<?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[Zero to Pete]]></title><description><![CDATA[Tech, AI, and building what's next. "You're part of the 1% signal on a topic that's 99% noise." — paid subscriber]]></description><link>https://www.zerotopete.com</link><image><url>https://substackcdn.com/image/fetch/$s_!7jbS!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F4ac20309-84e3-4eb7-8ca4-ce0642e3fdcc_1024x1024.png</url><title>Zero to Pete</title><link>https://www.zerotopete.com</link></image><generator>Substack</generator><lastBuildDate>Mon, 18 May 2026 05:21:26 GMT</lastBuildDate><atom:link href="https://www.zerotopete.com/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Zero to Pete]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[zerotopete@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[zerotopete@substack.com]]></itunes:email><itunes:name><![CDATA[Pete]]></itunes:name></itunes:owner><itunes:author><![CDATA[Pete]]></itunes:author><googleplay:owner><![CDATA[zerotopete@substack.com]]></googleplay:owner><googleplay:email><![CDATA[zerotopete@substack.com]]></googleplay:email><googleplay:author><![CDATA[Pete]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[The Squeeze]]></title><description><![CDATA[AI is compressing the org chart. The question is where you land.]]></description><link>https://www.zerotopete.com/p/the-squeeze</link><guid isPermaLink="false">https://www.zerotopete.com/p/the-squeeze</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Tue, 14 Apr 2026 12:03:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5jbD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5jbD!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5jbD!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 424w, https://substackcdn.com/image/fetch/$s_!5jbD!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 848w, https://substackcdn.com/image/fetch/$s_!5jbD!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 1272w, https://substackcdn.com/image/fetch/$s_!5jbD!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5jbD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png" width="1377" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1377,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2139376,&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://www.zerotopete.com/i/193887656?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.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_!5jbD!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 424w, https://substackcdn.com/image/fetch/$s_!5jbD!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 848w, https://substackcdn.com/image/fetch/$s_!5jbD!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.png 1272w, https://substackcdn.com/image/fetch/$s_!5jbD!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F32d80b15-6e8f-48a5-af87-731ca2cc0afa_1377x768.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><em>This Thursday I&#8217;m publishing <strong>Part 2: Surviving the Squeeze</strong>. If the org chart is compressing, what do you actually do about it? I cover five moves: why generalists are winning, how to think of yourself as an orchestrator running multiple agents and workstreams, why surrendering the details matters more than perfecting them, developing taste as a core skill, and how to evaluate whether the company you work at is going to make it through this.</em></p><p><em>Subscribe so you don&#8217;t miss it.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><div><hr></div><p>About nine months ago, one of my team members asked if they could help with the social media app I&#8217;d been building on the side. Run it like a normal project. Track it, manage it, and bring some structure.</p><p>I said no. I was flying. I was the product manager, the project manager, the developer, and QA. My agents were my staff. I couldn&#8217;t justify bringing in a project manager. The reason was simple: by the time I explain the intent, the goals, the constraints, the assumptions, by the time we segment ownership and schedule ceremonies, I would already have built it, tested it, and gathered real signal from users.</p><p>I wrote about this in S2S a few months ago and framed it as a process problem, a mismatch between how we&#8217;ve learned to build software and our new reality. Since then I&#8217;ve started to think the problem is bigger than process. <strong>Agile was the first thing to stop making sense. The entire org chart is next.</strong></p><div><hr></div><h2>The Memos</h2><p>Between January and March of this year, a handful of CEOs published detailed plans to restructure their companies around AI. Specific memos with headcounts and new role definitions.</p><p>In February, Jack Dorsey posted a note on X to Block&#8217;s 10,000 employees. The company was cutting to under 6,000. Forty percent of the workforce, gone in a single announcement. His reasoning was simple: &#8220;Intelligence tools have changed what it means to build and run a company. A significantly smaller team, using the tools we&#8217;re building, can do more and do it better.&#8221;</p><p>Stock went up 25%.</p><p>Five weeks later, Dorsey and Sequoia&#8217;s Roelof Botha published a 4,000-word essay called &#8220;From Hierarchy to Intelligence.&#8221; The thesis: corporate hierarchy is a 2,000-year-old information routing hack inherited from the Roman army, and AI is the first technology capable of replacing what it does. Middle managers, in this framing, were human routers. They existed to relay information between layers and precompute decisions so executives didn&#8217;t have to process everything themselves. AI can do that now, continuously, without losing context or playing telephone.</p><p>Dorsey flattened Block into three explicit roles:</p><ol><li><p><strong>Individual Contributors</strong>: the builders. They write code, ship product, do the actual work.</p></li><li><p><strong>Directly Responsible Individuals (DRIs)</strong>: they own specific outcomes on 90-day cycles. One person, one outcome, full accountability.</p></li><li><p><strong>Player-Coaches</strong>: senior people who mentor and guide Individual Contributors while still building themselves. Hands-on leadership, no pure managers.</p></li></ol><p>That&#8217;s the entire org. The management layer between &#8220;person doing the work&#8221; and &#8220;person deciding what work matters&#8221; compressed into nothing.</p><p>At Meta, a leaked memo revealed a pilot reorganizing roughly 1,000 people in Reality Labs into what they call &#8220;AI-native pods.&#8221; Every employee gets one of three titles: AI Builder, AI Pod Lead, or AI Org Lead. The ratio: up to 50 individual contributors per manager. Zuckerberg told investors that 2026 would &#8220;dramatically change the way we work&#8221; and that he&#8217;d become convinced &#8220;small, talent-dense teams&#8221; are the optimal configuration. Meta set a target for H1 2026: 65% of engineers should write more than 75% of their committed code with AI assistance.</p><p>Their CFO reported output per engineer up 30% since the start of 2025. Power users were at 80%.</p><p>The same pattern is playing out everywhere. Shopify&#8217;s Tobi Lutke told managers they must prove a job can be done exclusively by AI before they&#8217;re allowed to hire. Shopify&#8217;s headcount dropped 30% while revenue grew 21% annually. Salesforce cut 4,000 customer support roles after Benioff said he&#8217;d hire no engineers this year. Duolingo declared itself &#8220;AI-first&#8221; and began replacing contractors with GPT-4.</p><p>In Q1 2026 alone, 78,557 tech workers were laid off. Nearly half of those cuts were attributed directly to AI.</p><div><hr></div><h2>Follow the Handoffs</h2><p>So where do the roles go?</p><p>Think of any organization as a graph. There are nodes: the work itself. Analyzing product data. Writing requirements. Creating designs. Building the software. Testing it. Deploying it. Measuring whether it worked. And there are edges: the handoffs between each of those functions. A product manager translates strategy into a requirements document. A designer translates requirements into mockups. An engineer translates mockups into code. A QA team translates code into test results. <strong>Each translation is a boundary where context degrades, priorities get reinterpreted, and intent drifts.</strong></p><p>The tools for doing the work at each node are maturing fast. Amplitude runs product analytics on a prompt. Figma and AI design tools generate interfaces from descriptions. Claude Code and Cursor write and test software. The individual jobs are getting easier. That part of the story is well covered.</p><p>The part that isn&#8217;t: the edges. The translation cost between functions. The overhead of turning one person&#8217;s output into another person&#8217;s input.</p><p>That&#8217;s what I was describing in my opening. I couldn&#8217;t justify bringing someone in because the coordination cost, the explaining, the documenting, the translating, the scheduling, exceeded the cost of just building. <strong>The edges were more expensive than the nodes.</strong></p><p>In a traditional org, those edges are where most of the headcount lives. Project managers exist to synchronize the edges. Meetings exist to re-align after information degrades at a boundary. Documentation exists because the person writing the requirements and the person reading them sit in different rooms, on different teams, with different assumptions. The entire middle layer of most companies is edge infrastructure.</p><div class="callout-block" data-callout="true"><p><strong>AI is compressing the edges. When one person can go from product insight to requirements to design to working code to deployed feature, the translation layers between those steps disappear. </strong>You don&#8217;t need a PRD when the person who understands the user is also the person prompting the build. You don&#8217;t need a design handoff document when the builder is reviewing AI-generated interfaces directly against their own intent. You don&#8217;t need a QA handoff when tests are written alongside implementation.</p></div><p>The nodes still exist. Someone still has to understand the user. Someone still has to make design decisions. Someone still has to write and review code. The work hasn&#8217;t vanished. But the friction between each piece of work, the part that used to require dedicated roles and recurring meetings and Jira boards and handoff ceremonies, is collapsing into a single workflow.</p><p>That&#8217;s the real squeeze. Map the edges in your own organization. The ones AI can eliminate are where roles disappear. The ones it can&#8217;t are where the humans still matter.</p><h2>The Product Manager Squeeze</h2><p>Start at the top of the chain. The product manager&#8217;s job has always been a hybrid: strategy, analysis, translation, stakeholder management, and occasionally therapy. PMs looked at platform data, user behavior, reviews, interviews, feedback. They made informed decisions about what to build and tracked specific metrics to know if it worked.</p><p>Most of that analytical work can now be done by an AI agent in seconds. Amplitude launched what they call &#8220;Agentic AI Analytics&#8221; in February: AI agents that continuously analyze product usage, identify problems, build dashboards, and communicate findings via Slack. Mixpanel and ThoughtSpot are converging on the same idea from different angles. The whole category is racing toward natural language as the primary interface for data.</p><p>The analytical side of product management was hard before. Most PMs didn&#8217;t do it well. The tooling required SQL or a data engineer or both.</p><p>Now it requires a question typed in English.</p><p>The strategic work remains. Setting direction, communicating with stakeholders, making judgment calls about what metrics matter and what tradeoffs are acceptable. That&#8217;s still human. But the analytical infrastructure that used to justify a dedicated analyst role, or a full data team, now runs on a prompt.</p><h2>Design, QA, and the Rise of the Builder</h2><p>Further down the chain: requirements and design. The design-to-development handoff tools exist today, but they still require heavy supervision. The gap between &#8220;what we want it to do&#8221; and &#8220;working software&#8221; is closing fast.</p><p>I think the designer and the product manager will merge. Design still matters, but the translation layer between &#8220;what we want&#8221; and &#8220;what it looks like&#8221; is shrinking, and the person who understands the user and sets direction will also be the person reviewing the AI&#8217;s output and saying yes or no.</p><p>QA will be largely automated. It already is for builders working this way. AI agents write tests alongside implementation. They catch regressions. They run coverage. The manual QA cycle where a human clicks through every flow after every sprint is already an artifact.</p><p>The builder.</p><p>The builder, in this new structure, owns the full chain. Requirements to development to testing to deployment. One person, working with AI agents, shipping a feature that used to require a pod of five or six. This is what Meta&#8217;s &#8220;AI Builder&#8221; title and Dorsey&#8217;s &#8220;Individual Contributor&#8221; role both assume. It&#8217;s what I described in S2S: the emerging operator who articulates intent with precision, works directly with AI to produce code and interfaces, and owns outcomes end to end.</p><p>There will still be coordination above the builder. Someone needs to ensure the work across builders aligns with company goals, that deployments don&#8217;t conflict, that the product holds together. A thin layer. A Player-Coach in Dorsey&#8217;s framing. A Pod Lead in Meta&#8217;s.</p><div><hr></div><h2>What Happens to Everyone Else</h2><p>If the builder owns the full chain, what happens to everyone who used to own a piece of it? The project manager holding sprint planning for a team that no longer needs formal 2-week sprints. The QA lead running a test cycle that AI handles in minutes. The data analyst building dashboards that an agent builds on demand.</p><p>Some of those roles disappear entirely. Others get absorbed into the builder role. A few shift upward into the thin coordination layer.</p><p>And the ceremonies that held these teams together were designed for a world where execution was expensive and coordination was the price you paid. Daily standups lose their purpose when most of your collaborators are machines. Sprint planning falls apart when task estimation is meaningless. Everything is either trivial (seconds to minutes) or so large it&#8217;s an entire product. There&#8217;s no size 13 on the Fibonacci scale anymore. The XL task is an app.</p><p>This compression will be messy. Klarna cut 47% of its workforce and replaced 700 customer service workers with AI. Then they quietly started rehiring humans when the quality collapsed. The line between &#8220;AI can handle this&#8221; and &#8220;AI can handle this well enough&#8221; is thinner than the memos suggest. Companies that move too fast will overshoot and pull back. The ones that get it right will move deliberately, testing each collapsed handoff before committing to it.</p><div><hr></div><h2>The Taste Question</h2><p>There&#8217;s a question underneath all of this about taste.</p><p>You could argue taste is purely data. Users engage more or they don&#8217;t. They come back or they don&#8217;t. Run the A/B test. Let the numbers decide. If an AI agent identifies an optimization and the data supports it, ship it. Why wait for a designer&#8217;s opinion?</p><p>For most decisions, that&#8217;s probably right.</p><p>But there&#8217;s a layer above the data. How does the product make people feel? What do they associate with the brand? Is this thing we&#8217;re building getting us closer to what we actually want to be, or are we optimizing ourselves into something nobody intended?</p><p>I think about Rick Rubin. He doesn&#8217;t play instruments on the records he produces. He doesn&#8217;t write the songs. What he does is sit in the room and say &#8220;that&#8217;s it&#8221; or &#8220;not yet.&#8221; He holds the vision for what the thing is supposed to feel like, and he protects it from the thousand small compromises that would dilute it into nothing.</p><p>That&#8217;s the role that survives at the edges. Taste at the beginning: what are we building and why. Taste at the end: is this what we meant. One person, course-correcting at a high level, while builders and agents do the work between.</p><div><hr></div><p>Dorsey said something in his February memo that stuck with me. &#8220;I think most companies are late. Within the next year, I believe the majority of companies will reach the same conclusion and make similar structural changes.&#8221;</p><p>Eleven months before that memo, in March 2025, Dorsey explicitly denied that Block&#8217;s layoffs had anything to do with AI. By February 2026, AI was the entire thesis. That&#8217;s how fast the handoffs are collapsing.</p><p>Every org chart is a map of handoffs. AI is redrawing that map, and the roles that survive are the ones that sit where the handoffs can&#8217;t collapse: at the top, where someone has to decide what matters, and at the bottom, where someone has to judge whether the machine got it right. Everything in between is the squeeze.</p><div><hr></div><p><em>I publish a few times a week. If you want it in your inbox, subscribe. If you know a builder who&#8217;d get something out of this, send it their way.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p>]]></content:encoded></item><item><title><![CDATA[Claude Code Hit Escape Velocity in January. So I Used Claude Code to /Catch-Up.]]></title><description><![CDATA[A few charts to confirm what we all already feel, and a slash command to help you keep up.]]></description><link>https://www.zerotopete.com/p/claude-code-hit-escape-velocity-in</link><guid isPermaLink="false">https://www.zerotopete.com/p/claude-code-hit-escape-velocity-in</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Fri, 10 Apr 2026 02:22:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!_VLG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_VLG!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_VLG!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!_VLG!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!_VLG!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!_VLG!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_VLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png" width="1376" height="768" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/150d87ca-4382-4616-b201-5ab028849658_1376x768.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:768,&quot;width&quot;:1376,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1978424,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.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_!_VLG!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 424w, https://substackcdn.com/image/fetch/$s_!_VLG!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 848w, https://substackcdn.com/image/fetch/$s_!_VLG!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.png 1272w, https://substackcdn.com/image/fetch/$s_!_VLG!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F150d87ca-4382-4616-b201-5ab028849658_1376x768.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>Last week I opened Claude Code for the first time in about thirty days and felt like I was looking at a different product.</p><p>There were commands I didn&#8217;t recognize. Features people were tweeting about that I had zero context on. I use this tool every single day when I&#8217;m building, I write about it on this Substack, and I run a software agency where most of my engineers live inside of it. After my first few weeks away from Claude Code&#8217;s changelog, I felt behind.</p><p>I had spent nearly all of March buried in a fintech client project, getting over a year of code and infrastructure through a SOC2 audit. For anyone who hasn&#8217;t lived through one of those, it is the specific kind of work that consumes your attention completely. No time for X, podcasts, or side projects. Just control documentation, evidence collection, and the slow grind of making sure every system has a paper trail.</p><p>When I came up for air at the start of April and opened the Claude Code changelog, I just stared at it.</p><div><hr></div><h2>Two camps</h2><p>There are two camps of people on this question right now, and I think it&#8217;s worth naming both before I show you anything.</p><p>The first camp is what I&#8217;ll call the &#8220;calm down&#8221; camp. Their position is reasonable. You don&#8217;t need to use every feature. You don&#8217;t need to know what shipped yesterday. Pick a workflow that works for you and go. Claude Code is still Claude Code. The thing you were using last month still works.</p><p>The second camp, and I am firmly in it, thinks the first camp is underestimating what&#8217;s actually happening.</p><p>I wanted to prove the second camp is right, so I did what I usually do when I&#8217;m confused about something. I went to the source.</p><div><hr></div><h2>Pulling the data</h2><p>I cloned the <code>anthropics/claude-code</code> GitHub repository and pulled every tagged release from the last year. I extracted <code>CHANGELOG.md</code> at HEAD, parsed every version header, and ran <code>git blame</code> on the changelog file to date every entry back to the commit it was first written. That gave me 258 dated releases spanning April 2, 2025 to April 9, 2026.</p><p>I wanted to look at this four different ways, because I thought I owed it to the &#8220;calm down&#8221; camp to be fair. Every version of the chart I built was a response to an objection I could imagine them making. Here&#8217;s the progression.</p><div><hr></div><h2>Chart 1: Just count the releases</h2><p>The first version of the chart is the one most people arrive at if they bother to check at all. You count tagged releases. One per version. Plot them by day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NYy8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NYy8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 424w, https://substackcdn.com/image/fetch/$s_!NYy8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 848w, https://substackcdn.com/image/fetch/$s_!NYy8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 1272w, https://substackcdn.com/image/fetch/$s_!NYy8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NYy8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png" width="1456" height="536" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:536,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:69702,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.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_!NYy8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 424w, https://substackcdn.com/image/fetch/$s_!NYy8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 848w, https://substackcdn.com/image/fetch/$s_!NYy8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 1272w, https://substackcdn.com/image/fetch/$s_!NYy8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff09a63a8-24b4-458d-af7e-0e80937ff10d_1520x560.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>258 releases in a year. Over the last four months, that&#8217;s roughly one release every 24 hours of business time. One per working day, stretched across a year, for a single product.</p><p>Those numbers sound damning on their own, but they&#8217;re not honest. A release that fixes one typo counts the same as a release that adds a major new feature. Counting releases is like counting commits.</p><div><hr></div><h2>Chart 2: Count the changelog bullets</h2><p>Every Claude Code release ships with a changelog, and each release has a variable number of bullets describing what changed. So instead of counting releases, I counted the bullets inside them.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TYGH!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TYGH!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 424w, https://substackcdn.com/image/fetch/$s_!TYGH!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 848w, https://substackcdn.com/image/fetch/$s_!TYGH!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 1272w, https://substackcdn.com/image/fetch/$s_!TYGH!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TYGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png" width="1456" height="938" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:938,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:233342,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.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_!TYGH!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 424w, https://substackcdn.com/image/fetch/$s_!TYGH!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 848w, https://substackcdn.com/image/fetch/$s_!TYGH!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 1272w, https://substackcdn.com/image/fetch/$s_!TYGH!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F55ddc3f2-852c-4faf-aefd-f66a01442096_1502x968.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>2,113 changelog bullets across 258 releases. About eight per release on average. One &#8220;update&#8221; from Anthropic is rarely one change. It&#8217;s usually eight things, stacked.</p><p>This is the first chart where you can start to see the shape I ended up obsessing over. For the first eight months, it&#8217;s mostly quiet. Then something happens around the new year. </p><p>I&#8217;ll come back to that.</p><p>But this chart has the same fundamental problem in a new form. &#8220;Fixed a typo in an error message&#8221; is still counted the same as &#8220;Added Channels: full Telegram and Discord integration with bidirectional MCP bridge.&#8221; Those are not the same kind of change.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7eP1!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7eP1!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 424w, https://substackcdn.com/image/fetch/$s_!7eP1!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 848w, https://substackcdn.com/image/fetch/$s_!7eP1!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 1272w, https://substackcdn.com/image/fetch/$s_!7eP1!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7eP1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png" width="992" height="358" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:358,&quot;width&quot;:992,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:157951,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.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_!7eP1!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 424w, https://substackcdn.com/image/fetch/$s_!7eP1!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 848w, https://substackcdn.com/image/fetch/$s_!7eP1!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.png 1272w, https://substackcdn.com/image/fetch/$s_!7eP1!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2986789-d2ad-4cc1-9ab3-7568ef4e4a1a_992x358.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 class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0PNy!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0PNy!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 424w, https://substackcdn.com/image/fetch/$s_!0PNy!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 848w, https://substackcdn.com/image/fetch/$s_!0PNy!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 1272w, https://substackcdn.com/image/fetch/$s_!0PNy!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0PNy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png" width="1008" height="222" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:222,&quot;width&quot;:1008,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:66676,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.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_!0PNy!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 424w, https://substackcdn.com/image/fetch/$s_!0PNy!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 848w, https://substackcdn.com/image/fetch/$s_!0PNy!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 1272w, https://substackcdn.com/image/fetch/$s_!0PNy!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F51c1f9d5-d94c-4b76-935f-8c12f3389aef_1008x222.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>You can see what I mean in the screenshot above. A short bullet and a long bullet, side by side. The character count alone carries meaningful signal about how much actually landed. </p><div><hr></div><h2>Chart 3: Weight by category</h2><p>I categorized every bullet as one of four things: Added, Improved, Fixed, or Other. Then I weighted them.</p><p>Added features got a weight of four. Improved and Changed items got a weight of two. Fixed and Other items got a weight of one. Multiplied, stacked, colored.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!e4IM!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!e4IM!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 424w, https://substackcdn.com/image/fetch/$s_!e4IM!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 848w, https://substackcdn.com/image/fetch/$s_!e4IM!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 1272w, https://substackcdn.com/image/fetch/$s_!e4IM!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!e4IM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png" width="1456" height="920" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:920,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:313719,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.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_!e4IM!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 424w, https://substackcdn.com/image/fetch/$s_!e4IM!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 848w, https://substackcdn.com/image/fetch/$s_!e4IM!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 1272w, https://substackcdn.com/image/fetch/$s_!e4IM!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7494fe0b-4ea9-49c7-b47b-a7edb0139719_1488x940.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Now you can see the shape of what&#8217;s shipping, not just the volume. And the first thing you notice is the orange.</p><p>The orange band is bug fixes. There&#8217;s a lot of orange. Across the full year, Anthropic shipped roughly 2.3 bug fixes for every new feature. A meaningful portion of the velocity you&#8217;re seeing is them patching things they shipped the week before. It&#8217;s how shipping fast actually works, especially when the product is being used by millions of developers in configurations nobody at Anthropic can fully predict.</p><p>But this chart is still wrong in a subtle way. Every Added bullet counts the same as every other Added bullet. Channels, the feature that briefly made people think Anthropic was going to kill the third-party agent ecosystem, counts as one Added times four. So does &#8220;Added a new environment variable for cache configuration.&#8221; Same score. Obviously not the same thing.</p><div><hr></div><h2>Chart 4: Weight by length</h2><p>I weighted every single bullet by its character length. The intuition is straightforward. When Anthropic ships something big, they write a long description for it. When they ship something small, they write a short one. The mega-features get longer ones. It&#8217;s not perfect, but it&#8217;s worth acknowledging.</p><p>I multiplied character length by category weight, summed everything up per day, and plotted the full year. Then I went one step further and annotated the chart with the actual named launches that people talk about. Hooks. Skills. Subagents. Plugins. Worktrees. 1M context. Channels. Auto mode. The big things.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qe_3!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qe_3!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 424w, https://substackcdn.com/image/fetch/$s_!qe_3!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 848w, https://substackcdn.com/image/fetch/$s_!qe_3!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!qe_3!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qe_3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png" width="1456" height="1038" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1038,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:460962,&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://www.zerotopete.com/i/193747634?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.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_!qe_3!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 424w, https://substackcdn.com/image/fetch/$s_!qe_3!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 848w, https://substackcdn.com/image/fetch/$s_!qe_3!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 1272w, https://substackcdn.com/image/fetch/$s_!qe_3!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F27476bf0-7b87-4f1d-a6a0-76d4017e83cf_1498x1068.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Look at the line on the bottom for the first eight months. It hovers somewhere between two and six. Flat. Steady. A product being developed at a rhythm we can absorb.</p><p>Then January 7th happens. v2.1.0 drops. And the floor of the chart doubles and never comes back down.</p><p>That is escape velocity. Anthropic broke orbit on January 7th and the new altitude is just the altitude now. </p><p>I want to be careful not to overstate this, because the first eight months aren&#8217;t nothing. Hooks shipped in June. Subagents in September. Skills in October. These are really useful and impressive features that people built real workflows around. But the rate at which they were arriving was something a normal human with a normal job could track. The new rate is not.</p><div><hr></div><h2>The maximum rate of absorption</h2><p>When I finished building the charts, I sat with them for a few hours and got to a thought that kind of messed me up for a night.</p><p>We are at a ceiling. A ceiling that I don&#8217;t think most people in the industry are willing to accept. It is the ceiling of what a working human, with a job and other responsibilities and some expectation of sleep, can actually absorb in a given week.</p><p>Call it the maximum rate of absorption.</p><p>There was a window, roughly from when Claude Code launched through the end of last year, where a reasonably attentive developer could track everything Anthropic was shipping. You could read the changelog on Monday morning, try the new features that mattered to your work, and be more or less caught up by Monday afternoon. The product was evolving fast, but it was evolving at a human tempo. The tempo mattered.</p><p>That window closed sometime in January.</p><p>Past that point, the amount of surface area Anthropic is shipping per unit time exceeds what a single human can meaningfully evaluate, learn, and adopt. Simon Willison, who built his reputation on tracking exactly this kind of thing, told Business Insider recently that he hasn&#8217;t taken a proper break in three years and that he is &#8220;mass-subscribing to feeds&#8221; just trying to keep up. If Simon is drowning, you are drowning. Everyone who claims otherwise is drowning. The only difference is whether they'll admit it.</p><blockquote><p>And the part that I whole heartedly believe: I don&#8217;t think Anthropic is building for humans anymore.</p></blockquote><p>I don&#8217;t mean that as a conspiracy or a criticism. I mean it as a simple observation about their velocity. The tooling is getting richer faster than we can learn it. The configuration surface is getting denser faster than we can read the docs. The integration points are multiplying faster than we can wire them up. <strong>The only entity in the world that can actually keep pace with a product shipping at this rate is another AI.</strong></p><p>We got our oracle moment. We built a tool that can absorb all the other tools. And now the tool that can absorb all the other tools is getting built, at some level, for the tool that absorbs all the other tools. Humans are still in the loop, but at what point will we start to look more like beta testers than users. We&#8217;re the training signal, not the target.</p><p>I wrote a piece a couple of months ago called <em><a href="https://www.zerotopete.com/p/the-great-filter">The Great Filter for Ideas</a></em>, where I argued that the people who were going to build with AI were mostly the ones who were already building before AI. The unlock came, but it came for the people who were going to build anyway. This feels like an extension of the same story from a different angle. The tooling is sprinting ahead of human comprehension. The gap is widening. And the only way to close it, if you are a working developer with a job and a family and some interest in staying sane, is to outsource the tracking of the tool to the tool itself.</p><p>Which is what brings me to the thing I actually built.</p><div><hr></div><h2>The slash command</h2><p>I built a skill called <code>/catch-up</code>. When you run it in Claude Code, it kicks off a multi-minute audit of your entire setup and produces a long, opinionated, evidence-backed report.</p><p>Under the hood it spawns three research agents in parallel. One fetches the full Claude Code feature surface from the official docs and the changelog &#8212; every slash command, every hook event, every CLI flag, every settings option. One does a deep dive on your actual usage history: it reads your past 25 sessions from <code>~/.claude/projects/</code>, counts which tools you actually call, which slash commands you actually type, which prompts you keep repeating, and which errors keep showing up. The third audits your configuration top to bottom, global and project <code>CLAUDE.md</code>, every skill in <code>~/.claude/skills/</code>, every MCP server, every hook, every custom agent, plus the shape of the repo itself.</p><p>Then it cross-references all three and writes you a report with eight sections.</p><p>The first section is a profile dashboard. Sessions analyzed, tool call breakdown, error count, branches you&#8217;ve worked on, what&#8217;s installed. The second is a feature adoption matrix, every meaningful Claude Code capability with your status next to it. <em>Using</em>, <em>Configured but never called</em>, <em>Not set up</em>, <em>Remove this</em>. The third is recent launches with a <em>does this apply to you</em> verdict on each one. The fourth is dead weight, MCP servers you configured but never call, plugins that load on every session and never fire, hooks running on the wrong events. The fifth is workflow automation. The skill mines your repeated prompts and surfaces patterns. <em>You typed &#8220;run the tests&#8221; eleven times last week. Here&#8217;s a slash command that does it.</em> The sixth is <code>CLAUDE.md</code> gaps. The seventh is configuration improvements. The eighth is a prioritized action list with time estimates next to each item, ranked by impact.</p><p>And every single recommendation is cited. <em>You have zero Swift files in this project but the swift-lsp plugin loads on every session. Here is the command to disable it.</em> <em>You asked &#8220;what branch am I on&#8221; in three different sessions this week. Here is a status line config that puts the branch in your prompt.</em> <em>You have a Figma file in </em><code>/design</code><em> and you have never installed the Figma MCP. Here is the install command.</em> It does not give you generic advice. It tells you specifically what it saw and what to do about it.</p><p>The best part is that the report is interactive. At the end it says: <em>&#8220;Reply with the numbers of items you want me to execute now.&#8221;</em> You type back which ones you want, and Claude Code installs the missing MCP server, adds the hook, rewrites the skill frontmatter, trims your <code>CLAUDE.md</code>, updates your settings, all in the same session. You stay in your chair and the gap closes while you watch.</p><h2>How to install</h2><ol><li><p><strong>Copy the skill code below</strong>.</p></li><li><p><strong>Create the skills directory</strong> if it doesn&#8217;t exist yet. Open your terminal and run:</p></li></ol><pre><code><code>   mkdir -p ~/.claude/skills/catch-up</code></code></pre><ol start="3"><li><p><strong>Create the skill file</strong> at the right path. Still in your terminal:</p></li></ol><pre><code><code>   nano ~/.claude/skills/catch-up/SKILL.md</code></code></pre><p>(Or use any text editor &#8212; <code>vim</code>, <code>code</code>, <code>cursor</code>, whatever you prefer.)</p><ol start="4"><li><p><strong>Paste the contents</strong> you copied in step 1 into the file. Save and close.</p><ul><li><p>In <code>nano</code>: <code>Ctrl+O</code>, <code>Enter</code>, <code>Ctrl+X</code></p></li><li><p>In <code>vim</code>: <code>:wq</code></p></li><li><p>In a GUI editor: <code>Cmd+S</code></p></li></ul></li><li><p><strong>Verify the file is in the right place</strong>:</p></li></ol><pre><code><code>   ls ~/.claude/skills/catch-up/</code></code></pre><p>You should see <code>SKILL.md</code> listed.</p><ol start="6"><li><p><strong>Open a new Claude Code session</strong> in any project. If you have a session open already, exit it first (<code>Ctrl+D</code> or <code>/exit</code>) and start a new one with <code>claude</code> from the project directory you want to audit. Skills are loaded at session start, so an existing session won&#8217;t see the new skill until you restart.</p></li><li><p><strong>Run the command</strong>:</p></li></ol><pre><code><code>   /catch-up</code></code></pre><div><hr></div><h2>&#9888;&#65039; Heads up: the report is long on purpose. The skill runs at <code>effort:high</code> with <code>ultrathink</code> enabled, takes anywhere from 2 to 20 minutes, and uses a good amount of tokens. Make sure you've got the time and the budget before you run it.</h2><div class="highlighted_code_block" data-attrs="{&quot;language&quot;:&quot;markdown&quot;,&quot;nodeId&quot;:&quot;596330e2-c2c5-40f4-946a-900025fbfd77&quot;}" data-component-name="HighlightedCodeBlockToDOM"><pre class="shiki"><code class="language-markdown">---
name: catch-up
description: Full Claude Code capability audit &#8212; enumerates every feature available, maps each against your actual usage and config, surfaces what you're missing, highlights recent launches, and produces an exhaustive personalized report. User-invoked only &#8212; the agent will never auto-fire this.
allowed-tools: Read, Glob, Grep, Bash, WebFetch, Agent
disable-model-invocation: true
effort: high
---

# Catch Up

ultrathink

You are running a comprehensive Claude Code audit. The goal is to help the user discover and use every Claude Code feature relevant to how they actually work &#8212; not just recent additions, but the full capability surface. A user who types /catch-up wants a thorough report, not a quick summary. Be exhaustive. Be specific. Be verbose. This report should take several minutes to produce and should be long.

The output has two parts:
1. **The full picture** &#8212; here is everything Claude Code can do, organized by category, with your current adoption status next to each
2. **Personalized action items** &#8212; here is what you specifically should do, backed by evidence from your actual sessions, config, and codebase

---

## ANTI-HALLUCINATION RULE

Every feature citation must quote exact text from a source you fetched. Never invent version numbers, dates, or feature descriptions. If you cannot find a real source for a claim, write: `[no source found &#8212; inferred from analysis]`. This rule applies to every single item in your output.

---

## Step 1 &#8212; Locate session directory

Run this first. You need the actual path before spawning agents.

```bash
CWD=$(pwd)
PROJECT_KEY=$(echo "$CWD" | sed 's|/|-|g; s|_|-|g')
SESSIONS_DIR="$HOME/.claude/projects/$PROJECT_KEY"

if [ -d "$SESSIONS_DIR" ] &amp;&amp; [ -f "$SESSIONS_DIR/sessions-index.json" ]; then
  echo "FOUND:$SESSIONS_DIR"
else
  BASENAME=$(basename "$CWD" | sed 's|_|-|g')
  CANDIDATE=$(ls "$HOME/.claude/projects/" 2&gt;/dev/null | grep -- "-$BASENAME$" | head -1)
  if [ -n "$CANDIDATE" ]; then
    echo "FOUND:$HOME/.claude/projects/$CANDIDATE"
  else
    echo "NOT_FOUND"
  fi
fi
```

Also run:
```bash
pwd
cat package.json 2&gt;/dev/null | python3 -c "import json,sys; p=json.load(sys.stdin); print(p.get('name','?'), '|', p.get('version','?'))" 2&gt;/dev/null
```

Record the actual SESSIONS_DIR path and project name. You will embed these in the agent prompts below.

---

## Step 2 &#8212; Launch three research agents in parallel

**Critical**: spawn all three agents in a single message so they run simultaneously. Do not wait for one before starting the next.

Embed the actual SESSIONS_DIR path and project cwd into each agent prompt before launching.

---

### Agent A &#8212; Full Feature Researcher

Prompt (fill in PROJECT_CWD with the actual path before sending):

```
You are researching the complete Claude Code feature set to build an exhaustive inventory.

Fetch ALL of these pages. Do not skip any. Read each one fully:

1. https://code.claude.com/docs/en/changelog
2. https://code.claude.com/docs/en/
3. https://code.claude.com/docs/en/settings
4. https://code.claude.com/docs/en/hooks
5. https://code.claude.com/docs/en/mcp
6. https://code.claude.com/docs/en/skills
7. https://code.claude.com/docs/en/memory
8. https://code.claude.com/docs/en/cli-reference
9. https://code.claude.com/docs/en/tools-reference
10. https://api.github.com/repos/anthropics/claude-code/releases?per_page=50

From these sources, build a COMPLETE feature inventory organized into these categories. For each item, include: feature name, what it does (1 sentence), how to enable it, and the source URL + quote.

CATEGORIES TO COVER (be exhaustive within each):

**A. Built-in slash commands**
List every /command that exists. Include what it does and any arguments.

**B. Hook events**
List every hook event type (PreToolUse, PostToolUse, PostToolUseFailure, UserPromptSubmit, Stop, SubagentStop, PostCompact, TaskCreated, WorktreeCreate, WorktreeRemove, CwdChanged, FileChanged, StopFailure, SessionStart, SessionEnd, InstructionsLoaded, ConfigChange, ElicitationResult, PermissionDenied, etc.)
For each: what triggers it, what data it receives, what it can return.

**C. MCP capabilities**
What MCP servers can do, how to configure them, OAuth support, etc.

**D. Skill system**
All frontmatter fields available in SKILL.md (name, description, allowed-tools, disable-model-invocation, effort, model, argument-hint, etc.)
What skills can do that plain commands can't.

**E. Agent/subagent system**
Custom agents in .claude/agents/, frontmatter fields, background agents, worktree isolation, the Agent tool, SendMessage, etc.

**F. CLI flags and modes**
Every flag: --resume, --continue, --worktree, --bare, --print, --model, --effort, --agent, --channels, --name, --mcp-config, etc.
Special modes: auto mode, bypass-permissions, accept-edits, plan mode.

**G. Settings and configuration**
Every setting in settings.json that is useful for a typical developer. Group: permissions, hooks, MCP, display, performance, experimental.

**H. Keyboard shortcuts**
All default shortcuts and any that are rebindable via keybindings.json.

**I. Recent launches (last 60 days)**
List every significant feature released in the last 60 days in chronological order newest-first. Include: feature name, release version, date, what it does, how to enable.

**J. Status line**
What statusLine supports, the JSON schema, refreshInterval, rate_limits field, etc.

**K. Memory system**
Auto-memory, /memory command, MEMORY.md, custom memory directory, etc.

Return the COMPLETE inventory. Do not summarize or truncate. Include everything you found. Quote sources for everything.
```

---

### Agent B &#8212; Deep Usage Analyst

Prompt (fill in SESSIONS_DIR with the actual path before sending):

```
You are doing a deep analysis of Claude Code usage history for this project.

Sessions directory: SESSIONS_DIR_PLACEHOLDER

Run ALL of the following analyses. Be thorough. Return raw data and patterns, not just summaries.

**B1. Session overview**
```bash
python3 &lt;&lt; 'PYEOF'
import json, os
path = "SESSIONS_DIR_PLACEHOLDER/sessions-index.json"
with open(path) as f:
    idx = json.load(f)
entries = sorted(idx.get("entries", []), key=lambda e: e.get("modified", ""), reverse=True)[:25]
print(f"Total sessions: {len(idx.get('entries', []))}")
print(f"Showing most recent 25:\n")
for e in entries:
    date = e.get("modified", "?")[:10]
    msgs = e.get("messageCount", "?")
    branch = e.get("gitBranch", "") or "&#8212;"
    summary = e.get("summary", "")[:100]
    first = e.get("firstPrompt", "")[:80]
    print(f"{date} | {str(msgs):&gt;4}msg | {branch}")
    print(f"  {summary}")
    print(f"  &#8594; {first}")
    print()
PYEOF
```

**B2. Tool call frequency (all recent sessions)**
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -hoE '"tool_name":"[A-Za-z_][A-Za-z0-9_]*"' 2&gt;/dev/null | sed 's/"tool_name":"//;s/"//' | sort | uniq -c | sort -rn | head -40
```
Also try this pattern if the above returns nothing:
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -hoE '"name":"[A-Za-z_][A-Za-z0-9_]*"' 2&gt;/dev/null | sed 's/"name":"//;s/"//' | grep -v '^$' | sort | uniq -c | sort -rn | head -40
```

**B3. MCP tool usage**
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -hoE '"name":"mcp__[^"]+' 2&gt;/dev/null | sed 's/"name":"mcp__/mcp__/' | sort | uniq -c | sort -rn
```

**B4. Slash commands used**
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -hoE '"text"\s*:\s*"/[a-z][a-z0-9_/-]*' 2&gt;/dev/null | grep -oE '/[a-z][a-z0-9_/-]*' | sort | uniq -c | sort -rn | head -30
```

**B5. Repeated user prompts (pattern mining)**
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | while IFS= read -r f; do
  python3 - "$f" &lt;&lt; 'PYEOF'
import json, sys
try:
    for line in open(sys.argv[1], errors='replace'):
        try:
            obj = json.loads(line)
            if obj.get('type') != 'user':
                continue
            msg = obj.get('message', {})
            if not isinstance(msg, dict):
                continue
            content = msg.get('content', '')
            if isinstance(content, list):
                for block in content:
                    if isinstance(block, dict) and block.get('type') == 'text':
                        t = block.get('text', '').strip()
                        if 15 &lt; len(t) &lt; 150 and not t.startswith('&lt;') and not t.startswith('{'):
                            print(t)
            elif isinstance(content, str):
                t = content.strip()
                if 15 &lt; len(t) &lt; 150 and not t.startswith('&lt;') and not t.startswith('{'):
                    print(t)
        except:
            pass
except:
    pass
PYEOF
done 2&gt;/dev/null | sort | uniq -c | sort -rn | head -40
```

**B6. Error patterns**
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -ohoE '"is_error"\s*:\s*true' 2&gt;/dev/null | wc -l
echo "---"
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -hoE 'String to replace not found|permission denied|requires permission|not allowed|command not found|ENOENT|EACCES|WebGL|WebSocket.*failed|403|404|500' 2&gt;/dev/null | sort | uniq -c | sort -rn | head -20
```

**B7. Session depth distribution**
```bash
python3 &lt;&lt; 'PYEOF'
import json
with open("SESSIONS_DIR_PLACEHOLDER/sessions-index.json") as f:
    idx = json.load(f)
counts = sorted([e.get("messageCount", 0) for e in idx.get("entries", [])], reverse=True)
print(f"All sessions by depth: {counts[:30]}")
print(f"Average: {round(sum(counts)/len(counts),1) if counts else 0}")
print(f"Max: {max(counts) if counts else 0}")
over30 = len([c for c in counts if c &gt; 30])
over60 = len([c for c in counts if c &gt; 60])
print(f"Sessions &gt; 30 msgs: {over30}")
print(f"Sessions &gt; 60 msgs (autocompact risk): {over60}")
PYEOF
```

**B8. Git branch patterns from session history**
```bash
python3 &lt;&lt; 'PYEOF'
import json
with open("SESSIONS_DIR_PLACEHOLDER/sessions-index.json") as f:
    idx = json.load(f)
branches = {}
for e in idx.get("entries", []):
    b = e.get("gitBranch", "") or "unknown"
    branches[b] = branches.get(b, 0) + 1
for b, count in sorted(branches.items(), key=lambda x: -x[1]):
    print(f"{count:&gt;4}x {b}")
PYEOF
```

**B9. Recent session summaries (more detail)**
Read the summaries from sessions-index.json for the 10 most recent sessions in full. Show the complete summary field for each.

**B10. Tool use interrupts**
```bash
ls -t "SESSIONS_DIR_PLACEHOLDER"/*.jsonl 2&gt;/dev/null | head -25 | xargs grep -hoE '"interrupted"\s*:\s*true|"cancelled"\s*:\s*true|user.*interrupt|tool.*cancel' 2&gt;/dev/null | wc -l
```

Return ALL raw data. Do not truncate output. The caller needs the full picture to make recommendations.
```

---

### Agent C &#8212; Config and Project Auditor

Prompt (fill in PROJECT_CWD with the actual working directory before sending):

```
You are doing a complete audit of a project's Claude Code configuration and codebase structure.

Working directory: PROJECT_CWD_PLACEHOLDER

Read ALL of the following. Return the full content of each (not summaries).

**C1. Global Claude configuration**
- Read ~/.claude/CLAUDE.md &#8212; show line count and full content
- Read ~/.claude/settings.json &#8212; show full content
- Read ~/.claude/settings.local.json if it exists
- List ~/.claude/skills/ &#8212; show all skill names and their SKILL.md frontmatter
- List ~/.claude/commands/ &#8212; show all command names
- List ~/.claude/agents/ &#8212; show all agent names and their frontmatter

**C2. Project-level Claude configuration**
- Read PROJECT_CWD_PLACEHOLDER/CLAUDE.md &#8212; show full content and line count
- Read PROJECT_CWD_PLACEHOLDER/.claude/settings.json if it exists
- Read PROJECT_CWD_PLACEHOLDER/.claude/settings.local.json if it exists
- List PROJECT_CWD_PLACEHOLDER/.claude/skills/ &#8212; show all skill names
- List PROJECT_CWD_PLACEHOLDER/.claude/commands/ &#8212; show all command names
- List PROJECT_CWD_PLACEHOLDER/.claude/agents/ &#8212; show all agent names
- Read PROJECT_CWD_PLACEHOLDER/.mcp.json if it exists

**C3. Auto-memory files**
List and read ALL files in:
~/.claude/projects/$(echo "PROJECT_CWD_PLACEHOLDER" | sed 's|/|-|g; s|_|-|g')/memory/
Show full content of each memory file. These are crucial for understanding what the project is about.

**C4. Project stack**
Run:
```bash
cat PROJECT_CWD_PLACEHOLDER/package.json 2&gt;/dev/null | python3 -c "
import json,sys
p=json.load(sys.stdin)
print('name:', p.get('name'))
print('version:', p.get('version'))
print('scripts:', json.dumps(p.get('scripts',{}), indent=2))
deps={**p.get('dependencies',{}),**p.get('devDependencies',{})}
print('all deps:', json.dumps(sorted(deps.keys()), indent=2))
"
ls PROJECT_CWD_PLACEHOLDER/.github/workflows/ 2&gt;/dev/null
cat PROJECT_CWD_PLACEHOLDER/railway.toml 2&gt;/dev/null
ls PROJECT_CWD_PLACEHOLDER/prisma/ PROJECT_CWD_PLACEHOLDER/migrations/ 2&gt;/dev/null
find PROJECT_CWD_PLACEHOLDER -maxdepth 3 -name "*.test.*" -o -name "*.spec.*" 2&gt;/dev/null | head -10
ls PROJECT_CWD_PLACEHOLDER/src/ 2&gt;/dev/null | head -20
```

**C5. MCP configuration detail**
Show the full MCP server configurations from settings.json, settings.local.json, and .mcp.json. For each server: name, type, command/url, and any config options.

**C6. Hook configuration detail**
Show every hook currently configured: event type, matcher, command, and whether it's in global or project settings.

**C7. Current git state**
```bash
cd PROJECT_CWD_PLACEHOLDER &amp;&amp; git branch --show-current 2&gt;/dev/null
cd PROJECT_CWD_PLACEHOLDER &amp;&amp; git log --oneline -10 2&gt;/dev/null
cd PROJECT_CWD_PLACEHOLDER &amp;&amp; git remote -v 2&gt;/dev/null
```

Return EVERYTHING. Full file contents, not summaries. The caller needs the raw data.
```

---

## Step 3 &#8212; Synthesize all three agent results

After all three agents complete, you have:
- **A**: Complete feature inventory from official docs + changelog
- **B**: Deep usage profile from JSONL history  
- **C**: Full config + project context

Now cross-reference everything and produce the report below.

---

## Step 4 &#8212; Produce the full report

The report must be comprehensive and verbose. Do not summarize. Do not cap at N items. Show everything relevant. Use clear markdown headers and tables where appropriate.

---

### SECTION 0: Your Claude Code Profile

A dashboard view. Show:
- Installed Claude Code version (run `claude --version`)
- Sessions analyzed, date range, total message count
- Most active branches
- Tool call breakdown (top 10 tools with counts)
- Average session depth, max session depth
- Error count and top error types
- Skills installed (global + project)
- MCP servers configured
- Hooks configured
- Custom agents defined

---

### SECTION 1: Feature Adoption Matrix

For EVERY major Claude Code capability, show adoption status. Organize by category. Use this table format:

```
| Feature | Status | Notes |
|---------|--------|-------|
| /compact | &#10003; Used | Called 3&#215; |
| /resume  | &#8212; Never used | Would save context on long sessions |
| /loop    | &#8212; Never used | Could automate your deploy checks |
```

Status options:
- **&#10003; Using** &#8212; confirmed in session history
- **&#9881; Configured** &#8212; set up but zero usage
- **&#8212; Not set up** &#8212; not configured, not used
- **&#10007; Dead weight** &#8212; configured but never used, likely should remove
- **N/A** &#8212; doesn't apply to this project/stack

Cover ALL of these categories (from the feature inventory Agent A built):
- Built-in slash commands (every single one)
- Hook events (every event type)
- MCP capabilities
- Skill system features
- Agent/subagent features
- CLI modes and flags
- Settings options (meaningful ones)
- Status line
- Memory system features
- Keyboard shortcuts (notable ones)

For every "&#8212; Not set up" item where usage data or project structure suggests it would help: add a note explaining WHY it fits this project specifically.

---

### SECTION 2: Recent Launches &#8212; What Just Shipped

For every significant feature released in the last 60 days (from Agent A's changelog research):

Show each as:

```
#### {Feature Name} &#8212; {version} ({date})
{Exact quote from changelog}

**Applies to you**: Yes/No/Maybe &#8212; {1 sentence why, citing specific evidence from B or C}
**How to enable**: {exact command or config}
```

Do not skip any release. Do not filter. Show everything that shipped. Let the user decide what matters.

---

### SECTION 3: Dead Weight &#8212; Remove This

List everything that is configured but produces zero value:
- MCP servers with 0 calls in history
- Plugins/skills installed but never invoked
- Hooks firing on events they don't need to fire on
- Settings that do nothing for this stack

For each: what it is, the evidence it's unused, the command to remove it.

---

### SECTION 4: Workflow Automation Opportunities

From the repeated prompt analysis (Agent B, section B5), identify patterns the user repeats manually that Claude Code features could automate. For each:

```
#### Pattern: "{the repeated phrase or workflow}"
Seen: N times across sessions
Could be automated by: {specific Claude Code feature}
How: {exact implementation}
```

Look for: commit/push workflows, deploy triggers, branch questions, context re-establishment, test runs, repeated preambles that belong in CLAUDE.md.

---

### SECTION 5: Your CLAUDE.md Gaps

Based on the project structure (Agent C) and repeated prompts (Agent B), identify what belongs in CLAUDE.md that isn't there yet. Show:
- Current CLAUDE.md line count and whether it's approaching the effective limit (~200 lines)
- Repeated context that users provide verbally that should be documented
- Missing conventions (deploy workflow, component patterns, design system rules)
- Anything in memory files that should graduate to CLAUDE.md

---

### SECTION 6: Configuration Improvements

Specific changes to settings.json, hooks, or MCP setup that would reduce friction. For each:
- What to change and why
- The exact config snippet
- Expected benefit (cite the error/friction pattern from B6 it addresses)

---

### SECTION 7: Prioritized Action Items

Number every actionable recommendation from the entire report. Rank by expected impact. Format:

```
1. [10 min] **Remove swift-lsp plugin** &#8212; loads on every session, zero Swift files
   &#8594; claude plugin disable swift-lsp@claude-plugins-official
   &#8594; Evidence: 0 Swift files in project, 0 swift-lsp tool calls in 25 sessions

2. [5 min] **Add status line showing git branch** &#8212; you asked "which branch?" in 3 sessions  
   &#8594; Add to ~/.claude/settings.json: "statusLine": {"command": "...", "refreshInterval": 10}
   &#8594; Evidence: B5 repeated prompt analysis, session data

...
```

No cap on the number of items. Include everything worth doing.

---

### SECTION 8: Things to Know About

Features that exist and are relevant but don't require immediate action &#8212; just awareness. Organized as a bulleted list of short "did you know" facts specific to this project/workflow. Include exact docs links or changelog quotes.

---

## Output rules

- **Be exhaustive**. A short report is a failure. This should take several minutes to read.
- **Never truncate a section**. If a table has 30 rows, show all 30.
- **No generic advice**. Every item must cite something specific from this project, this config, or this usage history.
- **Quote your sources**. Every feature cite gets a verbatim quote from the fetched content.
- **Show the data**. Where you drew conclusions from usage counts or error patterns, show the numbers.
- **End with**: "Reply with the numbers of items you want me to execute now." Then execute whatever they choose.
</code></pre></div><p><em>You can trim it, extend it, or fork it for your team.</em></p><div><hr></div><h2>What I think this means</h2><p>I want to go back to the &#8220;calm down&#8221; camp for a second, because I owe them a fair hearing.</p><p>They are right that you don&#8217;t need to use every Claude Code feature. They are right that the thing you were using last month still works.</p><p>What I think they are missing is that the ceiling moved. There was a version of this tool where you could be a good user without trying too hard, and that version is gone. The new version requires either a full-time commitment to tracking the changelog, which few people have, or a system that tracks the changelog for you. I do not see a third option, <em>there&#8217;s just too much being release each day</em>.</p><p>I can live with that, I think.</p><p>We built the oracle. The oracle is now improving faster than we can absorb its improvements. The realistic path for a working developer who wants to stay close to the frontier is to use the oracle to keep up with the oracle. It is recursive and a little absurd, but it is also the honest answer to the situation we are actually in.</p><div><hr></div><p><em>If this was useful, subscribe. Thank you.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[I Found a Hidden Feature in Claude Code Called Speculation]]></title><description><![CDATA[A fully built speculative execution system is sitting in the binary, waiting behind a server flag]]></description><link>https://www.zerotopete.com/p/i-found-a-hidden-feature-in-claude</link><guid isPermaLink="false">https://www.zerotopete.com/p/i-found-a-hidden-feature-in-claude</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Thu, 26 Mar 2026 21:56:32 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!NTMl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!NTMl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!NTMl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NTMl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NTMl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NTMl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!NTMl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg" width="622" height="350" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:350,&quot;width&quot;:622,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:11634,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/192254620?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!NTMl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 424w, https://substackcdn.com/image/fetch/$s_!NTMl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 848w, https://substackcdn.com/image/fetch/$s_!NTMl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!NTMl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F85b80bce-bd3c-4c7c-826a-338957711434_622x350.jpeg 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></p><p>I was poking around the Claude Code binary trying to figure out why prompt suggestions disappeared. I found something else entirely &#8212; a fully built speculative execution system that pre-runs predicted commands in the background before you hit Enter. As far as I can tell, nobody has written about this publicly.</p><div><hr></div><h2>How I Got Here</h2><p>Prompt suggestions, the autocomplete feature where Claude predicts what you&#8217;ll type next, showed up in Claude Code for a few weeks, then vanished. I wanted to know why, so I went to the source: the binary itself.</p><p>For me, Claude Code lives at <code>~/.local/share/claude/versions/2.1.83</code>. It&#8217;s a 199MB Mach-O arm64 executable &#8212; a Bun-based Single Executable Application with the JS bundle embedded. Variable names are minified but strings are fully intact and extractable.</p><p>I found the init function that gates prompt suggestions:</p><p>javascript</p><pre><code><code>function vmT() {
  let _ = process.env.CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION;
  if (_ === "false") return !1;   // OFF
  if (_ === "1") return !0;       // ON &#8212; bypasses server gate
  if (!IT("tengu_chomp_inflection", !1)) return !1;  // server flag check
  // ...
}</code></code></pre><p>There&#8217;s an env var escape hatch. Set `CLAUDE_CODE_ENABLE_PROMPT_SUGGESTION=1` in `~/.claude/settings.json` and suggestions come back. Tab to accept and edit, Enter to accept and run.</p><p>So, I got the answer I was initially looking for, but I kept pulling the thread. Prompt suggestions feed into something bigger.</p><p>---</p><p>## Speculative Execution</p><p>Buried in the binary is a system called Speculation. Here&#8217;s every reference I extracted:</p><pre><code><code>[Speculation] Starting speculation
[Speculation] Complete:
[Speculation] Accept
[Speculation] Aborting
[Speculation] Denied
[Speculation] Stopping at bash:
[Speculation] Stopping at file edit:
[Speculation] Stopping at denied tool:
[Speculation] Failed to create overlay directory
[Speculation] Failed to copy
[Speculation] Pipelined suggestion:
[Speculation] Promoting pipelined suggestion:
Speculation paused: bash boundary
Speculation paused: file edit requires permission
Write outside cwd not allowed during speculation
speculationSessionTimeSavedMs
totalSpeculationTimeSavedMs
tengu_speculation
querySource:"speculation"</code></code></pre><p>The mechanism is straightforward. Claude finishes responding to your prompt. A suggestion is generated:  suggestion text like &#8220;run the tests.&#8221; Then, without waiting for you to accept, Claude forks a background API call and starts executing that predicted prompt speculatively.</p><pre><code><code>// After suggestion is generated and prompt suggestion is displayed:
if (Hnq() &amp;&amp; K.suggestion)
  jnq(K.suggestion, _, _.toolUseContext.setAppState, !1, q)
//  ^ starts speculative execution of the predicted prompt</code></code></pre><p>The speculation runs with <code>querySource: "speculation"</code> and <code>forkLabel: "speculation"</code>, executing tools and collecting results while you&#8217;re still reading the suggestion.</p><h3>The Overlay Filesystem</h3><p>All file writes during speculation are redirected to an isolated sandbox:</p><pre><code><code>// ~/.claude/speculation/&lt;pid&gt;/&lt;speculation_id&gt;/
let z = LmT(O);  // path.join(Hy(), "speculation", String(process.pid), _)
await nn.mkdir(z, { recursive: true });</code></code></pre><p>On first write to any file, the original is copied to the overlay. All subsequent reads and writes for that path use the overlay copy. Your actual codebase is never modified during speculation.</p><p>If you accept the suggestion (hit Enter), overlay files copy back to the real filesystem and the speculated messages inject into your conversation:</p><pre><code><code>if (q &gt; 0) await eb$(f, O.current, pE());  // copy overlay &#8594; real FS
oo_(f);  // delete overlay directory</code></code></pre><p>If you type something different, the overlay is deleted. Nothing happened.</p><pre><code><code>N(`[Speculation] Aborting ${q}`);
K();  // abort the API call
oo_(LmT(q));  // rm -rf the overlay
return { ...T, speculation: Q8_ };  // reset to idle</code></code></pre><div><hr></div><h2>Permission Tiers</h2><p>Speculation doesn&#8217;t get carte blanche. Tools are divided into tiers:</p><pre><code><code>// Freely allowed (read-only):
tb$ = new Set(["Read", "Glob", "Grep", "ToolSearch", "LSP", "TaskGet", "TaskList"]);

// Redirected to overlay:
sb$ = new Set(["Edit", "Write", "NotebookEdit"]);</code></code></pre><p>During Speculation Read, Glob, Grep, ToolSearch, LSP, TaskGet, TaskListRuns freelyEdit, Write, NotebookEditRedirected to overlay; stops if not in acceptEdits modeBashRuns only if the command would already be auto-approved. Everything else, denied immediately, speculation halts.</p><p>When speculation hits a bash command that needs user approval, it creates a boundary and stops:</p><pre><code><code>if (P.name === "Bash") {
  let W = "command" in D &amp;&amp; typeof D.command === "string" ? D.command : "";
  if (!W || NmT({command: W}, IQ_(W)).behavior !== "allow")
    return N(`[Speculation] Stopping at bash: ${W.slice(0, 50)}`),
      cv_(q, () =&gt; ({boundary: {type: "bash", command: W, completedAt: Date.now()}})),
      R.abort(),
      VmT("Speculation paused: bash boundary", "speculation_bash_boundary");
}</code></code></pre><p>Hard limits prevent runaway speculation:</p><pre><code><code>ab$ = 20;   // max 20 tool-use turns
ob$ = 100;  // max 100 messages before forced abort</code></code></pre><p>Writes outside the working directory are unconditionally blocked:</p><pre><code><code>if (fG.isAbsolute(Z) || Z.startsWith("..")) {
  N(`[Speculation] Denied ${P.name}: path outside cwd: ${h}`);
  VmT("Write outside cwd not allowed during speculation", "speculation_write_outside_root");
}</code></code></pre><h3>Recursive Pipelining</h3><p>When a speculation completes, it doesn&#8217;t stop. It immediately generates the next suggestion and starts speculatively executing that too:</p><pre><code><code>if (w &amp;&amp; _.pipelinedSuggestion) {
  let { text: k, promptId: X, generationRequestId: W } = _.pipelinedSuggestion;
  N(`[Speculation] Promoting pipelined suggestion: "${k.slice(0, 50)}..."`);
  jnq(k, h, q, true);  // isPipelined = true &#8212; recursive
}</code></code></pre><p>Predict, execute, predict, execute. It tries to stay multiple steps ahead.</p><div><hr></div><h2>I Patched the Binary and Tested It</h2><p>The gate function is hardcoded off:</p><pre><code><code>Code omitted. Figure this one out yourself :)</code></code></pre><p>This is controlled server-side by <code>tengu_speculation</code>, &#8220;Tengu&#8221; being Claude Code&#8217;s internal codename, with feature flags managed via Statsig/GrowthBook. There&#8217;s no env var override. No user-facing setting. The function just returns false.</p><p>So I patched it.</p><pre><code><code>Omitting this code, too. Sorry :( </code></code></pre><p><em>For now</em>, it&#8217;s not suggesting creative work. It&#8217;s suggesting the operational stuff: testing, committing, documenting, pushing. The things developers have to do but don&#8217;t want to do. The things that interrupt flow.</p><p>With auto-permissions and speculation working together, the picture is: you finish building a feature. The suggestion says &#8220;run the tests.&#8221; You hit Enter and the results are already there. It suggests &#8220;commit this.&#8221; Enter. Done. &#8220;Open a PR.&#8221; Enter. Done.</p><p>You stay in the creative work. Claude handles the pipeline in the background.</p><div><hr></div><h2>Telemetry Confirms This Is Being Measured</h2><p>Every speculation emits structured telemetry:</p><pre><code><code>F("tengu_speculation", {
  speculation_id: _,
  outcome: T,               // "accepted", "aborted", "error"
  duration_ms: Date.now() - q,
  suggestion_length: K,
  tools_executed: Ynq($),
  completed: O !== null,
  boundary_type: O?.type,    // "bash", "edit", "denied_tool", "complete"
  time_saved_ms: P,
  message_count: z.length,
  is_pipelined: j            // chained speculation?
});</code></code></pre><p>Time saved is tracked cumulatively:</p><pre><code><code>speculationSessionTimeSavedMs   // per-session
totalSpeculationTimeSavedMs     // lifetime</code></code></pre><p>Acceptance rates. Boundary hit rates. Completion rates. Time saved per accepted speculation. This is all being instrumented. They&#8217;re measuring whether this delivers meaningful speedups before wider rollout.</p><p>This feature is likely still in testing. I&#8217;m excited for when they release it to the public! </p><div><hr></div><p><em>I did most of this work at 3am over a couple of nights. If I got something wrong or missed something, let me know in the comments.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><item><title><![CDATA[The Great Filter for Ideas]]></title><description><![CDATA[AI removed almost every barrier to creation. Where are the creations?]]></description><link>https://www.zerotopete.com/p/the-great-filter-for-ideas</link><guid isPermaLink="false">https://www.zerotopete.com/p/the-great-filter-for-ideas</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Thu, 19 Feb 2026 21:19:17 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!zsIR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zsIR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zsIR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zsIR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zsIR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zsIR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zsIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg" width="1024" height="572" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:572,&quot;width&quot;:1024,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:50528,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/188521809?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!zsIR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 424w, https://substackcdn.com/image/fetch/$s_!zsIR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 848w, https://substackcdn.com/image/fetch/$s_!zsIR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!zsIR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbdc51689-cb55-41f6-985c-0c1cfb7e48bb_1024x572.jpeg 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></p><p>In Arthur C. Clarke&#8217;s <em>Childhood&#8217;s End</em>, the Overlords arrive without warning. They are more advanced, more powerful, and more generous than anything humanity has encountered. They end war, eliminate poverty, and cure disease. Every external barrier to human flourishing, every obstacle we had spent millennia pointing to as the reason we couldn&#8217;t reach our potential, is systematically removed.</p><p>And then something unexpected happens. Humanity loses its momentum. Art production slows. Ambition gradually disappears. People are comfortable, healthy, and free, but they have stopped reaching for anything beyond comfort. The golden age arrives and the species discovers, too late, that the obstacles were never the source of the drive. The drive was something else entirely, something the Overlords could not provide and their gifts could not replace.</p><p>Clarke wrote that in 1953. Seventy years later, we didn&#8217;t need the Overlords from outer space. We built them ourselves. We just call it AI.</p><div><hr></div><p>I grew up reading Clarke, Asimov, Gibson. For most of my childhood, the idea that occupied me most was the oracle, the machine you could ask anything and receive the truth. I was so taken with the concept that my AIM screen name as a kid was th3oracl3, years before <em>The Matrix</em> put one on screen.</p><p>My brother still reminds me of this. He likes to say I was ahead of the curve, that I saw where technology was going before the people around us were thinking about it. I think the truth is simpler: I was a kid who believed that if you could ask the right questions, you could understand anything, and I desperately wanted the machine that would let me.</p><p>I spent years imagining what it would feel like to sit in front of a system that could answer whatever question was large enough to deserve asking, and in every version of that fantasy, the arrival of the oracle was the turning point. Humanity leapt forward. The species matured. We became what we were supposed to become.</p><p>A few years ago, something resembling the oracle arrived. We can ask it anything.</p><p>People are asking it how many calories are in a serving of broccoli.</p><div><hr></div><p>Democratization has been the central promise of the technology industry for as long as the industry has existed. Lower the barriers and people will build, create, participate. The argument has repeated at every turn, from the personal computer to the internet to open source to the smartphone: the reason most people aren&#8217;t building is that building is too hard, too expensive, too exclusive. Remove the friction and watch what happens&#8230;</p><p>For a long time, that story was convincing. You could point to real barriers: access to capital, access to information, access to technical skill, access to the networks of people who knew how to get things done. I believed it. Over the course of my life, I&#8217;ve met hundreds of people who carried ideas they genuinely cared about, the book they wanted to write, the app they wanted to build, the business they were certain would change their lives. And in nearly every case, nothing came of it. I assumed the barriers were to blame. It was the only explanation that made sense, because the alternative was too uncomfortable to consider.</p><p>Then AI arrived and dismantled almost every single barrier.</p><p>You no longer need capital to prototype a product. You no longer need a technical cofounder, or a design team, or a strategist, or a year of runway. The most powerful creative and analytical tool ever built is available to anyone with an internet connection, and the most capable version of it costs less than a gym membership.</p><p>Every person who told me they had a novel inside them can now sit with a collaborator of extraordinary patience and skill, for as long as they want, and write it. Every person who sketched an app idea on a napkin can build a working prototype in a weekend. The tool is here. The excuses have dissolved. The conditions for a creative explosion, by every measure we once used, have been met.</p><p>And almost nobody is shipping with it.</p><div><hr></div><h2>What If the Tools Were Never the Problem?</h2><p>A few weeks ago, a tweet from a developer named Jim Raptis caught my attention. He was responding to Paul Graham, who had written that in the AI age, taste would become the great differentiator, that when anyone can make anything, what matters is what you choose to make. Raptis replied simply: not a single person he knew in real life actually wanted to ship an app. These were his friends. Many of them worked in tech.</p><p>I have watched the same thing play out in my own circles. I know people, technical people, creative people, people with means and education and every structural advantage, who have talked about the same ideas for years. AI did not change them. It did not even accelerate them. The distance between who they are and who they said they would become, if only they had the tools, has not closed by a single inch.</p><p>For decades, we had a simple narrative: the impulse to create is universal, and the barriers are external. Remove the barriers and the floodgates open. AI removed them. The floodgates stayed shut. And once you&#8217;ve watched that happen, once you&#8217;ve sat with it long enough, you arrive at a question that the simple narrative has no room for.</p><p>What if the impulse to create is something closer to intrinsic, present in some people, absent in others, and unchanged by even the most powerful new technology? I am not talking about motivation, which comes and goes with circumstance. I mean something more permanent. A restlessness. A compulsion to make something exist that did not exist before. The kind of pull that keeps a person in front of a blank screen long after comfort has told them to stop.</p><p>If that compulsion is genuinely internal, then every tool ever created, regardless of how powerful, will leave the fundamental distribution unchanged. People who carry it will use the oracle to build. People who don&#8217;t will use it to answer questions about broccoli, faster and more efficiently than they could before.</p><div><hr></div><p>In 1950, the physicist Enrico Fermi sat at lunch with colleagues at Los Alamos and asked a question that has haunted anyone with their eye to the stars ever since. The universe is staggeringly vast and nearly fourteen billion years old. There are hundreds of billions of galaxies, each containing hundreds of billions of stars, many of them orbited by planets in conditions hospitable to life. By sheer probability, intelligent civilizations should be common. So where is everyone?</p><p>This is Fermi&#8217;s Paradox, and the most reasonable proposed explanation is something called the Great Filter. The idea is that somewhere between dead matter and a civilization capable of reaching the stars, there is a barrier that almost no species gets past. In the optimistic version, the filter is behind us: the leap from single cells to complex life was so improbable that we have already cleared the hardest part. In the terrifying version, the filter is ahead. Something intrinsic to intelligent life, something about what we are, prevents us from becoming what we could become, whether by our own hand or by the cold indifference of a universe that does not care how far a species has come before an asteroid, a gamma-ray burst, or its own self-destruction wipes it from the record.</p><p>For decades, the technology industry has operated under its own optimistic interpretation. The Great Filter for human creativity was external. It was resources, access, friction. Remove those things and the latent genius of humanity would bloom.</p><p>AI removed them. The bloom did not come.</p><div><hr></div><p>I should be transparent about my own position in this. I am one of the people for whom AI has been transformative. I started programming at thirteen. I studied computer science. I built companies and products across web, mobile, and VR. Then I spent years running a studio where my role shifted away from hands-on building, and development became a luxury I no longer had time for.</p><p>When AI tools became good enough to function as genuine collaborators, something came back. I built an entire website from scratch in five nights and a weekend, the kind of project that would have taken months with a team, completed solo and many times faster than I had ever worked before. I spent five months of spare time building a social platform from nothing. Ideas I had been carrying for years could finally become real, and the feeling of that return was electric.</p><p>But here is what I cannot look away from. I was building before AI. I was the kid who spent every available hour in the computer lab, making websites at seventeen, starting a company in college. AI did not create the impulse. It supercharged an impulse that was already there, one that has been present <a href="https://substack.com/home/post/p-183253515">since I was five years old, lying on the floor in front of a glowing green monitor, pressing keys to see what would happen</a>.</p><p>The people I know who are doing extraordinary things with AI were already doing things before AI. They carried the restlessness. They had whatever the unnamed thing is that makes someone sit down, face the blank screen, start, and most importantly, not stop until it is done.</p><p>The people who were not building before AI have the oracle now. Sadly, they are still not building and launching. The truth is that many of them are creating, tinkering, asking questions, generating outputs. But there is a vast distance between creating and shipping, between asking the oracle for answers and using those answers to put something real into the world. Almost no one seems to have an interest in crossing that distance.</p><div><hr></div><p>This is where the story of democratization curdles into something harder to look at.</p><p>If the filter is internal, if it was never about access, then each new wave of technological empowerment does something other than level the playing field. It tilts the field further. The people who were already building receive a jet engine. Everyone else has access to the same jet engine, but they choose to keep it in the garage.</p><p>There is an obvious counter to this, and it deserves acknowledgement. Companies everywhere are leveraging AI to build faster, increase margins, and create enormous value. Entire industries are being restructured around the technology. Surely that represents broad adoption?</p><p>But look closer. In most of these cases, employees are being directed by their employers to use AI to produce more output at lower cost, increasing profit margins for a select few. That is capitalism doing what capitalism does, allocating powerful tools toward the extraction of value. It is a different question entirely from whether individuals, given the same tools and the freedom to use them however they wish, will choose to create something of their own. The company using AI to cut costs and the person using AI to build a dream are not the same story, and conflating them only reinforces the question: who is this technology actually democratizing for?</p><p>Economists describe what happens when growth diverges rather than converges as a K-shaped economy. Wages split. Opportunity splits. The top of the K accelerates upward while the bottom drifts down, and the distance between them only grows.</p><p>I believe we are watching a K-shaped divergence in human capability, and AI is the hinge point. What should unsettle us most is the rate. This divergence is not the slow, grinding separation of wages over decades. AI compounds. The technology improves exponentially. The ecosystem of research, investment, tooling, and capability is steepening, and the people who already knew how to build are riding that curve toward the clouds while the rest of the world watches from the basement.</p><p>The unlock came. It just did not come for humanity at large. It came for the people who were going to build with or without it. For everyone else, the oracle is a slightly faster search engine.</p><p>And the technology industry, whose founding mythology depends on access as the bottleneck, has no language for this. No framework. No honest accounting. If the filter is us, if the thing preventing most people from building is something that lives inside the individual rather than inside the system, then the central promise Silicon Valley has been making for forty years requires serious revision. &#8220;We are democratizing creation&#8221; becomes a much more complicated sentence when you have to ask: democratizing it for whom?</p><div><hr></div><p>I do not have an answer. I am not sure anyone does yet.</p><p>It is possible the filter is more nuanced than a binary. Perhaps what we are calling drive is itself shaped by conditions, by childhood environments, by early exposure to making, by models of agency encountered at the right age. Perhaps the filter is cultural rather than innate, and can be taught, or at least cultivated. I hope so. The alternative is bleak in ways I do not think we have begun to reckon with.</p><p>But I find myself less certain than I used to be. The technology industry has spent four decades telling us that if we gave people the right tools, we would unlock something extraordinary in the human species. The tools have never been better. The unlock, for the vast majority, has not come. And that gap between what we promised and what actually happened is something we owe it to ourselves to sit with, uncomfortable as it is.</p><p>Clarke saw it seventy years ago. The Overlords gave humanity everything, and humanity discovered that everything was not enough. The gifts were sufficient. What was missing was the thing that makes a species reach, and that was never about the obstacles in the way.</p><p>We built the oracle. We gave it to everyone. </p><p><strong>And what that revealed was a story about us.</strong></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Stop feeding your AI agent junk tokens]]></title><description><![CDATA[Why I started using rtk, a CLI tool that cuts 89% of terminal noise before it reaches your model.]]></description><link>https://www.zerotopete.com/p/stop-feeding-your-ai-agent-junk-tokens</link><guid isPermaLink="false">https://www.zerotopete.com/p/stop-feeding-your-ai-agent-junk-tokens</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Tue, 17 Feb 2026 22:16:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!7uIY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7uIY!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7uIY!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7uIY!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7uIY!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7uIY!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7uIY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg" width="1456" height="813" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/c2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:813,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:2781803,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/188317001?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7uIY!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 424w, https://substackcdn.com/image/fetch/$s_!7uIY!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 848w, https://substackcdn.com/image/fetch/$s_!7uIY!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!7uIY!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fc2702556-f867-4751-aca0-ddad687399e0_2752x1536.jpeg 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>If you use Claude Code, Cursor, Aider, or any AI coding agent, there&#8217;s a problem you probably haven&#8217;t thought about: most of the tokens your agent consumes aren&#8217;t your code. They&#8217;re noise.</p><p>Every <code>git status</code>, every <code>cargo test</code>, every <code>ls -la</code>, the agent runs these commands, reads the full output, and stuffs it into the context window. That output is full of boilerplate, progress bars, formatting junk, and information the model doesn&#8217;t need.</p><p>The result? Your context window fills up faster. </p><h2>The numbers are kind of wild</h2><p>A typical 2-hour coding session involves around 60 CLI commands. That&#8217;s roughly 210K tokens of raw terminal output, enough to overflow a 200K context window on its own.</p><p>Here&#8217;s what that looks like in practice:</p><ul><li><p><code>cargo test</code> with all tests passing? ~4,800 tokens of output. The agent only needed to know &#8220;262 passed, 0 failed.&#8221;</p></li><li><p><code>git push</code>? 15 lines about enumerating objects, counting objects, delta compression. The agent needed: &#8220;pushed to main.&#8221;</p></li><li><p><code>ls -la</code>? Full permissions, timestamps, owner info. The agent just needed the file list.</p></li></ul><p>Most of this output is completely useless for the model&#8217;s reasoning. But it still eats your tokens, your rate limits, and your session length.</p><h2>rtk: a CLI proxy that fixes this</h2><p><a href="https://github.com/rtk-ai/rtk">rtk</a> (Rust Token Killer) is an open-source CLI tool that sits between your AI agent and your terminal. It intercepts command outputs and compresses them before they reach the context window.</p><p>It&#8217;s not doing anything <em>too</em> magical. It filters noise, groups related output, truncates redundancy, and deduplicates repeated lines. The kind of thing you&#8217;d do if you were manually cleaning up terminal output before pasting it into a prompt, except it happens automatically.</p><p>Some real examples:</p><ul><li><p><code>cargo test</code> output goes from ~4,800 tokens &#8594; 11 tokens. Just: <code>&#10003; cargo test: 262 passed</code></p></li><li><p><code>git push</code> goes from ~200 tokens &#8594; ~10 tokens. Just: <code>ok &#10003; main</code></p></li><li><p><code>git diff</code> goes from ~21,500 tokens &#8594; ~1,259 tokens. Keeps the actual changes, drops the noise.</p></li><li><p><code>git status</code> goes from ~120 tokens &#8594; ~30 tokens. Clean, grouped output.</p></li></ul><p>Across a real session of ~2,900 commands, rtk measured <strong>89% average noise reduction</strong>. That translates to roughly 3x longer sessions before you hit context limits or rate caps.</p><p>If you&#8217;re on a pay-per-token setup, this directly cuts your bill. If you&#8217;re on a flat-rate plan with caps, it stretches your limits.</p><h2>It works with Claude Code (and probably your tool too?)</h2><p>rtk is built and tested for Claude Code, that&#8217;s where the auto-rewrite hook lives and where it works out of the box. If you&#8217;re using other tools like Cursor, Aider, Gemini CLI, or Windsurf, you could likely get it working with some customization since the core idea is the same: compress CLI output before it hits the context window. But I&#8217;ve only tested it with Claude Code.</p><p>If you get rtk to work with tools other than Claude Code, please let me know in the comments.</p><h2>Installation (30 seconds)</h2><p><strong>Option 1: One-liner (Linux/macOS)</strong></p><pre><code><code>curl -fsSL https://raw.githubusercontent.com/rtk-ai/rtk/refs/heads/master/install.sh | sh</code></code></pre><p><strong>Option 2: Via Cargo</strong></p><pre><code><code>cargo install --git https://github.com/rtk-ai/rtk</code></code></pre><p><strong>Option 3: Pre-built binaries</strong></p><p>Download from <a href="https://github.com/rtk-ai/rtk/releases">GitHub Releases</a>, available for macOS (Intel + Apple Silicon), Linux, and Windows.</p><h2>Setup (one command)</h2><p>After installing, run:</p><pre><code><code>rtk init --global</code></code></pre><p>That&#8217;s it. This installs a hook that automatically rewrites your agent&#8217;s CLI commands to their rtk equivalents. You don&#8217;t need to change how you work. The agent runs <code>git status</code>, the hook transparently converts it to <code>rtk git status</code>, and the compressed output is what lands in the context window.</p><p>If you want to verify it&#8217;s working:</p><pre><code><code>rtk gain</code></code></pre><p>This shows you exactly how many tokens rtk has saved, broken down by command. You can also run <code>rtk gain --graph</code> for a visual breakdown over time.</p><h2>That&#8217;s it</h2><p>rtk is open source (MIT), written in Rust, and doesn&#8217;t phone home or require any accounts. It just compresses CLI output so your AI agent can focus on what matters.</p><p>GitHub: <a href="https://github.com/rtk-ai/rtk">github.com/rtk-ai/rtk</a></p><p>Website: <a href="https://www.rtk-ai.app/">rtk-ai.app</a></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[Why I use GPT as Claude Code’s Designated Hitter]]></title><description><![CDATA[How I add a second perspective inside of Claude Code using a custom skill]]></description><link>https://www.zerotopete.com/p/why-i-use-gpt-as-claude-codes-designated</link><guid isPermaLink="false">https://www.zerotopete.com/p/why-i-use-gpt-as-claude-codes-designated</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Fri, 30 Jan 2026 02:13:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!5qP7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!5qP7!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!5qP7!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5qP7!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5qP7!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5qP7!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!5qP7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:659261,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/186260119?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!5qP7!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 424w, https://substackcdn.com/image/fetch/$s_!5qP7!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 848w, https://substackcdn.com/image/fetch/$s_!5qP7!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!5qP7!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9aeed54c-d645-417a-b7d0-3b74a2cd908e_1456x1057.jpeg 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>A funny thing happens when you talk about AI in public long enough. People stop asking what you are building and start asking what you are using to build it.</p><p>Over the last few months, I have gotten the same question in different forms, over and over.</p><p>Should you only use Claude Code?</p><p>The short answer is that it&#8217;s what I primarily use, but it&#8217;s technically not the only thing I use.</p><h2>The thing people miss about Claude Code</h2><p>Claude Code is my primary driver. I spend around 99 percent of my time there. I pair it with Cursor when I need direct access to the codebase in an editor. That is the answer I usually give when people ask me about my setup.</p><p>What most people do not know is that I also use GPT-5.2 High.</p><p>I use it as a second brain that I can invoke when I hit a wall.</p><p>Yes, through Claude Code.</p><p>When you are stuck, the limiting factor is rarely Claude Code&#8217;s capabilities. It is perspective. You are anchored. Your assistant is anchored. You are both staring at the same tree, trying to understand the forest.</p><p>A different model, given a tight bundle of context, is often enough to loosen the knot.</p><p>So I built an escape hatch.</p><p>A Claude Code skill called <strong>askgpt</strong>.</p><p>When I invoke it, Claude packages up the relevant context. The error. The involved files. Any nearby code that matters. Plus whatever prompt I write. The skill sends that bundle to OpenAI. GPT responds. Claude takes that response into consideration, and I keep moving.</p><p>About 98 percent of the time, Claude Code handles everything. The remaining 2 percent is where I get stuck, and where Claude gets stuck with me. That is the segment this skill is for.</p><p>This post gives you all the files to install it.</p><div><hr></div><h2>How I think about tools</h2><p>I tend to align myself with technologies in their ascendency, because that is where momentum, leverage, and real progress tend to concentrate. The best tools are rarely perfect. They are simply the ones doing the most useful work at the right moment in time.</p><p>Claude Code, in my opinion, is one of those tools.</p><p>I think of this setup, with a GPT skill, as the way a baseball team thinks about a designated hitter.</p><p>Claude Code plays the full game. It fields. It runs. It thinks across innings. It holds the context. It does the hard, unglamorous work.</p><p>GPT comes in fresh, off the bench, with one job.</p><p>Hit.</p><p>No history. No fatigue. Just a clean swing at the problem in front of it.</p><p>Most of the time, you do not need that swing. When you do, it matters that it is there.</p><h1>Install</h1><h2>1) Choose where the skill lives</h2><p>Pick one:</p><p><strong>Personal skill (available everywhere):</strong></p><pre><code><code>mkdir -p ~/.claude/skills/askgpt/scripts
</code></code></pre><p><strong>Project skill (only in this repo):</strong></p><pre><code><code>mkdir -p .claude/skills/askgpt/scripts
</code></code></pre><div><hr></div><h2>2) Set your OpenAI API key</h2><p>macOS or Linux:</p><pre><code><code>export OPENAI_API_KEY="sk-..."</code></code></pre><p>To make it permanent, add the same line to <code>~/.zshrc</code> or <code>~/.bashrc</code>, then reload your shell.</p><div><hr></div><h2>3) Create the files</h2><p>You are creating three files:</p><ul><li><p><code>SKILL.md</code></p></li><li><p><code>requirements.txt</code></p></li><li><p><code>scripts/askgpt.py</code></p></li></ul><p>Copy and paste exactly.</p><div><hr></div><h2>File: <code>SKILL.md</code></h2><p>Create this at:</p><ul><li><p><code>~/.claude/skills/askgpt/SKILL.md</code><br>or</p></li><li><p><code>.claude/skills/askgpt/SKILL.md</code></p></li></ul><pre><code><code>---
name: askgpt
description:
  Send curated project context and a user prompt to OpenAI GPT-5.2
  using high reasoning effort. Use when debugging or when a second
  opinion is needed.
disable-model-invocation: true
allowed-tools: Bash
---

# askgpt

Run this skill only when explicitly invoked by the user.

## Instructions

1. Confirm the user&#8217;s prompt if it is not already clear.
2. Collect relevant context:
   - error messages or stack traces
   - the files directly involved
   - nearby code required for understanding
3. Bundle the prompt and context into a single text payload.
4. Run the script and pass the payload through stdin:

```bash
python3 scripts/askgpt.py
</code></code></pre><p>A note on that front matter: `disable-model-invocation: true` is the key. This keeps it from firing constantly. You invoke it when you want it.</p><h2>Output</h2><p>Return GPT&#8217;s response verbatim.</p><h2>File: <code>requirements.txt</code></h2><p>Create this at:</p><ul><li><p><code>~/.claude/skills/askgpt/SKILL.md</code><br>or</p></li><li><p><code>.claude/skills/askgpt/SKILL.md</code></p></li></ul><pre><code>openai&gt;=1.8.0</code></pre><h2>File: <code>scripts/askgpt.py</code></h2><p>Create this at:</p><ul><li><p><code>~/.claude/skills/askgpt/scripts/askgpt.py</code><br>or</p></li><li><p><code>.claude/skills/askgpt/scripts/askgpt.py</code></p></li></ul><pre><code><code>#!/usr/bin/env python3
import os
import sys

from openai import OpenAI

MODEL = os.getenv("ASKGPT_MODEL", "gpt-5.2")
REASONING_EFFORT = os.getenv("ASKGPT_REASONING_EFFORT", "high")

def main() -&gt; int:
    api_key = os.getenv("OPENAI_API_KEY")
    if not api_key:
        print("OPENAI_API_KEY is not set", file=sys.stderr)
        return 1

    payload = sys.stdin.read().strip()
    if not payload:
        print("No input received on stdin", file=sys.stderr)
        return 2

    client = OpenAI(api_key=api_key)

    response = client.responses.create(
        model=MODEL,
        input=payload,
        reasoning={"effort": REASONING_EFFORT},
        max_output_tokens=1200,
        text={"verbosity": "high"},
    )

    output_text = getattr(response, "output_text", None)
    if output_text:
        print(output_text.strip())
        return 0

    chunks = []
    for item in (response.output or []):
        for content in (item.content or []):
            if getattr(content, "type", "") == "output_text":
                chunks.append(content.text)

    print("\n".join(chunks).strip())
    return 0

if __name__ == "__main__":
    raise SystemExit(main())
</code></code></pre><div><hr></div><h2>Optional: make it executable</h2><pre><code><code>chmod +x ~/.claude/skills/askgpt/scripts/askgpt.py</code></code></pre><div><hr></div><h1>How to use it</h1><p>Restart Claude Code or open a new session.</p><p>Then write what you want as if you were messaging a strong engineer and add &#8220;ask gpt&#8221; to the prompt, along with:</p><ul><li><p>the goal</p></li><li><p>the symptom</p></li><li><p>the error or behavior</p></li><li><p>what you already tried</p></li><li><p>which files seem relevant</p></li></ul><p>Claude will package the context and run the script.</p><div><hr></div><h2>Closing</h2><p>I am going to keep talking about Claude Code because it is still where I spend my time. That is not changing anytime soon.</p><p>This skill is a small addition that makes my workflow more resilient. When the conversation gets long, when the codebase is messy, when the bug is stubborn, it gives me a second perspective without changing my environment.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[What It Means to Be a Builder in the Age of AI (Part 1)]]></title><description><![CDATA[On foundations, leverage, and what it really means to build now.]]></description><link>https://www.zerotopete.com/p/what-it-means-to-be-a-builder-in</link><guid isPermaLink="false">https://www.zerotopete.com/p/what-it-means-to-be-a-builder-in</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Mon, 26 Jan 2026 21:23:44 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!0KJ8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em><strong>This is part one of a three-part essay on what it means to build in the age of AI. Parts two and three, publishing this week, move from the near-term shifts already underway to the longer-term implications of where this is headed.</strong></em></p><div><hr></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!0KJ8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!0KJ8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0KJ8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0KJ8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0KJ8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!0KJ8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg" width="1456" height="1057" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/f9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1057,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:532940,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/183253515?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!0KJ8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 424w, https://substackcdn.com/image/fetch/$s_!0KJ8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 848w, https://substackcdn.com/image/fetch/$s_!0KJ8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!0KJ8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ff9e9f5b5-82f3-478c-bb5a-28245a331bdd_1456x1057.jpeg 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></p><p>Twice last month, three different people asked me the same question on TikTok: if I were eighteen today, knowing what we know now about AI, would I still go to college, and would I still study computer science?</p><p>I&#8217;ve been getting versions of this question for a while, and I understand why. A lot of people know me from social media. Some people see me here on Substack. I talk often about AI and building, and that naturally leads to curiosity about who I am, how I got here, and whether I&#8217;m speaking from experience or just surfing a wave.</p><p>What&#8217;s interesting is that the question has started coming from two directions.</p><p>Some people are asking as students, trying to decide what to study and how to prepare. Others are asking as founders, managers, and hiring leads, trying to understand how roles are changing and what they should actually be optimizing for when they build teams.</p><p>I was asked the same question again on my birthday, December 24th, via DM, and I had already planned to collect my thoughts and write about it during the holiday break.</p><p>A couple of days later, <a href="https://x.com/karpathy/status/2004607146781278521">Andrej Karpathy shared a post on X</a> that caught my attention. Karpathy is one of the most respected engineers of our generation, someone who has helped define modern machine learning and software practice. In the post, he wrote that he had never felt this far behind as a programmer.</p><p>He described the profession as being actively refactored, with the human contribution becoming more sparse and intermittent. He compared the moment to being handed a powerful, unfamiliar tool with no manual, and said the shift is already reshaping the profession.</p><div class="pullquote"><p>&#8220;Roll up your sleeves to not fall behind.&#8221;</p></div><p>I wish I could say I was surprised by that framing. I wasn&#8217;t.</p><p>I&#8217;ve been building with AI tools for several years now, well before they were reliable or fashionable. I&#8217;ve been an early adopter as a practitioner, using them to make myself a better engineer and a better builder. Things like agents, prompts, protocols, context management, skills, workflows, and IDE integrations. These are not abstract concepts to me. They are the tools I use, the ones I write about, and the ones I talk about publicly.</p><p>So when Karpathy articulated the feeling so plainly, it didn&#8217;t read like a revelation. It read like recognition.</p><p>I&#8217;m bringing him up because when someone like Karpathy says this out loud, the question about studying computer science stops being a purely personal choice. It becomes a question about what this work is turning into.</p><p>And that forces a second question right behind it. If the best engineers in the world feel the ground shifting, what should everyone else be optimizing for, both as learners and as employers?</p><p>I don&#8217;t think there&#8217;s a clean, universal answer. Anyone offering one is probably oversimplifying something that&#8217;s still unfolding.</p><p>What I can offer is my own path. Not as a prescription, and not because it generalizes cleanly, but because it&#8217;s the only place I can speak from honestly.</p><p>Before I try to answer whether I&#8217;d still go to college, study computer science, or how I think about hiring today, it&#8217;s worth explaining how I got here. What I was optimizing for at the time. What I didn&#8217;t know yet. And what ended up mattering more than I expected.</p><p>AI is what brings this question up. Evolution and preparation are what it&#8217;s really about. Roles are changing. Skills are shifting. The work itself is being reshaped. And the way you position yourself, whether you are learning or hiring, is becoming the real differentiator.</p><p>So let me start at the beginning and work my way toward an answer.</p><h2>The Old Arc of Computer Science</h2><p>For most of my life, the arc of computer science was obvious. Progress was relentless. The surface area kept expanding. There was always more to learn, and the hierarchy of skill made sense. If you wanted to become a better engineer, you studied the details. Languages, protocols, syntax, systems, tools. You learned what was true, what was brittle, what was elegant, what was dangerous. You accumulated competence slowly, with scars.</p><p>Up until about two years ago, my answer would have been an emphatic yes. You should absolutely study computer science. If you enjoy puzzles, math, problem solving, critical thinking, building things, and taking on hard challenges, it was one of the most powerful skill sets you could acquire. It gave you leverage and range and a kind of quiet authority in a world increasingly built out of invisible rules.</p><p>Building felt like a superpower.</p><h2>The Blinking Cursor</h2><p>When I tell people I fell in love with computers at five years old, they usually don&#8217;t believe me. This was the late 80s. Computers weren&#8217;t lifestyle products. They were strange and intimidating.</p><p>The first computer I remember clearly was at my uncle&#8217;s house on Long Island, and the scene is lodged in my head the way certain childhood memories stay lodged: dim light, a kind of hush, the feeling that you&#8217;re awake at the wrong hour. The computer was on. The monitor glowed with a fuzzy, cinematic green. A blinking cursor sat there like a dare, like something I wasn&#8217;t supposed to touch.</p><p>It was Christmas Eve, and also my birthday. I should have been doing normal kid things. Instead I lay on the floor in front of the monitor and started pressing keys. Not with a plan, just with the instinct that something was waiting on the other side of the screen. My uncle showed me a few commands, some little combinations I could type that made the machine respond. I don&#8217;t remember what they were and it doesn&#8217;t matter. What mattered was the feeling: the computer wasn&#8217;t entertainment, it was a door. The cursor was a handle.</p><p>My family kept pulling me away for dinner, presents, dessert, and I kept running back.</p><h2>Finding a Way In</h2><p>I grew up in a modest household. We didn&#8217;t have much money, and as obsessed as I was with computers, we couldn&#8217;t afford one at home. So I used the ones at school. I&#8217;d sign myself up for every computer lab session I could, lingering whenever I was allowed, finding excuses to stay a little longer. That was how I got my fix.</p><p>By the time I finally had a computer of my own, around twelve, it felt less like receiving a device and more like being handed a private room inside the world. A place that was vast and open, but finally accessible. It felt like the keys were already there. I just didn&#8217;t know where they were yet. Now I had the time to look.</p><p>The following year, an uncle of mine, who ran a computer sales and repair business, asked if I wanted anything from a computer show he was going to. I told him I wanted books. He came back with a C++ book.</p><p>I had no formal programming background and no sense of how fast or slow I was supposed to move. I worked through it at my own pace, learning fundamentals, experimenting, and trying to get the machine to do what I wanted. Conditionals. Loops. The basic idea that logic could turn into behavior.</p><p>That was the first time the cursor stopped feeling like a dare and started feeling like an invitation. I wasn&#8217;t just pressing keys anymore. I was beginning to understand how things fit together.</p><h2>Finding My People</h2><p>When I was fifteen, I watched <em>Hackers</em> in ninth grade, and something clicked. It wasn&#8217;t just curiosity anymore. It felt like a door opening.</p><p>I started reading <em>2600: The Hacker Quarterly</em>. I wandered into parts of the internet I didn&#8217;t fully understand. I downloaded scripts and programs that promised disruption: the digital equivalent of firecrackers. I was a script kiddie in the most literal sense. I didn&#8217;t really know what I was doing, but I knew what it gave me.</p><p>It expanded my world. I grew up in a small, unassuming suburb on Long Island, and suddenly there was a much bigger universe to explore. One where geography mattered less, where ideas traveled faster than people, and where curiosity felt like an advantage instead of a distraction.</p><p>I had a few friends who shared the fascination. We weren&#8217;t building companies or thinking about careers. We were learning how this world worked: its language, its culture, its norms. We were figuring out how people who understood machines thought, moved, and saw the world.</p><p>Looking back, a lot of it was naive and silly. But it mattered. For someone whose world had been pretty small, it was awakening in the only way that really counts: it made my universe feel expandable.</p><h2>Flash, or the First Time It All Clicked</h2><p>By seventeen, I was making websites with HTML and CSS. Then I discovered Flash.</p><p>Flash was a turning point because it let me combine things that had felt separate until then. Code and design. Logic and motion. It wasn&#8217;t just about making something work, it was about how it moved, how it felt, how people experienced it. I picked up ActionScript because I had to. There was something I wanted to build, and that was the tool in the way.</p><p>I started building websites for bands, beginning with my own. That eventually led to doing early web work for Taking Back Sunday, the last Flash project I ever shipped.</p><p><strong>Building wasn&#8217;t something I thought of as a skill I was acquiring. It was how I showed up in the world, a way of thinking that reduced things to problems and solutions, and a habit of turning ideas into useful things.</strong></p><h2>Why Software Felt Too Obvious</h2><p>Around that time, I was intentionally keeping a lot of doors open. I was playing in a touring band, working at a small software agency on Long Island, and moving through college without rushing to commit.</p><p>I didn&#8217;t start in computer science. I first moved between political science and graphic design, not because I lacked direction, but because I wasn&#8217;t ready to narrow my world too early.</p><p>Software, oddly enough, didn&#8217;t feel like the obvious answer. It was the thing I did for enjoyment. The place where time disappeared. Turning it into a profession felt almost too easy, like confusing comfort with conviction.</p><p>What&#8217;s easy to miss is that even while I was exploring academically, I was learning at a very real pace. At the software company, I worked on production software for municipalities, systems people actually depended on. I could see how decisions became outcomes.</p><p>I found the work deeply engaging. I was growing quickly. And still, it didn&#8217;t feel inevitable.</p><p>At that age, I assumed that whatever I committed to would need to feel hard in a different way.</p><p>Software felt obvious. And that made me hesitate.</p><h2>Learning How to Think</h2><p>Eventually, I made a choice. I transferred to Stony Brook to study computer science. It was the strongest program on Long Island, and I knew it would force clarity.</p><p>Up to that point, most of my relationship with computing had been intuitive. As a kid, it was curiosity. In my early work, it was instinct and experimentation. I could make things work, but I didn&#8217;t always understand why they worked, or how they would behave when conditions changed.</p><p>At Stony Brook, the work forced me to think differently.</p><p>Math and computer science trained me to reason in terms of correctness instead of confidence. Either something worked or it didn&#8217;t. Either a solution was valid or it wasn&#8217;t. There was no room for hand-waving or vibes.</p><p>Algorithms taught me how to think step by step, how to reason about efficiency, tradeoffs, and scale. Compilers and operating systems taught me how abstraction really works, and why building anything meaningful requires time, discipline, and a solid foundation underneath it.</p><p>That way of thinking didn&#8217;t stay in the classroom. Over time, I learned to step back from individual problems and see the systems underneath them, along with the constraints that actually determined what was possible.</p><p>I gravitated toward a small group of people in the applied math, computer science, and physics programs who operated with that same clarity. Not louder. Not more performative. Just more precise. Conversations with them were grounding. Ideas had to stand up on their own.</p><p>Being around that recalibrated me. It showed me how much of what we call intelligence later in life is often a mix of drive, presentation, and stamina. Those things matter. But they are not the same as the deeper kind, the kind that holds under scrutiny and keeps working when conditions change.</p><p>Computer science was hard, but not in the way I expected. The difficulty wasn&#8217;t endurance. It was precision. And in committing to it, I got something I didn&#8217;t know I was asking for: a framework for thinking that I still rely on today.</p><h2>Learning How to Ship</h2><p>Computer science taught me how to think clearly. Engineering taught me how to apply that thinking in the real world, with other people, under constraints that didn&#8217;t care about elegance.</p><p>I still remember the first pull request I ever opened. Until then, my code had mostly been mine. Suddenly, someone else had to read it, understand it, and decide whether it belonged. Correctness wasn&#8217;t enough anymore. Clarity mattered. Context mattered. I had to explain not just what I did, but why.</p><p>Reviewing someone else&#8217;s code flipped that perspective again. Now I was responsible for more than my own work. I had to learn how to give feedback that improved something without rewriting it in my own image. How to disagree without blocking progress.</p><p>Then came the first time something I built actually scaled.</p><p>The system worked. Then it got used. Load increased. Edge cases appeared. Behavior changed in ways I hadn&#8217;t anticipated. Problems stopped being purely technical and started involving users, timing, and tradeoffs. That was when it really clicked that engineering isn&#8217;t just applied computer science. The system includes people, expectations, and entropy.</p><p>This became real for me early on as a mobile engineer at Booz Allen Hamilton, building native iOS and Android applications. Shipping real products meant balancing performance, reliability, security, and user experience at the same time. There was rarely a single correct answer. There was only what worked well enough, for the right reasons, under the right constraints.</p><p>As I took on more responsibility, the work expanded again. Building software was no longer just about what I could produce myself. It became about building teams, reviewing work, setting standards, and helping other engineers succeed. I had to learn how to multiply my impact without becoming a bottleneck.</p><p>Looking back, this is what I needed computer science for.</p><p>It gave me rigor. It gave me a way to reason about systems, correctness, and foundations. Engineering taught me judgment. Together, they let me build things that could survive contact with the real world.</p><h2>Why I Build</h2><p>I&#8217;ve always been a builder. My family spent nearly a century in construction, building homes on Long Island. I grew up around the idea that you can take nothing and use your talents to turn it into something of value.</p><p>For me, the materials were abstract. Logic. Language. Systems. I used more brain than muscle.</p><p>The deeper reason was simple. I wanted to turn ideas into real things. I wanted to bring something into the world that did not exist before. At the time, computer science felt like the most reliable way to do that.</p><p>That instinct has never really changed. Builders build because it is part of who they are. They are uncomfortable leaving ideas unformed. They feel incomplete until something imagined becomes tangible. It is not about titles or tools. It is about the need to make, to shape, to bring a vision into the world and see it hold up.</p><p>Everything else came later. Product. Business. Leadership. Starting my own studio.</p><p>But the throughline was always the same. I was building.</p><h2>Why I&#8217;m Telling You All This</h2><p>I want to be clear about why I&#8217;m sharing this context.</p><p>This is not an &#8220;AI changed my life last week&#8221; story. I&#8217;ve lived through multiple eras of building. Web. Mobile. VR. I&#8217;ve watched tools rise and disappear. I&#8217;ve watched entire ecosystems collapse. More than once, I&#8217;ve had to rebuild my sense of identity around a new set of languages, tools, and technologies.</p><p>After Booz Allen Hamilton, I became head of product at a Techstars-backed startup as one of the first employees. We built live sports experiences for FOX, BBC, NFL, FIFA, and the NCAA. We were early in social VR for live entertainment, early enough to watch Facebook and Oculus move into the space and reshape it entirely. That work didn&#8217;t vanish. Much of what we built was later <a href="https://www.cosm.com/news/cosm-rebrands-livelike-vr-to-cosm-immersive/">acquired by COSM</a>. When people experience COSM today, they&#8217;re touching work that traces back to that era.</p><p>After that, I joined Big Human as head of product, inside the same environment that incubated Vine and HQ Trivia, working with startups and Fortune 500 companies to bring products to market.</p><p>Not long after, I left and started my own branding and software studio, which I&#8217;ve owned and run for the last five years.</p><p>That sentence compresses a long and demanding chapter into a single line, which doesn&#8217;t really do it justice. What matters for this story is how my role changed over time.</p><p>Running the studio meant leading product strategy, managing projects, selling, hiring, managing teams and clients, absorbing risk, and doing the many unglamorous things solo founders end up doing.</p><p>I never billed myself as a hands-on engineer at my studio. I hired people who were better than me and should have been. I led systems, architecture, and technical direction, and I could step in when needed, but my day-to-day reality shifted.</p><p>Over the last decade, I barely coded.</p><p>Development felt like a luxury.</p><p>And that&#8217;s what makes what happened next matter.</p><h3>Where This Is Going</h3><p>I&#8217;ve spent this time walking through my background because the moment we are in now does not exist in isolation. It sits on top of decades of assumptions about what it means to build, to learn, and to take this work seriously.</p><p>For most of my career, building required scarcity. Time mattered. Skill accumulation mattered. The distance between an idea and something real was long enough that many ideas never survived it. That distance shaped education, careers, and the way we measured competence.</p><p><strong>That distance has changed.</strong></p><p>In the next part, I want to talk about what it felt like when it did, and why that change matters. Not just for people already working in software, but for anyone trying to decide what to study, what to practice, and what to optimize for now.</p><p>I&#8217;ll describe how AI changed my relationship to building in a very practical way, how it shifted the bottleneck upstream, and why the people seeing the most leverage today tend to combine systems thinking, design sensibility, product judgment, and a real understanding of how humans actually use what we build.</p><p>That shift has implications for how we think about computer science and software development, and for what kind of foundation still holds when tools accelerate this quickly. That&#8217;s where the real answer to the original question begins.</p><div><hr></div><p><em>In part two, I&#8217;ll explain what happened when AI gave me back a kind of building power I hadn&#8217;t felt in years, and why that experience reshaped how I think about computer science, software development, and preparation for what&#8217;s coming next.</em></p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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"><strong>Thanks for reading Zero to Pete. Subscribe to read part two and three of this series.</strong></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[Give Claude Code eyes and hands on your Figma design files using MCP]]></title><description><![CDATA[Why I stopped being the translation layer between Figma and Claude Code]]></description><link>https://www.zerotopete.com/p/give-claude-code-eyes-and-hands-on</link><guid isPermaLink="false">https://www.zerotopete.com/p/give-claude-code-eyes-and-hands-on</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Tue, 13 Jan 2026 21:31:14 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!tEBe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tEBe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tEBe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 424w, https://substackcdn.com/image/fetch/$s_!tEBe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 848w, https://substackcdn.com/image/fetch/$s_!tEBe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 1272w, https://substackcdn.com/image/fetch/$s_!tEBe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tEBe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:284825,&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://www.zerotopete.com/i/184478325?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.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_!tEBe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 424w, https://substackcdn.com/image/fetch/$s_!tEBe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 848w, https://substackcdn.com/image/fetch/$s_!tEBe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.png 1272w, https://substackcdn.com/image/fetch/$s_!tEBe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1105272a-180e-4d41-8a0b-e2987ea92cfb_2912x2096.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>If you&#8217;re still uploading screenshots and writing paragraphs explaining your UI to Claude Code, you&#8217;re working way too hard.</p><p>A few days ago, I was talking to a friend who built an entire product with Claude Code. Took them only a few months to get the product ready for market. Impressive stuff, especially given that they are not engineers.</p><p>But the way they described building it was very April 2025.</p><p>Screenshot. Upload. &#8220;This button is 16px from the edge. The background is #F5F5F5. The card has 24px padding and a 12px border radius. The font is Helvetica Neue at 14px...&#8221;</p><p>That works. It&#8217;s also super slow and error prone.</p><p>There&#8217;s a better way&#8230;</p><h2>What Figma MCP Actually Does</h2><p>MCP stands for Model Context Protocol, an open standard for how AI tools connect to external data sources.</p><p>Figma&#8217;s MCP server exposes your design files directly to Claude Code. Not as screenshots. As structured data: layer hierarchy, spacing values, typography scales, color tokens, component properties, layout constraints, etc. </p><p>Instead of Claude guessing what your design looks like from a screenshot, or having to granularly describe the design file, it reads the actual Figma file. It knows that button uses your <code>primary-500</code> color token. It knows that card has <code>auto layout</code> with <code>16px</code> gap. It knows which components are instances of your design system.</p><h2>The Setup (Under 5 Minutes)</h2><p>You have two options: <strong>Remote</strong> or <strong>Desktop</strong>.</p><h3>Option A: Remote Server (Easiest)</h3><p>No Figma desktop app required. Works with just a link.</p><pre><code><code>claude mcp add --transport http figma https://mcp.figma.com/mcp
</code></code></pre><p>Restart Claude Code. Run <code>/mcp</code>, select <code>figma</code>, and authenticate with your Figma account.</p><h3>Option B: Desktop Server (More Powerful)</h3><p>Requires the Figma desktop app, but gives you selection-based prompting&#8212;select a frame in Figma, and Claude already knows what you&#8217;re working on.</p><ol><li><p>Open Figma desktop &#8594; Preferences &#8594; Enable Dev Mode MCP Server</p></li><li><p>You&#8217;ll see a confirmation that it&#8217;s running at <code>http://127.0.0.1:3845/mcp</code></p></li><li><p>Add to Claude Code:</p></li></ol><pre><code><code>claude mcp add --transport http figma-desktop http://127.0.0.1:3845/mcp
</code></code></pre><p>Restart Claude Code. Verify with <code>/mcp</code>.</p><p>The desktop server is selection-based. Whatever you select in Figma becomes the context. The remote server is link-based - you paste a Figma URL into your prompt.</p><p>I use both. Remote for quick access and desktop when I&#8217;m deep in a build.</p><h2>The Three-Step Workflow</h2><h3>Step 1: Solid Figma Designs</h3><p>This is the unglamorous prerequisite. Figma MCP is only as good as the file it reads.</p><p>What &#8220;good&#8221; looks like:</p><ul><li><p><strong>Auto Layout everywhere.</strong> This is how Claude understands responsive intent.</p></li><li><p><strong>Components for reusable elements.</strong> Buttons, cards, inputs - anything used twice should be a component.</p></li><li><p><strong>Variables for design tokens.</strong> Colors, spacing, radius, typography. Named semantically.</p></li><li><p><strong>Semantic layer names.</strong> <code>CardContainer</code> tells Claude something. <code>Group 47</code> tells it nothing.</p></li></ul><p>If your Figma file is a mess, random frames, no auto layout, hardcoded colors, Claude will still generate code. But you&#8217;ll spend more time fixing it than you saved.</p><p>The cleaner the file, the closer to production-ready the output.</p><h3>Step 2: Connect and Authenticate</h3><p>Described, above. </p><h3>Step 3: Prompt with Context</h3><p>Here&#8217;s where the magic happens.</p><p><strong>Remote server:</strong></p><blockquote><p>Convert this Figma design to React with Tailwind: [paste Figma link]</p></blockquote><p><strong>Desktop server:</strong> Select your frame in Figma, then:</p><blockquote><p>Implement my current Figma selection as a React component using Tailwind.</p></blockquote><p>That&#8217;s it. Claude reads the design structure, pulls the tokens, and generates code.</p><h2>What Claude Actually Gets from Figma</h2><p>The MCP server exposes several tools. Understanding them helps you prompt better.</p><p><code>get_design_context</code>: The main one. Returns structured XML of your selection: layer hierarchy, positions, sizes, styles, component properties. Default output is React + Tailwind, but it adapts to your project.</p><p><code>get_variable_defs</code>: Returns all variables and styles used in your selection. Colors, spacing, typography tokens. Useful for implementing design tokens you haven&#8217;t added to your codebase yet.</p><p><code>get_code_connect_map</code>: If you&#8217;ve set up Code Connect (more on this below), returns the mapping between Figma components and your actual code components. This is how Claude knows to use <em>your</em> Button, not generate a new one.</p><p><code>take_screenshot</code>: Captures your selection visually. Claude uses this to verify layout fidelity. Adds tokens but improves accuracy.</p><p><code>create_design_system_rules</code>: Generates a rules file that teaches Claude your conventions: token naming, folder structure, component patterns. Run this once and save it.</p><h2>The Secret Weapon: Code Connect</h2><p>Here&#8217;s what separates &#8220;pretty good&#8221; output from &#8220;production-ready.&#8221;</p><p>Code Connect links your Figma components to actual code components in your repository. When Claude sees a Button instance in Figma, it doesn&#8217;t generate a new button&#8212;it imports <em>your</em> Button from <em>your</em> component library.</p><p>Two ways to set it up:</p><p><strong>Code Connect UI</strong> (easier): Inside Figma, connect to your GitHub repo and link components visually. Good for design-heavy teams.</p><p><strong>Code Connect CLI</strong> (more powerful): Define mappings in your codebase with property mappings and code snippets. The MCP server then includes your exact implementation patterns.</p><p>Without Code Connect, Claude is guessing which components to use. With it, Claude knows exactly which imports to reach for.</p><p>This is the difference between &#8220;rebuild everything from scratch&#8221; and &#8220;extend my existing system.&#8221;</p><h2>Teaching Claude Your Codebase</h2><p>The MCP server knows your Figma file. It doesn&#8217;t know your codebase.</p><p>Fix this with your <code>CLAUDE.md</code> (for example): </p><pre><code><code>## Figma Integration

When implementing Figma designs:

1. Use `get_design_context` to read the design structure
2. Use `get_variable_defs` if you need token definitions
3. Always check for Code Connect mappings before creating new components

### Project Conventions
- Components live in `src/components/`
- Design tokens are in `src/styles/tokens.css`
- Use existing components from our design system before creating new ones
- All spacing uses our defined tokens: `space-1` through `space-12`

### Framework
- React 18 with TypeScript
- Tailwind CSS
- All components should be functional with proper TypeScript interfaces
</code></code></pre><p>This context compounds. The more you define, the more consistent Claude&#8217;s output.</p><p>You can also run the <code>create_design_system_rules</code> tool once, it generates a rules file based on your existing codebase that Claude can reference.</p><h2>The Compound Effect</h2><p>When the cost of translating designs drops to near-zero, you translate more. When you translate more, you iterate faster. When you iterate faster, you ship more!</p><p>Figma MCP gets you to 80% instantly. You iterate your way to 95%.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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">If this was useful, subscribe. Thanks for reading Zero to Pete.</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><p></p>]]></content:encoded></item><item><title><![CDATA[How the Creator of Claude Code Ships with Claude Code]]></title><description><![CDATA[Boris Cherney's 10 tips for working in Claude Code, 3 of which I hadn't covered.]]></description><link>https://www.zerotopete.com/p/how-the-creator-of-claude-code-ships</link><guid isPermaLink="false">https://www.zerotopete.com/p/how-the-creator-of-claude-code-ships</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Tue, 06 Jan 2026 13:02:56 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pBvx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pBvx!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pBvx!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 424w, https://substackcdn.com/image/fetch/$s_!pBvx!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 848w, https://substackcdn.com/image/fetch/$s_!pBvx!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 1272w, https://substackcdn.com/image/fetch/$s_!pBvx!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pBvx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:47769,&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://www.zerotopete.com/i/183636969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.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_!pBvx!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 424w, https://substackcdn.com/image/fetch/$s_!pBvx!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 848w, https://substackcdn.com/image/fetch/$s_!pBvx!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.png 1272w, https://substackcdn.com/image/fetch/$s_!pBvx!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F37b0cac5-00b7-4e26-8fa3-0feb75f569d1_2912x2096.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>Over the holidays, <strong>Boris Cherney</strong>, the creator of Claude Code, posted a thread that made me feel two things at once: validated, and slightly behind.</p><p>The headline was simple. In the last 30 days, every code change he shipped to Claude Code was written by Claude Code itself.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7gFQ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7gFQ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 424w, https://substackcdn.com/image/fetch/$s_!7gFQ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 848w, https://substackcdn.com/image/fetch/$s_!7gFQ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 1272w, https://substackcdn.com/image/fetch/$s_!7gFQ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7gFQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png" width="1456" height="342" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:342,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:259064,&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;:false,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/183636969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.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_!7gFQ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 424w, https://substackcdn.com/image/fetch/$s_!7gFQ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 848w, https://substackcdn.com/image/fetch/$s_!7gFQ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 1272w, https://substackcdn.com/image/fetch/$s_!7gFQ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0ac2c2ec-a8e9-4c8b-9a69-baf974a5f55a_2088x490.png 1456w" sizes="100vw"></picture><div></div></div></a></figure></div><p>He included the stats, hundreds of pull requests, hundreds of commits, tens of thousands of lines, but they weren&#8217;t the point. He was still doing the work, just at a different layer, guiding a system capable of extending itself.</p><p>A few days later, he followed that post with something far more useful: ten concrete practices that make this way of working possible. No grand theory. Just a collection of tips for how he actually works, day to day.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!aGRV!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!aGRV!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 424w, https://substackcdn.com/image/fetch/$s_!aGRV!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 848w, https://substackcdn.com/image/fetch/$s_!aGRV!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 1272w, https://substackcdn.com/image/fetch/$s_!aGRV!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!aGRV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png" width="1456" height="672" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:672,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:518079,&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;:false,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/183636969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.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_!aGRV!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 424w, https://substackcdn.com/image/fetch/$s_!aGRV!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 848w, https://substackcdn.com/image/fetch/$s_!aGRV!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 1272w, https://substackcdn.com/image/fetch/$s_!aGRV!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0f83a4fe-ea55-4862-b292-ab50c71295b4_2092x966.png 1456w" sizes="100vw"></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>Most of them I was already doing, and had written about here. But three stood out, two of them I started doing a month or so ago, and another one I recently started doing after reading his tips. </p><h2>The Seven I&#8217;ve Already Covered</h2><p>The tips I&#8217;ve talked about before:</p><ol><li><p><strong>Run multiple Claudes in parallel:</strong> I typically run 4 terminal sessions. Boris runs 5 with numbered tabs and system notifications.</p></li><li><p><strong>Use Opus 4.5 for everything:</strong> He says it&#8217;s the best coding model he&#8217;s ever used. Slower than Sonnet, but you steer it less, so it&#8217;s faster in practice.</p></li><li><p><strong>Share a team CLAUDE.md:</strong> Their whole team contributes to one file in git. My addition: use <code>CLAUDE.local.md</code> for personal overrides.</p></li><li><p><strong>Start sessions in Plan mode:</strong> <code>shift+tab</code> twice. Go back and forth on the plan until you like it, then switch to auto-accept and let Claude one-shot it.</p></li><li><p><strong>Use subagents:</strong> Automate your common workflows. Code simplifier, test runner, whatever you do on most PRs.</p></li><li><p><strong>Use slash commands:</strong> Every &#8220;inner loop&#8221; workflow should be a command. Boris uses a custom slash command <code>/commit-push-pr</code> dozens of times a day. I&#8217;ve been using a skill for this, but honestly, it makes more sense to create a slash command for this purpose.</p></li><li><p><strong>Use /permissions instead of --dangerously-skip-permissions: </strong> Pre-allow safe commands. Check them into <code>.claude/settings.json</code>.</p></li></ol><p>If you want deep dives on any of these, check out my recent articles. They&#8217;re there.</p><p>Now here&#8217;s what I haven&#8217;t talked about yet&#8230;</p><h2>1. Parallel Browser and Local Claudes</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!piDd!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!piDd!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 424w, https://substackcdn.com/image/fetch/$s_!piDd!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 848w, https://substackcdn.com/image/fetch/$s_!piDd!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 1272w, https://substackcdn.com/image/fetch/$s_!piDd!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!piDd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png" width="480" height="170" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:170,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:58865,&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://www.zerotopete.com/i/183636969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.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_!piDd!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 424w, https://substackcdn.com/image/fetch/$s_!piDd!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 848w, https://substackcdn.com/image/fetch/$s_!piDd!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 1272w, https://substackcdn.com/image/fetch/$s_!piDd!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0fdd4a14-49e8-4238-8253-3d4ec025b363_480x170.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Boris runs five local Claude Code sessions in his terminal. I usually run four. But on top of that, he runs five to ten Claudes in the browser at <code>claude.ai/code</code>, simultaneously, and moves work between them.</p><p>Two commands make this possible:</p><p><strong>The </strong><code>&amp;</code><strong> prefix</strong>: sends a task from your terminal to run in the cloud.</p><pre><code><code>&amp; refactor the auth middleware to support token rotation</code></code></pre><p>This offloads the task to claude.ai/code. Your local terminal is free immediately. The task runs asynchronously in the browser.</p><p><strong>The </strong><code>--teleport</code><strong> flag</strong>: pulls a browser session back to your local terminal with full context.</p><pre><code><code>claude --teleport &lt;session-id&gt;</code></code></pre><p>You can start a task on mobile, let it run while you&#8217;re offline, and pick it up on your laptop later. Nothing feels handed off or lost.</p><h3>Setup Required (Don&#8217;t Skip This)</h3><p>If you try the <code>&amp;</code> command without setup, you&#8217;ll see this:</p><pre><code><code>Cannot launch remote Claude Code session.

No environments available, please ensure you've gone through onboarding at claude.ai/code

The Claude GitHub app must be installed on this repository first.</code></code></pre><p>Here&#8217;s the fix:</p><p><strong>Step 1: Install the Claude GitHub App</strong></p><p>Go to: <a href="https://github.com/apps/claude/installations/new">https://github.com/apps/claude/installations/new</a></p><ul><li><p>Select your GitHub account</p></li><li><p>Choose which repos to grant access to (or &#8220;All repositories&#8221;)</p></li><li><p>Click &#8220;Install &amp; Authorize&#8221;</p></li></ul><p><strong>Step 2: Complete onboarding at claude.ai/code</strong></p><p>Visit <a href="https://claude.ai/code">https://claude.ai/code</a> and follow the prompts. You&#8217;ll connect your GitHub account and create your first cloud environment.</p><p><strong>Step 3: Create a cloud environment</strong></p><p>You&#8217;ll see three network access options:</p><ul><li><p>None: Blocks all internet</p></li><li><p>Trusted: Downloads packages from verified sources only</p></li><li><p>Full: Unrestricted internet</p></li></ul><p>Pick based on your paranoia level. &#8220;Trusted&#8221; is fine for most work. If you&#8217;re working on a public repo with no secrets, &#8220;Full&#8221; lets Claude access any URL it needs. If you&#8217;re paranoid about exfiltration, use &#8220;None.&#8221;</p><p>You can create multiple environments with different settings and switch between them.</p><p><strong>Step 4: Verify</strong></p><p>Back in your terminal:</p><pre><code><code>&amp; take a screenshot of the repo structure</code></code></pre><p>If it launches a web session, you&#8217;re good.</p><p>At 10-15 parallel Claude instances, you stop working with an assistant. You start managing a distributed team.</p><p><strong>One caveat:</strong> Claude Code on the web runs with <code>--dangerously-skip-permissions</code> by default. That&#8217;s the point, it&#8217;s sandboxed, so Claude can move fast without asking permission for every bash command. But it means you&#8217;re trusting the sandbox. For most repos, that&#8217;s fine. For repos with production secrets, think twice about the &#8220;Full&#8221; network option. Read more about this, below:</p><ul><li><p><a href="https://simonwillison.net/2025/Oct/20/claude-code-for-web/">https://simonwillison.net/2025/Oct/20/claude-code-for-web/</a></p></li><li><p><a href="https://shipyard.build/blog/claude-code-on-the-web/">https://shipyard.build/blog/claude-code-on-the-web/</a></p></li><li><p><a href="https://www.anthropic.com/engineering/claude-code-sandboxing">https://www.anthropic.com/engineering/claude-code-sandboxing</a></p></li></ul><p><strong>Timeline:</strong></p><ul><li><p><code>--teleport</code> shipped October 20, 2025 with Claude Code on the Web</p></li><li><p><code>&amp;</code> prefix shipped in v2.0.45, around November 20, 2025</p></li></ul><p><strong>Docs:</strong></p><ul><li><p><a href="https://claude.ai/code">https://claude.ai/code</a></p></li><li><p><a href="https://code.claude.com/docs/en/claude-code-on-the-web">https://code.claude.com/docs/en/claude-code-on-the-web</a></p></li></ul><h2>2. PostToolUse Hooks for Formatting</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!UXwe!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!UXwe!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 424w, https://substackcdn.com/image/fetch/$s_!UXwe!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 848w, https://substackcdn.com/image/fetch/$s_!UXwe!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 1272w, https://substackcdn.com/image/fetch/$s_!UXwe!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!UXwe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png" width="480" height="102" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:102,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:35144,&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://www.zerotopete.com/i/183636969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.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_!UXwe!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 424w, https://substackcdn.com/image/fetch/$s_!UXwe!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 848w, https://substackcdn.com/image/fetch/$s_!UXwe!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 1272w, https://substackcdn.com/image/fetch/$s_!UXwe!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7a2c622b-dc61-4583-a903-334e0e87e8b8_480x102.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>Claude is already good at generating readable code. What it sometimes misses is the last 10%: formatting, linting, import ordering, the tiny inconsistencies that become CI failures or review churn.</p><p>The fix is a PostToolUse hook.</p><p>After Claude edits files, the hook automatically runs your formatter. Prettier. Black. <code>go fmt</code>. Whatever your stack uses.</p><p>Here&#8217;s an example of an actual config (goes in <code>.claude/settings.json</code> or <code>~/.claude/settings.json</code>):</p><pre><code><code>{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          {
            "type": "command",
            "command": "npx prettier --write \"$CLAUDE_FILE_PATHS\""
          }
        ]
      }
    ]
  }
}</code></code></pre><p>Claude Code sets <code>$CLAUDE_FILE_PATHS</code> automatically, it contains the paths of whatever files were just edited.</p><p>The result: code lands closer to production-ready by default.</p><p>This isn&#8217;t glamorous. But it removes an entire class of friction that compounds.</p><p><strong>Something isn&#8217;t working?</strong> Use <code>claude --debug</code> to see hook execution details if it&#8217;s not working as intended.</p><p><strong>Docs:</strong> <a href="https://code.claude.com/docs/en/hooks">https://code.claude.com/docs/en/hooks</a></p><h2>3. Updating CLAUDE.md During PR Review</h2><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!TyO9!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!TyO9!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 424w, https://substackcdn.com/image/fetch/$s_!TyO9!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 848w, https://substackcdn.com/image/fetch/$s_!TyO9!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 1272w, https://substackcdn.com/image/fetch/$s_!TyO9!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!TyO9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png" width="480" height="134" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:134,&quot;width&quot;:480,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:45737,&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://www.zerotopete.com/i/183636969?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.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_!TyO9!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 424w, https://substackcdn.com/image/fetch/$s_!TyO9!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 848w, https://substackcdn.com/image/fetch/$s_!TyO9!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 1272w, https://substackcdn.com/image/fetch/$s_!TyO9!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F5380dbc1-58b1-4a06-83e8-3800fd2ce692_480x134.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>When Claude makes a mistake, most people fix the issue and move on. Boris takes it a step further. During code review, he tags Claude directly on the PR and asks it to update the shared CLAUDE.md file.</p><p>The file lives in the repo. It&#8217;s version-controlled. It&#8217;s maintained collaboratively. And it acts as the system&#8217;s memory.</p><p>Here&#8217;s the flow:</p><ol><li><p>Claude generates code</p></li><li><p>A reviewer notices a recurring issue</p></li><li><p>Instead of just fixing the code, they tag <code>@.claude</code> on the PR</p></li><li><p>Claude adds guidance to CLAUDE.md</p></li><li><p>That guidance is versioned and applied to future runs</p></li></ol><p>This uses the Claude Code GitHub Action:</p><pre><code><code>/install-github-action</code></code></pre><p>The goal: you no longer have to fix the same class of mistake repeatedly. You eliminate it upstream. The system learns the team&#8217;s constraints, preferences, and failure modes over time.</p><p>This is compounding engineering&#8230; except the learner is non-human.</p><p><strong>Docs:</strong> <a href="https://code.claude.com/docs/en/github-actions">https://code.claude.com/docs/en/github-actions</a></p><div><hr></div><p>If you adopt only one of these, start with parallel sessions. If you adopt two, add hooks. If you adopt all three, you&#8217;re on your way to running an efficient system.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[Agile is dead. Long live S2S.]]></title><description><![CDATA[Spec to Signal (S2S): Prioritizing signal over ceremony in an AI-native era]]></description><link>https://www.zerotopete.com/p/agile-is-dead-long-live-s2s</link><guid isPermaLink="false">https://www.zerotopete.com/p/agile-is-dead-long-live-s2s</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Tue, 23 Dec 2025 16:58:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!lQGk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!lQGk!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!lQGk!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lQGk!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lQGk!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lQGk!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!lQGk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3884434,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/182431603?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!lQGk!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 424w, https://substackcdn.com/image/fetch/$s_!lQGk!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 848w, https://substackcdn.com/image/fetch/$s_!lQGk!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!lQGk!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F82990ba5-79e7-48dc-90a4-3f574e68ed12_2912x2096.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Spec to Signal (S2S)</h2><p>Software is no longer scarce.</p><p>AI collapsed the cost of implementation. What used to take weeks now takes hours.</p><p>When execution became cheap, something subtle but profound happened. The constraint didn&#8217;t disappear, it moved. The friction shifted upstream. The hard part is no longer writing code or shipping features. It&#8217;s knowing what to build, why it matters, and how to tell, quickly and honestly, whether you&#8217;re headed in the right direction.</p><p>Clarity is now the bottleneck.</p><p>I run a software development agency that works with startups and Fortune 500 companies. We have an unusually strong team: senior developers with decades of experience, people who&#8217;ve built systems at massive scale, people who could easily lead most engineering organizations.</p><p>And yet, over the past few months, I built a social network entirely on my own, in my spare time.</p><p>No delegation.</p><p>No internal team.</p><p>No tasking my senior developers, despite having them.</p><p>That fact unsettled me.</p><p>Not because building something solo is impressive, it isn&#8217;t the goal, but because it forced a question I couldn&#8217;t ignore:</p><p>Why was it faster to do this alone than to involve a team I deeply respect?</p><p>The answer wasn&#8217;t ego.</p><p>And it wasn&#8217;t capability.</p><p>It was process.</p><p>The way we&#8217;ve learned to build software no longer fits the shape of the work.</p><p>So I began to work differently.</p><p>I started front-loading intent instead of tasks. Writing specifications as hypotheses rather than contracts. Letting AI collapse execution while I focused on judgment, direction, and learning. I stopped optimizing for delivery and started optimizing for signal.</p><p>I&#8217;ve come to think of this approach as <strong>S2S: Spec to Signal</strong>.</p><p>You move from clearly articulated intent directly into a live system, then listen carefully to what comes back. The specification expresses assumptions. The deployed product produces evidence. The work is closing the distance between the two.</p><p>S2S borrows what still works from Waterfall, the discipline of thinking deeply before moving fast, and what still works from Agile, the insistence on learning through iteration. But it drops the ceremony, the handoffs, and the process that existed to manage human execution costs that no longer dominate.</p><p>What remains is a quieter loop, one that only makes sense in a post-AI world.</p><h2>When Process Becomes Drag</h2><p>My team is currently staffed on a large fintech platform. We&#8217;ve been using a modified Agile process there for a long time. Given the regulatory constraints, the security requirements, the surface area, and the risk profile of that system, it works. It&#8217;s deliberate. It&#8217;s careful. It&#8217;s appropriate.</p><p>But this project was different.</p><p>I was moving at lightning speed. Ideas were turning into artifacts almost as fast as I could articulate them. I knew instinctively that introducing any traditional process, planning cycles, role handoffs, formal ceremonies, would immediately collapse velocity.</p><p>That doesn&#8217;t mean the goal is to build products alone. It isn&#8217;t. Parallelism still wins. Teams still matter.</p><p>The issue wasn&#8217;t headcount.</p><p>It was coordination.</p><p>When I told my team I was launching a social network I had built myself, the reaction was predictable: confusion, curiosity, a bit of head-scratching. Why weren&#8217;t they pulled in?</p><p>I explained it this way:</p><p>By the time I explain the intent, the goals, the brand, the timeline, the constraints, the assumptions, and the codebase &#8212; by the time we segment ownership, align on interfaces, and schedule ceremonies, I would already have tested several critical assumptions and gathered real signal from the world.</p><p>Achieving signal in hours instead of weeks or months.</p><p>That tradeoff is no longer defensible.</p><h2>Ceremony Doesn&#8217;t Scale With Speed</h2><p>Standups, sprint planning, backlogs, wikis, and retros, these were already fragile abstractions. With AI, they become actively counterproductive.</p><p>Agile assumes roughly uniform execution speed across a team. AI obliterates that assumption. Some people move an order of magnitude faster than others, not because they&#8217;re better engineers, but because they&#8217;re fluent in a new mode of work. The process cannot absorb that variance without becoming drag.</p><blockquote><p>If your development cycles aren&#8217;t five to ten times faster than they were a few years ago, you&#8217;re already behind.</p><p>And the point of all this speed is not output.</p><p>It&#8217;s signal.</p><p>Signal is direction. Signal is correction. Signal is learning.</p><p>This has always been the intention of product development, but the intent gets lost in a sea of process. The goal quietly shifts from <em>learning from the thing</em> to <em>building the thing</em>. </p></blockquote><p>Progress quietly gets redefined.</p><p>The velocity of building becomes the metric: story points completed, tickets closed, features shipped. Movement is visible. It feels like progress.</p><p>What disappears is insight.</p><p>How many assumptions did we test? What did we learn that changed our direction? How much uncertainty did we actually remove?</p><p>The work becomes building the thing, not learning from the thing.</p><p>Imagine being dropped into the middle of a vast field, blindfolded, spun around until you&#8217;re completely disoriented. Your goal is to reach a specific point one hundred meters away. Now imagine that with every step you take, you receive immediate feedback: <em>right direction</em> or <em>wrong direction</em>.</p><p>The algorithm becomes simple.</p><p>Take a step.</p><p>If it&#8217;s wrong, step back.</p><p>Adjust.</p><p>Repeat.</p><p>You won&#8217;t wander far. You won&#8217;t drift. You&#8217;ll converge.</p><p>That&#8217;s product development now. Not perfect planning, but relentless correction. The job is to maximize the frequency and clarity of feedback, qualitative and quantitative, so direction emerges faster than doubt.</p><p>When build cost collapses, the work shifts.</p><p>Product judgment becomes dominant.</p><p>Engineering supports velocity.</p><p>Design sharpens intent.</p><p>Roughly speaking, the skill mix begins to look something like this: <strong>60% product judgment, 30% engineering, 10% design</strong>.</p><p>Not because engineering and design matter less, but because <strong>intent matters more</strong>.</p><p>This is especially true before product-market fit, when the primary job isn&#8217;t optimization or scale, but discovery. When every build is a hypothesis, and the real work is learning which direction is worth committing to at all.</p><h2>Roles Are Converging Whether We Like It or Not</h2><p>The clean separations we relied on for decades: product here, design there, and engineering over there, are eroding.</p><p>The emerging operator looks different.</p><p>They articulate intent with precision.</p><p>They work directly with AI to produce code and interfaces.</p><p>They understand systems, constraints, and tradeoffs.</p><p>And they own outcomes end to end.</p><p>This isn&#8217;t about job titles. It&#8217;s about ownership.</p><p>Methodologies built around handoffs and translation layers no longer fit the shape of the work.</p><h1>What Survives From the Old World</h1><p>At this point, the obvious question is: <em>okay, so what replaces it?</em></p><p>The answer isn&#8217;t a clean break. S2S doesn&#8217;t discard the past, it keeps what worked and drops what no longer earns its keep.</p><h3>What We Keep From Waterfall</h3><p>Waterfall understood something Agile de-emphasized: breadth and depth of thinking matter before accelerating feedback on an under-formed idea.</p><p>S2S keeps:</p><ul><li><p>Up-front clarity of vision and constraints</p></li><li><p>Explicit articulation of assumptions</p></li><li><p>Deliberate architecture decisions</p></li><li><p>Respect for downstream consequences</p></li></ul><p>What changes is that these decisions are no longer frozen. They&#8217;re made visible, testable, and revisable.</p><h3>What We Keep From Agile</h3><p>Agile got learning right.</p><p>S2S keeps:</p><ul><li><p>Incremental delivery</p></li><li><p>Continuous learning</p></li><li><p>Tight feedback loops</p></li><li><p>Adaptation based on evidence</p></li></ul><p>What goes is the theater, the rituals that exist to justify motion rather than accelerate insight.</p><h1>What S2S Actually Looks Like</h1><p>S2S does not feel fast in the way chaos feels fast.</p><p>It feels quiet.</p><p>Work begins not with tickets or ceremonies, but with a sustained act of thinking. </p><p>Intent is articulated carefully, sometimes slowly, because clarity is still the rarest input. The problem is named. The boundaries are drawn. Assumptions are written down without embarrassment. Constraints are treated as part of the design rather than obstacles to be negotiated away.</p><p>At this point, nothing has been built, and yet much of the work has already been done.</p><p>From this intent, artifacts appear almost immediately. Specifications, diagrams, acceptance criteria, interface contracts. They are not labored over. They are summoned. Their fidelity depends on the quality of the thinking that precedes them, not on the time spent formatting them. Documentation is no longer a delayed explanation of what happened. It is a live expression of what is meant.</p><p>Building, once the dominant cost, recedes into the background. Code is generated, revised, discarded, regenerated. Interfaces take shape and are reshaped. Tests emerge alongside implementation, not after it. Design artifacts appear good enough, then better, then precise where precision matters. The human role here is not to produce, but to judge. To say yes, no, not yet. To notice when something feels correct and when it subtly violates the original intent.</p><p><strong>What replaces standups is not silence but signal. Telemetry, usage, performance, error rates, friction. These are read not as dashboards to be reported upward, but as evidence to be interpreted. The system speaks continuously. The work is to listen without defensiveness.</strong></p><p>Documentation evolves as a byproduct of this listening. When behavior changes, the description changes. When constraints tighten, the record tightens. Nothing is ceremonially updated. Nothing is &#8220;kept in sync.&#8221; Synchronization is automatic, or it is not trusted.</p><p>Roles blur, not because expertise disappears, but because translation becomes unnecessary. The same intent is legible to machines, to builders, and to those deciding what to do next. There is less communication, not because collaboration is avoided, but because fewer things need to be explained twice.</p><div class="pullquote"><p>Progress is not measured in throughput. It is measured in reduced uncertainty. </p></div><p>A good week is one where assumptions were invalidated early, cheaply, and without drama. A good system is one where changing direction does not feel like failure, because direction was never confused with commitment.S2S is not anti-process. It is anti-theater.</p><p>It is not anti-planning. It is anti-pretense.</p><p>It assumes that thinking deserves time, that execution deserves rigor, and that reality deserves the final word.</p><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[Zero to Pete Weekly #1]]></title><description><![CDATA[Last week's signal.]]></description><link>https://www.zerotopete.com/p/zero-to-pete-weekly-1</link><guid isPermaLink="false">https://www.zerotopete.com/p/zero-to-pete-weekly-1</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Mon, 15 Dec 2025 02:24:45 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!kaUn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!kaUn!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!kaUn!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!kaUn!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!kaUn!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!kaUn!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!kaUn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:10604,&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://www.zerotopete.com/i/181630178?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!kaUn!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!kaUn!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!kaUn!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!kaUn!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1632bc05-71d2-43bf-9c4f-8e83e72edc22_1456x1048.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><em><strong>A new experiment.</strong></em></p><p>I read too much. Docs, release notes, research posts, Twitter threads from people who ship. Most of it&#8217;s noise. Some of it changes how I work.</p><p>This is the filter. Once a week, the stuff that&#8217;s actually worth your time, plus anything I published that you might&#8217;ve missed.</p><p>No fluff. No &#8220;10 AI tools that will BLOW YOUR MIND.&#8221; Just signal.</p><p>Let&#8217;s get into it.</p><div><hr></div><h2>Favorites from last week&#8230;</h2><h3>&#10022; <a href="https://www.lesswrong.com/posts/vpNG99GhbBoLov9og/claude-4-5-opus-soul-document">Claude 4.5 Opus&#8217; Soul Document</a></h3><p>Turns out Claude might have a soul doc, an internal &#8220;character training&#8221; document that shapes its values, safety behavior, and priorities at the model level, not through runtime prompts. This LessWrong post reverse-engineers it through careful prompting and reproducibility tests. Anthropic has since confirmed it&#8217;s real. The extracted version is incomplete and noisy, but the implications are worth sitting with: this is how you bake personality into a model.</p><p><a href="https://gist.github.com/Richard-Weiss/efe157692991535403bd7e7fb20b6695">Soul Document on Github</a></p><h3>&#10022; <a href="https://arstechnica.com/information-technology/2025/12/openai-releases-gpt-5-2-after-code-red-google-threat-alert">OpenAI releases GPT-5.2 after "code red" Google threat</a></h3><p>OpenAI launched GPT-5.2 in direct response to mounting pressure from Google, touting gains in long-context reasoning, coding, and professional task performance. The benchmarks look strong, but Ars rightly frames this as competitive, incremental progress &#8212; a useful snapshot of where the frontier is right now, not a decisive leap.</p><h3>&#10022; <a href="https://www.figma.com/blog/introducing-three-new-tools-for-precise-image-editing-in-figma">Three new tools for precise image editing in Figma</a></h3><p>Figma introduced three new AI image editing tools: Erase object, Isolate object, and Expand image, bringing image manipulation directly into the canvas. For Figma users, this closes a long-standing workflow gap by eliminating round-trips to external tools (*cough cough* Photoshop), making it faster to adapt assets across layouts, refine AI-generated imagery, and keep visual work consistent at scale.</p><div id="vimeo-1145614525" class="vimeo-wrap" data-attrs="{&quot;videoId&quot;:&quot;1145614525&quot;,&quot;videoKey&quot;:&quot;9a9ade7c7a&quot;,&quot;belowTheFold&quot;:true}" data-component-name="VimeoToDOM"><div class="vimeo-inner"><iframe src="https://player.vimeo.com/video/1145614525?autoplay=0&amp;h=9a9ade7c7a" frameborder="0" gesture="media" allow="autoplay; fullscreen" allowautoplay="true" allowfullscreen="true" loading="lazy"></iframe></div></div><h3>&#10022; <a href="https://cursor.com/blog/browser-visual-editor">A visual editor for the Cursor Browser</a></h3><p>Cursor&#8217;s new visual editor matters not because WYSIWYG is new, but because it pairs visual manipulation with agent-driven code updates in the same loop. For anyone vibe-coding with AI or lacking precise technical vocabulary, this makes fine-tuning and pixel-level polish accessible without breaking flow.</p><div class="native-video-embed" data-component-name="VideoPlaceholder" data-attrs="{&quot;mediaUploadId&quot;:&quot;e6d1acb9-5bd6-4bf1-a1a9-9cee8677e3d1&quot;,&quot;duration&quot;:null}"></div><h3>&#10022; Claude-mem</h3><p>Claude-mem adds real, persistent memory to Claude Code by automatically capturing and compressing what happens in each session, then re-injecting the right context next time you start. It&#8217;s relevant because as AI coding workflows get longer and more agentic, continuity is quickly becoming the limiting factor.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7XYJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7XYJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 424w, https://substackcdn.com/image/fetch/$s_!7XYJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 848w, https://substackcdn.com/image/fetch/$s_!7XYJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 1272w, https://substackcdn.com/image/fetch/$s_!7XYJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7XYJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png" width="680" height="303" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/b4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:303,&quot;width&quot;:680,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:159995,&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://www.zerotopete.com/i/181630178?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.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_!7XYJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 424w, https://substackcdn.com/image/fetch/$s_!7XYJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 848w, https://substackcdn.com/image/fetch/$s_!7XYJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 1272w, https://substackcdn.com/image/fetch/$s_!7XYJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fb4383a1e-1074-4805-a6c3-50a1fabb4a65_680x303.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe now&quot;,&quot;action&quot;:null,&quot;class&quot;:&quot;button-wrapper&quot;}" data-component-name="ButtonCreateButton"><a class="button primary button-wrapper" href="https://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><h3>&#10022; <a href="https://www.reddit.com/r/LocalLLaMA/comments/1pkpsee/training_an_llm_only_on_1800s_london_texts_90gb">Training an LLM only on 1800s London texts</a></h3><p>An open-source dev trained an LLM exclusively on 1800&#8211;1875 London texts, assembling a 90GB dataset to remove modern bias entirely. Even at an early stage, the model already captures the period&#8217;s distinctive voice, and the documented, constraint-driven build process makes this a compelling blueprint for novel LLM use-cases.</p><h3>&#10022; <a href="https://www.shopify.com/editions/winter2026">Shopify Editions Winter &#8216;26</a></h3><p>This edition is a sweeping recap of everything Shopify shipped over the last few quarters, presented through one of the most ambitious product microsites they&#8217;ve ever built. Beyond the sheer volume of updates (150+), what stands out is the design and implementation: an opinionated, immersive narrative that treats commerce as a cohesive system across AI, retail, checkout, marketing, and developer tooling.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!4Yue!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!4Yue!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 424w, https://substackcdn.com/image/fetch/$s_!4Yue!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 848w, https://substackcdn.com/image/fetch/$s_!4Yue!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 1272w, https://substackcdn.com/image/fetch/$s_!4Yue!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!4Yue!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png" width="1456" height="1751" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1751,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3456195,&quot;alt&quot;:&quot;&quot;,&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://www.zerotopete.com/i/181630178?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" title="" srcset="https://substackcdn.com/image/fetch/$s_!4Yue!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 424w, https://substackcdn.com/image/fetch/$s_!4Yue!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 848w, https://substackcdn.com/image/fetch/$s_!4Yue!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.png 1272w, https://substackcdn.com/image/fetch/$s_!4Yue!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F92f9a669-ad8e-4bfb-837c-527ddd8fb1d5_1683x2024.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><h2>Quick pulse check</h2><p>Two questions each week so I can tune this to what you care about.</p><div class="poll-embed" data-attrs="{&quot;id&quot;:419557}" data-component-name="PollToDOM"></div><div class="poll-embed" data-attrs="{&quot;id&quot;:419559}" data-component-name="PollToDOM"></div><div><hr></div><h2>In cased you missed it&#8230;</h2><p><em>Original Zero to Pete posts from the last seven days.</em></p><h3>&#10022; Christmas Came Early: Async Subagents in Claude Code</h3><p>Claude Code shipped async subagents, allowing multiple agents to run in parallel and wake the main thread only when attention is needed. We break down why this flips the workflow from &#8220;waiting on AI&#8221; to orchestrating a small agent team, with concrete examples you can use immediately.</p><h3>&#10022; Stop babysitting Claude Code by setting up notifications</h3><p>A missing notification system turned Claude Code into a silent productivity sink, where work stalls waiting for permission prompts you never see. We walked through a simple hook-based setup that adds sounds, speech, or native macOS notifications, eliminating the need to babysit the terminal and making parallel work viable.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Hytt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Hytt!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 424w, https://substackcdn.com/image/fetch/$s_!Hytt!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 848w, https://substackcdn.com/image/fetch/$s_!Hytt!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 1272w, https://substackcdn.com/image/fetch/$s_!Hytt!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Hytt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png" width="1456" height="904" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:904,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1275495,&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://www.zerotopete.com/i/181630178?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.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_!Hytt!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 424w, https://substackcdn.com/image/fetch/$s_!Hytt!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 848w, https://substackcdn.com/image/fetch/$s_!Hytt!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.png 1272w, https://substackcdn.com/image/fetch/$s_!Hytt!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F2c216209-576d-43e2-87ed-d0d5be89059b_1808x1123.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>That&#8217;s the week.</h1><p>If something here changed how you work, reply and tell me. If I missed something good, same deal.</p><p>See you next Sunday.</p><p>&#8212; Pete</p><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[Christmas Came Early: Async Subagents in Claude Code]]></title><description><![CDATA[Why I stayed up until 2am testing the biggest Claude Code update in a month...]]></description><link>https://www.zerotopete.com/p/christmas-came-early-async-subagents</link><guid isPermaLink="false">https://www.zerotopete.com/p/christmas-came-early-async-subagents</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Thu, 11 Dec 2025 22:24:18 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!pCbL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!pCbL!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!pCbL!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pCbL!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pCbL!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pCbL!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!pCbL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:452591,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/181374775?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!pCbL!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!pCbL!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!pCbL!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!pCbL!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1bc78bd7-0f13-4a43-a95b-80db508b4ec1_1456x1048.jpeg 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>On December 10th, Claude Code shipped a small line in the release notes:</p><blockquote><p><em>Agents and bash commands can run asynchronously and send messages to wake up the main agent.</em></p></blockquote><p>No screenshots. No launch blog. Easy to miss.</p><p>But it quietly changed the way I work.</p><p>Not because subagents are new, they aren&#8217;t, but because <strong>waiting is no longer the default</strong>.</p><p>Until now, even when you used subagents, your main thread was still blocked. You&#8217;d spawn one, then sit there until it finished. Background agents helped a bit, but under the hood everything was still serialized.</p><p>That changed yesterday. Multiple agents can now run in parallel. And more importantly, they can <em>wake</em> your main thread when something actually needs attention.</p><p>That flips the mental model.</p><p>My main Claude thread is no longer where work <em>happens</em>.<br>It&#8217;s where work is <em>assigned</em>, <em>monitored</em>, and <em>coordinated</em>.</p><p>Everything else can run in parallel.</p><div><hr></div><h2>What We&#8217;re Building Toward</h2><p>By the end of this guide, you&#8217;ll go from &#8220;what&#8217;s a subagent?&#8221; to running background routines that monitor, analyze, and coordinate, while your main thread stays free for the work that actually needs your attention.</p><p>We&#8217;ll go step by step:</p><ul><li><p><strong>Your first subagent</strong>: create and run one in under two minutes</p></li><li><p><strong>Background execution</strong>: launch it async and keep working</p></li><li><p><strong>Multiple agents</strong>: run several in parallel</p></li><li><p><strong>Coordination</strong>: agents that report back and suggest next actions</p></li></ul><div><hr></div><h2>Level 1: Your First Subagent</h2><p>There are two ways to create a subagent.</p><p><strong>The fast way:</strong><br>Type <code>/agents</code> in Claude Code and follow the prompts.</p><p><strong>The manual way:</strong><br>Create a markdown file in:</p><ul><li><p><code>.claude/agents/</code> (project-specific), or</p></li><li><p><code>~/.claude/agents/</code> (global)</p></li></ul><p>Here&#8217;s a dead-simple example:</p><pre><code><code>---
name: code-reviewer
description: Reviews code for issues. Use after making changes.
tools: Read, Grep, Glob
model: sonnet
---

You are a code reviewer. When invoked, review the most recent changes for:
- Bugs or logic errors
- Missing error handling
- Code style issues

Be concise. Prioritize by severity.
</code></code></pre><p>Save this as <code>code-reviewer.md</code>. Restart Claude Code.</p><p>Now just tell Claude:</p><pre><code><code>&gt; Have the code-reviewer look at my recent changes</code></code></pre><p>That&#8217;s it. You have a subagent.</p><div><hr></div><h2>Level 2: Background Execution</h2><p>Here&#8217;s where async starts to matter.</p><p>Instead of blocking on the result:</p><pre><code><code>&gt; Run code-reviewer in the background while I keep working on the auth module</code></code></pre><p>Your main thread stays free. The agent runs. When it&#8217;s done, it can wake you up with its findings.</p><p>This sounds small. It isn&#8217;t, because <strong>waiting used to be the bottleneck</strong>.</p><p>Before:</p><ul><li><p>Ask for a review</p></li><li><p>Wait</p></li><li><p>Read</p></li><li><p>Continue</p></li></ul><p>After:</p><ul><li><p>Ask for a review</p></li><li><p>Start the next task</p></li><li><p>Spawn another agent if you want</p></li><li><p>Get interrupted only when something matters</p></li></ul><p>At this point, Claude stops feeling like an assistant and starts feeling like delegated labor.</p><div><hr></div><h2>Level 3: Multiple Agents in Parallel</h2><p>Once you&#8217;re comfortable with background execution, you stop thinking in terms of &#8220;tasks&#8221; and start thinking in terms of <em>coverage</em>.</p><pre><code><code>&gt; Run these three subagents in the background:
&gt; 1. code-reviewer on the auth module
&gt; 2. test-writer for the new login flow
&gt; 3. doc-generator for the API changes
&gt;
&gt; I&#8217;ll keep working on the dashboard.</code></code></pre><p>Three agents. Working simultaneously. Main thread still free.</p><p>Here&#8217;s the <code>test-writer</code>:</p><pre><code><code>---
name: test-writer
description: Writes tests for new code. Run PROACTIVELY after features.
tools: Read, Write, Edit, Bash
model: sonnet
---

You write tests. When given a feature or module:
1. Analyze the code
2. Identify edge cases
3. Write comprehensive tests
4. Run them to verify they pass

Focus on behavior, not implementation details.
</code></code></pre><p>And the <code>doc-generator</code>:</p><pre><code><code>---
name: doc-generator
description: Generates documentation for code changes.
tools: Read, Write, Grep, Glob
model: haiku
---

You write documentation. When invoked:
1. Analyze the code structure
2. Document public APIs
3. Add usage examples
4. Keep it concise but complete
</code></code></pre><p>At this point, you don&#8217;t have &#8220;Claude.&#8221;<br>You have a small team that doesn&#8217;t need your attention unless something goes wrong.</p><div><hr></div><h2>Level 4: Coordination (Agents Talking to Agents)</h2><p>This is where it stopped feeling like a feature and started feeling like a system.</p><p>With wake messaging, agents can notify your main thread, and suggest what should happen next.</p><p>Here&#8217;s the setup I was experimenting with:</p><pre><code><code>---
name: error-watcher
description: Monitors for errors. Runs in background PROACTIVELY.
tools: Bash, Read, Grep
model: haiku
---

You monitor system logs for crashes and errors.

When you find an issue:
1. Identify the type (crash, network error, runtime error)
2. Wake the main thread with a summary
3. Suggest which agent should handle it (code-fixer for bugs, api-debugger for network issues)
</code></code></pre><p>The idea:</p><ul><li><p><code>error-watcher</code> runs in the background</p></li><li><p>It finds a problem</p></li><li><p>It wakes the main thread</p></li><li><p>The main thread dispatches the right agent</p></li></ul><p>Agents coordinating agents.<br>Your main thread as orchestrator.</p><div><hr></div><h2>Quick Reference</h2><p><strong>Create a subagent</strong></p><ul><li><p><code>/agents</code>, or</p></li><li><p>Add a <code>.md</code> file to <code>.claude/agents/</code> or <code>~/.claude/agents/</code></p></li></ul><p><strong>Run in background</strong></p><pre><code><code>&gt; Run [agent-name] in the background
</code></code></pre><p><strong>Run multiple</strong></p><pre><code><code>&gt; Run agent-1, agent-2, and agent-3 in the background while I work on X
</code></code></pre><p><strong>Coordinate</strong></p><ul><li><p>Build &#8220;wake the main thread&#8221; instructions directly into agent prompts</p></li></ul><div><hr></div><h2>What&#8217;s Next</h2><p>Async agents are only 16 hours old as I write this. I&#8217;m still finding new patterns every session.</p><p>What I know for sure is this:<br>Once waiting stops being the default, going back to a single-threaded workflow feels primitive.</p><p>One main thread.<br>As many subagents as you need.<br>All running in parallel.</p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[Stop babysitting Claude Code by setting up notifications]]></title><description><![CDATA[The simplest productivity hack in Claude Code: make it ping you.]]></description><link>https://www.zerotopete.com/p/stop-babysitting-claude-code-by-setting</link><guid isPermaLink="false">https://www.zerotopete.com/p/stop-babysitting-claude-code-by-setting</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Thu, 11 Dec 2025 04:28:27 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!HiFa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HiFa!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HiFa!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!HiFa!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!HiFa!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!HiFa!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HiFa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:723403,&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://www.zerotopete.com/i/181302409?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!HiFa!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!HiFa!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!HiFa!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!HiFa!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F667eb26e-679b-4e60-a84d-c6bb467c36cd_1456x1048.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>A month ago, I asked Claude to refactor our API layer. Not a small ask, 12+ tasks spanning authentication, error handling, and rate limiting. Claude spit out a plan that looked like a senior engineer&#8217;s week compressed into twenty minutes.</p><p>Perfect. I had just enough time to knock out a few tasks on the frontend. </p><p>I confidently started rebuilding some features for the iOS client. I felt like I&#8217;d cracked the code on parallel productivity, my AI pair programmer grinding while I worked on user-facing features.</p><p>After about 20 or so minutes, I switched to my other workspace to check in on Claude Code&#8217;s progress. </p><p>The terminal was exactly where I&#8217;d left it.</p><pre><code><code>Do you want to proceed?
&gt; 1. Yes
  2. Yes, and don't ask again
  3. Type here to tell Claude what to do differently</code></code></pre><p>It never started. Twenty minutes of potential progress, evaporated. Claude had been sitting there, cursor blinking, waiting for me to press &#8220;1&#8221; to proceed with permissions. </p><p>This wasn&#8217;t the first time. It wouldn&#8217;t be the last, until I decided to fix it once and for all.</p><div><hr></div><h2>The Invisible Bottleneck</h2><p>Here&#8217;s the thing about Claude Code that nobody warns you about: <em>you</em> are the bottleneck.</p><p>Claude is fast. Claude is thorough. Claude will absolutely rip through a twelve-task refactor if you let it. But that speed creates two problems:</p><p>First, Claude finishes and you don&#8217;t know. It&#8217;s sitting there, ready for the next task, while you&#8217;re heads-down on something else. Minutes pass. Sometimes longer.</p><p>Second, Claude asks for permission. A lot. And if you&#8217;re not there to grant it, everything stops.</p><p>The mental load is worse than the time loss. You can&#8217;t fully context-switch. You&#8217;re half-present in whatever else you&#8217;re doing, wondering: <em>Is it stuck? Should I check? Did it finish?</em></p><p>Claude Code has hooks for notifications, but nothing intuitive out of the box. No sounds, no alerts, no way to personalize what gets your attention and when. The good news: you can set up exactly what you need in about five minutes.</p><div><hr></div><h2>Hooks: Claude&#8217;s Event System</h2><p>Hooks let you trigger terminal commands at key moments in Claude Code&#8217;s workflow. Think of them as event listeners: something happens in Claude Code, your command runs.</p><p>You define hooks in your <code>settings.json</code>. For notifications that work everywhere, use your global settings at <code>~/.claude/settings.json</code>.</p><p>The structure is straightforward. You specify an event type, a pattern to match, and the command to run:</p><pre><code><code>{
  &#8220;hooks&#8221;: {
    &#8220;Notification&#8221;: [
      {
        &#8220;matcher&#8221;: &#8220;permission_prompt&#8221;,
        &#8220;hooks&#8221;: [
          {
            &#8220;type&#8221;: &#8220;command&#8221;,
            &#8220;command&#8221;: &#8220;your-terminal-command-here&#8221;
          }
        ]
      }
    ]
  }
}</code></code></pre><p>For the <code>Notification</code> event, two matchers matter most: <code>permission_prompt</code> fires when Claude needs permission to do something, and <code>idle_prompt</code> fires after Claude has been idle for 60 seconds. There&#8217;s also <code>auth_success</code> and <code>elicitation_dialog</code>, but you&#8217;ll rarely need those.</p><div><hr></div><h2>Three Ways to Get Notified</h2><p><strong>Option 1: System Sounds</strong></p><p>Every Mac has <code>afplay</code> built in. Point it at any system sound and you&#8217;ve got an audio notification:</p><pre><code><code>{
  &#8220;hooks&#8221;: {
    &#8220;Notification&#8221;: [
      {
        &#8220;matcher&#8221;: &#8220;permission_prompt&#8221;,
        &#8220;hooks&#8221;: [
          {
            &#8220;type&#8221;: &#8220;command&#8221;,
            &#8220;command&#8221;: &#8220;afplay /System/Library/Sounds/Glass.aiff&#8221;
          }
        ]
      }
    ]
  }
}</code></code></pre><p>The sounds live in <code>/System/Library/Sounds/</code> &#8212; Glass, Ping, Submarine, Funk, and about a dozen others. Test them with <code>afplay /System/Library/Sounds/Submarine.aiff</code>.</p><p><strong>Option 2: Text-to-Speech</strong></p><p>The <code>say</code> command makes your Mac talk to you. Impossible to miss.</p><pre><code><code>{
  &#8220;matcher&#8221;: &#8220;permission_prompt&#8221;,
  &#8220;hooks&#8221;: [
    {
      &#8220;type&#8221;: &#8220;command&#8221;,
      &#8220;command&#8221;: &#8220;say &#8216;Claude needs permission&#8217;&#8221;
    }
  ]
}</code></code></pre><p>You can even pick voices: <code>say -v Daniel &#8220;Permission needed&#8221;</code> for a British accent, or <code>say -v Whisper &#8220;Hey&#8221;</code> if you want something unsettling.</p><p><strong>Option 3: Native macOS Notifications (My Favorite)</strong></p><p>This gives you a proper notification banner &#8212; clean, unobtrusive, clickable. Install <code>terminal-notifier</code> via Homebrew:</p><pre><code><code>brew install terminal-notifier</code></code></pre><p>Then configure it:</p><pre><code><code>{
  &#8220;hooks&#8221;: {
    &#8220;Notification&#8221;: [
      {
        &#8220;matcher&#8221;: &#8220;permission_prompt&#8221;,
        &#8220;hooks&#8221;: [
          {
            &#8220;type&#8221;: &#8220;command&#8221;,
            &#8220;command&#8221;: &#8220;terminal-notifier -title &#8216;Claude Code&#8217; -message &#8216;Permission needed&#8217; -sound Glass&#8221;
          }
        ]
      },
      {
        &#8220;matcher&#8221;: &#8220;idle_prompt&#8221;,
        &#8220;hooks&#8221;: [
          {
            &#8220;type&#8221;: &#8220;command&#8221;,
            &#8220;command&#8221;: &#8220;terminal-notifier -title &#8216;Claude Code&#8217; -message \&#8221;What&#8217;s next?\&#8221;&#8220;
          }
        ]
      }
    ]
  }
}</code></code></pre><p>One gotcha: if you hear two sounds (a pop plus your custom sound), go to System Settings &#8594; Notifications &#8594; terminal-notifier and disable &#8220;Play sound for notifications.&#8221;</p><div><hr></div><h2>The Full Config</h2><p>Here&#8217;s a complete <code>settings.json</code> you can copy-paste:</p><pre><code><code>{
  &#8220;permissions&#8221;: {
    &#8220;allow&#8221;: [],
    &#8220;deny&#8221;: []
  },
  &#8220;hooks&#8221;: {
    &#8220;Notification&#8221;: [
      {
        &#8220;matcher&#8221;: &#8220;permission_prompt&#8221;,
        &#8220;hooks&#8221;: [
          {
            &#8220;type&#8221;: &#8220;command&#8221;,
            &#8220;command&#8221;: &#8220;terminal-notifier -title &#8216;Claude Code&#8217; -message &#8216;Permission needed&#8217; -sound Glass&#8221;
          }
        ]
      },
      {
        &#8220;matcher&#8221;: &#8220;idle_prompt&#8221;,
        &#8220;hooks&#8221;: [
          {
            &#8220;type&#8221;: &#8220;command&#8221;,
            &#8220;command&#8221;: &#8220;terminal-notifier -title &#8216;Claude Code&#8217; -message \&#8221;What&#8217;s next?\&#8221;&#8220;
          }
        ]
      }
    ]
  }
}</code></code></pre><p>After saving, run <code>/hooks</code> in Claude Code. It&#8217;ll detect changes automatically, no restart needed.</p><div><hr></div><h2>Troubleshooting</h2><p><strong>Notifications not appearing?</strong> Check System Settings &#8594; Notifications &#8594; terminal-notifier. Make sure they&#8217;re allowed and Do Not Disturb is off.</p><p><strong>Command not found?</strong> Use the full path: <code>/opt/homebrew/bin/terminal-notifier</code> instead of just <code>terminal-notifier</code>.</p><p><strong>JSON errors?</strong> Validate at jsonlint.com. Watch your apostrophes &#8212; use <code>\&#8221;What&#8217;s next?\&#8221;</code> inside double-quoted strings, not single quotes around contractions.</p><div><hr></div><h2>The Compound Effect</h2><p>This isn&#8217;t really about saving twenty minutes.</p><p>It&#8217;s about what happens to your brain when you <em>know</em> you&#8217;ll be notified.</p><p>Before notifications, I couldn&#8217;t fully leave. Part of my attention was still on that terminal. Is it stuck? Should I check? The cognitive overhead leaked into everything.</p><p>Now I can actually disappear. Deep work on something else. A real break. Full immersion in whatever I&#8217;m doing, with complete confidence that if Claude needs me, I&#8217;ll know.</p><p></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p></p>]]></content:encoded></item><item><title><![CDATA[Give Claude Eyes and Hands on Your App]]></title><description><![CDATA[Turn your iOS simulator into a remote-controlled test lab Claude can see, tap through, and verify... no more dragging screenshots into chat.]]></description><link>https://www.zerotopete.com/p/give-claude-eyes-and-hands-on-your</link><guid isPermaLink="false">https://www.zerotopete.com/p/give-claude-eyes-and-hands-on-your</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Tue, 02 Dec 2025 04:22:30 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!ugSw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!ugSw!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!ugSw!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ugSw!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ugSw!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ugSw!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!ugSw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1087662,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/180470850?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!ugSw!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!ugSw!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!ugSw!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!ugSw!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F72dea334-4af7-433e-9800-a939518292d6_1456x1048.jpeg 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>If you&#8217;re still dragging simulator screenshots into Claude to debug UI, you&#8217;re wasting the best part of Claude Code.</p><p>Two months ago, I was building my dream social network in Claude Code. Just me, nights and weekends, moving faster than I ever thought possible with a solo project.</p><p>But one thing was killing my momentum.</p><p>Every time something looked wrong on screen, I&#8217;d go through the same ritual: </p><blockquote><p>Build. </p><p>Open the simulator. </p><p>Squint at the bug. </p><p>Screenshot. </p><p>Find the file in Finder. </p><p>Drag it into Claude. </p><p>Type out what I was seeing. </p><p>Wait for the fix. </p><p>Build again. </p><p>Repeat.</p></blockquote><p>That loop wasn&#8217;t just slow, it was cognitively exhausting. I was the translation layer between Claude&#8217;s brain and my app&#8217;s face, and every time I hit flow state, that translation friction pulled me out.</p><p><br>Most of you are still doing this. I see it constantly: people dragging screenshots into chat, describing what&#8217;s broken, waiting, repeating. The back-and-forth is exhausting because you&#8217;re asking AI to debug something it literally cannot see.</p><p><br>The fix is giving Claude direct access to the simulator or browser. That&#8217;s where MCP servers come in.</p><div><hr></div><h2>MCP in 30 Seconds</h2><p>An MCP server is a bridge that gives Claude access to tools it doesn&#8217;t have by default. The flow:</p><ol><li><p>You tell Claude what to do</p></li><li><p>Claude asks the MCP server how to do it</p></li><li><p>The MCP server translates that into commands</p></li><li><p>Claude executes them</p></li></ol><p>For our purposes: there&#8217;s an MCP server that wraps iOS simulator control. Connect it, and Claude can tap, swipe, read the screen, and run tests, without you lifting a finger.</p><div><hr></div><h2>iOS Simulator Setup</h2><p>I&#8217;m using <a href="https://fbidb.io/docs/installation/">Facebook&#8217;s IDB (iOS Development Bridge)</a> and <a href="https://github.com/joshuayoes/ios-simulator-mcp">Joshua Yoes&#8217; </a><code>ios-simulator-mcp</code> which wraps it.</p><p>You don&#8217;t need anything fancy for this:</p><ul><li><p>macOS</p></li><li><p>Xcode + iOS simulators</p></li><li><p>Homebrew</p></li><li><p>~15 minutes</p></li></ul><h3>Step 1: Install IDB</h3><p>Apple gives you <code>xcrun simctl</code> for basic simulator control, but it doesn&#8217;t give you a clean &#8220;tap/swipe/read the accessibility tree&#8221; interface. IDB fills that gap.</p><pre><code><code>brew tap facebook/fb
brew install idb-companion
pip3 install fb-idb</code></code></pre><blockquote><p><strong>Note</strong>: If you&#8217;re on Python 3.11+ and using the system interpreter, you may need <code>pip3 install fb-idb --break-system-packages</code>.</p></blockquote><p>Verify it&#8217;s working:</p><pre><code><code>idb list-targets</code></code></pre><p>You should see your available simulators listed.</p><h3>Step 2: Add the MCP Server</h3><pre><code><code>claude mcp add ios-simulator npx ios-simulator-mcp
</code></code></pre><p>One command. Claude Code now has access to your iOS simulator.</p><h3>Step 3: Verify the Connection</h3><p>Start Claude Code and run:</p><pre><code><code>/mcp
</code></code></pre><p>Navigate to <code>ios-simulator</code>. You&#8217;ll see tools for getting the booted simulator ID, tapping, swiping, typing, taking screenshots, and reading the accessibility tree. The exact names might shift between versions, but you&#8217;ll recognize them: <code>ui_tap</code>, <code>ui_swipe</code>, <code>screenshot</code>, <code>launch_app</code>, plus a couple of &#8220;describe the screen&#8221; tools.</p><p>You&#8217;re connected.</p><div><hr></div><h2>Teaching Claude How to Test</h2><p>Having the tools is step one. Teaching Claude how to use them effectively is where the magic happens. This goes in your <code>CLAUDE.md</code>.</p><p>Here&#8217;s a simplified version of what I use:</p><pre><code><code>## iOS Simulator Testing

When I ask you to test a feature or verify a UI change:

1. **Build the app**: Run the build command and wait for success
2. **Launch in simulator**: Use `launch_app` with the bundle ID
3. **Navigate to the feature**: Use `ui_tap` and `ui_swipe` to get there (refer to sitemap.md available in the root directory)
4. **Verify the state**: Use the accessibility describe tools to read what&#8217;s on screen
5. **Take a screenshot**: Capture the result for confirmation
6. **Report back**: Tell me what you found

### Key Coordinates
- Tab bar: y=750 (bottom navigation)
- Navigation back button: x=30, y=60
- Primary action button: x=200, y=700

### Common Flows
- Login: Tap email field (x=200, y=300), input text, tap password field (x=200, y=380), input text, tap Submit (x=200, y=460)
- Navigate to Profile: Tap profile tab (x=350, y=750)

### When Something Looks Wrong
1. Read the accessibility tree
2. Compare expected vs actual element states
3. Take a screenshot for my review
4. Suggest a fix
</code></code></pre><p>If I ask Claude to &#8220;test the commenting flow,&#8221; Claude builds the app, launches the simulator, takes a screenshot, taps on a post, takes a screenshot, taps on the comment button, takes screenshot, adds a comment and presses submit, reads the screen state, and tells me whether it worked. If something&#8217;s broken, it shows me the screenshot and proposes a fix. In some cases it&#8217;ll see the visual inconsistency and will fix it immediately just like it would fix a compiler error.</p><p>Closed loop. No manual intervention.</p><div><hr></div><h2>What My Workflow Looks Like Now</h2><p>Before:</p><ol><li><p>Make a change</p></li><li><p>Build</p></li><li><p>Open simulator</p></li><li><p>Navigate to the feature</p></li><li><p>Screenshot</p></li><li><p>Find file in Finder</p></li><li><p>Drag into Claude</p></li><li><p>Explain what I&#8217;m seeing</p></li><li><p>Wait for fix</p></li><li><p>Repeat</p></li></ol><p>After:</p><ol><li><p>Describe what I want</p></li><li><p>Claude builds, tests, and confirms</p></li></ol><p>Here&#8217;s a real prompt from yesterday:</p><blockquote><p>&#8220;The profile avatar isn&#8217;t showing up on the edit profile screen. Find it and fix it.&#8221;</p></blockquote><p>Claude built the app, launched the simulator, navigated to edit profile, read the accessibility tree to see that the avatar image view existed but had no source, checked the code, found I was passing the wrong key from the user object, fixed it, rebuilt, re-tested, and confirmed the avatar was now visible.</p><p>I played chess while this happened.</p><div><hr></div><h2>The Compound Effect</h2><p>When the cost of testing drops to zero, you test more. When you test more, you catch issues earlier. When you catch issues earlier, you ship faster.</p><p>And here&#8217;s the thing: Claude gets better at testing <em>your specific app</em> over time. The more flows you document in CLAUDE.md, the more context it has. It&#8217;s not just automation, it&#8217;s institutional knowledge that compounds.</p><div><hr></div><h2>Bonus: Web with Playwright</h2><p>The same pattern works for web. Microsoft&#8217;s official Playwright MCP server lets Claude control browsers the same way:</p><pre><code><code>claude mcp add playwright npx @playwright/mcp@latest</code></code></pre><p>Add a small &#8220;Web Testing&#8221; section to your CLAUDE.md with your local URLs and key selectors, and Claude can open localhost, click through flows, snapshot the DOM, and verify behavior.</p><p>I&#8217;ll do a deeper dive on the web setup in a future post. The pattern is identical, the only difference is the tools.</p><div><hr></div><h2>Getting Started</h2><p><strong>For iOS:</strong></p><ol><li><p><code>brew tap facebook/fb &amp;&amp; brew install idb-companion</code></p></li><li><p><code>pip3 install fb-idb</code></p></li><li><p><code>claude mcp add ios-simulator npx ios-simulator-mcp</code></p></li><li><p>Add testing instructions to your <code>CLAUDE.md</code></p></li></ol><p><strong>Verify:</strong></p><ul><li><p>Run <code>/mcp</code> in Claude Code</p></li><li><p>Look for your new tools</p></li><li><p>Ask Claude to &#8220;take a screenshot of the simulator&#8221; or &#8220;tap the center of the screen&#8221;</p></li></ul><p>You&#8217;ll know it&#8217;s working when Claude starts doing things without asking you to screenshot.</p><div><hr></div><p><em>If this was useful, subscribe. Next up: automated testing pipelines that run before every commit.</em></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[The Brick-by-Brick Revolution: Why I’m Skill-ifying Everything in Claude Code]]></title><description><![CDATA[How Claude Skills helps me turn repetitive work into reusable intelligence.]]></description><link>https://www.zerotopete.com/p/the-brick-by-brick-revolution-why</link><guid isPermaLink="false">https://www.zerotopete.com/p/the-brick-by-brick-revolution-why</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Thu, 13 Nov 2025 18:14:35 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!qD22!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!qD22!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!qD22!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!qD22!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!qD22!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!qD22!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!qD22!,w_2400,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png" width="1200" height="863.7362637362637" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/da373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:false,&quot;imageSize&quot;:&quot;large&quot;,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:1200,&quot;bytes&quot;:1956757,&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://www.zerotopete.com/i/178807944?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:&quot;center&quot;,&quot;offset&quot;:false}" class="sizing-large" alt="" srcset="https://substackcdn.com/image/fetch/$s_!qD22!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 424w, https://substackcdn.com/image/fetch/$s_!qD22!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 848w, https://substackcdn.com/image/fetch/$s_!qD22!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.png 1272w, https://substackcdn.com/image/fetch/$s_!qD22!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fda373b68-4f45-43db-9750-1c7c2cda6c2e_1456x1048.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></p><p>I remember reading Nick Bostrom&#8217;s <em>Superintelligence</em> around a decade ago, and one analogy I keep returning to: AGI will be created brick by brick. We won&#8217;t know when the wall is complete until suddenly, it is. The idea is that we&#8217;re building narrowly intelligent systems, each mastering one specific domain, until eventually we&#8217;ll have intelligence that excels at everything narrowly. Then some breakthrough will connect them all.</p><p>Claude Skills completely validates this vision. Each skill <em>is</em> a brick.</p><p>Three weeks ago, Anthropic released Skills, and I&#8217;ve been in a productive frenzy ever since. While most founders are still debating whether AI will take their jobs, I&#8217;m skill-ifying every repetitive cognitive task in my company, laying down brick after brick of narrow intelligence. Client updates that took 3 hours of herding cats? Now 2 minutes. Investor reports that required chasing down six different team members? Claude goes straight to GitHub and tells me what actually shipped. Style guide compliance that we&#8217;d catch (maybe) in PR reviews? Now enforced automatically before code even hits review.</p><p>Yet when I talk to other founders, most haven&#8217;t even heard of Skills or they dismiss them as &#8220;just another automation tool.&#8221;</p><p>They&#8217;re missing the revolution hiding in plain sight.</p><h2>The intelligence assembly line</h2><p>Here&#8217;s what&#8217;s actually happening: we&#8217;re building the narrow intelligence modules that Bostrom predicted, except they&#8217;re not locked in research labs, they&#8217;re sitting in <code>~/.claude/skills/</code> folders on our machines.</p><p>Each skill is a brick of specialized intelligence. The breakthrough? Claude itself, a general-purpose LLM that can dynamically load and connect these bricks as needed. This is fundamentally different from anything we&#8217;ve had before.</p><p><strong>Skills aren&#8217;t slash commands</strong> (those are user-invoked, requiring you to remember <code>/command</code> exists and manually trigger it every time).</p><p><strong>They&#8217;re not subagents either</strong> (those are like hiring temporary contractors, they spawn as separate AI instances, work in isolation without seeing your conversation context, complete their specific task, then disappear. You need to explicitly delegate to them and manage their coordination).</p><p>Skills are something entirely new: modular intelligence that Claude automatically recognizes and loads when relevant. Think of Claude as the mortar that holds the bricks together, it understands context, recognizes patterns, and seamlessly activates the right narrow intelligence at the right moment.</p><p><strong>The magic is in the integration.</strong> When I ask Claude to write a product update for a client, it doesn&#8217;t just follow a template. It recognizes the task, loads my client-update skill (brick #1), might reference my code-standards skill to explain technical decisions (brick #2), and could pull from my metrics-dashboard skill for KPIs (brick #3). The LLM is the breakthrough that connects these bespoke narrow intelligences.</p><p>This isn&#8217;t <em>actually</em> AGI, let&#8217;s be clear. But it&#8217;s the closest practical implementation we have. And here&#8217;s the kicker: imagine when Skills become shareable through an app store-like model. Suddenly, you&#8217;re not just building your own wall of intelligence, you&#8217;re contributing to a collective one. Your invoice-processing skill becomes a brick someone else can use. Their data-visualization skill becomes one you can adopt. We&#8217;re creating a marketplace of narrow intelligences that any LLM can orchestrate.</p><p>This is the wall being built in real-time. And unlike the monolithic AGI we&#8217;ve been promised, this one is modular, controllable, and happening right now. It&#8217;s distributed intelligence assembly that we actually control.</p><h2>Build your first brick</h2><p>Let me show you exactly how simple this is. A Claude Skill is just a folder with a markdown file. That&#8217;s it.</p><p>Here&#8217;s the bare minimum structure:</p><pre><code><code>~/.claude/skills/
&#9492;&#9472;&#9472; your-skill-name/
    &#9492;&#9472;&#9472; SKILL.md</code></code></pre><p>The SKILL.md file needs just a few things in its YAML frontmatter. Here&#8217;s an example skill called &#8220;email-writer&#8221; that drafts professional emails:</p><pre><code><code>---
name: email-writer
description: Writes professional emails. Triggers when user asks to write, draft, or compose emails.
---

# Instructions

Write clear, professional emails that:
- Get to the point quickly
- Use appropriate tone for the context
- Include a clear call-to-action
```

That `description` field is critical&#8212;it&#8217;s how Claude decides when to activate your skill. Make it specific and include trigger phrases.

But here&#8217;s where it gets interesting. You can include reference files that turn Claude into a domain expert:
```
email-writer/
&#9500;&#9472;&#9472; SKILL.md
&#9500;&#9472;&#9472; references/
&#9474;   &#9500;&#9472;&#9472; templates.md         # Email templates for different situations
&#9474;   &#9500;&#9472;&#9472; tone-guide.md        # How to adjust tone (formal, casual, urgent)
&#9474;   &#9492;&#9472;&#9472; signatures.md        # Your standard email signatures
&#9492;&#9472;&#9472; scripts/
    &#9492;&#9472;&#9472; check_grammar.py     # Executable code for grammar checking</code></code></pre><p>That <code>description</code> field is critical, it&#8217;s how Claude decides when to activate your skill. Make it specific and include trigger phrases.</p><p>But here&#8217;s where it gets interesting. You can include reference files that turn Claude into a domain expert:</p><pre><code><code>When writing emails:
1. Check `references/templates.md` for similar email types
2. Apply tone guidelines from `references/tone-guide.md`
3. Add appropriate signature from `references/signatures.md`</code></code></pre><p>Claude will read these files when the skill activates, instantly gaining all your preferences and standards. This simple email example scales to any domain, from code reviews to recipe generation to financial analysis.</p><p><strong>Installation is stupidly simple:</strong></p><ol><li><p>Create a folder called <code>skills</code> inside <code>~/.claude/</code></p></li><li><p>Drop your skill folder inside</p></li><li><p>There is no step 3</p></li></ol><p>Claude automatically discovers and loads skills from:</p><ul><li><p><code>~/.claude/skills/</code> (personal skills)</p></li><li><p><code>.claude/skills/</code> (project-specific skills)</p></li><li><p>Any skills installed via plugins</p></li></ul><h2>What skills can (and can&#8217;t) do</h2><p><strong>Skills excel at:</strong></p><ul><li><p>Repetitive cognitive tasks with clear patterns</p></li><li><p>Enforcing standards and best practices</p></li><li><p>Synthesizing information from multiple sources</p></li><li><p>Applying complex, domain-specific logic</p></li><li><p>Maintaining consistency across time and projects</p></li></ul><p><strong>Skills struggle with:</strong></p><ul><li><p>Tasks requiring real-time external data (without additional tools)</p></li><li><p>Highly creative, unprecedented problems</p></li><li><p>Decisions requiring human judgment on ethics or strategy</p></li><li><p>Anything requiring persistent memory between sessions</p></li></ul><p>The sweet spot? Tasks where you&#8217;ve developed a clear process but execution is tedious. If you&#8217;ve ever written a how-to document for your team, you can probably skill-ify it.</p><h2>Examples of my current skill arsenal</h2><p>At my agency, we&#8217;re building skills for:</p><p><strong>Engineering Standards:</strong></p><ul><li><p><code>component-library-enforcer</code>: Ensures all UI components come from our design system</p></li><li><p><code>unit-test-standards</code>: Writes tests following our specific patterns and coverage requirements</p></li><li><p><code>pr-reviewer</code>: Pre-reviews code for common issues before human review</p></li></ul><p><strong>Communication:</strong></p><ul><li><p><code>investor-update</code>: Transforms GitHub activity into polished monthly updates</p></li><li><p><code>client-report</code>: Generates weekly progress reports with appropriate technical depth</p></li></ul><p><strong>Product Management:</strong></p><ul><li><p><code>feature-spec</code>: Turns rough ideas into properly formatted specifications</p></li><li><p><code>user-story-writer</code>: Generates user stories with our specific acceptance criteria format</p></li><li><p><code>roadmap-analyzer</code>: Applies my fitness landscape framework to evaluate our product direction</p></li></ul><p>Each skill saves at least a few hours per week. Multiply that across a team, and we&#8217;re talking about reclaiming entire roles worth of time.</p><h2>The compound effect</h2><p>We&#8217;re building institutional intelligence that lasts beyond any one person. When someone leaves, their expertise stays in Skills. When someone joins, they can work at the level of your top performer on day one.</p><p>Each skill you create is a brick. Most people don&#8217;t realize this, but Skills are already shareable. Claude Code has a plugin marketplace. Anthropic publishes skills on GitHub. You can export and share .skill files with your team today.</p><p>This is only the beginning. Soon there will be a full marketplace with thousands of specialized skills you can install with a click. Your invoice-processing skill becomes a brick someone else can use. Their visualization skill becomes one you can adopt.</p><p>This isn&#8217;t about creating some giant intelligence. It&#8217;s about building modular systems you actually control.</p><p>Pick your most annoying weekly task. Document it. Turn it into a skill. Save yourself hours.</p><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><item><title><![CDATA[The Death of the PRD: Why Markdown Files Are the Future of Product Requirements]]></title><description><![CDATA[A new development paradigm where code and documentation are inseparable. They live, breathe, and evolve as one.]]></description><link>https://www.zerotopete.com/p/the-death-of-the-prd-why-markdown</link><guid isPermaLink="false">https://www.zerotopete.com/p/the-death-of-the-prd-why-markdown</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Thu, 06 Nov 2025 23:51:11 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!f73O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!f73O!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!f73O!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!f73O!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!f73O!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!f73O!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!f73O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1769087,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/jpeg&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://www.zerotopete.com/i/176424067?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg&quot;,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!f73O!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 424w, https://substackcdn.com/image/fetch/$s_!f73O!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 848w, https://substackcdn.com/image/fetch/$s_!f73O!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!f73O!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9f7ae8c3-9f02-4c52-9135-c5034297d6d3_1456x1048.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><h2>Welcome to the Document Graveyard</h2><p>Every product team knows this story: A product manager spends days crafting the perfect PRD in Notion. Stakeholders review it. Design signs off. Engineering gives the thumbs up. Development begins. The product ships.</p><p>Then reality hits.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><p>Users provide feedback. The market shifts. A better technical solution emerges. Features get cut, modified, or added. But who updates the PRD? Usually, no one. It sits there, a monument to what we <em>thought</em> we were building three months ago, while the actual product has evolved into something entirely different.</p><p><strong>Welcome to the document graveyard, where good intentions go to die and where new team members go to get confused.</strong></p><p>This isn&#8217;t just frustrating; it&#8217;s actively harmful. Outdated documentation leads to misaligned teams, confused stakeholders, and developers building the wrong things. We&#8217;ve all been there: six months into a project, nobody knows which doc is the source of truth anymore.</p><h2>The Paradigm Shift: Code and Documentation Are One</h2><p>The rise of agentic AI coding tools like Claude Code and Codex hasn&#8217;t just changed how we write code. It&#8217;s fundamentally changing how we should think about product documentation.</p><div class="pullquote"><p><strong>Here&#8217;s the crucial insight: We can&#8217;t think about code and documentation separately anymore.</strong></p></div><p>These AI tools need context to be effective, and the most efficient way to provide that context? Markdown files that live directly in your codebase. But here&#8217;s the revolutionary part: If you&#8217;re already writing requirements in <code>.md</code> files to give AI the context it needs to build, why not make those files the single source of truth that evolves with your product?</p><p>The traditional separation between &#8220;documentation&#8221; and &#8220;implementation&#8221; is an artifact of the pre-AI era. When your AI engineer can read, understand, and update both simultaneously, keeping them separate becomes not just inefficient but absurd.</p><h2>Understanding Claude Code&#8217;s File Structure</h2><p>When using Claude Code, the tool looks for specific markdown files to understand your project:</p><h3>The CLAUDE.md Convention</h3><p>Claude Code automatically reads <code>CLAUDE.md</code> files when working in your directory, treating them as authoritative instructions for your project. The <code>/init</code> command can create this project file automatically, analyzing your codebase to summarize the project&#8217;s purpose, architecture, and key components.</p><p>The naming hierarchy works like this:</p><ul><li><p><strong>CLAUDE.md</strong>: The standard file checked into git and shared across your team </p></li><li><p><strong>CLAUDE.local.md</strong>: Personal preferences that are gitignored and not shared </p></li><li><p><strong>Subdirectory CLAUDE.md files</strong>: Context specific to that part of the project (e.g., a /tests directory)</p></li></ul><p>Claude Code searches for these files in the root of your repo (or wherever you run claude from), and in any parent directories. This is particularly useful for monorepos where you might have CLAUDE.md files at multiple levels.</p><h2>The New Workflow: Living Requirements</h2><p>Here&#8217;s how it actually works in practice:</p><h3>1. Structure Requirements Like a Knowledge Tree</h3><p>Create your product specs as <code>.md</code> files in a hierarchical folder structure that mirrors how humans actually think:</p><pre><code><code>project/
&#9500;&#9472;&#9472; CLAUDE.md                  # Top-level product vision &amp; context
&#9500;&#9472;&#9472; features/
&#9474;   &#9500;&#9472;&#9472; authentication/
&#9474;   &#9474;   &#9500;&#9472;&#9472; requirements.md   # Feature-specific details
&#9474;   &#9474;   &#9492;&#9472;&#9472; oauth-flow.md     # Sub-feature specs
&#9474;   &#9492;&#9472;&#9472; payments/
&#9474;       &#9500;&#9472;&#9472; requirements.md
&#9474;       &#9492;&#9472;&#9472; stripe-integration.md</code></code></pre><p>This structure leverages &#8220;cascading context.&#8221; Claude reads from specific to general, building understanding from the ground up. Claude Code can read CLAUDE.md files in subdirectories to provide context specific to that part of the project, creating a natural hierarchy of understanding.</p><h3>2. Direct-to-Engineer Communication</h3><p>When you need to make a change, you don&#8217;t update a PRD first and wait for approval. You go straight to your &#8220;engineer&#8221; (Claude) with the context window open and request the changes. The AI has all the context it needs from the <code>.md</code> files, understands the current state of the product, and can implement changes immediately.</p><p>This is where traditional Agile starts to feel prehistoric. No more sprint planning for a feature you&#8217;ll pivot on in three days. No more extensive documentation for an experiment that might not work. You think, you build, you learn. All in real-time. The feedback loop collapses from weeks to minutes.</p><h3>3. Automatic Documentation Updates</h3><p>Here&#8217;s the magic: Every time you confirm a change (make a commit), you can instruct Claude to update the relevant <code>.md</code> files with what changed. The documentation evolves with the code, staying perpetually current.</p><p>You can even create this as a persistent instruction in your CLAUDE.md file, telling Claude to &#8220;treat all CLAUDE.md files as living API documentation&#8221; and to &#8220;always check for relevant CLAUDE.md files and update them when changes impact their accuracy.&#8221;</p><p>Example of a living requirement file:</p><pre><code><code>## Authentication Requirements
&lt;!-- Last updated: 2024-11-09 by Claude Code --&gt;

### Current Implementation
- OAuth 2.0 with PKCE flow &#9989;
- Biometric login for mobile &#9989; (Added 2024-11-09)
- ~~Password-based auth~~ (Deprecated 2024-11-08)

### Architecture Notes
- Session management via JWT tokens
- Refresh token rotation implemented
- Rate limiting: 100 requests/minute per IP</code></code></pre><h3>4. Fresh Context for Every Feature</h3><p>Creating a new Claude instance for each task provides better, more focused performance. Claude isn&#8217;t trying to juggle the entire product history but is laser-focused on the specific feature at hand. This approach naturally aligns with the <code>.md</code> file structure, where each feature can have its own focused requirements that Claude references.</p><h2>Why This Changes Everything</h2><h3>The End of Staleness</h3><p>Documentation can&#8217;t become stale if it&#8217;s updated with every commit. It&#8217;s not a separate task someone has to remember to do. It&#8217;s part of the development flow itself. When code and documentation are one, they evolve together or not at all.</p><h3>The Death of &#8220;Documentation Debt&#8221;</h3><p>We&#8217;ve all heard of technical debt, but documentation debt is just as real and often more painful. With this approach, there is no documentation debt because documentation updates are atomic with code changes. You literally cannot commit code without the option to update the docs.</p><h3>Instant Onboarding</h3><p>New team members (human or AI) can understand any part of the system by reading the relevant <code>.md</code> files. These files become living API documentation for your future self. They explain not just what the system should do, but what it actually does. </p><h3>Fearless Experimentation</h3><p>Want to try a completely different approach? Just build it. If it works, the documentation updates automatically. If it doesn&#8217;t, revert both code and docs in a single git operation. No wasted documentation effort on failed experiments. No meetings about updating specs for something that might not work.</p><h2>Scaling Beyond Engineering</h2><p>For teams that need to share product specs with non-technical stakeholders, the solution scales beautifully:</p><h3>Automated Translation Pipeline</h3><p>Set up GitHub Actions to trigger nightly builds that:</p><ol><li><p>Digest all <code>.md</code> files from your repo</p></li><li><p>Use AI to transform technical specifications into audience-appropriate documentation</p></li><li><p>Push to Notion, Confluence, or wherever your business teams live</p></li><li><p>Maintain separate &#8220;views&#8221; for different audiences</p></li></ol><p>The transformation can be intelligent:</p><p><strong>From (in repo):</strong></p><pre><code><code>## Auth Requirements
- Implement OAuth2 with PKCE flow
- Redis session store with 24hr TTL
- Rate limit: 100 req/min per IP
```

**To (in Notion for sales team):**
```
&#10024; User Authentication
- Single sign-on for seamless access
- Secure 24-hour sessions
- Enterprise-grade security controls
[Visual diagram of login flow]</code></code></pre><p>Sales gets their battle cards. Marketing gets feature descriptions. Support gets how-it-works guides. All automatically generated from the single source of truth that lives with your code.</p><h2>Best Practices for Implementation</h2><h3>Keep It Concise</h3><p>CLAUDE.md files consume part of your token budget with every interaction, so keep them concise while preserving critical information. Focus on documenting what IS, not what WAS. No changelogs in the main files.</p><h3>Use Hierarchical Context</h3><p>Every piece of information should be as context-efficient as possible. Subdirectory files matter just as much as the main one. Focus on project-specific patterns, architectural decisions, and common pitfalls specific to your codebase.</p><h3>Living Documentation Mindset</h3><p>Periodically review and refactor your CLAUDE.md files to keep them relevant. If you find yourself repeating the same instructions across multiple sessions, that&#8217;s a sign it belongs in your CLAUDE.md file.</p><h2>The Post-PRD World</h2><p>This isn&#8217;t a theoretical framework. It&#8217;s how modern product teams are already working. When you understand that <code>.md</code> files can be living, breathing product requirements, you unlock a new way of building:</p><ul><li><p><strong>No separation between thinking and doing</strong>: Requirements and implementation evolve in lockstep</p></li><li><p><strong>No translation layer</strong>: What you write is what gets built</p></li><li><p><strong>No synchronization overhead</strong>: One source of truth, automatically maintained</p></li><li><p><strong>No documentation archaeology</strong>: The current state is always the documented state</p></li></ul><p>The traditional PRD is dead because it was built for a world where documentation and implementation were separate activities, performed by different people, at different times. In a world where AI can turn requirements into code in seconds, and update documentation with every commit, that separation isn&#8217;t just inefficient. It&#8217;s absurd.</p><p><strong>We can&#8217;t think about code and documentation separately anymore. They&#8217;re not two things that need to be kept in sync. They&#8217;re one thing that evolves together.</strong></p><div><hr></div><p><em>Pete runs a 7-figure software agency in NYC, bringing products to market for Fortune 500s and startups. This approach has fundamentally changed how his teams deliver software: faster, more accurately, and with documentation that actually helps rather than hinders.</em></p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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 Zero to Pete! 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><item><title><![CDATA[I Fired My Billionaire Mentors, and My Business Grew to $2M]]></title><description><![CDATA[The N+3 Rule: My simple system for decoding the playbooks of those three steps ahead.]]></description><link>https://www.zerotopete.com/p/i-fired-my-billionaire-mentors-and</link><guid isPermaLink="false">https://www.zerotopete.com/p/i-fired-my-billionaire-mentors-and</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Wed, 17 Sep 2025 14:23:47 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!g9RI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!g9RI!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!g9RI!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 424w, https://substackcdn.com/image/fetch/$s_!g9RI!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 848w, https://substackcdn.com/image/fetch/$s_!g9RI!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 1272w, https://substackcdn.com/image/fetch/$s_!g9RI!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!g9RI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png" width="1452" height="1092" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1092,&quot;width&quot;:1452,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:1483134,&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://petebuilds.substack.com/i/173850989?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.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_!g9RI!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 424w, https://substackcdn.com/image/fetch/$s_!g9RI!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 848w, https://substackcdn.com/image/fetch/$s_!g9RI!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.png 1272w, https://substackcdn.com/image/fetch/$s_!g9RI!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F0d214c6c-d89f-443d-822b-5471ba8833b0_1452x1092.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>You know the routine. It&#8217;s 11 PM, and you&#8217;re deep in a YouTube rabbit hole. Another interview with a billionaire at Davos or as a keynote speaker for a pay-to-play business conference. They&#8217;re talking about "thinking in first principles," "disrupting paradigms," or the existential weight of managing a $100 billion company.</p><p>You close the tab feeling vaguely inspired, thinking you&#8217;ve just done some valuable "micro-learning."</p><p>Let&#8217;s be honest. You haven&#8217;t learned anything. You&#8217;ve just been entertained.</p><p><strong>Consuming advice from people 100 steps ahead of you isn't education; it's escapism. </strong></p><blockquote><p>It&#8217;s like trying to learn how to ride a bike by watching a Formula 1 driver. The physics are the same, but the context, tools, and immediate problems are so different that the advice is functionally useless.</p></blockquote><p>I scaled my business from zero to $2M in revenue. The single biggest unlock wasn't a grand vision or a piece of esoteric wisdom from a titan of industry. It was getting brutally honest about my stage and consuming information that matched my immediate goals - not someone else's champagne problems.</p><h2>The Mentor Paradox</h2><p>My first job out of grad school, I had two mentors. One was a Senior Partner, a legend who managed a 5,000-person division. Our conversations were about golf, macro-economic trends, and 10-year strategic roadmaps. It was inspiring, sure. But did it help me figure out how to get my project unstuck, scale my team, or navigate a tricky conversation with my client? Not once.</p><p>My other mentor was a Senior Associate, just three levels above me. He wasn't a legend; he was just really good at his job - a fantastic manager. He taught me how to navigate politics at the firm, how to hire and manage great people,  and how to deliver massive value to clients on-time and under budget. </p><p><strong>He gave me the cheat codes for the level I was </strong><em><strong>actually playing</strong></em><strong>.</strong></p><p>The partner was 100 steps ahead. The associate was three. Guess whose advice got me promoted three times in three years?</p><p>This is the principle that matters. You don't need mentors in the stratosphere. You need guides for the terrain you're about to cross.</p><p>I call it the <strong>N+3 Rule</strong>: Find the people and companies who are just three tangible steps ahead of your current state (N). That&#8217;s where the gold is.</p><p>Here&#8217;s the framework to put it into practice.</p><h2>Step 1: Get Brutally Honest About <code>N</code> (Where You Are)</h2><p>You can't find your next step if you don't know where your feet are. Most people are vague about their current position. "We're an early-stage startup." "I'm a growing creator." This is too fuzzy. Get specific and quantitative.</p><p>My <code>N</code>:</p><ul><li><p><strong>Revenue:</strong> $2M ARR</p></li><li><p><strong>Team:</strong> 6 full-time employees</p></li><li><p><strong>Go-to-Market:</strong> 100% word-of-mouth, founder-led sales.</p></li><li><p><strong>Biggest Problem:</strong> My time is the bottleneck. We can't grow unless I build repeatable systems for marketing, sales, and delivery.</p></li></ul><p>Your <code>N</code> might be:</p><ul><li><p><strong>Revenue:</strong> $5k MRR</p></li><li><p><strong>Team:</strong> 1 founder, 2 freelancers</p></li><li><p><strong>Go-to-Market:</strong> Posting on X</p></li><li><p><strong>Biggest Problem:</strong> Going from first 10 customers to first 100.</p></li></ul><p>Write it down. No vanity metrics. Just the ground truth.</p><h2>Step 2: Map Your Next Three Milestones (N+1, N+2, N+3)</h2><p>With a clear picture of <code>N</code>, define the next three meaningful milestones. Don't just pull numbers out of the air. Think about what each milestone <em>unlocks</em>.</p><p>My milestones:</p><ul><li><p><strong>N+1: $3M ARR.</strong> <em>Unlock:</em> Build a repeatable marketing engine beyond word-of-mouth. Have a predictable lead generation system.</p></li><li><p><strong>N+2: $6M ARR.</strong> <em>Unlock:</em> Hire a dedicated salesperson and an operations lead to free me from day-to-day firefighting. </p></li><li><p><strong>N+3: $12M ARR.</strong> <em>Unlock:</em> Establish a leadership team that can run the business without my daily operational involvement.</p></li></ul><p>Each step represents a fundamental shift in the business, from me doing the work, to me building the team that does the work.</p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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">Subscribe for free. Get weekly posts on using <strong>technology</strong> and <strong>product</strong> to build a life of <strong>freedom</strong>, <strong>wealth</strong>, and <strong>meaning</strong>.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div><h2>Step 3: Build Your N+3 Dashboard</h2><p>Now, stop watching interviews with the CEO of the $12 <em>billion</em> company. Your goal is to find and obsessively study the companies and founders who are currently at your <strong>N+3</strong> stage ($12M ARR, in my case).</p><p>They have solved the exact problems you are about to face. Their solutions are relevant, recent, and accessible.</p><p>Here&#8217;s the tactical part:</p><ol><li><p><strong>Create Private Lists:</strong> Go to X and LinkedIn and create private lists. Name it "N+3 Mentors" or "Future State."</p></li><li><p><strong>Identify Your Targets:</strong> Find 10-15 companies that fit your N+3 profile. Look on industry lists, funding announcements from a few years ago, or LinkedIn Sales Navigator. Find the founders, CEOs, and heads of product, technology, marketing, and sales at these companies.</p></li><li><p><strong>Add Them to Your Lists:</strong> This is your new, curated feed. It's your real-time MBA.</p></li><li><p><strong>Study, Don't Just Scroll:</strong> Watch what they do, not just what they say.</p><ul><li><p><strong>Hiring:</strong> What roles are they hiring for <em>right now</em>? That&#8217;s your future org chart. If they&#8217;re hiring their first Head of Customer Success, it tells you when they decided to specialize that function.</p></li><li><p><strong>Marketing:</strong> What channels are they using? Are they running podcasts? Publishing case studies? How do they talk about their product? Their positioning is a masterclass for your future self.</p></li><li><p><strong>People:</strong> How do the founders talk on podcasts (the smaller, industry-specific ones, not the giant ones)? What problems do they discuss? Their last year's problems are your next year's problems.</p></li></ul></li></ol><p>Reassess this list every 6 months. As you grow, your N+3 target will shift. The people you follow today might not be the right guides for you in a year. This is a living system, not a static list.</p><h2>Inspiration vs. Instruction</h2><p>Does this mean you should never listen to Jeff Bezos or Sara Blakely? Of course not. Listen to them for inspiration, for long-term vision, for thinking about the shape of a market a decade from now.</p><p><strong>But don't confuse their stories for a user manual.</strong></p><p>The art of building is knowing the difference between inspiration and instruction. Instruction is what gets you to the next level. And the best instruction comes from the people who just got there.</p><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/i-fired-my-billionaire-mentors-and?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading Zero to Pete! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/i-fired-my-billionaire-mentors-and?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.zerotopete.com/p/i-fired-my-billionaire-mentors-and?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Art of Letting Go: Build Better & Faster with AI by Surrendering Control]]></title><description><![CDATA[Why the key to unlocking AI's potential isn't better prompting - it's a fundamental shift in how we think about building.]]></description><link>https://www.zerotopete.com/p/the-art-of-letting-go-build-better</link><guid isPermaLink="false">https://www.zerotopete.com/p/the-art-of-letting-go-build-better</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Mon, 09 Jun 2025 16:23:57 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/2f87dbac-cef2-4d6f-8b09-2f51929c10b1_1456x1048.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>It's 2025, and building with AI feels like living through a paradox. The technology's leap in capability has been staggering, moving from a curiosity to a core engine of creation in what feels like an instant.</p><ul><li><p><strong>2023:</strong> AI for coding felt like teaching your dog a new trick. It was cute, impressive to your friends, but mostly a novelty.</p></li><li><p><strong>2024:</strong> With a lot of hand-holding, you could coax out a crude MVP. Progress, but it still required a ton of supervision.</p></li><li><p><strong>2025:</strong> Today's models can build almost anything you can <em>clearly</em> describe.</p></li></ul><p>The power is here. But the key to moving at its speed requires a change in our approach. It demands that we, especially seasoned developers and creators, unlearn our most cherished professional habit: the need for total control. <strong>It requires mastering the art of letting go.</strong></p><h3>A Tale of Two MVPs</h3><p>I recently saw this play out at my technology agency, Religion Studio. I had a team of four seasoned developers spend seven business days crafting an MVP for an internal &#8220;labs&#8221; project. By any normal measure, their output was incredible, the kind of rapid, high-quality progress that would make any product manager ecstatic. And yet, juxtaposed with what's now possible, it felt... constrained.</p><p>This isn't an overnight observation. I studied computer science, and though most of my career has focused on product management and strategy, I&#8217;ve been building on the side for years. For the last three years especially, as the AI revolution took hold, I&#8217;ve built something new every month to test the limits of AI: scripts, sites, apps, and watching the tools get progressively better.</p><p>But I'd never run a direct A/B test. So I did&#8230;</p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p>After the team completed the labs project, I set out to build a different product two to three times more complex than the team's MVP. I gave myself the same seven-day window. I&#8217;ll admit the architectural trade-offs: I chose a quick deployment on Railway instead of a full Amazon AWS stack designed for scale and security which certainly gave me an edge in speed. I could focus on creating value in the product instead of configuring architecture. </p><p>But the product I was building, it was a beast! I built something nearly three times the size and complexity. I did it by myself. With 20% of the resources, I delivered 300% of the scope. My workflow was completely different though: I didn&#8217;t fret over a single line of code unless there was an error. I didn't debug; I just fed the error back to the AI and had it fix it for me, either in Cursor or a Claude chat.</p><h3>The Friction in Your Mindset</h3><p>This new way of working feels heretical. It goes against everything we were taught about craftsmanship, creating friction in two key areas.</p><p><strong>First, the myth of total code ownership. Second, the tyranny of the pixel-perfect design.</strong> I learned this while building complex UIs for both responsive websites and native apps. I used to fight the model for hours over misaligned buttons. Now, I accept the good-enough UI it creates and focus my energy on the core functionality. I stopped fighting the model and started &#8220;vibing&#8221; with it.</p><p>This experience highlights the real shift in our roles. <strong>For years, seniority meant knowing every line. Today, the leverage is different.</strong></p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2Nq5!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2Nq5!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 424w, https://substackcdn.com/image/fetch/$s_!2Nq5!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 848w, https://substackcdn.com/image/fetch/$s_!2Nq5!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 1272w, https://substackcdn.com/image/fetch/$s_!2Nq5!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2Nq5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png" width="550" height="173.57798165137615" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:344,&quot;width&quot;:1090,&quot;resizeWidth&quot;:550,&quot;bytes&quot;:57137,&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://pastandprologue.substack.com/i/165551914?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.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_!2Nq5!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 424w, https://substackcdn.com/image/fetch/$s_!2Nq5!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 848w, https://substackcdn.com/image/fetch/$s_!2Nq5!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 1272w, https://substackcdn.com/image/fetch/$s_!2Nq5!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F71554be9-c5a7-4bb6-89df-fe7962557d27_1090x344.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption"> </figcaption></figure></div><h3>The Slot Machine Mindset</h3><p>For the first time in history, the cost of trying things is approaching zero. This economic shift demands a new mental model, and the best one I&#8217;ve found is to <strong>treat AI like a slot machine.</strong></p><p>The goal isn't to meticulously craft one perfect prompt. It's to maximize your chances of hitting a jackpot in the shortest amount of time. The engineers at Anthropic, who created Claude, have a workflow that perfectly embodies this:</p><blockquote><p>"Save your state before letting Claude work, let it run for 30 minutes, then either accept the result or start fresh rather than trying to wrestle with corrections. Starting over often has a higher success rate than trying to fix Claude&#8217;s mistakes."</p></blockquote><p>This is the core of the slot machine mindset. When an output is wrong, whether it's buggy code or a bad image, don't get sucked into a lengthy back-and-forth. Your odds are better if you just pull the lever again. Refine your prompt and start fresh. An extra minute spent on a new pull can save an hour of painful, manual debugging.</p><h3>Your Tinker-Tonight Checklist</h3><ol><li><p><strong>Write the user story in plain English first.</strong></p></li><li><p><strong>Choose your stack or ask the model which stack pitfalls to choose/avoid.</strong></p></li><li><p><strong>Focus 90% on function, 10% on polish.</strong> Let the design evolve.</p></li><li><p><strong>Run functional tests, accept good-enough visuals, and iterate.</strong></p></li><li><p><strong>Keep a "sniff-test" branch.</strong> If something feels off, isolate it and then dive deep.</p></li></ol><h3>What Stays Human&#8230;For Now</h3><p>Letting go doesn't mean abdicating responsibility. This workflow is optimized for greenfield projects. It&#8217;s <strong>not yet suited for complex legacy systems that require too large of a context for an AI to fully grasp the product's codebase complexity and nuance.</strong> The AI is still a valuable companion there, but the workflow is different.</p><p>And for any project, the most critical roles remain firmly human:</p><ul><li><p><strong>Vision:</strong> Deciding <em>what</em> to build and <em>why</em> it matters.</p></li><li><p><strong>High-Level Architecture:</strong> Someone must choose the north star for the project.</p></li><li><p><strong>Security &amp; Compliance:</strong> We still sign our names on the risk register.</p></li><li><p><strong>Taste &amp; Story:</strong> Knowing <em>which</em> experience feels right is a human superpower.</p></li></ul><h3>Optimism Beats Anxiety</h3><p>The real story here isn't about pushing developers out; it's about <strong>pulling more ideas into reality.</strong> The historic bottleneck for innovation was discovering the right problem and iterating fast enough to nail product-market fit. Now you can test three hypotheses in the time it used to take for one.</p><p><strong>The art of building in the age of AI is the art of letting go. </strong></p><p></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/the-art-of-letting-go-build-better?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;,&quot;action&quot;:null,&quot;class&quot;:null}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.zerotopete.com/p/the-art-of-letting-go-build-better?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p><p></p>]]></content:encoded></item><item><title><![CDATA[Forget Vision. Build Something Useful.]]></title><description><![CDATA[No, you don&#8217;t need a vision statement. You need to create value.]]></description><link>https://www.zerotopete.com/p/forget-vision-build-something-useful</link><guid isPermaLink="false">https://www.zerotopete.com/p/forget-vision-build-something-useful</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Mon, 07 Apr 2025 12:26:15 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!cDjJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>There&#8217;s a lot of noise in the startup world about the importance of having a &#8220;vision.&#8221; About how no company can succeed without one. About how your mission should be on the wall, in your pitch deck, tattooed on your soul. </p><p>But I&#8217;d argue that for most early-stage founders, vision is a distraction. Worse, it can be a limitation.</p><p>Let me be clear: I&#8217;m not saying vision is useless. If you&#8217;re running a multi-unit business or you're a CEO trying to align ten departments under one roof, you need a vision. You need a narrative that brings clarity and cohesion to chaos.</p><p>But that&#8217;s not where startups are. <strong>Most startups haven&#8217;t even earned the right to have a vision.</strong></p><h2>Vision is for later. Usefulness is for now.</h2><p>Right now, you need something else. You need to build something useful. Something real. Something that solves a problem someone actually has, and solves it in a way that makes them say, &#8220;this is awesome.&#8221;</p><p>Cool, even. And then they come back, because your clever little thing actually adds value to their life.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!cDjJ!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!cDjJ!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 424w, https://substackcdn.com/image/fetch/$s_!cDjJ!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 848w, https://substackcdn.com/image/fetch/$s_!cDjJ!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 1272w, https://substackcdn.com/image/fetch/$s_!cDjJ!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!cDjJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic" width="1456" height="1048" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1048,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:282507,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://pastandprologue.substack.com/i/160684899?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.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_!cDjJ!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 424w, https://substackcdn.com/image/fetch/$s_!cDjJ!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 848w, https://substackcdn.com/image/fetch/$s_!cDjJ!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 1272w, https://substackcdn.com/image/fetch/$s_!cDjJ!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F11370362-7388-4b43-9ee5-8e7f18e6da3b_1456x1048.heic 1456w" sizes="100vw" fetchpriority="high"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a><figcaption class="image-caption">I stole this photo of @manramp from Thrasher Magazine</figcaption></figure></div><p>Now, &#8220;cool&#8221; is often written off as subjective. But it&#8217;s not <em>that</em> subjective. We know it when we see it. An AI assistant that takes better meeting notes than any project manager you&#8217;ve ever worked with? Cool. A tool that helps the Department of Sanitation process waste 10% faster? Not flashy, but cool. Because it's solving a real problem in a way that clearly works.</p><p>Cool, in this context, means: you found a problem and created a solution someone actually wants.</p><p>That&#8217;s it. That&#8217;s the goal.</p><p>Not defining your vision statement. Not brainstorming a five-point mission framework. Just solving something that matters, in a way that makes someone else say, &#8220;this is better than what I had before.&#8221;</p><h2>Vision-first thinking traps you.</h2><p>If you're pre-product-market fit, haven&#8217;t cracked retention, and haven't captured more than a sliver of your total addressable market, vision is a trap. It invites you to anchor your thinking around a fantasy future instead of engaging honestly with what&#8217;s happening now. It discourages learning and evolving. It locks you into a version of the world that may never materialize.</p><p>Even worse, it makes it harder to pivot. Because now you&#8217;ve told everyone: investors, your team, the internet, what you stand for. You&#8217;ve made it public. And you don&#8217;t want to look like you were wrong. So instead of adapting, you start contorting your roadmap to keep the original narrative intact. </p><p><strong>That&#8217;s how smart people end up building things no one wants.</strong></p><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p>And don&#8217;t even get me started on the consultants. There&#8217;s an entire cottage industry of strategists selling Fortune 500 companies templated visions and missions at absurd markups. These companies check the box and move on. Maybe that&#8217;s fine when you&#8217;re a mature organization looking to align massive teams. But for a startup, it&#8217;s theater.</p><h2>Just build something. Let the vision emerge.</h2><p>The truth is, vision can be discovered. It doesn't always need to be declared.</p><p>A few weeks ago, I found myself stuck. I&#8217;d been thinking about a product idea for months, turning it over, theorizing, trying to articulate what it <em>could</em> be. I&#8217;ve been coding since I was 13, studied computer science in undergrad and grad school, worked as an engineer and product manager for years, built mobile apps and enterprise platforms. Still, I felt blocked. I wasn&#8217;t building.</p><p>Then one weekend, I just opened my laptop. I started vibe coding. Not wireframing. Not writing docs. Just coding. Tinkering. Testing. I literally took a photo of a sketch on a napkin and used that to generate the interface. </p><p>Eight hours later, I had a prototype. My girlfriend tried it and gave feedback. I iterated. The next day, I had a second prototype. The following weekend, a third.</p><p>Each version taught me something. And every iteration got better. Not because I had a guiding vision, but because I was in the loop. I was learning through doing.</p><p>Now, her and I use the product almost daily. Not out of obligation, but because it&#8217;s useful. It adds value to our life. That&#8217;s the only validation I needed.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!oTDq!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!oTDq!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 424w, https://substackcdn.com/image/fetch/$s_!oTDq!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 848w, https://substackcdn.com/image/fetch/$s_!oTDq!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 1272w, https://substackcdn.com/image/fetch/$s_!oTDq!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!oTDq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic" width="476" height="112.94093686354378" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:233,&quot;width&quot;:982,&quot;resizeWidth&quot;:476,&quot;bytes&quot;:20074,&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://pastandprologue.substack.com/i/160684899?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.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_!oTDq!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 424w, https://substackcdn.com/image/fetch/$s_!oTDq!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 848w, https://substackcdn.com/image/fetch/$s_!oTDq!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 1272w, https://substackcdn.com/image/fetch/$s_!oTDq!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3d38e37-eee7-4ef0-9ec3-657cce0c9285_982x233.heic 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>And here&#8217;s the wild part: I used almost nothing from grad school. I relied almost entirely on AI tools. All that mattered was momentum, feedback, and the willingness to build without overthinking.</p><h2>Vision will come later. When it&#8217;s earned.</h2><p>Eventually, yes, you&#8217;ll need a story. Something to help others understand what you&#8217;re building and why it matters. But you&#8217;ll write that story based on what you&#8217;ve seen in the world, not what you <em>hope</em> to see. You&#8217;ll build your vision from the ground up, brick by brick, based on real signals.</p><p><strong>Until then, forget the branding exercises. Forget the boardroom poetry.</strong></p><p><strong>Build something useful.</strong></p><p><strong>That&#8217;s how you earn your vision.</strong></p><p></p><div><hr></div><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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">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><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/forget-vision-build-something-useful?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/forget-vision-build-something-useful?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.zerotopete.com/p/forget-vision-build-something-useful?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div><p></p>]]></content:encoded></item><item><title><![CDATA[The Prompt Every Product Manager Should Use to Make Sure They’re Climbing the Right Hill]]></title><description><![CDATA[This is how I zoom out to ask: am I climbing the right hill, or just the one that&#8217;s most familiar?]]></description><link>https://www.zerotopete.com/p/the-prompt-every-product-manager</link><guid isPermaLink="false">https://www.zerotopete.com/p/the-prompt-every-product-manager</guid><dc:creator><![CDATA[Pete]]></dc:creator><pubDate>Sat, 05 Apr 2025 16:11:24 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!By6_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic" length="0" type="image/jpeg"/><content:encoded><![CDATA[<div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!By6_!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!By6_!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!By6_!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!By6_!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!By6_!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!By6_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic" width="1456" height="971" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/ece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:971,&quot;width&quot;:1456,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:230103,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/heic&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:&quot;https://pastandprologue.substack.com/i/160646807?img=https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.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_!By6_!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 424w, https://substackcdn.com/image/fetch/$s_!By6_!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 848w, https://substackcdn.com/image/fetch/$s_!By6_!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 1272w, https://substackcdn.com/image/fetch/$s_!By6_!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fece64816-8cdf-4c41-81b2-1e487e7af4a2_1536x1024.heic 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>Yesterday I wrote about <a href="https://open.substack.com/pub/pastandprologue/p/a-mental-model-from-evolutionary">a mental model from evolutionary biology that will change how you work</a> &#8212; a concept called the <strong>fitness landscape</strong> that&#8217;s guided how I think about strategy, product, and progress.</p><p>Instead of seeing work as a straight line, roadmap to result, the fitness landscape helps me see it as movement across shifting terrain:  </p><p>Peaks of success. Valleys of failure. Blind spots.  </p><p>Sometimes you climb. Sometimes you get stuck. Sometimes the ground moves beneath you. That shift in perspective changed the kinds of questions I ask about product strategy.</p><p><strong>Today&#8217;s post is about how I apply that lens in practice, and the prompt I use to gut check whether I&#8217;m still climbing the right hill.</strong></p><h2>How I Review Roadmaps Like a Terrain Map</h2><p>At the end of each planning cycle, usually monthly or quarterly, I run a simple process that helps me take a step back and ask:</p><ul><li><p>Are we climbing a meaningful hill, or just polishing what we&#8217;ve already built?</p></li><li><p>Are we making space for new ideas, or avoiding exploration because it feels riskier to say yes than no?</p></li><li><p>Are we protecting features that still have strategic value or just the ones that have political momentum?</p></li></ul><p>I&#8217;ve used three prompts over the past year to help me explore those questions:</p><ol><li><p>One for auditing features</p></li><li><p>One for surfacing adjacent ideas</p></li><li><p>One for spotting places I might be stuck</p></li></ol><p>Read more about fitness landscapes here: </p><div class="digest-post-embed" data-attrs="{&quot;nodeId&quot;:&quot;d88041d2-e0a6-4343-ad91-3744f14b69da&quot;,&quot;caption&quot;:&quot;Some teams sprint confidently in the wrong direction.&quot;,&quot;cta&quot;:null,&quot;showBylines&quot;:true,&quot;size&quot;:&quot;sm&quot;,&quot;isEditorNode&quot;:true,&quot;title&quot;:&quot;A Mental Model from Evolutionary Biology That Will Change How You Work&quot;,&quot;publishedBylines&quot;:[{&quot;id&quot;:161291298,&quot;name&quot;:&quot;Pete Spano&quot;,&quot;bio&quot;:&quot;NY-based strategist and tech founder. Lessons from scaling a 7-figure business, where strategy and technology fuel personal and professional growth.&quot;,&quot;photo_url&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7a790ad1-92cb-41cf-8fc0-fc0b838ddc4c_800x800.jpeg&quot;,&quot;is_guest&quot;:false,&quot;bestseller_tier&quot;:null}],&quot;post_date&quot;:&quot;2025-04-04T14:15:02.373Z&quot;,&quot;cover_image&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd5498c91-9fa3-48cc-928e-3fee1e6e1d87_1456x1048.heic&quot;,&quot;cover_image_alt&quot;:null,&quot;canonical_url&quot;:&quot;https://pastandprologue.substack.com/p/a-mental-model-from-evolutionary&quot;,&quot;section_name&quot;:null,&quot;video_upload_id&quot;:null,&quot;id&quot;:160575659,&quot;type&quot;:&quot;newsletter&quot;,&quot;reaction_count&quot;:4,&quot;comment_count&quot;:0,&quot;publication_id&quot;:null,&quot;publication_name&quot;:&quot;Past and Prologue&quot;,&quot;publication_logo_url&quot;:&quot;https://substackcdn.com/image/fetch/f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F924e97a0-741d-4b24-94f8-790a884c7f24_800x800.png&quot;,&quot;belowTheFold&quot;:true,&quot;youtube_url&quot;:null,&quot;show_links&quot;:null,&quot;feed_url&quot;:null}"></div><p>This week, I decided to combine them into a single, more thoughtful AI prompt, something you could drop into ChatGPT or Claude with a roadmap and some context, and get back a useful terrain-aware view of what I&#8217;m doing and what I might be missing.</p><h2>How I Use It</h2><p>I build my roadmaps in Asana, where each item in my roadmap is a card that has a title, description, time horizon, and usually a few tags: theme, goal, KPIs, audience, and monetization. At the end of the planning cycle, I export the Asana roadmap as a CSV.</p><p>Alongside that, I always attach a short <strong>strategy document</strong>. It includes:</p><ul><li><p>Current goals</p></li><li><p>Strategic themes</p></li><li><p>User segments or personas</p></li><li><p>Known risks</p></li><li><p>Go-to-market plans</p></li><li><p>Any broader context I&#8217;d give a new PM joining the team</p></li></ul><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.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://www.zerotopete.com/subscribe?"><span>Subscribe now</span></a></p><p>The prompt works best with both, the tactical (what you&#8217;re doing), and the strategic (why you&#8217;re doing it). When I include both, I find the insights sharper and more useful.</p><p>I don&#8217;t expect it to give me the answers. <strong>What I want is to spark new questions to help me notice patterns I may have stopped questioning, or areas I&#8217;ve unintentionally under-explored.</strong></p><h2>What the Prompt Does</h2><p>This isn&#8217;t just about labeling items &#8220;optimization&#8221; or &#8220;exploration.&#8221;  </p><p>The prompt asks the AI to act like a <strong>terrain navigator</strong> to help me evaluate:</p><ul><li><p>What hill I&#8217;m on  </p></li><li><p>Whether it&#8217;s still worth climbing  </p></li><li><p>What peaks I might be avoiding  </p></li><li><p>Where inertia or sunk cost might be shaping decisions  </p></li><li><p>Where I&#8217;m doing work that looks productive, but isn&#8217;t moving me toward anything that matters</p></li></ul><p>And then it prompts <strong>reflection</strong>, not recommendations.  </p><p><strong>Because strategy isn&#8217;t a checklist. </strong>It&#8217;s movement in a landscape that doesn&#8217;t stay still.</p><h2>You&#8217;ll find the full prompt below.</h2><p>If you use it, I&#8217;d love to hear how it works for you or what you adapted. </p><p>The terrain&#8217;s different for all of us. That&#8217;s kind of the point.</p><p>&#128591;</p><pre><code><code>** AI Prompt: Terrain Navigator &#8211; Roadmap Strategy Audit **

You are a terrain navigator, not just a product strategist.

Your job is to help a team understand where they are on the strategic landscape &#8212; where they&#8217;re climbing, where they&#8217;re stuck, and where they might be ignoring higher peaks altogether.

You're working from a mental model called the fitness landscape, borrowed from evolutionary biology. In this model:

Optimization = climbing a known peak

Exploration = jumping to new terrain in search of higher fitness

Local maxima = a place that feels successful, but isn&#8217;t the best spot on the map

Fitness = strategic value &#8212; measured in traction, growth, retention, relevance, user love, or long-term advantage

The terrain shifts over time &#8212; and teams must adapt with it

** Your goal **

Help the team see where their roadmap places them on the landscape

Reveal patterns that suggest they are:

Climbing the same hill

Ignoring better terrain

Over-polishing flat or eroding ground

Avoiding exploration due to sunk cost or inertia

Give them terrain-aware insight: Are they moving toward higher fitness, or circling?

You are most useful when you:

Surface blind spots

Challenge comfort

Spot the gap between strategy and movement

Provoke meaningful, reflective questions

** Your tasks **

Assess each item and categorize it by movement type:

- Climbing the same peak (optimization)

- Exploring adjacent terrain (exploration)

- Circling (low movement, low novelty)

- Eroding value (working on something that no longer matters)

- Unvisited terrain (nothing planned here, but opportunity exists)

Identify topography patterns:

Where is most energy being spent?

Are we over-indexing on a single peak?

What&#8217;s being ignored that may represent strategic upside?

Evaluate current strategic fitness:

Are roadmap efforts aligned with long-term goals or short-term comfort?

Are we polishing areas that no longer move us forward?

What roadmap items reflect fear or inertia more than strategy?

Reflect and provoke:

What are we not building &#8212; and why?

What &#8220;next peak&#8221; are we pretending not to see?

Where might the terrain be shifting beneath us?

** Format your response like this: **

&#129517; Terrain Overview
- Climbing (Optimization): X items (Y%)
- Exploring (Adjacent): X items (Y%)
- Circling: X items (Y%)
- Eroding: X items (Y%)
- Unvisited but valuable: X areas

&#128205; Patterns Noticed

[Pattern or tension 1]

[Pattern or imbalance 2]

[Underleveraged area or opportunity 3]

&#129504; Terrain-Aware Questions

[What peak are we climbing, and is it still the right one?]

[Where are we assuming stability in a shifting landscape?]

[What adjacent territory have we ignored out of comfort or legacy?]

&#128269; Strategic Moves to Consider

[Feature or theme to deprioritize] &#8212; may be over-optimized

[Underexplored idea] &#8212; potential new terrain worth scouting

[Bold move] &#8212; scary but possibly game-changing

&#128229; USER INPUT (Required)

Please upload any roadmap, changelog, backlog, or planning documents OR paste them below, and include context as needed.

Provide as much of the following as possible:

Product or company goals (e.g. growth, retention, monetization)

Target audience or user types

Known competition or threats

Roadmap or backlog items, ideally with descriptions or statuses

Any strategic priorities, themes, or OKRs guiding decisions

Any additional metadata (e.g. percent complete, timelines, effort, impact)

&#128071;&#128071;&#128071;Paste your roadmap and context here, or upload your file&#128071;&#128071;&#128071;</code></code></pre><div><hr></div><div class="captioned-button-wrap" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/the-prompt-every-product-manager?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="CaptionedButtonToDOM"><div class="preamble"><p class="cta-caption">Thanks for reading! This post is public so feel free to share it.</p></div><p class="button-wrapper" data-attrs="{&quot;url&quot;:&quot;https://www.zerotopete.com/p/the-prompt-every-product-manager?utm_source=substack&utm_medium=email&utm_content=share&action=share&quot;,&quot;text&quot;:&quot;Share&quot;}" data-component-name="ButtonCreateButton"><a class="button primary" href="https://www.zerotopete.com/p/the-prompt-every-product-manager?utm_source=substack&utm_medium=email&utm_content=share&action=share"><span>Share</span></a></p></div>]]></content:encoded></item></channel></rss>