<?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: Kavan Chan</title>
    <description>The latest articles on DEV Community by Kavan Chan (@kavan_chan_769fdc127a7c76).</description>
    <link>https://dev.to/kavan_chan_769fdc127a7c76</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3895020%2F62420a33-6787-48f6-8fa4-4f6ee6d600c5.png</url>
      <title>DEV Community: Kavan Chan</title>
      <link>https://dev.to/kavan_chan_769fdc127a7c76</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/kavan_chan_769fdc127a7c76"/>
    <language>en</language>
    <item>
      <title>I Built tmuxhop So I Could Keep Coding From the Toilet</title>
      <dc:creator>Kavan Chan</dc:creator>
      <pubDate>Sat, 25 Apr 2026 07:44:03 +0000</pubDate>
      <link>https://dev.to/kavan_chan_769fdc127a7c76/i-built-tmuxhop-so-i-could-keep-coding-from-the-toilet-45dj</link>
      <guid>https://dev.to/kavan_chan_769fdc127a7c76/i-built-tmuxhop-so-i-could-keep-coding-from-the-toilet-45dj</guid>
      <description>&lt;p&gt;&lt;em&gt;A small local-first browser tool for hopping back into the same tmux session from your phone.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I didn’t build tmuxhop because I needed full remote access.&lt;/p&gt;

&lt;p&gt;I built it because I was deep in a coding flow, had to step away from my desk for a few minutes, and didn’t want that flow to break.&lt;/p&gt;

&lt;p&gt;Sometimes that means food. Sometimes that means taking a short break. Sometimes that means going to the toilet.&lt;/p&gt;

&lt;p&gt;If you spend enough time vibe coding, you probably know the feeling: your terminal, editor, prompts, agent output, and half-finished thoughts are all lined up perfectly. You do &lt;strong&gt;not&lt;/strong&gt; want to lose that state just because life interrupts for ten minutes.&lt;/p&gt;

&lt;p&gt;My phone was already in my pocket. I just wanted the same session, on another screen, with as little friction as possible.&lt;/p&gt;

&lt;p&gt;That is why I built &lt;strong&gt;tmuxhop&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real problem was not remote access
&lt;/h2&gt;

&lt;p&gt;At first glance, this sounds like a remote terminal problem.&lt;/p&gt;

&lt;p&gt;But for me, it wasn’t.&lt;/p&gt;

&lt;p&gt;There are already plenty of ways to SSH into a machine from a phone. Some of them are good. Some have mobile apps. Some support more features than tmuxhop probably ever will.&lt;/p&gt;

&lt;p&gt;The problem was the &lt;strong&gt;friction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;For a short desk-to-phone hop, the usual setup felt too heavy:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;install a phone app&lt;/li&gt;
&lt;li&gt;configure SSH&lt;/li&gt;
&lt;li&gt;manage keys&lt;/li&gt;
&lt;li&gt;deal with client-specific setup&lt;/li&gt;
&lt;li&gt;think about security hardening&lt;/li&gt;
&lt;li&gt;then finally reconnect to the machine&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That is all reasonable if your goal is “serious mobile remote access.”&lt;/p&gt;

&lt;p&gt;That was not my goal.&lt;/p&gt;

&lt;p&gt;My goal was much simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I want to continue the same tmux session from my phone, immediately, in a browser.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changes the product a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I actually wanted
&lt;/h2&gt;

&lt;p&gt;I wanted something that felt like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;I am coding on my desktop&lt;/li&gt;
&lt;li&gt;my work is already inside &lt;code&gt;tmux&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;I need to get up for a bit&lt;/li&gt;
&lt;li&gt;I open my phone&lt;/li&gt;
&lt;li&gt;I open a browser&lt;/li&gt;
&lt;li&gt;I land in the same session&lt;/li&gt;
&lt;li&gt;I continue telling the AI what to do&lt;/li&gt;
&lt;li&gt;I stay in flow&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That was the whole idea.&lt;/p&gt;

&lt;p&gt;Not a full remote desktop. Not a secure internet-facing shell service. Not a general-purpose mobile terminal platform.&lt;/p&gt;

&lt;p&gt;Just a &lt;strong&gt;fast continuation path&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That “continue easily” part became the real product idea.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why tmux made this possible
&lt;/h2&gt;

&lt;p&gt;The key insight was that I was already using &lt;code&gt;tmux&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That meant I didn’t need to invent session persistence. I didn’t need to sync shell history. I didn’t need to make mobile and desktop behave like separate environments.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;tmux&lt;/code&gt; was already doing the important part: keeping the session alive.&lt;/p&gt;

&lt;p&gt;So tmuxhop only needed to do one job:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;expose that existing tmux session in a phone-friendly browser UI.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is why the name made sense to me:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;tmux&lt;/code&gt; = the session continuity layer&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;hop&lt;/code&gt; = jump to another device and keep going&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The tradeoff I chose on purpose
&lt;/h2&gt;

&lt;p&gt;I made tmuxhop &lt;strong&gt;local-first&lt;/strong&gt; on purpose.&lt;/p&gt;

&lt;p&gt;That means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;no built-in auth&lt;/li&gt;
&lt;li&gt;no public internet story&lt;/li&gt;
&lt;li&gt;no “secure your shell for the world” pitch&lt;/li&gt;
&lt;li&gt;intended for same machine, LAN, or VPN only&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some people will look at that and say it is too limited.&lt;/p&gt;

&lt;p&gt;That is fair.&lt;/p&gt;

&lt;p&gt;But the limitation is also what keeps the product simple.&lt;/p&gt;

&lt;p&gt;If I had tried to solve “mobile terminal access from anywhere securely,” I would have built a very different tool. The complexity would go up fast. The setup would get heavier. The product would become more about infrastructure than continuity.&lt;/p&gt;

&lt;p&gt;I did not want that.&lt;/p&gt;

&lt;p&gt;I wanted:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;open browser&lt;/li&gt;
&lt;li&gt;same session&lt;/li&gt;
&lt;li&gt;keep going&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes a product gets better by &lt;strong&gt;not&lt;/strong&gt; trying to solve the bigger problem.&lt;/p&gt;

&lt;h2&gt;
  
  
  What tmuxhop optimizes for
&lt;/h2&gt;

&lt;p&gt;tmuxhop is optimized for a very specific workflow:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you already live in the terminal&lt;/li&gt;
&lt;li&gt;you already use &lt;code&gt;tmux&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;you are often working with agents or long-running coding sessions&lt;/li&gt;
&lt;li&gt;you do not want to lose context during short interruptions&lt;/li&gt;
&lt;li&gt;you care more about continuity than perfect mobile-native terminal features&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is not optimized for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;internet-facing access&lt;/li&gt;
&lt;li&gt;multi-user collaboration&lt;/li&gt;
&lt;li&gt;replacing desktop terminal tools&lt;/li&gt;
&lt;li&gt;being a full remote ops platform&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That focus helped a lot.&lt;/p&gt;

&lt;p&gt;The more I worked on it, the clearer it became that tmuxhop is not really a “mobile terminal app.”&lt;/p&gt;

&lt;p&gt;It is a &lt;strong&gt;flow continuity tool&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building it also reminded me how rough mobile terminal UX is
&lt;/h2&gt;

&lt;p&gt;A normal desktop terminal is easy to take for granted.&lt;/p&gt;

&lt;p&gt;A mobile browser terminal is not.&lt;/p&gt;

&lt;p&gt;Once I started building tmuxhop, I ran into a lot of weird details:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;font rendering&lt;/li&gt;
&lt;li&gt;Nerd Font support&lt;/li&gt;
&lt;li&gt;terminal sizing across laptop and phone&lt;/li&gt;
&lt;li&gt;keyboard pop-up behavior&lt;/li&gt;
&lt;li&gt;viewport scrolling&lt;/li&gt;
&lt;li&gt;control placement on small screens&lt;/li&gt;
&lt;li&gt;the awkwardness of text input inside mobile browser terminals&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A lot of the work was not glamorous. It was small UX friction everywhere.&lt;/p&gt;

&lt;p&gt;That also changed how I think about developer tools.&lt;/p&gt;

&lt;p&gt;The core idea can be simple and correct, but if the interaction details are annoying, the tool still feels broken. Especially on mobile.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who I think this is for
&lt;/h2&gt;

&lt;p&gt;If you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;code in the terminal a lot&lt;/li&gt;
&lt;li&gt;keep your work in &lt;code&gt;tmux&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;use AI tools heavily&lt;/li&gt;
&lt;li&gt;work in bursts of deep focus&lt;/li&gt;
&lt;li&gt;hate losing context during short breaks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;then tmuxhop might make sense to you too.&lt;/p&gt;

&lt;p&gt;If you need a hardened remote shell product, it probably does not.&lt;/p&gt;

&lt;p&gt;And that is fine.&lt;/p&gt;

&lt;p&gt;I think it is good for tools to know what they are &lt;strong&gt;for&lt;/strong&gt;, and what they are &lt;strong&gt;not for&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;I like building tools that remove tiny amounts of friction from real life.&lt;/p&gt;

&lt;p&gt;tmuxhop is one of those tools.&lt;/p&gt;

&lt;p&gt;It is not trying to be the biggest or most complete solution. It is just trying to solve one specific problem well:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;keep the same coding flow alive when you have to step away from your desk.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If that sounds familiar, you can check it out here, appreciated if you can leave a star:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/AgenticBridge/tmuxhop" rel="noopener noreferrer"&gt;tmuxhop on GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>mobile</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
