<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jaga</title>
    <description>The latest articles on DEV Community by Jaga (@jagafarm).</description>
    <link>https://dev.to/jagafarm</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3874233%2Fa1f3b031-3afa-47f9-91d1-4c70d2eb8e93.png</url>
      <title>DEV Community: Jaga</title>
      <link>https://dev.to/jagafarm</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/jagafarm"/>
    <language>en</language>
    <item>
      <title>I couldn't talk to Claude Code from my phone, so I shipped my own terminal</title>
      <dc:creator>Jaga</dc:creator>
      <pubDate>Wed, 15 Jul 2026 10:27:05 +0000</pubDate>
      <link>https://dev.to/jagafarm/i-couldnt-talk-to-claude-code-from-my-phone-so-i-shipped-my-own-terminal-3pia</link>
      <guid>https://dev.to/jagafarm/i-couldnt-talk-to-claude-code-from-my-phone-so-i-shipped-my-own-terminal-3pia</guid>
      <description>&lt;p&gt;I haven't gone a day without talking to Claude Code.&lt;/p&gt;

&lt;p&gt;That sounds dramatic until you check your own terminal history. Mine is a wall of &lt;code&gt;claude&lt;/code&gt; commands going back months — sometimes shipping a feature, sometimes just rubber-ducking a bug on the train. At some point Claude Code stopped being a tool I opened and became something closer to a coworker I check in with. The kind of coworker who waits 20 minutes for you to approve a file edit while you're at lunch.&lt;/p&gt;

&lt;p&gt;That waiting is the part nobody warned me about. When you live with an AI coding agent, the bottleneck isn't typing — it's &lt;em&gt;being away from your Mac&lt;/em&gt;. Every time I stepped out for coffee, every train ride, every meeting that ran long, Claude Code was sitting there, blocked on a one-key approval, while I was holding the only computer that could unblock it: my phone.&lt;/p&gt;

&lt;p&gt;So I started trying iOS terminals.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every option failed me in a different way
&lt;/h2&gt;

&lt;p&gt;I won't name names because the people building these are working hard, but here's what I hit, over and over:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subscriptions for a fundamentally simple tool.&lt;/strong&gt; A terminal is plumbing. I do not want a recurring charge for plumbing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No real Mosh.&lt;/strong&gt; SSH on a phone dies the second you switch from Wi-Fi to LTE. You re-connect, you lose your tmux pane state, you lose your scrollback, you swear quietly. Mosh fixes this — and almost no iOS app actually ships a real Mosh implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tmux on mobile is a nightmare.&lt;/strong&gt; Prefix keys (&lt;code&gt;Ctrl+B&lt;/code&gt;, then a letter) are fine on a hardware keyboard. They are &lt;em&gt;miserable&lt;/em&gt; on a touchscreen. Switching panes shouldn't take three taps and a finger gymnastic.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No notifications when an agent needs you.&lt;/strong&gt; This is the killer. Claude Code is &lt;em&gt;built&lt;/em&gt; to wait for you, but none of the terminals I tried surfaced "your agent needs input" anywhere I'd actually see it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I kept thinking someone would fix this. After about a year of waiting, I decided that someone was me.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built (in six weeks of nights and weekends)
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1tpgnsbpl1led5n1q2dw.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F1tpgnsbpl1led5n1q2dw.jpg" alt=" " width="800" height="1738"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The app is &lt;strong&gt;&lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=06-why-i-built-mt-hero" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt;&lt;/strong&gt;. The whole thing is organized around one idea: &lt;em&gt;the moment Claude Code needs me, my phone should know.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A few decisions that fell out of that (the full technical deep-dive is in &lt;a href="https://dev.to/jagafarm/show-dev-i-built-mt-mosh-terminal-so-i-could-run-claude-code-from-my-phone-4fhl"&gt;my Show DEV post&lt;/a&gt;, this is the short version):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Real Mosh, written from scratch.&lt;/strong&gt; Not a wrapper. I wanted to control how aggressively the client retries on a flaky LTE handoff, because that's the difference between "session survived the subway" and "session died at the platform."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-tap tmux.&lt;/strong&gt; Fifteen of the operations I do constantly — split, swap, zoom, kill, swipe between sessions — are now single taps from a bottom action bar. No prefix keys, no muscle memory, no leaving the home row when I do have a keyboard.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff656bdeqieme1zkcb0sq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff656bdeqieme1zkcb0sq.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;System-level push notifications via Claude Code Hooks.&lt;/strong&gt; You paste two hook entries into your &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, and that's it. When Claude Code needs an approval, my phone buzzes. Tap the notification → MT instantly resumes the exact tmux session over Mosh. Host, user, session name — all matched automatically. Apple Watch notifications too, because sometimes my phone is in another room.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keyboard-first on iPad.&lt;/strong&gt; With a Magic Keyboard or a split ergo board, iPad becomes a real terminal machine. Tabs, splits, ⌘1–9 to switch panes, drag tabs to tile them. I can run an entire dev session without lifting a finger to the screen.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The thing I did &lt;em&gt;not&lt;/em&gt; expect is how often I now reach for my iPad mini before I reach for my MacBook. A &lt;a href="https://dev.to/jagafarm/the-300-gram-ai-coding-rig-ipad-mini-claude-code-anywhere-e1o"&gt;300-gram tablet plus a folding keyboard&lt;/a&gt; is somehow a faster Claude Code workstation than a 1.5 kg laptop, because I can pull it out anywhere and it's already paired to my home Mac &lt;a href="https://dev.to/jagafarm/reach-your-home-mac-from-anywhere-with-tailscale-so-claude-code-can-come-with-you-1077"&gt;via Tailscale&lt;/a&gt;. I genuinely did not see this coming.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one-time, not a subscription
&lt;/h2&gt;

&lt;p&gt;MT is &lt;strong&gt;$14.99, one time.&lt;/strong&gt; No monthly fee, no Pro tier I'm hiding the good stuff behind, no "trial." You buy it, you own it, you keep it.&lt;/p&gt;

&lt;p&gt;This is partly philosophy and partly a promise to myself: if I'm building plumbing, I'm not going to charge rent on it. If you want to support continued development there's an optional MT Pro tier later, but everything in this post — Mosh, tmux, push notifications, iPad keyboard support — ships in the base app.&lt;/p&gt;

&lt;h2&gt;
  
  
  If this resonates
&lt;/h2&gt;

&lt;p&gt;If you've ever stared at your phone in a coffee shop knowing your AI agent is blocked on you, MT was built for that exact feeling. The frustration that made me build it is probably the same frustration that brought you to this article.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=06-why-i-built-mt-footer" rel="noopener noreferrer"&gt;MT — Mosh Terminal on the App Store&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I'd love to know what your "Claude Code is waiting for me" moment looks like — drop it in the comments, or find me on X at &lt;a href="https://x.com/jaga_farm" rel="noopener noreferrer"&gt;@jaga_farm&lt;/a&gt;. I read everything.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a solo iOS developer. I write about gadgets and dev tools at &lt;a href="https://jaga-farm.com" rel="noopener noreferrer"&gt;jaga-farm.com&lt;/a&gt;. MT — Mosh Terminal is my first App Store release. Find me on X at &lt;a href="https://x.com/jaga_farm" rel="noopener noreferrer"&gt;@jaga_farm&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>claude</category>
      <category>indiehackers</category>
      <category>terminal</category>
    </item>
    <item>
      <title>Show DEV: I built MT — Mosh Terminal so I could run Claude Code from my phone</title>
      <dc:creator>Jaga</dc:creator>
      <pubDate>Sun, 12 Jul 2026 09:12:41 +0000</pubDate>
      <link>https://dev.to/jagafarm/show-dev-i-built-mt-mosh-terminal-so-i-could-run-claude-code-from-my-phone-4fhl</link>
      <guid>https://dev.to/jagafarm/show-dev-i-built-mt-mosh-terminal-so-i-could-run-claude-code-from-my-phone-4fhl</guid>
      <description>&lt;p&gt;I run Claude Code every day. I also spend a lot of time away from my Mac. Those two facts are in constant tension, and this is the post about how I tried to solve it.&lt;/p&gt;

&lt;p&gt;After about a year of fighting with iOS terminal apps that all let me down in different ways — broken on flaky networks, hostile to tmux on a touchscreen, no way to know when my AI agent was waiting on me — I gave up and built my own. It's called &lt;strong&gt;&lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=04-mt-terminal-review-hero" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt;&lt;/strong&gt;, it's $14.99 once and you own it forever, and this is the long-form Show DEV post about what's actually inside it.&lt;/p&gt;

&lt;p&gt;I'll cover the four things I did from scratch (Mosh, tmux on touch, push notifications via Claude Code Hooks, GPU rendering), the honest tradeoffs (what MT does &lt;em&gt;not&lt;/em&gt; do), how it stacks up against Termius / Blink / Prompt 3, and the pricing decision that's going to either delight you or annoy you.&lt;/p&gt;

&lt;h2&gt;
  
  
  What MT is, in one paragraph
&lt;/h2&gt;

&lt;p&gt;MT — Mosh Terminal is a SSH and Mosh terminal client for iPhone and iPad, built specifically for developers who live with AI coding agents. It connects to your own servers — your home Mac, a cloud VM, a Raspberry Pi, anything you SSH into today — and gives you a terminal experience that's actually usable on a phone. The headline features are a from-scratch Mosh implementation in Rust, one-tap tmux operations that don't require touching the prefix key, system-level push notifications via Claude Code's Hooks API, and a Metal-rendered terminal engine based on libghostty. It costs &lt;strong&gt;$14.99 once&lt;/strong&gt;, no subscription.&lt;/p&gt;

&lt;h2&gt;
  
  
  Specs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Spec&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;MT — Mosh Terminal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devices&lt;/td&gt;
&lt;td&gt;iPhone, iPad, iPad mini&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Price&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;$14.99 one-time&lt;/strong&gt; (no subscription)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocols&lt;/td&gt;
&lt;td&gt;SSH, Mosh (custom Rust implementation)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Terminal engine&lt;/td&gt;
&lt;td&gt;libghostty (Metal GPU rendering)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CJK input&lt;/td&gt;
&lt;td&gt;Full Japanese / Chinese / Korean IME with inline composition&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrent tabs&lt;/td&gt;
&lt;td&gt;Unlimited (limited by device memory)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tmux integration&lt;/td&gt;
&lt;td&gt;15+ one-tap actions, multi-session&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;External keyboard&lt;/td&gt;
&lt;td&gt;Magic Keyboard, JIS, Bluetooth, ⌘ shortcuts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Themes&lt;/td&gt;
&lt;td&gt;8 built-in (Tokyo Night, Dracula, Catppuccin, Gruvbox, Solarized, etc.) + custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scrollback&lt;/td&gt;
&lt;td&gt;Up to 100,000 lines&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Auth&lt;/td&gt;
&lt;td&gt;Password, public key (RSA, Ed25519), SSH agent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OS&lt;/td&gt;
&lt;td&gt;iOS 18+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The Mosh implementation
&lt;/h2&gt;

&lt;p&gt;The thing I want to talk about first is also the one that took the longest to build. Let me back up.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mosh&lt;/strong&gt; (Mobile Shell) is the answer to "SSH dies the moment you switch from Wi-Fi to LTE." A normal SSH session is a phone call: when the line drops, the call ends, and you redial. Mosh is closer to a series of letters: even if some of them get lost in transit, the next one tells you the latest state of the world. It's a UDP-based, state-synchronization protocol designed for terminals on flaky mobile networks. If you've ever had a terminal session survive a subway tunnel or a Wi-Fi-to-cellular handoff without missing a beat, that was Mosh.&lt;/p&gt;

&lt;p&gt;Almost every "iOS terminal with Mosh support" is wrapping the existing &lt;code&gt;mosh-client&lt;/code&gt; binary. &lt;strong&gt;MT doesn't.&lt;/strong&gt; I wrote the protocol from scratch in Rust. It implements the State Synchronization Protocol (SSP) from the Mosh paper, stays compatible with the standard &lt;code&gt;mosh-server&lt;/code&gt;, and uses AES-128-OCB3 for encryption.&lt;/p&gt;

&lt;p&gt;Why bother? Because the &lt;em&gt;feel&lt;/em&gt; of Mosh on mobile — how aggressively the client retries, how quickly it gives up and reconnects, how it adapts scroll speed to the current round-trip time, what it does when the network is "almost back" — is invisible to most users and totally unfixable when you're a thin wrapper around an opaque binary. I wanted control over every one of those decisions, because the difference between "session survived the subway" and "session died at the platform" is exactly there.&lt;/p&gt;

&lt;p&gt;I tested it on the actual Tokyo subway, in cafés with garbage Wi-Fi, on Wi-Fi-to-LTE handoffs, in elevators, in basements. SSH dies. Mosh hangs on. It's not magic — if you have &lt;em&gt;zero&lt;/em&gt; signal for long enough you do eventually lose it — but the recovery is dramatically better than anything else I've used on iOS.&lt;/p&gt;

&lt;h2&gt;
  
  
  One-tap tmux
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu1q4z9ajbgvtdyk42822.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu1q4z9ajbgvtdyk42822.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've ever used tmux on a touchscreen, you already know the problem.&lt;/p&gt;

&lt;p&gt;tmux is built around a "prefix key" model: press &lt;code&gt;Ctrl+B&lt;/code&gt;, release, then press another key for the actual command. On a hardware keyboard this is fine. On a soft keyboard it's &lt;em&gt;misery&lt;/em&gt;. Hunting for &lt;code&gt;Ctrl&lt;/code&gt;, then &lt;code&gt;B&lt;/code&gt;, then &lt;code&gt;n&lt;/code&gt;, every time you want to switch windows is the kind of friction that makes you stop using mobile terminals altogether.&lt;/p&gt;

&lt;p&gt;MT defines &lt;strong&gt;15 tmux operations as one-tap actions&lt;/strong&gt; in a bottom action bar: detach, new window, vertical split, horizontal split, switch pane, zoom, copy mode, list sessions, kill window, and so on. No prefix key juggling. The action bar is reorderable and you can hide actions you don't use. (New to tmux? I wrote &lt;a href="https://dev.to/jagafarm/stop-losing-claude-code-sessions-a-tmux-primer-for-mobile-devs-2p48"&gt;a tmux primer for mobile devs&lt;/a&gt; that covers the basics first.)&lt;/p&gt;

&lt;p&gt;Two details that fell out of building this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No accidental tmux fires while typing CJK.&lt;/strong&gt; If you've used a Japanese, Chinese, or Korean IME inside any other iOS terminal, you've hit the bug where pressing keys mid-composition fires off random tmux commands. MT tracks IME composition state and holds tmux input until composition is committed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Server tmux config is auto-imported.&lt;/strong&gt; If your &lt;code&gt;~/.tmux.conf&lt;/code&gt; defines a custom prefix or key bindings, MT reads them on connect and adapts the action bar so the labels match what you actually have on the server. You can opt out in settings.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can also run multiple tmux sessions side by side with horizontal swipe to switch. On iPhone where screen real estate is tight, this is the workflow I use most: one session per task, swipe to switch, no memorization of pane layouts.&lt;/p&gt;

&lt;h2&gt;
  
  
  Push notifications via Claude Code Hooks
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyys69bvgrkyillxn4p1v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyys69bvgrkyillxn4p1v.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the feature MT was &lt;em&gt;named after&lt;/em&gt;, in spirit. The whole reason I built it.&lt;/p&gt;

&lt;p&gt;The pain: I'd ask Claude Code to do something big, walk away, come back twenty minutes later to find the agent had been waiting on a one-key approval the whole time. That's twenty minutes of nothing happening because I had no way to know.&lt;/p&gt;

&lt;p&gt;The fix: &lt;strong&gt;system-level push notifications wired into Claude Code's Hooks API.&lt;/strong&gt; You paste two hook entries into your &lt;code&gt;~/.claude/settings.json&lt;/code&gt;, you're done. When Claude Code (or Codex) needs input — task completion, permission request, anything — your iPhone buzzes. &lt;strong&gt;Tap the notification → MT auto-resumes the exact tmux session over Mosh.&lt;/strong&gt; Host, user, and session name are matched automatically. Apple Watch is supported too, because half the time my phone is in another room.&lt;/p&gt;

&lt;p&gt;There's no proprietary daemon and no vendor lock-in. The push relay is &lt;strong&gt;self-hostable&lt;/strong&gt; if you don't want to use the default one. The whole hook setup is two YAML entries you can read and audit.&lt;/p&gt;

&lt;p&gt;This is the closest thing to "Claude Code in your pocket" that I know how to build, and it's the feature I use most.&lt;/p&gt;

&lt;h2&gt;
  
  
  iPad: keyboard-first
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flp1am7d3fa7yb9c6jdff.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flp1am7d3fa7yb9c6jdff.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;iPad with an external keyboard is, unironically, my favorite Claude Code workstation right now. I have a MacBook. I still reach for the iPad first when the work is "talk to the agent."&lt;/p&gt;

&lt;p&gt;What MT does on iPad:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stage Manager support&lt;/strong&gt; — multi-window, resize, tile.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;External keyboard, mouse, trackpad&lt;/strong&gt; — full ⌘ shortcuts.

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;⌘1&lt;/code&gt;–&lt;code&gt;⌘9&lt;/code&gt;: switch tab&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⌘N&lt;/code&gt;: new connection&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⌘W&lt;/code&gt;: close&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⌘D&lt;/code&gt;: split pane&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⌘+&lt;/code&gt;/&lt;code&gt;⌘-&lt;/code&gt;: font size&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;⌘K&lt;/code&gt;: clear terminal&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hold &lt;code&gt;⌘&lt;/code&gt;&lt;/strong&gt; to surface a shortcut overlay (the macOS convention; nice that iPadOS exposes it).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Binary-tree pane splits with no hard limit&lt;/strong&gt; — split as many times as you want, zoom in on one pane, drag tabs between windows.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JIS keyboard auto-detection with &lt;code&gt;¥&lt;/code&gt;→&lt;code&gt;\&lt;/code&gt; conversion&lt;/strong&gt; for the Japanese-keyboard crowd. (If you're not on a JIS layout this doesn't affect you.)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The result, with a Magic Keyboard or a split ergo board, is a terminal experience that genuinely doesn't feel like a compromise. I've done full debug sessions on a 13" iPad Pro and forgotten I wasn't on a Mac. My daily setup is actually the iPad mini — I wrote about &lt;a href="https://dev.to/jagafarm/the-300-gram-ai-coding-rig-ipad-mini-claude-code-anywhere-e1o"&gt;the 300-gram AI coding rig&lt;/a&gt; separately.&lt;/p&gt;

&lt;h2&gt;
  
  
  iPhone: the L1 soft key bar
&lt;/h2&gt;

&lt;p&gt;"iPhone for terminal work? The screen is too small."&lt;/p&gt;

&lt;p&gt;I thought so too. Then I built it and discovered it's totally usable, with two tricks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The L1 soft key bar.&lt;/strong&gt; Always-on at the bottom of the screen: ESC, TAB, sticky Ctrl, arrow keys, F1–F12, Page Up/Down. The Ctrl key is &lt;em&gt;sticky&lt;/em&gt; — tap it, then the next key — so one-handed operation is genuinely possible. This is the feature that turns "I can technically run a terminal on iPhone" into "I can actually do work on iPhone."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Horizontal swipe between sessions.&lt;/strong&gt; I commute with five tmux sessions running, one per Claude Code task, and switching between them is one swipe. The combination of swipe-to-switch and the L1 bar means you can run a real multi-agent workflow on a 6-inch screen, which I would not have believed before I built it.&lt;/p&gt;

&lt;h2&gt;
  
  
  libghostty + Metal
&lt;/h2&gt;

&lt;p&gt;The terminal engine is &lt;strong&gt;libghostty&lt;/strong&gt;, the library form of the popular desktop terminal Ghostty. Metal GPU rendering, 60 fps everywhere, 120 fps on ProMotion iPads, smooth scroll, no tearing.&lt;/p&gt;

&lt;p&gt;Getting libghostty (which was designed for macOS) to run cleanly on iOS / iPadOS was not a one-line port. There's a non-trivial amount of glue code in MT for the iOS-specific bits — view lifecycle, background-to-foreground redraws, touch and pointer event routing — that I won't get into here. The user-visible result is that I can have a dozen tabs open and the app stays smooth.&lt;/p&gt;

&lt;p&gt;Themes ship with the usual suspects (Tokyo Night, Dracula, Catppuccin Mocha, Gruvbox Dark, One Dark, Solarized Dark/Light, default). Fonts include Menlo, Courier New, JetBrains Mono, and you can import your own &lt;code&gt;.ttf&lt;/code&gt; / &lt;code&gt;.otf&lt;/code&gt; files. Pinch-to-zoom on the terminal text is a real-time font-size change, which is &lt;em&gt;very&lt;/em&gt; satisfying after years of "Settings → Display → Font Size → Apply → Restart."&lt;/p&gt;

&lt;h2&gt;
  
  
  Other things in the box
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iCloud Sync&lt;/strong&gt; — Connection profiles, tmux settings, and terminal settings sync across devices. Per-category toggles. Passwords and SSH keys are gated behind a separate iCloud Keychain toggle and are E2E encrypted. &lt;strong&gt;All sync is off by default&lt;/strong&gt;, because that's the safe default.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security&lt;/strong&gt; — SSH keys live in iOS Keychain protected by Secure Enclave. Face ID / Touch ID gating for keys. Host key verification (TOFU) with fingerprint display. No analytics, no tracking, no ads, no third-party SDKs of any kind.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Localization&lt;/strong&gt; — English, Japanese, Korean, Simplified Chinese, Traditional Chinese. Full UI translations for each, including the tmux action bar labels.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest tradeoffs
&lt;/h2&gt;

&lt;p&gt;I would lose your trust if I didn't write this section.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;MT does &lt;em&gt;not&lt;/em&gt; do:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SFTP file transfer.&lt;/strong&gt; If you need to move files in and out of remote machines as a primary use case, MT isn't your tool yet. Termius and Prompt 3 are better at this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Port forwarding.&lt;/strong&gt; Same story. MT is laser-focused on the &lt;em&gt;terminal&lt;/em&gt; experience, not the SSH-as-network-tool experience.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Always-on cloud sessions.&lt;/strong&gt; MT is a client. It connects to servers you set up. It is &lt;strong&gt;not a VPN, not a proxy, not a tunnel&lt;/strong&gt; — those are explicit non-goals because they're a different category of app and Apple reviews them as such (more on that in a separate post).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Push notifications might be Pro-only later.&lt;/strong&gt; Maintaining the push relay infrastructure costs money, and it's the one thing that doesn't fit cleanly into a one-time-purchase model. As of v1.2.1 they're free. If they ever move to MT Pro, existing users at least get a heads-up.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mosh requires &lt;code&gt;mosh-server&lt;/code&gt; on the remote machine.&lt;/strong&gt; This is a Mosh-protocol limitation, not an MT one. SSH connections need no server-side install; Mosh does. If &lt;code&gt;mosh-server&lt;/code&gt; isn't installed or UDP is blocked, MT auto-falls-back to SSH.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If those tradeoffs are dealbreakers, the table below should help you pick something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  How MT compares to Termius / Blink Shell / Prompt 3
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;MT&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;Termius&lt;/th&gt;
&lt;th&gt;Blink Shell&lt;/th&gt;
&lt;th&gt;Prompt 3&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Price&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$14.99 one-time&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$10/month and up&lt;/td&gt;
&lt;td&gt;$19.99/year&lt;/td&gt;
&lt;td&gt;$20/year or $100 one-time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mosh&lt;/td&gt;
&lt;td&gt;✅ Custom Rust impl&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;tmux integration&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;15 one-tap actions&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pane splits&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU rendering&lt;/td&gt;
&lt;td&gt;✅ Metal&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Partial&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Push notifications&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;✅ via Claude Code Hooks&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SFTP&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Port forwarding&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'm not going to claim MT is "better than" any of those apps in a vacuum — they all have years of head start and feature surface I don't match. What MT has that none of them have is the &lt;strong&gt;specific intersection&lt;/strong&gt; I built it for: from-scratch Mosh + one-time pricing + one-tap mobile tmux + Claude Code Hooks notifications. If that intersection is what you need, MT is currently the only option. If you need a Swiss-army-knife SSH tool, one of the others is probably a better fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why one-time pricing
&lt;/h2&gt;

&lt;p&gt;Quick personal note.&lt;/p&gt;

&lt;p&gt;I do not enjoy paying subscriptions for tools that are fundamentally simple infrastructure. A terminal client is plumbing. Plumbing should not have a monthly fee. So I shipped MT as a one-time $14.99 purchase and gritted my teeth about everything that decision makes harder (notification servers, future updates, my own runway).&lt;/p&gt;

&lt;p&gt;$14.99 is more than a single month of Termius. It is dramatically less than a year. &lt;strong&gt;You break even at month two and own it forever.&lt;/strong&gt; That's the deal I wanted as a customer, so that's the deal I built.&lt;/p&gt;

&lt;p&gt;There will eventually be an &lt;strong&gt;MT Pro&lt;/strong&gt; tier for things that genuinely cost ongoing money to operate. Everything in this post — Mosh, tmux, Claude Code notifications, the iPad/iPhone experience — is in the base app. I'm not playing the "feature gating" game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this app is for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;You run Claude Code, Codex, or another AI coding agent on a remote machine&lt;/strong&gt; and you want to be able to talk to it from your phone or iPad without losing your mind. (No remote machine yet? &lt;a href="https://dev.to/jagafarm/reach-your-home-mac-from-anywhere-with-tailscale-so-claude-code-can-come-with-you-1077"&gt;Tailscale turns your home Mac into one&lt;/a&gt; in about ten minutes.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You commute, travel, or work from places that aren't your main desk.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You don't want another monthly subscription&lt;/strong&gt; for the small set of dev tools you use every day.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You use tmux&lt;/strong&gt; and want it to not be hostile on touch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You care about your terminal feeling fast&lt;/strong&gt; at any tab count.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that's you, &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=04-mt-terminal-review-footer" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt; is on the App Store now for $14.99.&lt;/p&gt;

&lt;p&gt;If it's not you, no hard feelings — Termius and Prompt 3 are excellent for the use cases MT doesn't cover, and I've used both.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;I'm shipping MT updates monthly and watching what users actually ask for. The current short list:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Better SFTP-style file ops&lt;/strong&gt; (I know, I know — see "Honest tradeoffs" above; a minimal version is coming)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More hook integrations&lt;/strong&gt; beyond Claude Code (Codex CLI is already in, more agent CLIs being added)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Per-host theme overrides&lt;/strong&gt; so prod and dev &lt;em&gt;look&lt;/em&gt; different&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android version&lt;/strong&gt; — not soon, but on the long-term roadmap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try MT, the thing that helps me most right now is honest feedback. I read every review, every X reply, and every email. Tell me what's missing and I'll prioritize.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=04-mt-terminal-review-footer-cta" rel="noopener noreferrer"&gt;MT — Mosh Terminal on the App Store&lt;/a&gt; — $14.99 one-time, no subscription. Requires iOS 18 or later.&lt;/p&gt;




&lt;p&gt;*I'm a solo iOS developer. I write about gadgets and dev tools at &lt;a href="https://jaga-farm.com" rel="noopener noreferrer"&gt;jaga-farm.com&lt;/a&gt;. MT — Mosh Terminal is my first App Store release. Find me on X at &lt;a href="https://x.com/jaga_farm" rel="noopener noreferrer"&gt;@jaga_farm&lt;/a&gt;. If you want the personal-essay version of why I built this, &lt;a href="https://dev.to/jagafarm/i-couldnt-talk-to-claude-code-from-my-phone-so-i-shipped-my-own-terminal-3pia"&gt;I wrote one&lt;/a&gt; — link will go here once that post is up.&lt;/p&gt;

</description>
      <category>ios</category>
      <category>terminal</category>
      <category>claude</category>
      <category>showdev</category>
    </item>
    <item>
      <title>Reach your home Mac from anywhere with Tailscale (so Claude Code can come with you)</title>
      <dc:creator>Jaga</dc:creator>
      <pubDate>Mon, 20 Apr 2026 19:55:37 +0000</pubDate>
      <link>https://dev.to/jagafarm/reach-your-home-mac-from-anywhere-with-tailscale-so-claude-code-can-come-with-you-1077</link>
      <guid>https://dev.to/jagafarm/reach-your-home-mac-from-anywhere-with-tailscale-so-claude-code-can-come-with-you-1077</guid>
      <description>&lt;p&gt;If you've started running Claude Code or any other AI coding agent on a Mac at home, you've probably already had this thought: &lt;em&gt;"I should be able to talk to that machine from my phone."&lt;/em&gt; Then you tried to actually do it, and you ran into router config, dynamic DNS, port forwarding, and somewhere around the third firewall rule you closed the tab and went back to coding at your desk like a normal person.&lt;/p&gt;

&lt;p&gt;The good news is you don't have to do any of that anymore. Tailscale makes "reach my home Mac from anywhere" a ten-minute setup with no network knowledge required, and the free Personal plan covers everything an individual developer needs. This post is the version of that setup I wish I'd had when I started.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Tailscale actually is (without the marketing)
&lt;/h2&gt;

&lt;p&gt;Tailscale is a &lt;strong&gt;mesh VPN built on WireGuard&lt;/strong&gt;. The shortest possible explanation: install the same app on each of your devices, sign in with the same account, and they can all talk to each other directly over an encrypted connection, no matter what network they're on.&lt;/p&gt;

&lt;p&gt;Two things make this different from "regular" VPNs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Same IP, anywhere.&lt;/strong&gt; Each device gets a private IP in the &lt;code&gt;100.x.y.z&lt;/code&gt; range that never changes. Your home Mac's Tailscale IP at the cafe is the same as its Tailscale IP from your desk. You stop caring what network you're on.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct device-to-device traffic.&lt;/strong&gt; Your iPad doesn't route data through Tailscale's servers. Tailscale just helps the two devices find each other and hand-shake; the actual traffic goes peer-to-peer over WireGuard. It's fast and the company can't see your data.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A useful mental model: Tailscale is the matchmaker, not the post office. It introduces your devices to each other and then steps out of the room.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why WireGuard matters
&lt;/h3&gt;

&lt;p&gt;The encryption layer is &lt;strong&gt;WireGuard&lt;/strong&gt;, a relatively new VPN protocol that's "small, fast, and modern." Compared to OpenVPN or IPsec, WireGuard is a few thousand lines of code instead of a few hundred thousand, which means dramatically fewer places for bugs and exploits to hide. You don't have to think about it — Tailscale just uses it under the hood — but it's the reason the connection is both fast and trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pricing
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;th&gt;Devices&lt;/th&gt;
&lt;th&gt;Users&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Personal&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free&lt;/td&gt;
&lt;td&gt;Up to 100&lt;/td&gt;
&lt;td&gt;Up to 3&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Starter&lt;/td&gt;
&lt;td&gt;$5/user/month&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Premium&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;td&gt;Unlimited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For the use case in this post — connecting your own devices to each other — &lt;strong&gt;Personal is plenty.&lt;/strong&gt; I have been running on the free plan for over a year and have never bumped against a limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Install Tailscale on the Mac
&lt;/h2&gt;

&lt;p&gt;Go to &lt;a href="https://tailscale.com/download" rel="noopener noreferrer"&gt;tailscale.com/download&lt;/a&gt; and grab the &lt;strong&gt;Standalone variant&lt;/strong&gt; for macOS, not the Mac App Store version. The Standalone variant has fewer sandbox restrictions, which matters for some advanced features later.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the downloaded file and drag Tailscale into Applications.&lt;/li&gt;
&lt;li&gt;Launch it. A small Tailscale icon appears in your menu bar.&lt;/li&gt;
&lt;li&gt;Click the icon → &lt;strong&gt;Log in...&lt;/strong&gt;. A browser opens; sign in with Google, Apple, GitHub, or any other supported identity provider.&lt;/li&gt;
&lt;li&gt;macOS will ask permission to add a VPN configuration. Allow it.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When it finishes, click the menu bar icon again. You should see your Mac's Tailscale IP — something like &lt;code&gt;100.64.0.1&lt;/code&gt;. &lt;strong&gt;Write that down&lt;/strong&gt;, you'll use it in a minute. (You can always get it back later with &lt;code&gt;tailscale ip -4&lt;/code&gt; in a terminal.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install Tailscale on the iPad (or iPhone)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Open the App Store on the iPad and search for "Tailscale."&lt;/li&gt;
&lt;li&gt;Install it, open it, tap &lt;strong&gt;Get Started&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sign in with the same identity provider you used on the Mac.&lt;/strong&gt; This is the only step people get wrong. If you sign in with two different accounts, the devices end up in two different tailnets and can't see each other.&lt;/li&gt;
&lt;li&gt;Allow the VPN configuration when iOS asks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Once you're signed in, the Tailscale app will show a list of all your devices. You should see both your Mac and your iPad. If you do, the network half is done — they can now reach each other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Turn on Remote Login on the Mac
&lt;/h2&gt;

&lt;p&gt;Tailscale gets the two devices on the same private network, but that's not enough to actually SSH into the Mac. macOS ships with an SSH server built in but disabled by default. Turn it on:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;System Settings&lt;/strong&gt; → &lt;strong&gt;General&lt;/strong&gt; → &lt;strong&gt;Sharing&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Toggle &lt;strong&gt;Remote Login&lt;/strong&gt; on&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it. Your Mac is now accepting SSH connections from devices that can reach it — which, thanks to Tailscale, includes your iPad from anywhere in the world.&lt;/p&gt;

&lt;p&gt;While you're there, also check your Mac's username so you know what to type later. Easiest way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whatever it prints (e.g. &lt;code&gt;alex&lt;/code&gt;) is your username.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: SSH from the iPad to the Mac
&lt;/h2&gt;

&lt;p&gt;Open any iOS terminal app on the iPad. Many people start with &lt;a href="https://apps.apple.com/app/termius/id549039908" rel="noopener noreferrer"&gt;Termius&lt;/a&gt; or &lt;a href="https://apps.apple.com/app/prompt-3/id1594420480" rel="noopener noreferrer"&gt;Prompt 3&lt;/a&gt;, and there's also my own &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=03-tailscale-mid" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt; which I built specifically for this kind of mobile-to-home-Mac workflow. Any of them work for the basic SSH step below.&lt;/p&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;ssh&lt;/span&gt; alex@100.64.0.1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Substitute your username and your Mac's Tailscale IP.)&lt;/p&gt;

&lt;p&gt;The first time, it will ask if you trust the host fingerprint. Type &lt;code&gt;yes&lt;/code&gt;. Then enter your Mac's &lt;strong&gt;login password&lt;/strong&gt; (not your Apple ID — your local Mac password). You should now see your Mac's shell prompt on the iPad.&lt;/p&gt;

&lt;p&gt;Congratulations, you're now logged into your home Mac from a tablet that doesn't know what network it's on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: ditch the IP address with MagicDNS
&lt;/h2&gt;

&lt;p&gt;Memorizing &lt;code&gt;100.64.0.1&lt;/code&gt; is annoying. Tailscale has a feature called &lt;strong&gt;MagicDNS&lt;/strong&gt; that lets you use device names instead.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;a href="https://login.tailscale.com/admin/dns" rel="noopener noreferrer"&gt;Tailscale Admin Console&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Enable MagicDNS&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;After that:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ssh"&gt;&lt;code&gt;&lt;span class="k"&gt;ssh&lt;/span&gt; alex@mac-mini
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;works just as well as the IP version. The device name is whatever shows up in your Tailscale device list.&lt;/p&gt;

&lt;h2&gt;
  
  
  When it doesn't work
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Symptom&lt;/th&gt;
&lt;th&gt;What to check&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Connection timed out&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Is Tailscale on, on &lt;strong&gt;both&lt;/strong&gt; devices? Open the &lt;a href="https://login.tailscale.com/admin/machines" rel="noopener noreferrer"&gt;Admin Console&lt;/a&gt; and confirm both are "Connected."&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Permission denied (password)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;You're typing your Apple ID password, not your local Mac login password. Use the Mac one.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Connection refused&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Remote Login is off. Re-check System Settings → General → Sharing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Could not resolve hostname&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;MagicDNS isn't enabled, or you mistyped the device name. Use the IP directly to confirm, then debug DNS.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Works at home, not at the cafe&lt;/td&gt;
&lt;td&gt;Some restrictive captive-portal Wi-Fi blocks WireGuard's UDP ports. Tailscale automatically falls back to a relay (DERP), but if you see persistent issues, try tethering off your phone to confirm.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What this unlocks
&lt;/h2&gt;

&lt;p&gt;Once SSH-from-anywhere works, the entire "mobile AI coding" workflow opens up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start a long Claude Code task at home in the morning&lt;/li&gt;
&lt;li&gt;Detach the tmux session and walk out the door&lt;/li&gt;
&lt;li&gt;Re-attach from the iPad on the train, watch the agent's progress, answer its questions&lt;/li&gt;
&lt;li&gt;Get home, attach from the Mac again, pick up exactly where you left off&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first time it actually works it feels almost too easy. There's no port forwarding to undo, no router rule to maintain, no dynamic DNS account to renew. You just install one app on each device and they find each other.&lt;/p&gt;

&lt;p&gt;If you want the next pieces of this workflow, the rest of the series covers them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Keeping your remote sessions alive across disconnects → my &lt;strong&gt;tmux primer&lt;/strong&gt; (link will go here once it's published)&lt;/li&gt;
&lt;li&gt;Why mobile terminals are painful and what I did about it → &lt;strong&gt;MT — Mosh Terminal&lt;/strong&gt;, the iOS terminal I built for exactly this use case → &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=03-tailscale-footer" rel="noopener noreferrer"&gt;App Store&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;I'm a solo iOS developer. I write about gadgets and dev tools at &lt;a href="https://jaga-farm.com" rel="noopener noreferrer"&gt;jaga-farm.com&lt;/a&gt;. MT — Mosh Terminal is my first App Store release. Find me on X at &lt;a href="https://x.com/jaga_farm" rel="noopener noreferrer"&gt;@jaga_farm&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>networking</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>The 300-gram AI coding rig: iPad mini + Claude Code anywhere</title>
      <dc:creator>Jaga</dc:creator>
      <pubDate>Mon, 13 Apr 2026 21:15:13 +0000</pubDate>
      <link>https://dev.to/jagafarm/the-300-gram-ai-coding-rig-ipad-mini-claude-code-anywhere-e1o</link>
      <guid>https://dev.to/jagafarm/the-300-gram-ai-coding-rig-ipad-mini-claude-code-anywhere-e1o</guid>
      <description>&lt;p&gt;For the last two months, my daily Claude Code workstation has weighed about 300 grams.&lt;/p&gt;

&lt;p&gt;Not the laptop. Not the desk. The whole thing — tablet, keyboard, the whole rig that I actually use to send prompts to Claude Code, watch the agent work, and ship code from a coffee shop. It's an iPad mini A17 Pro and a folding split keyboard, and I'm increasingly convinced this is the right shape of "AI coding workstation" for anyone who already runs an agent on a real machine somewhere.&lt;/p&gt;

&lt;p&gt;I expected this to be a gimmick that I'd abandon after a week. It wasn't. So this post is the actual setup, the parts I use, and the one thing about iPad mini that I now consider a feature instead of a limitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "AI coding from a tablet" actually means
&lt;/h2&gt;

&lt;p&gt;Let me clear up the obvious confusion first: I am not writing Swift on an 8.3-inch screen. Nobody should do that.&lt;/p&gt;

&lt;p&gt;What I'm doing is much narrower:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code runs on a Mac mini at home.&lt;/strong&gt; That's where the codebase lives, that's where the agent has full filesystem and shell access, that's where the actual work happens.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The iPad mini is a remote control.&lt;/strong&gt; I SSH into the home Mac, attach to a long-running tmux session, type prompts in plain English, and watch Claude Code do its thing.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;My job is the prompt and the review.&lt;/strong&gt; I read the agent's plan, I approve or redirect, I check the diff. The iPad mini is the screen and keyboard for that conversation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you frame it that way — &lt;em&gt;typing intent and reading output&lt;/em&gt; — the screen size objection disappears. I'm not in a code editor. I'm in a terminal. Terminals scale down beautifully.&lt;/p&gt;

&lt;h2&gt;
  
  
  The exact rig
&lt;/h2&gt;

&lt;p&gt;Here's everything I carry:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Weight&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;iPad mini A17 Pro&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~293 g&lt;/td&gt;
&lt;td&gt;The screen and the brains for the prompt-and-review loop&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;strong&gt;Folding split keyboard&lt;/strong&gt; (I use a 40-key split board, but any Bluetooth board with Ctrl/Esc works)&lt;/td&gt;
&lt;td&gt;~200 g&lt;/td&gt;
&lt;td&gt;Real keys, real Ctrl, real Esc, no soft keyboard pain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;A small sleeve&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;negligible&lt;/td&gt;
&lt;td&gt;So I can throw it in any bag&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's it. No hub, no laptop bag, no power brick. Battery life is a full work day even with continuous SSH.&lt;/p&gt;

&lt;p&gt;The keyboard part matters more than people expect. &lt;strong&gt;Any iPad terminal experience without a real Ctrl key is going to make you miserable&lt;/strong&gt; — every shell command needs Ctrl-C, Ctrl-D, Ctrl-R, and the soft keyboard's modifier handling is nowhere near good enough. A cheap split board changes the entire experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The software side
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtbhb1i2ta2fjj0f9rcs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhtbhb1i2ta2fjj0f9rcs.png" alt=" " width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Four pieces:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://tailscale.com" rel="noopener noreferrer"&gt;Tailscale&lt;/a&gt;&lt;/strong&gt; — free for personal use. Lets the iPad mini reach my home Mac mini securely from anywhere, with no router config or port forwarding. I cover the install in my Tailscale post (link will go here once that one is published).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An iOS terminal app&lt;/strong&gt; — anything that does SSH and ideally Mosh. (More on this in a moment.)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;tmux&lt;/code&gt; on the Mac side&lt;/strong&gt; — so the Claude Code session keeps running even when my SSH connection drops. I have a four-command tmux primer if you've never used it.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code itself&lt;/strong&gt; — installed on the Mac, started inside the tmux session.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Home in the morning  →  ssh into Mac, tmux new -As work, claude
                     →  ask Claude Code to do the long task
                     →  Ctrl+b d (detach), close laptop, leave the house

On the train        →  ssh into Mac from iPad mini, tmux attach -t work
                    →  see exactly what Claude Code is doing
                    →  answer its questions, redirect, approve

Cafe                →  same thing, different network — tmux + Mosh keeps it alive
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once this loop is set up, the iPad mini becomes a &lt;em&gt;passive monitor&lt;/em&gt; for the agent. You're not even really "using" it most of the time. You give it a prompt, you go read a book, you come back when the notification fires.&lt;/p&gt;

&lt;h2&gt;
  
  
  The thing I didn't expect: the constraint is the feature
&lt;/h2&gt;

&lt;p&gt;Here's the part of this setup that surprised me.&lt;/p&gt;

&lt;p&gt;iPad mini is genuinely bad at multitasking. The 8.3-inch screen makes Stage Manager pointless. You can't really run a code editor and a terminal and a browser side-by-side. You do &lt;em&gt;one thing at a time.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I assumed this would be the dealbreaker. It turned out to be the killer feature.&lt;/p&gt;

&lt;p&gt;When my workstation is a MacBook with eight tabs open, I cannot stop context-switching. I check Slack, I check email, I look something up "real quick," I lose forty minutes. When my workstation is an iPad mini with literally no room for distraction, the loop is brutally simple: &lt;strong&gt;prompt the agent → put the device down → read a book → pick it up when something happens.&lt;/strong&gt; I get more deep work done in two hours of iPad mini time than in four hours at my desk.&lt;/p&gt;

&lt;p&gt;Single-tasking, when it's enforced by physics rather than willpower, is a productivity hack disguised as a hardware limitation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What about the terminal app?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01uqsstjy3gbneizqjv1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F01uqsstjy3gbneizqjv1.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the part I struggled with for a long time, and the part that eventually made me build my own.&lt;/p&gt;

&lt;p&gt;Most iOS terminals are fine for occasional SSH. They are &lt;em&gt;not&lt;/em&gt; fine for the rig I just described. The pain points stack up:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tap-tap-tap to switch tmux panes because the prefix key is hostile to touch&lt;/li&gt;
&lt;li&gt;SSH dies the moment you switch from Wi-Fi to LTE on the train, and you lose your scrollback&lt;/li&gt;
&lt;li&gt;No system-level notification when Claude Code is waiting on you, so you keep checking your phone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After about a year of duct-taping around all of this, I built &lt;strong&gt;&lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=02-ipad-mini-rig-mid" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt;&lt;/strong&gt; — a $14.99 one-time iOS terminal that has real Mosh (so the connection survives subway tunnels), one-tap tmux operations (no prefix-key juggling), and system push notifications wired into Claude Code Hooks (so the moment the agent needs me, my phone buzzes and a tap drops me back into the exact session). If the iPad mini rig sounds appealing but the terminal-app friction is what's stopping you, that's literally the reason MT exists. I'll write more about it in another post in this series; for now, just know it's there.&lt;/p&gt;

&lt;p&gt;You don't &lt;em&gt;have&lt;/em&gt; to use MT for any of this to work. Any terminal that can hold an SSH connection will get you started. The rig is the rig regardless.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who this setup is actually for
&lt;/h2&gt;

&lt;p&gt;Be honest with yourself before buying anything:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;You already use Claude Code (or Codex, or any agent CLI) on a Mac.&lt;/strong&gt; This setup is a remote control for a workflow you already have. It does not make sense as a starting point.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;You like the "give it a task, walk away, come back" rhythm.&lt;/strong&gt; If you need to be hands-on every keystroke, the iPad mini will frustrate you.&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;You travel, commute, or hate being chained to a desk.&lt;/strong&gt; Every hour I spend not at my main rig is an hour I'd otherwise lose.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;You want to write code by hand.&lt;/strong&gt; Get a real laptop.&lt;/li&gt;
&lt;li&gt;❌ &lt;strong&gt;You don't have a home Mac to SSH into.&lt;/strong&gt; Tailscale + Claude Code on a remote box (a cloud VM, a Raspberry Pi, anything) works too, but you do need &lt;em&gt;some&lt;/em&gt; always-on machine on the other end.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;The iPad mini AI coding rig is 300 grams of tablet, 200 grams of keyboard, four free or one-time-purchase pieces of software, and a workflow that turns "I need to step away from my Mac" from an interruption into a feature. After two months I have stopped reaching for my MacBook for anything that's just "talk to Claude Code for an hour."&lt;/p&gt;

&lt;p&gt;If this resonates and you want the mobile-terminal half of the story, → &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=02-ipad-mini-rig-footer" rel="noopener noreferrer"&gt;MT — Mosh Terminal on the App Store&lt;/a&gt;.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a solo iOS developer. I write about gadgets and dev tools at &lt;a href="https://jaga-farm.com" rel="noopener noreferrer"&gt;jaga-farm.com&lt;/a&gt;. MT — Mosh Terminal is my first App Store release. Find me on X at &lt;a href="https://x.com/jaga_farm" rel="noopener noreferrer"&gt;@jaga_farm&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>claude</category>
      <category>mobile</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Stop losing Claude Code sessions: a tmux primer for mobile devs</title>
      <dc:creator>Jaga</dc:creator>
      <pubDate>Sun, 12 Apr 2026 00:34:07 +0000</pubDate>
      <link>https://dev.to/jagafarm/stop-losing-claude-code-sessions-a-tmux-primer-for-mobile-devs-2p48</link>
      <guid>https://dev.to/jagafarm/stop-losing-claude-code-sessions-a-tmux-primer-for-mobile-devs-2p48</guid>
      <description>&lt;p&gt;You ask Claude Code to refactor a module. It says "this will take a few minutes." You close your laptop and head out for coffee. You come back, open the lid, and your SSH session is dead, your terminal is empty, and Claude Code never finished — because the moment your connection dropped, the agent that was running on your remote machine got killed along with it.&lt;/p&gt;

&lt;p&gt;If you've felt that exact frustration, the fix has existed for over a decade and it's called &lt;strong&gt;tmux&lt;/strong&gt;. This post is the shortest possible introduction I can write — four commands, one analogy, and a workflow that lets you walk away from your AI agent without losing its work.&lt;/p&gt;

&lt;h3&gt;
  
  
  What tmux actually does
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccua6n3t1ampf629u3bj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fccua6n3t1ampf629u3bj.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tmux&lt;/code&gt; (terminal multiplexer) is a small program that runs on your &lt;strong&gt;server or remote Mac&lt;/strong&gt; and keeps your terminal session alive even when you're not connected to it.&lt;/p&gt;

&lt;p&gt;The TV analogy is the easiest one I know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plain SSH is live broadcast.&lt;/strong&gt; If you leave the room, you miss it. If the cable goes out, the show is gone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tmux is recording.&lt;/strong&gt; The show keeps running on the box at home. When you come back, you reconnect and pick up exactly where you left off.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For Claude Code, this is the difference between "I asked it to do something big and lost an hour of work" and "I asked it to do something big and watched the result roll in from my phone three hours later." The agent doesn't care that you walked away. tmux is what makes that possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The three layers (skim this and move on)
&lt;/h2&gt;

&lt;p&gt;You don't need to memorize this. Just know these words exist:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Mental model&lt;/th&gt;
&lt;th&gt;What it is&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Session&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A desk&lt;/td&gt;
&lt;td&gt;Your workspace. You can have a "work" session and a "personal" session running side by side.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Window&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A browser tab&lt;/td&gt;
&lt;td&gt;Tabs inside a session. Switch with one key.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Pane&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A split view&lt;/td&gt;
&lt;td&gt;Splits inside a window. Useful on big screens, painful on phones.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For mobile work, &lt;strong&gt;one session, one or two windows, no panes&lt;/strong&gt; is all you need. Pane splits are nice on a 27-inch monitor and miserable on a 6-inch screen.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install it (one minute)
&lt;/h2&gt;

&lt;p&gt;tmux runs on the &lt;em&gt;server side&lt;/em&gt; — the machine you're SSH'ing into. You don't install anything on your phone or iPad. On a Mac:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# 1. Install Homebrew if you don't have it&lt;/span&gt;
/bin/bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;

&lt;span class="c"&gt;# 2. Install tmux&lt;/span&gt;
brew &lt;span class="nb"&gt;install &lt;/span&gt;tmux

&lt;span class="c"&gt;# 3. Verify&lt;/span&gt;
tmux &lt;span class="nt"&gt;-V&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see something like &lt;code&gt;tmux 3.6a&lt;/code&gt;, you're done.&lt;/p&gt;

&lt;p&gt;On Linux servers, replace step 2 with &lt;code&gt;sudo apt install tmux&lt;/code&gt; or &lt;code&gt;sudo dnf install tmux&lt;/code&gt; depending on your distro.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four commands you actually need
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvf498aj8quhisx95tps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flvf498aj8quhisx95tps.png" alt=" " width="800" height="1731"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I have been using tmux daily for years and I genuinely use &lt;strong&gt;one command 95% of the time&lt;/strong&gt;. Here are all four anyway, in increasing order of "I actually need this."&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Create a session
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;work&lt;/code&gt; is just a name. Pick anything. When tmux starts, you'll see a green status bar at the bottom of your terminal — that's how you know you're inside a tmux session.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Detach (leave the session running)
&lt;/h3&gt;

&lt;p&gt;While inside tmux, press:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Ctrl+b   then release   then press d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;Ctrl+b&lt;/code&gt; is called the &lt;strong&gt;prefix key&lt;/strong&gt;. You always press it, release it, then press a second key. &lt;code&gt;d&lt;/code&gt; is for "detach."&lt;/p&gt;

&lt;p&gt;You'll drop back to your normal shell prompt. The tmux session is still running in the background — your processes are still working, your scrollback is preserved, Claude Code is still doing its thing. You just stepped out of the room.&lt;/p&gt;

&lt;p&gt;You can now safely close your laptop, kill your SSH connection, lose your Wi-Fi, whatever. The session lives on the server.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Re-attach (come back to it)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Boom — you're back. Same screen, same scrollback, same running processes. If Claude Code finished while you were gone, you'll see its output waiting for you. If it's still running, you'll see it in real time.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. The one command I actually use
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux new &lt;span class="nt"&gt;-As&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-A&lt;/code&gt; flag means "&lt;strong&gt;a&lt;/strong&gt;ttach if a session named &lt;code&gt;work&lt;/code&gt; already exists, otherwise create a new one." This is the only tmux command I type. It's idempotent: it always puts me into the &lt;code&gt;work&lt;/code&gt; session, regardless of whether one was already there.&lt;/p&gt;

&lt;p&gt;If you only memorize one thing from this post, memorize that.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real-world workflow
&lt;/h2&gt;

&lt;p&gt;Here's how I actually use this with Claude Code on a normal day:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Morning, at home, on my Mac:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh me@myserver
tmux new &lt;span class="nt"&gt;-As&lt;/span&gt; work
claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I open Claude Code inside the tmux session and ask it to do something that'll take a while — refactor a service, write tests, audit a dependency. Then I close my laptop and leave for the train.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On the train, on my phone or iPad:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh me@myserver
tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I see exactly the screen Claude Code was looking at when I left. If it's still working, I can watch the progress. If it's finished and waiting on input, I can answer right there. If I need to think about something, I &lt;code&gt;Ctrl+b d&lt;/code&gt; to detach again and the session keeps running while I read a book.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Evening, back at the Mac:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Same session, same context. I never lost a thing.&lt;/p&gt;

&lt;p&gt;This pattern — start a long-running agent task on one device, monitor and approve from another — is the killer use case for AI coding agents on mobile. tmux is what makes it work.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small gotcha when switching devices
&lt;/h2&gt;

&lt;p&gt;If you attach from your phone while your Mac is also still attached to the same session, tmux will resize the display to the smaller screen. Annoying. The fix:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux attach &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;-t&lt;/span&gt; work
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;-d&lt;/code&gt; flag detaches whoever was previously attached, so only your current device sees the session. I use this constantly when bouncing between Mac and iPad.&lt;/p&gt;

&lt;h2&gt;
  
  
  Common keys (for after you're comfortable)
&lt;/h2&gt;

&lt;p&gt;All tmux commands start with &lt;code&gt;Ctrl+b&lt;/code&gt;, then a second key. Press them in sequence, not together.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What you want&lt;/th&gt;
&lt;th&gt;Keys&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Detach&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;d&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List sessions&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;s&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;New window&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;c&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Next window&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;n&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List windows&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;w&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Help&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;?&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;For a phone or small tablet, I'd skip pane splitting entirely and just use &lt;strong&gt;windows&lt;/strong&gt;. Two windows — one for Claude Code, one for &lt;code&gt;git status&lt;/code&gt; and file pokes — is enough for almost everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this falls apart on mobile (and what to do about it)
&lt;/h2&gt;

&lt;p&gt;Honest take: tmux's prefix-key model is great on a real keyboard and frustrating on a touchscreen. Tapping &lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;n&lt;/code&gt; on a soft keyboard means hunting for the &lt;code&gt;Ctrl&lt;/code&gt; key, then the &lt;code&gt;b&lt;/code&gt;, then the &lt;code&gt;n&lt;/code&gt;, every single time you want to switch windows. After about ten of those, you start questioning your life choices.&lt;/p&gt;

&lt;p&gt;This is exactly the problem I ran into when I started doing serious AI agent work from my phone. I ended up building &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=01-tmux-primer-mid" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt;, a $14.99 one-time iOS terminal whose entire bottom action bar is just one-tap tmux operations — split, switch, detach, the works — so the prefix-key gymnastics disappear on mobile. It also gets a system push notification the moment Claude Code needs you, so you don't have to keep checking. I'll write more about that in a later post; for now just know that the option exists if mobile tmux ever drives you up a wall.&lt;/p&gt;

&lt;p&gt;You don't need any of that to make tmux work, though. The four commands above are the whole game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wrap-up
&lt;/h2&gt;

&lt;p&gt;tmux is a "recording device" for your terminal. Once your sessions live on the server and not on your local connection, the question of "what happens if my laptop sleeps while Claude Code is working" stops being scary.&lt;/p&gt;

&lt;p&gt;The cheat sheet you actually need:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Action&lt;/th&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Start (or rejoin)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tmux new -As work&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step out&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+b&lt;/code&gt; then &lt;code&gt;d&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Come back&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tmux attach -t work&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Steal session from another device&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tmux attach -d -t work&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That's it. Try it once tonight: open a tmux session on your dev box, run a long task inside it, close your laptop, and reconnect from your phone an hour later. The first time it works you'll wonder how you ever lived without it.&lt;/p&gt;

&lt;p&gt;→ If you want the mobile side of this story, the app I built for it is &lt;a href="https://apps.apple.com/app/mt-mosh-terminal/id6760889044?utm_source=devto&amp;amp;utm_medium=article&amp;amp;utm_campaign=phase-c-en&amp;amp;utm_content=01-tmux-primer-footer" rel="noopener noreferrer"&gt;MT — Mosh Terminal&lt;/a&gt; on the App Store.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;I'm a solo iOS developer. I write about gadgets and dev tools at &lt;a href="https://jaga-farm.com" rel="noopener noreferrer"&gt;jaga-farm.com&lt;/a&gt;. MT — Mosh Terminal is my first App Store release. Find me on X at &lt;a href="https://x.com/jaga_farm" rel="noopener noreferrer"&gt;@jaga_farm&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>claude</category>
      <category>cli</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
