<?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: Elvis</title>
    <description>The latest articles on DEV Community by Elvis (@elvis_05f76cf8425324).</description>
    <link>https://dev.to/elvis_05f76cf8425324</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%2F4207906%2F66967f06-b455-49e3-80dd-35163e4a5784.jpg</url>
      <title>DEV Community: Elvis</title>
      <link>https://dev.to/elvis_05f76cf8425324</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/elvis_05f76cf8425324"/>
    <language>en</language>
    <item>
      <title>Why Your iPhone SSH Client Should Be Native (Not a Web Wrapper)</title>
      <dc:creator>Elvis</dc:creator>
      <pubDate>Mon, 26 Oct 2026 06:53:07 +0000</pubDate>
      <link>https://dev.to/elvis_05f76cf8425324/why-your-iphone-ssh-client-should-be-native-not-a-web-wrapper-5gae</link>
      <guid>https://dev.to/elvis_05f76cf8425324/why-your-iphone-ssh-client-should-be-native-not-a-web-wrapper-5gae</guid>
      <description>&lt;p&gt;I was halfway through dinner when a deploy alert hit Slack.&lt;/p&gt;

&lt;p&gt;The fix was trivial — restart a systemd unit, tail the logs, confirm the queue drained. But my laptop was at home, and I was on my phone. Not "check a dashboard" on my phone. A &lt;strong&gt;real shell&lt;/strong&gt; on my phone.&lt;/p&gt;

&lt;p&gt;If you've tried mobile SSH, you know the gap between "technically connected" and "actually usable" is enormous. After building &lt;strong&gt;&lt;a href="https://lakesnowtech.com/lxterm/" rel="noopener noreferrer"&gt;LxTerm&lt;/a&gt;&lt;/strong&gt; — a SwiftUI-native SSH client for iPhone and iPad — here's what I learned about why the implementation stack matters more than most people expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  The mobile SSH problem nobody warns you about
&lt;/h2&gt;

&lt;p&gt;Desktop SSH clients hide a lot of complexity. You get a full keyboard, predictable modifier keys, and a terminal emulator that has had decades to mature.&lt;/p&gt;

&lt;p&gt;On iPhone, you inherit three hard constraints at once:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;No physical Ctrl / Esc / arrow keys&lt;/strong&gt; — interactive tools assume you have them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Spotty networks&lt;/strong&gt; — tunnels drop mid-command; sessions need keep-alive and sane reconnect behavior.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Security expectations&lt;/strong&gt; — you're storing production credentials on a pocket device. Plain-text config files are not acceptable.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A login screen that accepts &lt;code&gt;user@host&lt;/code&gt; is the easy part. The hard part is surviving &lt;code&gt;vim&lt;/code&gt;, &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;less&lt;/code&gt;, and an impromptu &lt;code&gt;journalctl -f&lt;/code&gt; without throwing your phone across the room.&lt;/p&gt;

&lt;h2&gt;
  
  
  Web wrappers vs native clients
&lt;/h2&gt;

&lt;p&gt;Many mobile SSH apps — and plenty of "terminal in the browser" setups — ultimately wrap a web stack: HTML canvas, JavaScript terminal emulators, WebSocket bridges, or embedded WebViews.&lt;/p&gt;

&lt;p&gt;That can work for quick one-liners. It often falls apart for daily driver use:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Concern&lt;/th&gt;
&lt;th&gt;Web-style wrapper&lt;/th&gt;
&lt;th&gt;Native terminal app&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input latency&lt;/td&gt;
&lt;td&gt;Extra layers between key events and PTY&lt;/td&gt;
&lt;td&gt;Direct event path to shell&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Modifier keys&lt;/td&gt;
&lt;td&gt;Simulated; easy to miss chords&lt;/td&gt;
&lt;td&gt;Dedicated on-screen control bar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Color / PTY features&lt;/td&gt;
&lt;td&gt;Depends on emulator fidelity&lt;/td&gt;
&lt;td&gt;Full PTY + &lt;code&gt;xterm-256color&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Background behavior&lt;/td&gt;
&lt;td&gt;Browser tabs suspend unpredictably&lt;/td&gt;
&lt;td&gt;App lifecycle tuned for sessions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential storage&lt;/td&gt;
&lt;td&gt;Varies; often synced to vendor cloud&lt;/td&gt;
&lt;td&gt;Stored locally inside the app on your device&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;I'm not saying web terminals are useless. For read-only log tailing inside an existing web admin panel, they're fine.&lt;/p&gt;

&lt;p&gt;But when &lt;strong&gt;you&lt;/strong&gt; are the operator — editing nginx configs, restarting Docker containers, debugging a stuck migration — you want the terminal to feel like an extension of the device, not a mini browser pretending to be one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What "works on mobile" actually requires
&lt;/h2&gt;

&lt;p&gt;These are the features I now treat as non-negotiable. If your client is missing more than one, you'll feel it within a week.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Real PTY, not a fake shell
&lt;/h3&gt;

&lt;p&gt;Interactive programs need a pseudo-terminal. Without it, you get broken pagers, no job control, and cursed &lt;code&gt;sudo&lt;/code&gt; behavior.&lt;/p&gt;

&lt;p&gt;LxTerm opens a proper PTY session with &lt;code&gt;xterm-256color&lt;/code&gt; support — enough for colored &lt;code&gt;htop&lt;/code&gt;, &lt;code&gt;vim&lt;/code&gt; syntax highlighting, and tools that probe &lt;code&gt;$TERM&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Control keys you can hit without gymnastics
&lt;/h3&gt;

&lt;p&gt;The iOS software keyboard was not designed for terminal power users. A good client adds an accessory row for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ctrl+C / Ctrl+D / Ctrl+Z&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Esc, Tab, arrows&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Quick actions: copy output, clear screen, font size&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This sounds minor until you're trying to exit &lt;code&gt;vim&lt;/code&gt; on a train.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Auth that matches how servers actually are
&lt;/h3&gt;

&lt;p&gt;Password auth is table stakes. &lt;strong&gt;Private key login&lt;/strong&gt; matters too — many servers disable password auth entirely, and a mobile client that only handles passwords will leave you stuck at the login prompt.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Connection hygiene
&lt;/h3&gt;

&lt;p&gt;Mobile networks lie. Look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TCP keep-alive / SSH keep-alive pings&lt;/li&gt;
&lt;li&gt;Auto-reconnect when you switch Wi‑Fi ↔ cellular&lt;/li&gt;
&lt;li&gt;Configurable session timeout (security vs convenience)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Trust on first use (TOFU) fingerprinting
&lt;/h3&gt;

&lt;p&gt;If a server's host key changes, &lt;strong&gt;stop&lt;/strong&gt;. Don't silently connect. TOFU verification is the right default when you're touching prod from a phone.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Credentials that stay on your device
&lt;/h3&gt;

&lt;p&gt;Saved passwords and connection profiles stay &lt;strong&gt;on your iPhone or iPad&lt;/strong&gt; — not uploaded to our servers. SSH traffic goes directly to your server — no proxy, no session logging through a third-party relay.&lt;/p&gt;

&lt;p&gt;We also don't collect your data: &lt;a href="https://lakesnowtech.com/lxterm/" rel="noopener noreferrer"&gt;no analytics on terminal content, no credential sync, no usage tracking&lt;/a&gt;. What you type in the shell stays between you and the server you're connected to.&lt;/p&gt;

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

&lt;p&gt;In practice, we see four recurring personas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Developers&lt;/strong&gt; — deploy, tail logs, restart services without opening a laptop bag.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sysadmins / DevOps&lt;/strong&gt; — manage VPS instances and homelab boxes with organized favorites.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;On-call responders&lt;/strong&gt; — SSH into staging or prod when alerts fire away from desk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Homelab tinkerers&lt;/strong&gt; — Raspberry Pi, NAS, Linux desktop — star the hosts you touch daily.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you only SSH twice a year, any client is probably fine. If your phone is the &lt;strong&gt;second screen&lt;/strong&gt; for infrastructure, the stack choice compounds.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building native was the point
&lt;/h2&gt;

&lt;p&gt;LxTerm is SwiftUI-native on iOS 18+ for a reason: terminal UX is input, haptics, and lifecycle all at once.&lt;/p&gt;

&lt;p&gt;Native code doesn't magically make SSH secure — you still need good key hygiene and MFA on the server side. But it &lt;strong&gt;does&lt;/strong&gt; remove an entire class of "works on desktop web, janky on mobile Safari" problems.&lt;/p&gt;

&lt;p&gt;We also leaned into quality-of-life details that only make sense on-device:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unlimited saved connections with search and favorites&lt;/li&gt;
&lt;li&gt;Themes: Dark, Light, Solarized Dark, Monokai&lt;/li&gt;
&lt;li&gt;Font switching (monospace / sans / serif)&lt;/li&gt;
&lt;li&gt;Haptic feedback on connect and errors&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of that is flashy in a feature list. Together, it's the difference between "I &lt;em&gt;can&lt;/em&gt; SSH from my phone" and "I &lt;em&gt;choose&lt;/em&gt; to."&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If mobile SSH is part of your workflow, compare your current client against the checklist above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://apps.apple.com/us/app/lxterm/id6742640756" rel="noopener noreferrer"&gt;LxTerm on the App Store&lt;/a&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;a href="https://lakesnowtech.com/lxterm/" rel="noopener noreferrer"&gt;Product page &amp;amp; privacy details&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requirements: iPhone or iPad on iOS/iPadOS 18.0+.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Disclosure: I'm part of the team that builds LxTerm at &lt;a href="https://lakesnowtech.com/" rel="noopener noreferrer"&gt;LAKESNOWTECH&lt;/a&gt;. This post focuses on mobile terminal design tradeoffs we've run into while shipping it — hopefully useful even if you use a different client.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>ssh</category>
      <category>mobile</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
