<?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[newsletter.esc.sh]]></title><description><![CDATA[newsletter.esc.sh]]></description><link>https://newsletter.esc.sh</link><image><url>https://newsletter.esc.sh/img/substack.png</url><title>newsletter.esc.sh</title><link>https://newsletter.esc.sh</link></image><generator>Substack</generator><lastBuildDate>Tue, 29 Sep 2026 04:56:31 GMT</lastBuildDate><atom:link href="https://newsletter.esc.sh/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Mansoor]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[writeahead@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[writeahead@substack.com]]></itunes:email><itunes:name><![CDATA[Mansoor]]></itunes:name></itunes:owner><itunes:author><![CDATA[Mansoor]]></itunes:author><googleplay:owner><![CDATA[writeahead@substack.com]]></googleplay:owner><googleplay:email><![CDATA[writeahead@substack.com]]></googleplay:email><googleplay:author><![CDATA[Mansoor]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Dubernetes: Vibe Coding A Dumb Container Orchestrator]]></title><description><![CDATA[TL;DR Give me code]]></description><link>https://newsletter.esc.sh/p/vibecoding-dubernetes</link><guid isPermaLink="false">https://newsletter.esc.sh/p/vibecoding-dubernetes</guid><dc:creator><![CDATA[Mansoor]]></dc:creator><pubDate>Sun, 28 Sep 2025 03:57:49 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/eb5a04c3-dd50-4c75-b01e-2235212c1af9_1712x898.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>TL;DR Give me code</h2><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gJvu!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gJvu!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 424w, https://substackcdn.com/image/fetch/$s_!gJvu!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 848w, https://substackcdn.com/image/fetch/$s_!gJvu!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 1272w, https://substackcdn.com/image/fetch/$s_!gJvu!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gJvu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!gJvu!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 424w, https://substackcdn.com/image/fetch/$s_!gJvu!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 848w, https://substackcdn.com/image/fetch/$s_!gJvu!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 1272w, https://substackcdn.com/image/fetch/$s_!gJvu!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F673654a6-babb-460d-b647-5e0f69e62d99_1712x898.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>Alright. Here <a href="https://github.com/MansoorMajeed/Dubernetes?ref=blog.esc.sh">https://github.com/MansoorMajeed/Dubernetes</a></p><h2>But Why?</h2><p>A while ago I wrote about how Kubernetes runs containers under the hood</p><div class="captioned-image-container"><figure><p><a href="https://blog.esc.sh/kubernetes-containers-linux-processes/">How Kubernetes Runs Containers : A Practical Deep Dive</a></p><figcaption class="image-caption"><a href="https://blog.esc.sh/kubernetes-containers-linux-processes/">Taking a deep dive into how Kubernetes runs containers as Linux processes</a></figcaption></figure></div><p>And this was my "dumb architecture" from that article</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!zCP2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!zCP2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 424w, https://substackcdn.com/image/fetch/$s_!zCP2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 848w, https://substackcdn.com/image/fetch/$s_!zCP2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 1272w, https://substackcdn.com/image/fetch/$s_!zCP2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!zCP2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png" width="1840" height="986" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:986,&quot;width&quot;:1840,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!zCP2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 424w, https://substackcdn.com/image/fetch/$s_!zCP2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 848w, https://substackcdn.com/image/fetch/$s_!zCP2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.png 1272w, https://substackcdn.com/image/fetch/$s_!zCP2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F485302c4-8ed5-4814-bbdf-10726a485fb2_1840x986.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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>So I thought, why don't I vibe code a dumb one? It could be a valuable resource for someone learning container orchestration. I initially thought of writing it by myself, but a quick look at my graveyard of half-baked projects convinced me otherwise.</p><h2>Requirements - How should it work?</h2><p>I want to write down a desired state for my app in a <code>yaml</code> file, use a command line tool similar to <code>kubectl</code> and Dubernetes should then use that to create Docker containers to run my application.</p><p>The Yaml should be something like this</p><pre><code>name: myapp
image: myapp-image:latest
replicas: 3
access:
  host: myapp.local</code></pre><p>It is as simple as it can be</p><ul><li><p>Give a name</p></li><li><p>Specify a docker image to run (no sidecars in Dubernetes sorry)</p></li><li><p>Specify how many replicas (docker containers)</p></li><li><p>Expose it via a domain name (Built-in ingress)</p></li></ul><h2>Building it</h2><h3>Step 1 : Deciding on the basics</h3><ul><li><p><strong>Language </strong>: When it came to the language, was there ever any doubt? It had to be <strong>Go</strong>. It&#8217;s the native tongue of Kubernetes and is fantastic for building the kind of system-level tools like Dubernetes</p></li><li><p><strong>AI Assistant</strong>: I decided to go with <code>Claude code</code></p></li></ul><h3>Step 2: Brainstorming with Claude Code</h3><p>I spent a bit of time talking to Claude about what we are going to build. We discussed about the <code>yaml</code> structure, and the need for keeping everything simple. Initially it suggested a whole lot of complicated features. But added the following lines in <code>CLAUDE.md</code> to curb Claude's enthusiasm a little bit</p><blockquote><p><strong>Design Goals</strong><br>Maximum Simplicity: One orchestrator, one proxy, minimal components<br>Learning Focus: Understand orchestration without enterprise complexity</p></blockquote><p>Claude can be opinionated if you don't drive the conversation. So be very vocal about your vision and you will of course be bombarded with the classic <code>You're absolutely right</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!81ay!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!81ay!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!81ay!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!81ay!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!81ay!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!81ay!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg" width="600" height="900" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:900,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!81ay!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 424w, https://substackcdn.com/image/fetch/$s_!81ay!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 848w, https://substackcdn.com/image/fetch/$s_!81ay!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!81ay!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F6919c759-c434-4b1f-a5cf-41fb65d39a00_600x900.jpeg 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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>Take as much time as needed in this step. Make sure to not overload the context with unnecessary information.</p><h4>Coming up with a high level architecture</h4><p>After talking to claude for some time, we came up with an architecture.</p><p>You can find the detailed architecture <a href="https://github.com/MansoorMajeed/Dubernetes/blob/main/architecture.md?ref=blog.esc.sh">here</a>. Here is a high level view of the overall system</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xYQP!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xYQP!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 424w, https://substackcdn.com/image/fetch/$s_!xYQP!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 848w, https://substackcdn.com/image/fetch/$s_!xYQP!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 1272w, https://substackcdn.com/image/fetch/$s_!xYQP!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xYQP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png" width="2000" height="1742" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1742,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!xYQP!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 424w, https://substackcdn.com/image/fetch/$s_!xYQP!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 848w, https://substackcdn.com/image/fetch/$s_!xYQP!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.png 1272w, https://substackcdn.com/image/fetch/$s_!xYQP!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa0553b1f-3bef-4c9a-926a-0e862f945565_2812x2449.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">dubernetes architecture</figcaption></figure></div><ul><li><p>A <strong>single binary</strong> <code>Orchestrator</code></p><ul><li><p>It has API endpoints where the user can make requests about the desired state of the containers (more on this later)</p></li><li><p>This state is stored in an SQLite database</p></li><li><p>It will have a <code>reconciler</code> component that will run in a loop and make sure that the actual state of the running containers matches the desired state in the database</p><ul><li><p>It uses the <code>docker</code> command to manage docker containers on the host machine</p></li></ul></li></ul></li><li><p><code>dubectl</code> the command line tool for the user to interact with the API</p></li><li><p>An in built <code>Nginx</code> container that act as an ingress to route traffic from outside the "cluster"</p></li></ul><h3>Step 3 : Creating an implementation plan</h3><p>Once the architecture is clear, next step was to have Claude create an implementation plan.</p><p>I wanted to make sure that with each change, Claude will not break existing functionality. So I decided to go with <strong>Test Driven Development</strong></p><blockquote><p>Building Dubernetes using Test-Driven Development (TDD) approach. Each phase starts with writing tests, then implementing the functionality to make tests pass.</p></blockquote><p>So we wrote down the implementation plan into a markdown file. You can find that <a href="https://github.com/MansoorMajeed/Dubernetes/blob/main/IMPLEMENTATION_PLAN.md?ref=blog.esc.sh">HERE</a></p><p>At this point I also made sure to update the <code>CLAUDE.md</code> to reflect these documents and the vision. Check it out <a href="https://github.com/MansoorMajeed/Dubernetes/blob/main/CLAUDE.md?ref=blog.esc.sh">HERE</a></p><h3>Step 4 : Session Continuity made easy!</h3><p>After creating a clear direction, I asked claude to use a markdown file <a href="https://github.com/MansoorMajeed/Dubernetes/blob/main/PROJECT_STATUS.md?ref=blog.esc.sh">PROJECT_STATUS.md</a> to keep the status updated after each session. Exact instruction in CLAUDE.md</p><pre><code>**Session Continuity**
Status File: PROJECT_STATUS.md - Contains current progress and context 
Resume Protocol: When starting new sessions, check PROJECT_STATUS.md for:
- Current implementation phase
- Completed tasks and checklist status
- Active development context
- Next steps and priorities
- Key Design Principles</code></pre><p>Additionally, this line</p><blockquote><p>When user says "let us wrap up for the day", update PROJECT_STATUS.md with current progress and context for seamless session resumption.</p></blockquote><h3>Step 5: Vibe!!</h3><p>Once the plan was locked in, I stepped back and let Claude handle the implementation.! I did not look at the code, not even once!</p><h3>Step 6 : Reset often</h3><p>After finishing a milestone (tests passing &#8211; both manual and unit), commit it, have Claude update the <code>PROJECT_STATUS</code> and <code>/reset</code> to free up context! I found that this simple act made Claude very consistent.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!gcbt!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!gcbt!,w_424,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 424w, https://substackcdn.com/image/fetch/$s_!gcbt!,w_848,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 848w, https://substackcdn.com/image/fetch/$s_!gcbt!,w_1272,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 1272w, https://substackcdn.com/image/fetch/$s_!gcbt!,w_1456,c_limit,f_webp,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!gcbt!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif" width="498" height="278" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/d05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:278,&quot;width&quot;:498,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!gcbt!,w_424,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 424w, https://substackcdn.com/image/fetch/$s_!gcbt!,w_848,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 848w, https://substackcdn.com/image/fetch/$s_!gcbt!,w_1272,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 1272w, https://substackcdn.com/image/fetch/$s_!gcbt!,w_1456,c_limit,f_auto,q_auto:good,fl_lossy/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fd05671cf-4135-4c89-a32e-94472f7f4ce5_498x278.gif 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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">no memory</figcaption></figure></div><p>While you might think you have ample context window to spare, an LLM's performance actually degrades significantly as the context grows, well before reaching the advertised maximum. There's a sharp drop-off, which this graph illustrates perfectly.</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!FbjN!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!FbjN!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 424w, https://substackcdn.com/image/fetch/$s_!FbjN!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 848w, https://substackcdn.com/image/fetch/$s_!FbjN!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 1272w, https://substackcdn.com/image/fetch/$s_!FbjN!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!FbjN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png" width="1189" height="790" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:790,&quot;width&quot;:1189,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!FbjN!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 424w, https://substackcdn.com/image/fetch/$s_!FbjN!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 848w, https://substackcdn.com/image/fetch/$s_!FbjN!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.png 1272w, https://substackcdn.com/image/fetch/$s_!FbjN!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F1c9a174d-f188-48a7-8a22-8ee5208a5c65_1189x790.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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>Source: <a href="https://research.trychroma.com/context-rot?ref=blog.esc.sh#results">https://research.trychroma.com/context-rot#results</a></p><h2>The Code Flow</h2><h3>Step 1 : The Yaml</h3><p>Let's take the previous example yaml</p><pre><code>name: myapp
image: myapp-image:latest
replicas: 3
access:
  host: myapp.local</code></pre><p>We want the <code>myapp-image:latest</code> docker container to run with 3 containers and have it respond at the domain <code>myapp.local</code></p><h3>Step 2 : Applying it using dubectl</h3><p>PodSpec looks like this</p><p><code>cmd/dubectl/types.go</code></p><pre><code>type PodSpec struct {
&#9;Name     string      `yaml:"name" json:"name"`
&#9;Image    string      `yaml:"image" json:"image"`
&#9;Replicas int         `yaml:"replicas,omitempty" json:"replicas,omitempty"`
&#9;Access   *AccessSpec `yaml:"access,omitempty" json:"access,omitempty"`
}</code></pre><p>The CLI tool Makes an API call</p><p><code>cmd/dubectl/types.go</code></p><pre><code>// CreatePod creates a new pod via the API
func (c *APIClient) CreatePod(podSpec *PodSpec) error {
&#9;// Convert PodSpec to API request format
&#9;requestData := map[string]interface{}{
&#9;&#9;"name":     podSpec.Name,
&#9;&#9;"image":    podSpec.Image,
&#9;&#9;"replicas": podSpec.Replicas,
&#9;}</code></pre><h3>Step 3 : The Orchestrator API receives the request</h3><p><code>pkg/api/handlers.go</code></p><p>Upon receiving the <code>POST</code> request, orchestrator does some validation and calls <code>CreatePod</code></p><pre><code>// createPod handles POST /pods
func (h *Handler) createPod(w http.ResponseWriter, r *http.Request) {

    // ----snip-----

&#9;// Create pod
&#9;pod, err := h.orchestrator.CreatePod(r.Context(), req)
&#9;if err != nil {
&#9;&#9;h.writeError(w, http.StatusInternalServerError, "failed to create pod", "CREATE_FAILED", err.Error())
&#9;&#9;return
&#9;}
}</code></pre><p><code>cmd/orchestrator/main.go</code></p><pre><code>// CreatePod creates a new pod
// Simply creates a database entry for the pod
func (o *OrchestratorImpl) CreatePod(ctx context.Context, req api.PodRequest) (*api.PodResponse, error) {

    //-----snip-----

&#9;// Convert API request to database pod
&#9;dbPod := &amp;database.Pod{
&#9;&#9;Name:         req.Name,
&#9;&#9;Image:        req.Image,
&#9;&#9;Replicas:     replicas,
&#9;&#9;DesiredState: "running",
&#9;&#9;CreatedAt:    time.Now(),
&#9;&#9;UpdatedAt:    time.Now(),
&#9;}

&#9;err := o.db.CreatePod(dbPod)
&#9;if err != nil {
&#9;&#9;return nil, err
&#9;}
    //-----snip-----
}</code></pre><h3>Step 4 : Reconciler creates containers</h3><p><code>pkg/reconciler/reconciler.go</code></p><p>Finally, create the docker container, update Ingress nginx configuration</p><pre><code>// ReconcileOnce performs a single reconciliation cycle
func (r *Reconciler) ReconcileOnce() error {
&#9;// Get all pods from database
&#9;// Reconcile each pod
&#9;// Update nginx configuration
}


// reconcileRunningPod ensures a pod has the correct number of running replicas
func (r *Reconciler) reconcileRunningPod(pod *database.Pod, replicas []*database.Replica) error {
&#9;runningReplicas := 0
&#9;var replicasToRestart []*database.Replica

&#9;// Count running replicas and identify failed ones
&#9;// Restart failed replicas
&#9;// Remove excess replicas if needed
    // Create additional replicas if needed
}

func (r *Reconciler) createReplica(pod *database.Pod) error {
&#9;// Allocate port
&#9;// Generate replica ID
&#9;// Create replica record first

&#9;// Create container
&#9;req := &amp;docker.RunContainerRequest{
&#9;&#9;Image:  pod.Image,
&#9;&#9;Name:   replicaID,
&#9;&#9;Port:   port,
&#9;&#9;Labels: map[string]string{
&#9;&#9;&#9;"dubernetes.pod":     pod.Name,
&#9;&#9;&#9;"dubernetes.replica": replicaID,
&#9;&#9;},
&#9;}
&#9;containerID, err := r.docker.RunContainer(req)
}
</code></pre><h2>Running it!</h2><h3>Build and start the orchestrator</h3><pre><code>make build
./bin/orchestrator &amp;</code></pre><h3>Run a demo pod</h3><pre><code>./bin/dubectl apply -f examples/whoami-service.yaml</code></pre><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!GG-G!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!GG-G!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 424w, https://substackcdn.com/image/fetch/$s_!GG-G!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 848w, https://substackcdn.com/image/fetch/$s_!GG-G!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 1272w, https://substackcdn.com/image/fetch/$s_!GG-G!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!GG-G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png" width="2000" height="146" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:146,&quot;width&quot;:2000,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Dubernetes: Vibe Coding A Dumb Container Orchestrator&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Dubernetes: Vibe Coding A Dumb Container Orchestrator" title="Dubernetes: Vibe Coding A Dumb Container Orchestrator" srcset="https://substackcdn.com/image/fetch/$s_!GG-G!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 424w, https://substackcdn.com/image/fetch/$s_!GG-G!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 848w, https://substackcdn.com/image/fetch/$s_!GG-G!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 1272w, https://substackcdn.com/image/fetch/$s_!GG-G!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F8d3286ca-df1a-40a1-ad01-0f5789c16c69_2708x198.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a><figcaption class="image-caption">app running as docker containers</figcaption></figure></div><p>We can see that the 3 app containers and the nginx (which acts as the ingress) container running</p><h3>Making a request</h3><p>We can make a request using <code>curl</code> and the <code>--resolve</code> flag to map the domain <code>whoami.local</code> to <code>127.0.0.1</code>, letting us send a proper request as if the hostname resolved normally</p><pre><code>$ curl localhost  --resolve whoami.local:80:127.0.0.1
Hostname: 53b4ab629c3e
IP: 127.0.0.1
IP: ::1
IP: 172.17.0.3
RemoteAddr: 172.17.0.2:42188
GET / HTTP/1.1
Host: localhost
User-Agent: curl/8.7.1
Accept: */*
Connection: close
X-Forwarded-For: 192.168.65.1
X-Forwarded-Proto: http
X-Real-Ip: 192.168.65.1</code></pre><p>okay it works!</p><h2>Conclusion</h2><p>It turned out to be surprisingly easy to vibe-code the whole thing without Claude melting down. I think the main reason was sticking to test-driven development and regularly resetting the context. I had a ton of fun and I hope you had a decent read too!</p>]]></content:encoded></item><item><title><![CDATA[Using Claude-Code on the go]]></title><description><![CDATA[Introduction]]></description><link>https://newsletter.esc.sh/p/using-claude-code-on-the-go</link><guid isPermaLink="false">https://newsletter.esc.sh/p/using-claude-code-on-the-go</guid><dc:creator><![CDATA[Mansoor]]></dc:creator><pubDate>Sat, 23 Aug 2025 15:22:00 GMT</pubDate><enclosure url="https://substack-post-media.s3.amazonaws.com/public/images/c01718e2-8d28-4e4e-b774-821e95341bcc_2000x1091.jpeg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Introduction</h1><h2>What is this about?</h2><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!B1PK!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!B1PK!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 424w, https://substackcdn.com/image/fetch/$s_!B1PK!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 848w, https://substackcdn.com/image/fetch/$s_!B1PK!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!B1PK!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!B1PK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/cfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:null,&quot;width&quot;:null,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!B1PK!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 424w, https://substackcdn.com/image/fetch/$s_!B1PK!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 848w, https://substackcdn.com/image/fetch/$s_!B1PK!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 1272w, https://substackcdn.com/image/fetch/$s_!B1PK!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fcfb35031-b350-41f4-8204-6f7a4164b438_2000x1091.jpeg 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a><p>You're at home, and claude-code is busy building your next billion-dollar project. But you've got to run and don't want to lug your laptop with you. The problem? When Claude finishes an item on its to-do list, you need to be there to press a key to let it continue.</p><p>What if you could do that from your phone, without paying for anything extra? That's what this post is about.</p><h2>But why would you do that?</h2><p>Great question. Before you go any further, you should really ask yourself: do you <em>really</em> want to do this? If you're taking a walk, then take the walk. Don't bring Claude with you.</p><p>This guide is for that <em>one time</em> you're out and it would be a massive help to quickly review Claude's work, press <code>1</code>, <code>2</code>, or <code>Esc</code>, and then immediately put your phone away. If that's the case, read on.</p><h2>How does it work?</h2><p>It's quite simple. We'll enable SSH on your workstation, run <code>claude-code</code> inside <code>tmux</code> (to keep it alive), and connect to your workstation from your phone via an SSH client. To make it all work seamlessly while your phone is on 5G and your laptop is on your home network, we'll use a bit of magic called Tailscale.</p><h3>Is it free?</h3><p>Yes (except for claude-code, everything else is free)</p><h3>Is it safe?</h3><p>Yes. No one can see your traffic. Take a look at <a href="https://tailscale.com/blog/how-tailscale-works?ref=blog.esc.sh">how tailscale works</a> to get an idea, if you are interested. TL;DR is that Tailscale builds a private tunnel between your devices, no traffic flows through Tailscale's servers (it is peer to peer)</p><p>Is Tailscale safe? Yes; You can enable <a href="https://tailscale.com/kb/1226/tailnet-lock?ref=blog.esc.sh">Tailnet lock</a> to be extra secure</p><h2>Is there an easier way?</h2><p>Maybe. There are tools like <a href="https://github.com/amantus-ai/vibetunnel?ref=blog.esc.sh">VibeTunnel</a> . I have not tried it. I would rather rely on tried and tested solutions like SSH. Feel free to choose whatever works for you.</p><h1>How to set it up</h1><h2>Step 1 - Enable SSH on your workstation</h2><p>This of course depends on your operating system.</p><p>&#128161;</p><p><strong>CAUTION: </strong>Enabling SSH on your device means any other device on the same network as you would be able to login to your device if they know your password. Make sure you have a strong password. Ideally, use key based authentication instead of password</p><h3>MacOS</h3><p>In MacOS, you can enable SSH by going to settings -&gt; General -&gt; Sharing -&gt; Remote Login. Check Apple docs for more details</p><div class="captioned-image-container"><figure><p><a href="https://support.apple.com/lt-lt/guide/mac-help/mchlp1066/mac?ref=blog.esc.sh">Allow a remote computer to access your Mac</a></p><figcaption class="image-caption"><a href="https://support.apple.com/lt-lt/guide/mac-help/mchlp1066/mac?ref=blog.esc.sh">Allow remote login on your Mac so you can use SSH or SFTP to access it from another computer.</a></figcaption></figure></div><p>It should look something like this once enabled</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!_ta8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!_ta8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 424w, https://substackcdn.com/image/fetch/$s_!_ta8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 848w, https://substackcdn.com/image/fetch/$s_!_ta8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 1272w, https://substackcdn.com/image/fetch/$s_!_ta8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!_ta8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png" width="470" height="214" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:214,&quot;width&quot;:470,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!_ta8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 424w, https://substackcdn.com/image/fetch/$s_!_ta8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 848w, https://substackcdn.com/image/fetch/$s_!_ta8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 1272w, https://substackcdn.com/image/fetch/$s_!_ta8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe3618f22-19b2-4d5c-84ef-905fa1f9abf4_470x214.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><h3>Linux</h3><p>Depending on your Linux distro, install and enable SSH server.</p><ul><li><p>Ubuntu : <a href="https://documentation.ubuntu.com/server/how-to/security/openssh-server/?ref=blog.esc.sh">HERE</a></p></li><li><p>Fedora : <a href="https://docs.fedoraproject.org/en-US/fedora/f40/system-administrators-guide/infrastructure-services/OpenSSH/?ref=blog.esc.sh">HERE</a></p></li><li><p>Arch BTW : <a href="https://wiki.archlinux.org/title/OpenSSH?ref=blog.esc.sh">HERE</a></p></li></ul><h3>Windows</h3><p>If you plan to use <code>claude-code</code> with WSL2, you can enable SSH on WSL2 and basically have it work like Linux. Check <a href="https://gist.github.com/MansoorMajeed/1af34b0900c174bf247cd1769efa458c?ref=blog.esc.sh">HERE</a></p><h3>Step 1.1 - Disable Password Login (Windows WSL / Linux)</h3><p>&#128161;</p><p>Disabling password based SSH auth on <strong>MacOS </strong>requires messing with PAM configuration, I have not tried doing so, try it at your own risk.</p><p>In your <code>/etc/ssh/sshd_config</code> ensure you have <code>PasswordAuthentication no</code> to prevent password based authentication</p><h2>Step 2 - Install and setup Tmux</h2><p>Tmux is a terminal multiplexer &#8211; which is a fancy way of saying that you can run a terminal session with any number of tabs/windows on a remote host and detach and attach to it any time.</p><p>While not 100% required, Tmux makes it so much more convenient. You can easily switch between your phone and your workstation &#8211; continuity is preserved. Additionally, even if you lose internet access on your phone, you can simply reconnect to the Tmux session and resume</p><h3>Installing Tmux</h3><ul><li><p>Ubuntu <code>sudo apt install tmux</code></p></li><li><p>Fedora <code>sudo dnf install tmux</code></p></li><li><p>Arch BTW <code>sudo pacman -S tmux</code></p></li></ul><h3>Starting Tmux</h3><p>Open a terminal and simply type</p><pre><code>tmux new -s claude-demo</code></pre><p>This will create a new tmux session with the name <code>claude-demo</code></p><p>All of tmux commands are done in a funny way. That is, you press <code>Ctrl+b</code> then let go and then immediately press one of the keys. For example</p><ul><li><p><code>Ctrl+b</code>, let go completely, press <code>c</code> : Open a new tab</p></li><li><p><code>Ctrl+b</code>, release, press <code>1</code> : switch to tab 1</p></li><li><p><code>Ctrl+b</code>, release, <code>d</code> : detach from Tmux. You will be back on your terminal before you started the tmux session. Now, even if you exit or close your terminal, <code>Tmux</code> is still running in the background, waiting for you to re-attach to it</p></li><li><p><code>tmux ls</code> : List Tmux sessions</p></li><li><p><code>tmux a -t claude-demo</code> : Attach again to the running session</p></li></ul><p>Great, now you have a Tmux session running on your workstation</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!IemT!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!IemT!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 424w, https://substackcdn.com/image/fetch/$s_!IemT!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 848w, https://substackcdn.com/image/fetch/$s_!IemT!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 1272w, https://substackcdn.com/image/fetch/$s_!IemT!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!IemT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png" width="1264" height="827" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/a7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:827,&quot;width&quot;:1264,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!IemT!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 424w, https://substackcdn.com/image/fetch/$s_!IemT!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 848w, https://substackcdn.com/image/fetch/$s_!IemT!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.png 1272w, https://substackcdn.com/image/fetch/$s_!IemT!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fa7bba86a-1bfa-4bef-87f4-8794956c9ed8_1264x827.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Terminal running Claude on Tmux</figcaption></figure></div><h2>Step 3 - SSH Client for your Phone</h2><h3>Android</h3><p>There are several SSH client apps available for free. I use <code>Termius</code>. <code>Termux</code> is another option. You can choose whichever you like</p><h3>iOS</h3><p><code>Termius</code> is popular among IOS users too. Or you can find another one you like better</p><h2>Step 4 - Generating SSH keys for your phone</h2><p>Depending on the app you use, these steps might vary. You could generate them on your workstation and copy the private keys to your phone's ssh client too. This is fully up to you.</p><p>I will show you how to generate ssh keys for your Phone using <code>Termius</code></p><ul><li><p>Open Termius</p></li><li><p>Go to <code>Vaults</code> -&gt; <code>Keychain</code> -&gt; <code>+</code> button</p></li><li><p>Choose <code>New SSH key...</code></p></li><li><p>Choose <code>Generate new SSH key</code></p><ul><li><p>Give it a name you like, it does not matter</p></li><li><p>Type: <code>ED25519</code></p></li><li><p>Optionally choose a passphrase.</p></li><li><p><code>Generate</code></p></li></ul></li><li><p>Click <code>Export or share a public key</code></p></li></ul><p>Now, you should have your ssh public key available. We need to get this key to your workstation so you can allow this key to access SSH. This public key is completely safe to be shown in public, so you can easily copy it to a note app and transfer it to your workstation</p><h2>Step 5 - Allowing your phone's SSH key on your workstation</h2><h3>WSL/Linux</h3><p>Edit or create the file <code>~/.ssh/authorized_keys</code> and add your public key there</p><h3>MacOS</h3><h4>Security considerations for MacOS</h4><p>Enabling public key only SSH on MacOS requires us to edit the pam configuration files. This can mess up things if not done properly. Because of this, the easiest solution is to keep using password for ssh. However this puts us in a risky situation &#8211; anyone on the same network could attempt to brute force your password. With that, I recommend you try some or all of the following</p><ul><li><p>Use a strong password for your Mac user</p></li><li><p>Disable remote login (SSH) while you are on insecure wifi networks</p></li><li><p>Use MacOS firewall to allow SSH only from the network interface used by Tailscale and drop everything else.</p></li></ul><h2>Step 6 - Install Tailscale</h2><p>For your workstation, go <a href="https://tailscale.com/download?ref=blog.esc.sh">HERE</a>, download and install Tailscale. For your mobile devices, you can download <code>Tailscale</code> from your App store / Play store. Login to both devices using the same account.</p><p>Once you have logged in and connected, you should be able to see your devices in the Tailscale admin page.</p><p>&#128161;</p><p>Note the names of the machines you have -- by default it uses the hostname</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7bGR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7bGR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 424w, https://substackcdn.com/image/fetch/$s_!7bGR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 848w, https://substackcdn.com/image/fetch/$s_!7bGR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 1272w, https://substackcdn.com/image/fetch/$s_!7bGR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7bGR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png" width="600" height="906" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/95535329-efaf-4939-9598-08024a7bb58d_600x906.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:906,&quot;width&quot;:600,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!7bGR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 424w, https://substackcdn.com/image/fetch/$s_!7bGR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 848w, https://substackcdn.com/image/fetch/$s_!7bGR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.png 1272w, https://substackcdn.com/image/fetch/$s_!7bGR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F95535329-efaf-4939-9598-08024a7bb58d_600x906.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Tailscale mobile app</figcaption></figure></div><p>Here you can see my devices, <code>helium</code> is the Windows PC I will use this for post. I have WSL2 running on Windows.</p><h2>Step 7 - Adding SSH host to your mobile device</h2><p>We are almost there. Let's add SSH connection to your workstation from your mobile device.</p><p>Open the SSH client app (Termius in my case)</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!HxRl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!HxRl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 424w, https://substackcdn.com/image/fetch/$s_!HxRl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 848w, https://substackcdn.com/image/fetch/$s_!HxRl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 1272w, https://substackcdn.com/image/fetch/$s_!HxRl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!HxRl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png" width="500" height="1099" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/babd4656-73be-484f-9aad-c937c5ad4293_500x1099.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1099,&quot;width&quot;:500,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!HxRl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 424w, https://substackcdn.com/image/fetch/$s_!HxRl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 848w, https://substackcdn.com/image/fetch/$s_!HxRl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.png 1272w, https://substackcdn.com/image/fetch/$s_!HxRl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbabd4656-73be-484f-9aad-c937c5ad4293_500x1099.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Add new host to Termius</figcaption></figure></div><ol><li><p>Alias : You can set it to whatever you like</p></li><li><p>Hostname: This should match the Tailscale name (hostname) of your workstation</p></li><li><p>Port : In Linux and MacOS it <strong>would be most probably <code>22</code></strong>, in my case it is <code>2222</code> because I am connecting to a WSL2 instance where SSH is configured to run on <code>2222</code></p></li><li><p>Username: Replace it with your username for your workstation</p></li><li><p>Password: Leave it empty for Linux and Windows/WSL, enter your password for MacOS</p></li><li><p>For Linux and Windows/WSL, choose the SSH key you created in Step 4</p></li><li><p>Save it</p></li></ol><h2>Step 8 - Connecting and Vibing</h2><p>You are ready to make your billion dollar SaaS.</p><p>Re-attach using <code>tmux a -t claude-demo</code> (or create a new session using <code>tmux new -s claude-demo</code>) &#8211; You can do this from your phone or workstation, it does not matter</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!2YUW!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!2YUW!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 424w, https://substackcdn.com/image/fetch/$s_!2YUW!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 848w, https://substackcdn.com/image/fetch/$s_!2YUW!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 1272w, https://substackcdn.com/image/fetch/$s_!2YUW!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!2YUW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png" width="1223" height="904" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:904,&quot;width&quot;:1223,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!2YUW!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 424w, https://substackcdn.com/image/fetch/$s_!2YUW!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 848w, https://substackcdn.com/image/fetch/$s_!2YUW!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.png 1272w, https://substackcdn.com/image/fetch/$s_!2YUW!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F35de0ec5-b2af-4b63-beb6-f648d6e5d882_1223x904.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Claude is not working for me. Anyone else have this issue?</figcaption></figure></div><p>Now that I have Claude-Code running on my PC, I can access it from my phone. Running <code>tmux ls</code> from phone, I can see the <code>claude-demo</code> tmux session</p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!bGz8!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!bGz8!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 424w, https://substackcdn.com/image/fetch/$s_!bGz8!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 848w, https://substackcdn.com/image/fetch/$s_!bGz8!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 1272w, https://substackcdn.com/image/fetch/$s_!bGz8!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!bGz8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png" width="1080" height="541" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:541,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!bGz8!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 424w, https://substackcdn.com/image/fetch/$s_!bGz8!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 848w, https://substackcdn.com/image/fetch/$s_!bGz8!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.png 1272w, https://substackcdn.com/image/fetch/$s_!bGz8!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F7760327a-614a-41d0-97bd-0e25532e5ab0_1080x541.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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>I can attach to it and resume work by simply doing <code>tmux a -t claude-demo</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!tmQR!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!tmQR!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 424w, https://substackcdn.com/image/fetch/$s_!tmQR!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 848w, https://substackcdn.com/image/fetch/$s_!tmQR!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 1272w, https://substackcdn.com/image/fetch/$s_!tmQR!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!tmQR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png" width="1080" height="1601" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1601,&quot;width&quot;:1080,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!tmQR!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 424w, https://substackcdn.com/image/fetch/$s_!tmQR!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 848w, https://substackcdn.com/image/fetch/$s_!tmQR!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.png 1272w, https://substackcdn.com/image/fetch/$s_!tmQR!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F00a49fea-c13a-436b-aeb9-58bc8033a15f_1080x1601.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">Claude code accessed from phone</figcaption></figure></div><h2>Step 8 - (Optional) Reading and Editing code on your phone</h2><p>If you want to quickly view some code from your workstation, you can achieve this very easily using <code>code-server</code>, which is a VS code server running on your workstation that can be accessed from your phone's browser</p><h3>Installing Code Server</h3><p>Check <a href="https://github.com/coder/code-server?ref=blog.esc.sh">HERE</a> on how to install this on your operating system.</p><p>But TL;DR is running</p><pre><code>curl -fsSL https://code-server.dev/install.sh | sh</code></pre><h3>Running Code Server</h3><p>Once installed, follow the docs to set it up to start using systemd (if on Linux/WSL2). Otherwise you can manually start it by running <code>code-server</code> on your workstation</p><p>When you run it, it will show you the config file <code>code-server</code> will be using, something like <code>/home/your username/.config/code-server/config.yaml</code></p><p>Edit this file</p><pre><code>vim /home/mansoor/.config/code-server/config.yaml</code></pre><p>And change the <code>bind-addr</code> to <code>0.0.0.0:8080</code> so that code-server will listen on all network interfaces (You can change the port number if you would like something else). The same file will also show the password you will use to login to it, take note of it. You</p><p>&#128161;</p><p>This makes your code-server be accessible over plain text http on your local network. If you use it on insecure wifi networks, you should set up https. Check docs <a href="https://coder.com/docs/code-server/guide?ref=blog.esc.sh">HERE</a></p><p>After changing the <code>bind-addr</code>, restart <code>code-server</code></p><h3>Accessing Code Server</h3><p>From your phone's browser, access <code>your-workstation-hostname:8080</code></p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!386N!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!386N!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 424w, https://substackcdn.com/image/fetch/$s_!386N!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 848w, https://substackcdn.com/image/fetch/$s_!386N!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 1272w, https://substackcdn.com/image/fetch/$s_!386N!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!386N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png" width="1079" height="1618" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:1618,&quot;width&quot;:1079,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:null,&quot;alt&quot;:&quot;Using Claude-Code on the go&quot;,&quot;title&quot;:null,&quot;type&quot;:null,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="Using Claude-Code on the go" title="Using Claude-Code on the go" srcset="https://substackcdn.com/image/fetch/$s_!386N!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 424w, https://substackcdn.com/image/fetch/$s_!386N!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 848w, https://substackcdn.com/image/fetch/$s_!386N!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.png 1272w, https://substackcdn.com/image/fetch/$s_!386N!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F90d620d3-4a93-4470-a820-5b46a7d61267_1079x1618.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 buttonBase-GK1x3M"><svg aria-hidden="true" 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" class="icon-noB79L"><g><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 buttonBase-GK1x3M"><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 icon-noB79L"><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">code-server on phone</figcaption></figure></div>]]></content:encoded></item></channel></rss>