[{"data":1,"prerenderedAt":83},["ShallowReactive",2],{"$fDevnN-9pN76oumqI5kHONsRMvB_jtB27hrff9rxti8E":3,"post-tags-run-your-entire-web-dev-workflow-from-your-phone-claude-code-a-tunnel":82},[4],{"id":5,"date":6,"date_gmt":6,"guid":7,"modified":6,"modified_gmt":6,"slug":9,"status":10,"type":11,"link":8,"title":12,"content":14,"excerpt":17,"author":19,"featured_media":20,"comment_status":21,"ping_status":21,"sticky":16,"template":22,"format":23,"meta":24,"categories":25,"tags":26,"class_list":27,"post_image_original":35,"devto_meta":36,"_links":42},168,"2026-08-17T12:15:37",{"rendered":8},"https:\u002F\u002Fportal.pluginizelab.com\u002Frun-your-entire-web-dev-workflow-from-your-phone-claude-code-a-tunnel\u002F","run-your-entire-web-dev-workflow-from-your-phone-claude-code-a-tunnel","publish","post",{"rendered":13},"Run Your Entire Web Dev Workflow From Your Phone (Claude Code + a Tunnel)",{"rendered":15,"protected":16},"\u003Cp>There&#8217;s a specific kind of frustration that shows up the moment you start driving Claude Code from your phone.\u003C\u002Fp>\n\u003Cp>The coding part works beautifully. You&#8217;re on a bus, or in a queue, or lying on the couch, and you can read what Claude is doing, approve a tool call, tell it to refactor the header, ask it to fix the failing test. Your laptop is at your desk doing the work. Your phone is the steering wheel.\u003C\u002Fp>\n\u003Cp>Then Claude says &#8220;done &#8211; check it out at \u003Ca href=\"http:\u002F\u002Flocalhost:3000\" target=\"_blank\" rel=\"noopener noreferrer\">http:\u002F\u002Flocalhost:3000\u003C\u002Fa>&#8221; and the whole thing falls apart. Your phone has no idea what \u003Ccode>localhost:3000\u003C\u002Fcode> means. That address points at your phone, not your laptop. You are now a developer who can write code but cannot look at it.\u003C\u002Fp>\n\u003Cp>The fix is two pieces stacked on top of each other: \u003Cstrong>Remote Control\u003C\u002Fstrong> for driving the session, and \u003Cstrong>a tunnel\u003C\u002Fstrong> for seeing the result. Here&#8217;s how to wire both up.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>\n  \u003Ca name=\"part-1-get-claude-code-onto-your-phone\" href=\"#part-1-get-claude-code-onto-your-phone\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Part 1: Get Claude Code onto your phone\u003Cbr \u002F>\n\u003C\u002Fh2>\n\u003Cp>Claude Code has a Remote Control feature that connects a session running on your machine to the Claude mobile app. The session never leaves your laptop &#8211; your files, your dev server, your node_modules all stay put. The phone is just a window into that terminal.\u003C\u002Fp>\n\u003Cp>Start it from your project folder:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight shell\">\u003Ccode>claude \u003Cspan class=\"nt\">--remote-control\u003C\u002Fspan> \u003Cspan class=\"s2\">\"My App\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>You get a normal interactive session at your desk \u003Cem>and\u003C\u002Fem> the same session on your phone. If you&#8217;re already mid-conversation, \u003Ccode>\u002Fremote-control\u003C\u002Fcode> (or \u003Ccode>\u002Frc\u003C\u002Fcode>) does the same thing without losing your history. If you&#8217;re walking away entirely, \u003Ccode>claude remote-control\u003C\u002Fcode> runs it in server mode with no local prompt.\u003C\u002Fp>\n\u003Cp>Either way, Claude Code prints a session URL and a QR code. Scan the QR into the Claude app, or open the app, tap \u003Cstrong>Code\u003C\u002Fstrong>, and pick the session from the list. That&#8217;s the whole setup.\u003C\u002Fp>\n\u003Cp>Two things worth doing while you&#8217;re at the desk:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\n\u003Cstrong>Turn on push notifications.\u003C\u002Fstrong> Run \u003Ccode>\u002Fconfig\u003C\u002Fcode> and enable pushes. Now your phone buzzes when a build finishes or Claude needs a decision, instead of you checking every few minutes. You can also ask inline: \u003Cem>&#8220;notify me when the tests pass.&#8221;\u003C\u002Fem>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cstrong>Check you&#8217;re eligible.\u003C\u002Fstrong> Remote Control needs a paid claude.ai plan and \u003Ccode>claude auth login\u003C\u002Fcode> &#8211; API keys won&#8217;t work. If it refuses to start, \u003Ccode>claude doctor\u003C\u002Fcode> says why.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>\n  \u003Ca name=\"part-2-why-you-still-cant-see-your-app\" href=\"#part-2-why-you-still-cant-see-your-app\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Part 2: Why you still can&#8217;t see your app\u003Cbr \u002F>\n\u003C\u002Fh2>\n\u003Cp>You&#8217;ve got Claude in your pocket. You tell it to change the hero section. It does. And you&#8217;re stuck, because the dev server is bound to \u003Ccode>127.0.0.1:5173\u003C\u002Fcode> on a laptop that&#8217;s behind your router, behind your ISP&#8217;s NAT, with no public address.\u003C\u002Fp>\n\u003Cp>Being on the same Wi-Fi \u003Cem>sometimes\u003C\u002Fem> helps &#8211; you can occasionally reach \u003Ccode>http:\u002F\u002F192.168.1.x:5173\u003C\u002Fcode> if your dev server binds to \u003Ccode>0.0.0.0\u003C\u002Fcode>. But that dies the moment you leave the house, and it&#8217;s exactly when you leave the house that this whole setup becomes worth doing.\u003C\u002Fp>\n\u003Cp>What you actually want is a \u003Cstrong>tunnel\u003C\u002Fstrong>: a small daemon on your laptop that opens an outbound connection to a public edge server, which then forwards inbound requests back down that pipe to your local port. No firewall changes. No port forwarding. No public IP.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>\n  \u003Ca name=\"part-3-picking-a-tunnel\" href=\"#part-3-picking-a-tunnel\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Part 3: Picking a tunnel\u003Cbr \u002F>\n\u003C\u002Fh2>\n\u003Cp>Three realistic options, and the free tiers diverge sharply.\u003C\u002Fp>\n\u003Ch3>\n  \u003Ca name=\"cloudflare-tunnel-the-best-free-option\" href=\"#cloudflare-tunnel-the-best-free-option\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Cloudflare Tunnel &#8211; the best free option\u003Cbr \u002F>\n\u003C\u002Fh3>\n\u003Cp>Two flavours, and the distinction matters more than most tutorials admit.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Quick tunnel\u003C\u002Fstrong> (no account, one command):\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight shell\">\u003Ccode>cloudflared tunnel \u003Cspan class=\"nt\">--url\u003C\u002Fspan> http:\u002F\u002Flocalhost:5173\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>You get a random \u003Ccode>trycloudflare.com\u003C\u002Fcode> subdomain, printed to your terminal. Copy it to your phone and you&#8217;re browsing your local app from anywhere. Zero setup.\u003C\u002Fp>\n\u003Cp>The catch: quick tunnels are explicitly meant for development and testing. Expect a cap on in-flight requests, no Server-Sent Events support, no SLA, and a brand new URL every time you restart. For &#8220;look at my dev server for the next two hours,&#8221; that&#8217;s completely fine. For anything you want to leave running, it isn&#8217;t.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Named tunnel\u003C\u002Fstrong> (account + your domain on Cloudflare DNS):\u003C\u002Fp>\n\u003Cp>More setup &#8211; you create the tunnel, route DNS to it, and usually end up managing a \u003Ccode>config.yml\u003C\u002Fcode> or a system service. In exchange you get a stable URL on your own domain that survives restarts, free SSL, no bandwidth caps, no session timeouts, and you can put Cloudflare Access in front of it so only you can load the page. The requirement is that your domain&#8217;s authoritative DNS lives on Cloudflare.\u003C\u002Fp>\n\u003Cp>If you&#8217;re going to do this more than twice, spend the twenty minutes on a named tunnel. \u003Ccode>dev.yourdomain.com\u003C\u002Fcode> pointing at your laptop is a genuinely nice thing to own.\u003C\u002Fp>\n\u003Ch3>\n  \u003Ca name=\"ngrok-fastest-to-first-url-tightest-free-tier\" href=\"#ngrok-fastest-to-first-url-tightest-free-tier\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  ngrok &#8211; fastest to first URL, tightest free tier\u003Cbr \u002F>\n\u003C\u002Fh3>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight shell\">\u003Ccode>ngrok http 5173\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>Still the quickest path from nothing to a public URL, and its request inspector is better than anything Cloudflare gives you &#8211; useful if you&#8217;re debugging webhooks rather than just eyeballing a page. Every account gets a free static domain, so your URL doesn&#8217;t rotate on restart.\u003C\u002Fp>\n\u003Cp>But ngrok cut its free plan hard in early 2026: roughly 2-hour session limits, about 1 GB of monthly bandwidth, a handful of endpoints, and an interstitial warning page in front of every visit. The two-hour ceiling is the one that hurts here &#8211; you&#8217;ll be restarting the tunnel and re-copying URLs in the middle of your afternoon. Removing the interstitial means paying.\u003C\u002Fp>\n\u003Ch3>\n  \u003Ca name=\"expose-good-if-youre-already-in-php-land\" href=\"#expose-good-if-youre-already-in-php-land\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Expose &#8211; good if you&#8217;re already in PHP land\u003Cbr \u002F>\n\u003C\u002Fh3>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight shell\">\u003Ccode>expose share http:\u002F\u002Flocalhost:8000\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>Beyond Code&#8217;s tool, self-hostable, and pleasant if you&#8217;re doing Laravel work. The shared free tier has session limits similar in spirit to ngrok&#8217;s. Its real selling point is that you can run your own Expose server on a cheap VPS and stop worrying about anyone&#8217;s free tier.\u003C\u002Fp>\n\u003Ch3>\n  \u003Ca name=\"quick-comparison\" href=\"#quick-comparison\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Quick comparison\u003Cbr \u002F>\n\u003C\u002Fh3>\n\u003Cdiv class=\"table-wrapper-paragraph\">\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>\u003C\u002Fth>\n\u003Cth>Cloudflare quick\u003C\u002Fth>\n\u003Cth>Cloudflare named\u003C\u002Fth>\n\u003Cth>ngrok free\u003C\u002Fth>\n\u003Cth>Expose (shared)\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Account needed\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Yes\u003C\u002Ftd>\n\u003Ctd>Yes\u003C\u002Ftd>\n\u003Ctd>Yes\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Setup time\u003C\u002Ftd>\n\u003Ctd>~1 min\u003C\u002Ftd>\n\u003Ctd>~20 min\u003C\u002Ftd>\n\u003Ctd>~2 min\u003C\u002Ftd>\n\u003Ctd>~2 min\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Session limit\u003C\u002Ftd>\n\u003Ctd>None\u003C\u002Ftd>\n\u003Ctd>None\u003C\u002Ftd>\n\u003Ctd>~2 hours\u003C\u002Ftd>\n\u003Ctd>Limited\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Stable URL\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Yes (your domain)\u003C\u002Ftd>\n\u003Ctd>Yes (static domain)\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Bandwidth cap\u003C\u002Ftd>\n\u003Ctd>None stated\u003C\u002Ftd>\n\u003Ctd>None\u003C\u002Ftd>\n\u003Ctd>~1 GB\u002Fmo\u003C\u002Ftd>\n\u003Ctd>Limited\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Interstitial page\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003Ctd>Yes\u003C\u002Ftd>\n\u003Ctd>No\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Best for\u003C\u002Ftd>\n\u003Ctd>A quick look\u003C\u002Ftd>\n\u003Ctd>Leaving it running\u003C\u002Ftd>\n\u003Ctd>Webhook debugging\u003C\u002Ftd>\n\u003Ctd>PHP\u002FLaravel\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>Recommendation:\u003C\u002Fstrong> quick tunnel today because you want to get moving, named tunnel this weekend because you&#8217;ll want it permanently.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>\n  \u003Ca name=\"part-4-the-devserver-config-that-will-bite-you\" href=\"#part-4-the-devserver-config-that-will-bite-you\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Part 4: The dev-server config that will bite you\u003Cbr \u002F>\n\u003C\u002Fh2>\n\u003Cp>This is the step nobody warns you about, and it produces a blank page or a scary error banner that looks like the tunnel is broken. It isn&#8217;t. Modern dev servers reject requests whose \u003Ccode>Host\u003C\u002Fcode> header doesn&#8217;t match localhost, as a defence against DNS rebinding attacks. Your tunnel&#8217;s hostname is, by definition, not localhost.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Vite\u003C\u002Fstrong> &#8211; add the tunnel host to \u003Ccode>vite.config.js\u003C\u002Fcode>:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight javascript\">\u003Ccode>\u003Cspan class=\"k\">export\u003C\u002Fspan> \u003Cspan class=\"k\">default\u003C\u002Fspan> \u003Cspan class=\"p\">{\u003C\u002Fspan>\n  \u003Cspan class=\"na\">server\u003C\u002Fspan>\u003Cspan class=\"p\">:\u003C\u002Fspan> \u003Cspan class=\"p\">{\u003C\u002Fspan>\n    \u003Cspan class=\"na\">host\u003C\u002Fspan>\u003Cspan class=\"p\">:\u003C\u002Fspan> \u003Cspan class=\"kc\">true\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan>              \u003Cspan class=\"c1\">\u002F\u002F bind 0.0.0.0\u003C\u002Fspan>\n    \u003Cspan class=\"na\">allowedHosts\u003C\u002Fspan>\u003Cspan class=\"p\">:\u003C\u002Fspan> \u003Cspan class=\"p\">[\u003C\u002Fspan>\u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"s1\">.trycloudflare.com\u003C\u002Fspan>\u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan> \u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"s1\">dev.yourdomain.com\u003C\u002Fspan>\u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"p\">],\u003C\u002Fspan>\n    \u003Cspan class=\"na\">hmr\u003C\u002Fspan>\u003Cspan class=\"p\">:\u003C\u002Fspan> \u003Cspan class=\"p\">{\u003C\u002Fspan> \u003Cspan class=\"na\">clientPort\u003C\u002Fspan>\u003Cspan class=\"p\">:\u003C\u002Fspan> \u003Cspan class=\"mi\">443\u003C\u002Fspan> \u003Cspan class=\"p\">}\u003C\u002Fspan> \u003Cspan class=\"c1\">\u002F\u002F HMR over the tunnel's HTTPS\u003C\u002Fspan>\n  \u003Cspan class=\"p\">}\u003C\u002Fspan>\n\u003Cspan class=\"p\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>That \u003Ccode>hmr.clientPort\u003C\u002Fcode> line is what makes hot reload keep working through the tunnel. Without it the page loads but never updates, and you&#8217;ll waste ten minutes wondering why Claude&#8217;s changes aren&#8217;t showing up.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Next.js\u003C\u002Fstrong> &#8211; add \u003Ccode>allowedDevOrigins\u003C\u002Fcode> in \u003Ccode>next.config.js\u003C\u002Fcode>:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight javascript\">\u003Ccode>\u003Cspan class=\"nx\">module\u003C\u002Fspan>\u003Cspan class=\"p\">.\u003C\u002Fspan>\u003Cspan class=\"nx\">exports\u003C\u002Fspan> \u003Cspan class=\"o\">=\u003C\u002Fspan> \u003Cspan class=\"p\">{\u003C\u002Fspan>\n  \u003Cspan class=\"na\">allowedDevOrigins\u003C\u002Fspan>\u003Cspan class=\"p\">:\u003C\u002Fspan> \u003Cspan class=\"p\">[\u003C\u002Fspan>\u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"s1\">dev.yourdomain.com\u003C\u002Fspan>\u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan> \u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"s1\">*.trycloudflare.com\u003C\u002Fspan>\u003Cspan class=\"dl\">'\u003C\u002Fspan>\u003Cspan class=\"p\">]\u003C\u002Fspan>\n\u003Cspan class=\"p\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>\u003Cstrong>WordPress through Herd\u003C\u002Fstrong> has the same shape of problem with a different cause: WordPress stores the site URL in the database, so the tunneled page loads as bare HTML while every asset still points at \u003Ccode>my-site.test\u003C\u002Fcode>.\u003C\u002Fp>\n\u003Cp>Herd installs Expose into your PATH and gives you a token field in settings, so from the site directory the tunnel is one command:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight shell\">\u003Ccode>herd share\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>Herd detects the site&#8217;s local URL and shares the right address. Now teach WordPress to answer on the public hostname, in \u003Ccode>wp-config.php\u003C\u002Fcode> above the &#8220;stop editing&#8221; line:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight php\">\u003Ccode>\u003Cspan class=\"nv\">$tunnel_host\u003C\u002Fspan> \u003Cspan class=\"o\">=\u003C\u002Fspan> \u003Cspan class=\"nv\">$_SERVER\u003C\u002Fspan>\u003Cspan class=\"p\">[\u003C\u002Fspan>\u003Cspan class=\"s1\">'HTTP_X_FORWARDED_HOST'\u003C\u002Fspan>\u003Cspan class=\"p\">]\u003C\u002Fspan> \u003Cspan class=\"o\">??\u003C\u002Fspan> \u003Cspan class=\"s1\">''\u003C\u002Fspan>\u003Cspan class=\"p\">;\u003C\u002Fspan>\n\n\u003Cspan class=\"k\">if\u003C\u002Fspan> \u003Cspan class=\"p\">(\u003C\u002Fspan>\u003Cspan class=\"nf\">str_contains\u003C\u002Fspan>\u003Cspan class=\"p\">(\u003C\u002Fspan>\u003Cspan class=\"nv\">$tunnel_host\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan> \u003Cspan class=\"s1\">'sharedwithexpose.com'\u003C\u002Fspan>\u003Cspan class=\"p\">))\u003C\u002Fspan> \u003Cspan class=\"p\">{\u003C\u002Fspan>\n    \u003Cspan class=\"nv\">$_SERVER\u003C\u002Fspan>\u003Cspan class=\"p\">[\u003C\u002Fspan>\u003Cspan class=\"s1\">'HTTP_HOST'\u003C\u002Fspan>\u003Cspan class=\"p\">]\u003C\u002Fspan> \u003Cspan class=\"o\">=\u003C\u002Fspan> \u003Cspan class=\"nv\">$tunnel_host\u003C\u002Fspan>\u003Cspan class=\"p\">;\u003C\u002Fspan>\n    \u003Cspan class=\"nv\">$_SERVER\u003C\u002Fspan>\u003Cspan class=\"p\">[\u003C\u002Fspan>\u003Cspan class=\"s1\">'HTTPS'\u003C\u002Fspan>\u003Cspan class=\"p\">]\u003C\u002Fspan>     \u003Cspan class=\"o\">=\u003C\u002Fspan> \u003Cspan class=\"s1\">'on'\u003C\u002Fspan>\u003Cspan class=\"p\">;\u003C\u002Fspan>\n    \u003Cspan class=\"nb\">define\u003C\u002Fspan>\u003Cspan class=\"p\">(\u003C\u002Fspan>\u003Cspan class=\"s1\">'WP_HOME'\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan>       \u003Cspan class=\"s1\">'https:\u002F\u002F'\u003C\u002Fspan> \u003Cspan class=\"mf\">.\u003C\u002Fspan> \u003Cspan class=\"nv\">$tunnel_host\u003C\u002Fspan>\u003Cspan class=\"p\">);\u003C\u002Fspan>\n    \u003Cspan class=\"nb\">define\u003C\u002Fspan>\u003Cspan class=\"p\">(\u003C\u002Fspan>\u003Cspan class=\"s1\">'WP_SITEURL'\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan>    \u003Cspan class=\"s1\">'https:\u002F\u002F'\u003C\u002Fspan> \u003Cspan class=\"mf\">.\u003C\u002Fspan> \u003Cspan class=\"nv\">$tunnel_host\u003C\u002Fspan>\u003Cspan class=\"p\">);\u003C\u002Fspan>\n    \u003Cspan class=\"nb\">define\u003C\u002Fspan>\u003Cspan class=\"p\">(\u003C\u002Fspan>\u003Cspan class=\"s1\">'COOKIE_DOMAIN'\u003C\u002Fspan>\u003Cspan class=\"p\">,\u003C\u002Fspan> \u003Cspan class=\"nv\">$tunnel_host\u003C\u002Fspan>\u003Cspan class=\"p\">);\u003C\u002Fspan>\n\u003Cspan class=\"p\">}\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>Keep it conditional &#8211; hardcoding \u003Ccode>WP_SITEURL\u003C\u002Fcode> to the tunnel fixes the phone and breaks local \u003Ccode>.test\u003C\u002Fcode> access. Matching the suffix rather than an exact domain means it survives the free plan&#8217;s rotating subdomains. The \u003Ccode>HTTPS\u003C\u002Fcode> line stops WordPress emitting \u003Ccode>http:\u002F\u002F\u003C\u002Fcode> URLs onto an \u003Ccode>https:\u002F\u002F\u003C\u002Fcode> page, since Expose terminates TLS before PHP sees the request.\u003C\u002Fp>\n\u003Cp>Confirm the header name before trusting that snippet. Expose rewrites \u003Ccode>Host\u003C\u002Fcode> so Herd can pick the right site, which means the public hostname arrives in a forwarded header &#8211; load the tunnel on your phone, then read the actual request headers in Expose&#8217;s dashboard at \u003Ccode>http:\u002F\u002F127.0.0.1:4040\u003C\u002Fcode> and swap the key if it differs.\u003C\u002Fp>\n\u003Cp>URLs baked into post content still point at \u003Ccode>.test\u003C\u002Fcode>, and multisite is worse again &#8211; don&#8217;t tunnel that one.\u003C\u002Fp>\n\u003Cp>While you&#8217;re here, tell Claude about it once and never think about it again. Drop this in your \u003Ccode>CLAUDE.md\u003C\u002Fcode>:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight markdown\">\u003Ccode>\u003Cspan class=\"gu\">## Mobile preview\u003C\u002Fspan>\nThis project is previewed through a Cloudflare tunnel at dev.yourdomain.com.\nWhen adding a dev server config, keep \u003Cspan class=\"sb\">`allowedHosts`\u003C\u002Fspan> and HMR clientPort 443 intact.\nNever hardcode localhost URLs in client-side code - use relative paths.\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>That last line matters more than it looks. A hardcoded \u003Ccode>http:\u002F\u002Flocalhost:8000\u002Fapi\u003C\u002Fcode> in your frontend works perfectly on your laptop and fails silently on your phone, because your phone&#8217;s &#8220;localhost&#8221; is your phone.\u003C\u002Fp>\n\u003Chr>\n\u003Ch2>\n  \u003Ca name=\"part-5-putting-it-together\" href=\"#part-5-putting-it-together\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Part 5: Putting it together\u003Cbr \u002F>\n\u003C\u002Fh2>\n\u003Cp>The full startup sequence, run once at your desk before you go anywhere:\n\u003C\u002Fp>\n\u003Cdiv class=\"highlight js-code-highlight\">\n\u003Cpre class=\"highlight shell\">\u003Ccode>\u003Cspan class=\"c\"># Terminal 1 - your app\u003C\u002Fspan>\nnpm run dev\n\n\u003Cspan class=\"c\"># Terminal 2 - the tunnel\u003C\u002Fspan>\ncloudflared tunnel \u003Cspan class=\"nt\">--url\u003C\u002Fspan> http:\u002F\u002Flocalhost:5173\n\n\u003Cspan class=\"c\"># Terminal 3 - Claude, with Remote Control on\u003C\u002Fspan>\n\u003Cspan class=\"nb\">cd\u003C\u002Fspan> ~\u002Fprojects\u002Fmy-app\nclaude \u003Cspan class=\"nt\">--remote-control\u003C\u002Fspan> \u003Cspan class=\"s2\">\"My App\"\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"highlight__panel js-actions-panel\">\n\u003Cdiv class=\"highlight__panel-action js-fullscreen-code-action\">\n    \u003Ctitle>Enter fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003Cp>    \u003Ctitle>Exit fullscreen mode\u003C\u002Ftitle>\u003C\u002Fp>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003C\u002Fdiv>\n\u003Cp>Then: scan the QR code into the Claude app, copy the tunnel URL into your phone&#8217;s browser, and put both on your home screen or in split view. That&#8217;s the whole rig.\u003C\u002Fp>\n\u003Cp>The loop, once you&#8217;re out of the house:\u003C\u002Fp>\n\u003Col>\n\u003Cli>\n\u003Cstrong>Type into the Claude app.\u003C\u002Fstrong> &#8220;The mobile nav overlaps the logo below 400px. Fix it.&#8221;\u003C\u002Fli>\n\u003Cli>\n\u003Cstrong>Claude works on your laptop.\u003C\u002Fstrong> You watch the tool calls stream by. Approve anything it asks about.\u003C\u002Fli>\n\u003Cli>\n\u003Cstrong>Switch to your browser tab, pull to refresh.\u003C\u002Fstrong> Or don&#8217;t &#8211; with HMR configured, it&#8217;s usually already updated.\u003C\u002Fli>\n\u003Cli>\n\u003Cstrong>Screenshot the problem and send it back.\u003C\u002Fstrong> This is the part that feels like cheating. Attach a photo or screenshot in the Claude app; Claude sees the image directly as part of your message. &#8220;Still overlapping, see attached&#8221; is a complete bug report.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Repeat.\u003C\u002Fstrong>\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Chr>\n\u003Ch2>\n  \u003Ca name=\"part-6-the-things-that-will-go-wrong\" href=\"#part-6-the-things-that-will-go-wrong\">\u003Cbr \u002F>\n  \u003C\u002Fa>\u003Cbr \u002F>\n  Part 6: The things that will go wrong\u003Cbr \u002F>\n\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>Your laptop must stay awake.\u003C\u002Fstrong> Both the session and the tunnel are local processes &#8211; a closed lid ends the party. Disable sleep on AC power. This is a preview mechanism, not hosting; if you want the app up permanently, deploy it.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Your dev server is now public.\u003C\u002Fstrong> A \u003Ccode>trycloudflare.com\u003C\u002Fcode> URL is unguessable but has no auth in front of it. Never tunnel a production database, an admin panel, or a debug endpoint, use fake data locally, and stop the tunnel when you&#8217;re done. On a named tunnel, put Cloudflare Access in front and the problem goes away.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Dropped sessions come back.\u003C\u002Fstrong> Ctrl+C&#8217;d out of \u003Ccode>claude remote-control\u003C\u002Fcode>? Run it again in the same directory within a few hours and it picks up where it left off.\u003C\u002Fp>\n\u003Cp>Set it up once. The next time you have an idea on a walk, you can just build it.\u003C\u002Fp>\n",false,{"rendered":18,"protected":16},"\u003Cp>There&#8217;s a specific kind of frustration that shows up the moment you start driving Claude Code from&#8230;\u003C\u002Fp>\n",1,169,"open","","standard",{"footnotes":22},[19],[],[28,11,29,30,31,32,33,34],"post-168","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-uncategorized","https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-content\u002Fuploads\u002F2026\u002F08\u002Fdevto-4418058-cover.webp",{"edited_at":37,"published_at":38,"reactions":39,"comments":39,"reading_time":40,"body_markdown":41},null,"2026-08-17T12:15:37Z",0,8,"There's a specific kind of frustration that shows up the moment you start driving Claude Code from your phone.\n\nThe coding part works beautifully. You're on a bus, or in a queue, or lying on the couch, and you can read what Claude is doing, approve a tool call, tell it to refactor the header, ask it to fix the failing test. Your laptop is at your desk doing the work. Your phone is the steering wheel.\n\nThen Claude says \"done - check it out at http:\u002F\u002Flocalhost:3000\" and the whole thing falls apart. Your phone has no idea what `localhost:3000` means. That address points at your phone, not your laptop. You are now a developer who can write code but cannot look at it.\n\nThe fix is two pieces stacked on top of each other: **Remote Control** for driving the session, and **a tunnel** for seeing the result. Here's how to wire both up.\n\n---\n\n## Part 1: Get Claude Code onto your phone\n\nClaude Code has a Remote Control feature that connects a session running on your machine to the Claude mobile app. The session never leaves your laptop - your files, your dev server, your node_modules all stay put. The phone is just a window into that terminal.\n\nStart it from your project folder:\n\n```bash\nclaude --remote-control \"My App\"\n```\n\nYou get a normal interactive session at your desk *and* the same session on your phone. If you're already mid-conversation, `\u002Fremote-control` (or `\u002Frc`) does the same thing without losing your history. If you're walking away entirely, `claude remote-control` runs it in server mode with no local prompt.\n\nEither way, Claude Code prints a session URL and a QR code. Scan the QR into the Claude app, or open the app, tap **Code**, and pick the session from the list. That's the whole setup.\n\nTwo things worth doing while you're at the desk:\n\n- **Turn on push notifications.** Run `\u002Fconfig` and enable pushes. Now your phone buzzes when a build finishes or Claude needs a decision, instead of you checking every few minutes. You can also ask inline: *\"notify me when the tests pass.\"*\n- **Check you're eligible.** Remote Control needs a paid claude.ai plan and `claude auth login` - API keys won't work. If it refuses to start, `claude doctor` says why.\n\n## Part 2: Why you still can't see your app\n\nYou've got Claude in your pocket. You tell it to change the hero section. It does. And you're stuck, because the dev server is bound to `127.0.0.1:5173` on a laptop that's behind your router, behind your ISP's NAT, with no public address.\n\nBeing on the same Wi-Fi *sometimes* helps - you can occasionally reach `http:\u002F\u002F192.168.1.x:5173` if your dev server binds to `0.0.0.0`. But that dies the moment you leave the house, and it's exactly when you leave the house that this whole setup becomes worth doing.\n\nWhat you actually want is a **tunnel**: a small daemon on your laptop that opens an outbound connection to a public edge server, which then forwards inbound requests back down that pipe to your local port. No firewall changes. No port forwarding. No public IP.\n\n---\n\n## Part 3: Picking a tunnel\n\nThree realistic options, and the free tiers diverge sharply.\n\n### Cloudflare Tunnel - the best free option\n\nTwo flavours, and the distinction matters more than most tutorials admit.\n\n**Quick tunnel** (no account, one command):\n\n```bash\ncloudflared tunnel --url http:\u002F\u002Flocalhost:5173\n```\n\nYou get a random `trycloudflare.com` subdomain, printed to your terminal. Copy it to your phone and you're browsing your local app from anywhere. Zero setup.\n\nThe catch: quick tunnels are explicitly meant for development and testing. Expect a cap on in-flight requests, no Server-Sent Events support, no SLA, and a brand new URL every time you restart. For \"look at my dev server for the next two hours,\" that's completely fine. For anything you want to leave running, it isn't.\n\n**Named tunnel** (account + your domain on Cloudflare DNS):\n\nMore setup - you create the tunnel, route DNS to it, and usually end up managing a `config.yml` or a system service. In exchange you get a stable URL on your own domain that survives restarts, free SSL, no bandwidth caps, no session timeouts, and you can put Cloudflare Access in front of it so only you can load the page. The requirement is that your domain's authoritative DNS lives on Cloudflare.\n\nIf you're going to do this more than twice, spend the twenty minutes on a named tunnel. `dev.yourdomain.com` pointing at your laptop is a genuinely nice thing to own.\n\n### ngrok - fastest to first URL, tightest free tier\n\n```bash\nngrok http 5173\n```\n\nStill the quickest path from nothing to a public URL, and its request inspector is better than anything Cloudflare gives you - useful if you're debugging webhooks rather than just eyeballing a page. Every account gets a free static domain, so your URL doesn't rotate on restart.\n\nBut ngrok cut its free plan hard in early 2026: roughly 2-hour session limits, about 1 GB of monthly bandwidth, a handful of endpoints, and an interstitial warning page in front of every visit. The two-hour ceiling is the one that hurts here - you'll be restarting the tunnel and re-copying URLs in the middle of your afternoon. Removing the interstitial means paying.\n\n### Expose - good if you're already in PHP land\n\n```bash\nexpose share http:\u002F\u002Flocalhost:8000\n```\n\nBeyond Code's tool, self-hostable, and pleasant if you're doing Laravel work. The shared free tier has session limits similar in spirit to ngrok's. Its real selling point is that you can run your own Expose server on a cheap VPS and stop worrying about anyone's free tier.\n\n### Quick comparison\n\n| | Cloudflare quick | Cloudflare named | ngrok free | Expose (shared) |\n|---|---|---|---|---|\n| Account needed | No | Yes | Yes | Yes |\n| Setup time | ~1 min | ~20 min | ~2 min | ~2 min |\n| Session limit | None | None | ~2 hours | Limited |\n| Stable URL | No | Yes (your domain) | Yes (static domain) | No |\n| Bandwidth cap | None stated | None | ~1 GB\u002Fmo | Limited |\n| Interstitial page | No | No | Yes | No |\n| Best for | A quick look | Leaving it running | Webhook debugging | PHP\u002FLaravel |\n\n**Recommendation:** quick tunnel today because you want to get moving, named tunnel this weekend because you'll want it permanently.\n\n---\n\n## Part 4: The dev-server config that will bite you\n\nThis is the step nobody warns you about, and it produces a blank page or a scary error banner that looks like the tunnel is broken. It isn't. Modern dev servers reject requests whose `Host` header doesn't match localhost, as a defence against DNS rebinding attacks. Your tunnel's hostname is, by definition, not localhost.\n\n**Vite** - add the tunnel host to `vite.config.js`:\n\n```js\nexport default {\n  server: {\n    host: true,              \u002F\u002F bind 0.0.0.0\n    allowedHosts: ['.trycloudflare.com', 'dev.yourdomain.com'],\n    hmr: { clientPort: 443 } \u002F\u002F HMR over the tunnel's HTTPS\n  }\n}\n```\n\nThat `hmr.clientPort` line is what makes hot reload keep working through the tunnel. Without it the page loads but never updates, and you'll waste ten minutes wondering why Claude's changes aren't showing up.\n\n**Next.js** - add `allowedDevOrigins` in `next.config.js`:\n\n```js\nmodule.exports = {\n  allowedDevOrigins: ['dev.yourdomain.com', '*.trycloudflare.com']\n}\n```\n\n**WordPress through Herd** has the same shape of problem with a different cause: WordPress stores the site URL in the database, so the tunneled page loads as bare HTML while every asset still points at `my-site.test`.\n\nHerd installs Expose into your PATH and gives you a token field in settings, so from the site directory the tunnel is one command:\n\n```bash\nherd share\n```\n\nHerd detects the site's local URL and shares the right address. Now teach WordPress to answer on the public hostname, in `wp-config.php` above the \"stop editing\" line:\n\n```php\n$tunnel_host = $_SERVER['HTTP_X_FORWARDED_HOST'] ?? '';\n\nif (str_contains($tunnel_host, 'sharedwithexpose.com')) {\n    $_SERVER['HTTP_HOST'] = $tunnel_host;\n    $_SERVER['HTTPS']     = 'on';\n    define('WP_HOME',       'https:\u002F\u002F' . $tunnel_host);\n    define('WP_SITEURL',    'https:\u002F\u002F' . $tunnel_host);\n    define('COOKIE_DOMAIN', $tunnel_host);\n}\n```\n\nKeep it conditional - hardcoding `WP_SITEURL` to the tunnel fixes the phone and breaks local `.test` access. Matching the suffix rather than an exact domain means it survives the free plan's rotating subdomains. The `HTTPS` line stops WordPress emitting `http:\u002F\u002F` URLs onto an `https:\u002F\u002F` page, since Expose terminates TLS before PHP sees the request.\n\nConfirm the header name before trusting that snippet. Expose rewrites `Host` so Herd can pick the right site, which means the public hostname arrives in a forwarded header - load the tunnel on your phone, then read the actual request headers in Expose's dashboard at `http:\u002F\u002F127.0.0.1:4040` and swap the key if it differs.\n\nURLs baked into post content still point at `.test`, and multisite is worse again - don't tunnel that one.\n\nWhile you're here, tell Claude about it once and never think about it again. Drop this in your `CLAUDE.md`:\n\n```markdown\n## Mobile preview\nThis project is previewed through a Cloudflare tunnel at dev.yourdomain.com.\nWhen adding a dev server config, keep `allowedHosts` and HMR clientPort 443 intact.\nNever hardcode localhost URLs in client-side code - use relative paths.\n```\n\nThat last line matters more than it looks. A hardcoded `http:\u002F\u002Flocalhost:8000\u002Fapi` in your frontend works perfectly on your laptop and fails silently on your phone, because your phone's \"localhost\" is your phone.\n\n---\n\n## Part 5: Putting it together\n\nThe full startup sequence, run once at your desk before you go anywhere:\n\n```bash\n# Terminal 1 - your app\nnpm run dev\n\n# Terminal 2 - the tunnel\ncloudflared tunnel --url http:\u002F\u002Flocalhost:5173\n\n# Terminal 3 - Claude, with Remote Control on\ncd ~\u002Fprojects\u002Fmy-app\nclaude --remote-control \"My App\"\n```\n\nThen: scan the QR code into the Claude app, copy the tunnel URL into your phone's browser, and put both on your home screen or in split view. That's the whole rig.\n\nThe loop, once you're out of the house:\n\n1. **Type into the Claude app.** \"The mobile nav overlaps the logo below 400px. Fix it.\"\n2. **Claude works on your laptop.** You watch the tool calls stream by. Approve anything it asks about.\n3. **Switch to your browser tab, pull to refresh.** Or don't - with HMR configured, it's usually already updated.\n4. **Screenshot the problem and send it back.** This is the part that feels like cheating. Attach a photo or screenshot in the Claude app; Claude sees the image directly as part of your message. \"Still overlapping, see attached\" is a complete bug report.\n5. **Repeat.**\n\n---\n\n## Part 6: The things that will go wrong\n\n**Your laptop must stay awake.** Both the session and the tunnel are local processes - a closed lid ends the party. Disable sleep on AC power. This is a preview mechanism, not hosting; if you want the app up permanently, deploy it.\n\n**Your dev server is now public.** A `trycloudflare.com` URL is unguessable but has no auth in front of it. Never tunnel a production database, an admin panel, or a debug endpoint, use fake data locally, and stop the tunnel when you're done. On a named tunnel, put Cloudflare Access in front and the problem goes away.\n\n**Dropped sessions come back.** Ctrl+C'd out of `claude remote-control`? Run it again in the same directory within a few hours and it picks up where it left off.\n\nSet it up once. The next time you have an idea on a walk, you can just build it.",{"self":43,"collection":49,"about":52,"author":55,"replies":59,"version-history":62,"wp:featuredmedia":65,"wp:attachment":68,"wp:term":71,"curies":78},[44],{"href":45,"targetHints":46},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F168",{"allow":47},[48],"GET",[50],{"href":51},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts",[53],{"href":54},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Ftypes\u002Fpost",[56],{"embeddable":57,"href":58},true,"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fusers\u002F1",[60],{"embeddable":57,"href":61},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fcomments?post=168",[63],{"count":39,"href":64},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fposts\u002F168\u002Frevisions",[66],{"embeddable":57,"href":67},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fmedia\u002F169",[69],{"href":70},"https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fmedia?parent=168",[72,75],{"taxonomy":73,"embeddable":57,"href":74},"category","https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Fcategories?post=168",{"taxonomy":76,"embeddable":57,"href":77},"post_tag","https:\u002F\u002Fportal.pluginizelab.com\u002Fwp-json\u002Fwp\u002Fv2\u002Ftags?post=168",[79],{"name":80,"href":81,"templated":57},"wp","https:\u002F\u002Fapi.w.org\u002F{rel}",[],1786969903462]