<?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: Theory</title>
    <description>The latest articles on DEV Community by Theory (@luminosityfc).</description>
    <link>https://dev.to/luminosityfc</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%2F4197052%2Ffdd3b238-004f-46a3-b1e2-2f494dae027f.png</url>
      <title>DEV Community: Theory</title>
      <link>https://dev.to/luminosityfc</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/luminosityfc"/>
    <language>en</language>
    <item>
      <title>Any Agent, Any Model: Run Your AI Coding Setup From an iPhone</title>
      <dc:creator>Theory</dc:creator>
      <pubDate>Thu, 22 Oct 2026 13:20:37 +0000</pubDate>
      <link>https://dev.to/luminosityfc/any-agent-any-model-run-your-ai-coding-setup-from-an-iphone-23l8</link>
      <guid>https://dev.to/luminosityfc/any-agent-any-model-run-your-ai-coding-setup-from-an-iphone-23l8</guid>
      <description>&lt;h1&gt;
  
  
  Any Agent, Any Model: Run Your AI Coding Setup From an iPhone
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Mission
&lt;/h2&gt;

&lt;p&gt;Run an AI coding agent from your iPhone using a cloud server. No laptop needed. Full terminal, full power, accessible from anywhere — the jobsite, the truck, home.&lt;/p&gt;

&lt;p&gt;This is the vendor-neutral version of the pattern. I first wrote it up as a Claude Code guide, and Claude Code is still one of the examples below — but the setup itself doesn't belong to any one tool. The pieces are boring on purpose: a small cloud server is the computer, your phone is just the window into it, and your sessions live on the server so they survive every disconnect. Pick the agent you like, pick the model you like. The plumbing is the same.&lt;/p&gt;

&lt;p&gt;The examples below use four real harnesses — Claude Code, OpenAI's Codex CLI, Google's Gemini CLI, and Aider — because they're the ones with public, documented install routes. The steps are written pattern-first: do the step generically, then take your harness's version of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You'll Have When Done
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A cloud server (a DigitalOcean droplet in NYC) that stays on when your phone doesn't&lt;/li&gt;
&lt;li&gt;An AI coding agent installed and authenticated — your pick of harness and model&lt;/li&gt;
&lt;li&gt;SSH access from your iPhone via Termius&lt;/li&gt;
&lt;li&gt;Browser-based terminal access (optional)&lt;/li&gt;
&lt;li&gt;Persistent sessions that survive disconnects&lt;/li&gt;
&lt;li&gt;MCP browser tools so your agent can browse the web&lt;/li&gt;
&lt;li&gt;A standing context file, so your agent already knows your work when a session starts&lt;/li&gt;
&lt;li&gt;Your codebase cloned and ready to build&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total monthly cost:&lt;/strong&gt; ~$6–36/mo for most people (server + one agent subscription, or pay-per-use API credit). It can run lower — even $0 for the model itself — if you go the local-model route in Part 5.&lt;br&gt;
&lt;strong&gt;First 2 months:&lt;/strong&gt; The droplet is free via the $200 DigitalOcean signup credit.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 1: Choose Your Cloud Server
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Why You Need a Cloud Server
&lt;/h3&gt;

&lt;p&gt;AI coding agents require a real Linux environment with process spawning, filesystem access, and streaming API calls. iOS is sandboxed and can't run them natively. The workaround is the whole idea: install the agent on a remote server and SSH in from your phone.&lt;/p&gt;
&lt;h3&gt;
  
  
  Provider Comparison
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Cheapest Useful Plan&lt;/th&gt;
&lt;th&gt;US Datacenter&lt;/th&gt;
&lt;th&gt;Best For&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;DigitalOcean&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$6/mo (1 vCPU, 1GB, 25GB SSD)&lt;/td&gt;
&lt;td&gt;NYC, SF, Atlanta&lt;/td&gt;
&lt;td&gt;Simplest UI, $200 free credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Vultr&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$6/mo (1 vCPU, 1GB, 25GB NVMe)&lt;/td&gt;
&lt;td&gt;NJ, NY, Atlanta, Miami&lt;/td&gt;
&lt;td&gt;NVMe storage, more US locations&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hetzner&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~$4/mo (2 vCPU, 4GB, 40GB NVMe)&lt;/td&gt;
&lt;td&gt;EU only (cheapest tier)&lt;/td&gt;
&lt;td&gt;Best specs per dollar, but higher latency from US&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;GitHub Codespaces&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Free (120 core-hours/mo)&lt;/td&gt;
&lt;td&gt;N/A (cloud)&lt;/td&gt;
&lt;td&gt;Zero cost, but limited hours&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Recommended:&lt;/strong&gt; DigitalOcean — simplest setup, $200 free credit covers 12+ months of a $16/mo droplet, NYC datacenter gives low latency from the US East Coast.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 2: Create the DigitalOcean Droplet
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: Sign Up
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;digitalocean.com&lt;/strong&gt; (not the sponsored Google results — scroll past the ads)&lt;/li&gt;
&lt;li&gt;Create an account&lt;/li&gt;
&lt;li&gt;Claim the &lt;strong&gt;$200 free credit&lt;/strong&gt; (60-day trial)&lt;/li&gt;
&lt;li&gt;Add a payment method (required to activate, won't be charged until credit runs out)&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step 2: Create Droplet
&lt;/h3&gt;

&lt;p&gt;On the "Create Droplets" page, configure:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Region&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;New York — NYC1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Image&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Ubuntu 24.04 (LTS) x64&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Droplet Type&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Shared CPU → Basic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU Options&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Premium Intel (NVMe SSD)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;$16/mo — 2 vCPU, 2GB RAM, 70GB NVMe, 2TB transfer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Authentication&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SSH Key (not password — see Part 3)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backups&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skip (your code lives in Git)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Monitoring&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Check the free monitoring box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Managed Database&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Skip the $15/mo add-on&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Hostname&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Something memorable like &lt;code&gt;tradestack-dev&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  What NOT to Select
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Don't pick the $32/mo plan (overkill for a dev terminal box)&lt;/li&gt;
&lt;li&gt;Don't use password authentication (SSH keys are more secure and easier from Termius)&lt;/li&gt;
&lt;li&gt;Don't add the managed database (you'll install PostgreSQL directly on the droplet)&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Part 3: Set Up Termius on iPhone
&lt;/h2&gt;

&lt;p&gt;Termius is the SSH client you'll use to connect to your droplet from your phone. It doesn't care which agent runs on the other end — it's just the door.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 1: Install Termius
&lt;/h3&gt;

&lt;p&gt;Download &lt;strong&gt;Termius&lt;/strong&gt; from the App Store (free tier works fine).&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: Generate an SSH Key
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open Termius → tap &lt;strong&gt;Vaults&lt;/strong&gt; tab (bottom left)&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Keychain&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Tap the &lt;strong&gt;+&lt;/strong&gt; button → &lt;strong&gt;Generate Key&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Name it something like &lt;code&gt;tradestack-do&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Leave defaults (ED25519 or RSA) → tap &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step 3: Copy the Public Key to DigitalOcean
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Tap the key you just created&lt;/li&gt;
&lt;li&gt;Tap &lt;strong&gt;Export to Clipboard&lt;/strong&gt; (copy the public key)&lt;/li&gt;
&lt;li&gt;Go back to the DigitalOcean droplet creation page in Safari&lt;/li&gt;
&lt;li&gt;Under "Authentication" → select &lt;strong&gt;SSH Key&lt;/strong&gt; → paste your public key&lt;/li&gt;
&lt;li&gt;Finish creating the droplet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Copy the IP address&lt;/strong&gt; DigitalOcean gives you&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step 4: Add Your Droplet as a Host
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In Termius → tap &lt;strong&gt;Hosts&lt;/strong&gt; → tap &lt;strong&gt;+&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Fill in:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hostname:&lt;/strong&gt; your droplet IP address&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;root&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SSH Key:&lt;/strong&gt; select the key you generated (&lt;code&gt;tradestack-do&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Leave Password blank&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Tap the &lt;strong&gt;blue checkmark&lt;/strong&gt; to save&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;
  
  
  Step 5: Connect
&lt;/h3&gt;

&lt;p&gt;Tap the host to SSH in. You should see a &lt;code&gt;root@your-hostname:~#&lt;/code&gt; prompt.&lt;/p&gt;


&lt;h2&gt;
  
  
  Part 4: Server Setup + Install Your Agent
&lt;/h2&gt;

&lt;p&gt;Once you're SSH'd into your droplet, set up a persistent session first so you don't lose progress if your phone disconnects:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; apt upgrade &lt;span class="nt"&gt;-y&lt;/span&gt;
apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; tmux git curl wget htop unzip build-essential
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Node.js 20
&lt;/h3&gt;

&lt;p&gt;Some agents install themselves without Node (Claude Code's native installer, for one), but several harnesses ship as npm packages, and you'll want Node for your own projects either way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://deb.nodesource.com/setup_20.x | bash -
apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; nodejs
node &lt;span class="nt"&gt;-v&lt;/span&gt;  &lt;span class="c"&gt;# Should show v20.x&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Install Your Agent
&lt;/h3&gt;

&lt;p&gt;The step is the same everywhere: install the harness on the server, verify it runs, fix the PATH if the shell can't find it. Take your pick — install one, or install two and compare; they coexist fine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; (Anthropic) — native installer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://claude.ai/install.sh | bash
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.local/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
claude &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Codex CLI&lt;/strong&gt; (OpenAI) — npm package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @openai/codex
codex &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Gemini CLI&lt;/strong&gt; (Google) — npm package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @google/gemini-cli
gemini &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Aider&lt;/strong&gt; (open source, model-flexible) — Python:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; pip &lt;span class="nb"&gt;install &lt;/span&gt;aider-install
aider &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(&lt;code&gt;pip install aider-chat&lt;/code&gt; is the other documented route to the same tool.)&lt;/p&gt;

&lt;p&gt;Whichever you picked, the check is identical: the version command answers, and the agent launches inside your tmux session. If the shell says "command not found," the install landed somewhere your PATH doesn't look — for npm packages that's the global npm bin folder; for Claude Code it's &lt;code&gt;~/.local/bin&lt;/code&gt;, which the export line above handles.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install PostgreSQL (Optional, for Database Projects)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; postgresql postgresql-contrib
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;postgresql
systemctl start postgresql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configure tmux
&lt;/h3&gt;

&lt;p&gt;Create a tmux config for better phone terminal experience:&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;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; ~/.tmux.conf &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt;'
set -g mouse on
set -g history-limit 50000
set -g status-bg colour235
set -g status-fg colour136
set -g status-left '#[fg=green]#S '
set -g status-right '#[fg=yellow]%H:%M '
bind | split-window -h
bind - split-window -v
set -g detach-on-destroy off
&lt;/span&gt;&lt;span class="no"&gt;EOF
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Harden SSH + Firewall
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Disable password auth (SSH keys only)&lt;/span&gt;
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/#PasswordAuthentication yes/PasswordAuthentication no/'&lt;/span&gt; /etc/ssh/sshd_config
&lt;span class="nb"&gt;sed&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; &lt;span class="s1"&gt;'s/PasswordAuthentication yes/PasswordAuthentication no/'&lt;/span&gt; /etc/ssh/sshd_config
systemctl restart sshd

&lt;span class="c"&gt;# Enable firewall&lt;/span&gt;
ufw allow OpenSSH
ufw &lt;span class="nt"&gt;--force&lt;/span&gt; &lt;span class="nb"&gt;enable&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Part 5: Authenticate Your Agent
&lt;/h2&gt;

&lt;p&gt;Every harness needs to know whose models it's spending. There are three routes, and most harnesses offer at least two of them. Pick one per harness — you can mix routes across harnesses on the same server.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Subscription Sign-In (Simplest if it works)
&lt;/h3&gt;

&lt;p&gt;Several harnesses let you sign in with a subscription account instead of an API key — flat monthly cost, no per-token meter. Claude Code signs in with a Claude Pro or Max account. Codex CLI signs in with a ChatGPT account. The flow is the same shape everywhere:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Run the agent in your terminal&lt;/li&gt;
&lt;li&gt;It will display a long sign-in URL (or open a sign-in flow)&lt;/li&gt;
&lt;li&gt;Long-press the URL in Termius to copy it&lt;/li&gt;
&lt;li&gt;Open Safari → paste the &lt;strong&gt;entire&lt;/strong&gt; URL (make sure nothing gets cut off)&lt;/li&gt;
&lt;li&gt;Log in with your subscription account&lt;/li&gt;
&lt;li&gt;Copy the auth code back to the terminal prompt, if it gives you one&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Common issue:&lt;/strong&gt; The URL is very long and can get truncated when copying. If you get an "invalid request" error from the sign-in page, the URL was cut off. Try again, or use Option B.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option B: API Key (Works with Everything)
&lt;/h3&gt;

&lt;p&gt;The universal route: every major model provider issues API keys, and every harness accepts them, usually through an environment variable. This is pay-per-use — powerful, and the meter is always running.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open Safari → go to your provider's console (Anthropic, OpenAI, and Google AI Studio all issue keys)&lt;/li&gt;
&lt;li&gt;Sign in → find &lt;strong&gt;API Keys&lt;/strong&gt; → create a new key&lt;/li&gt;
&lt;li&gt;Copy the key&lt;/li&gt;
&lt;li&gt;Back in Termius, set the variable your harness reads:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;ANTHROPIC_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your key&amp;gt;    &lt;span class="c"&gt;# Claude Code / Aider with Claude models&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;OPENAI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your key&amp;gt;       &lt;span class="c"&gt;# Codex CLI / Aider with OpenAI models&lt;/span&gt;
&lt;span class="nb"&gt;export &lt;/span&gt;&lt;span class="nv"&gt;GEMINI_API_KEY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;your key&amp;gt;       &lt;span class="c"&gt;# Gemini CLI / Aider with Gemini models&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; When pasting an API key, make sure your phone keyboard doesn't insert spaces in the middle of the key. Use the Termius text input bar at the bottom for cleaner pasting.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Save the ones you use permanently, the same way as any other environment variable:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'export ANTHROPIC_API_KEY=&amp;lt;your key&amp;gt;'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option C: Local Models — Turn the Meter Off
&lt;/h3&gt;

&lt;p&gt;If the harness accepts a custom or OpenAI-compatible model endpoint, you can point it at a model you run yourself with Ollama, and no API bill ever arrives. Aider documents Ollama support directly, and endpoint-flexible harnesses follow the same pattern:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
ollama pull qwen3-coder
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then configure your harness to use the local endpoint and that model name — each harness keeps this in its own settings, so follow its docs for the exact field.&lt;/p&gt;

&lt;p&gt;Honest limits: a $6–16 droplet cannot run a serious coding model. The local route makes sense on a bigger server or on a machine at home that your droplet can reach. What it buys you is real: private code never leaves your hardware, and the per-token meter is gone. What it costs you is frontier-level capability on the hardest work. Plenty of people run both — a frontier model for the hard jobs, a local model for everything else.&lt;/p&gt;

&lt;h3&gt;
  
  
  What It Costs to Authenticate
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Subscription:&lt;/strong&gt; one flat plan per vendor you use (Claude Pro is $20/mo, Max runs $100–200/mo; ChatGPT plans cover Codex sign-in) — predictable, no per-token math&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API keys:&lt;/strong&gt; pay-per-use at each provider's published per-token rates — cheap for light use, unbounded for heavy use&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local models:&lt;/strong&gt; $0 in model fees; you pay for the hardware that runs them&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these routes cares that you're connecting from a phone. The server is authenticated once; you just visit it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Part 6: The Context Layer + Clone Your Project
&lt;/h2&gt;

&lt;p&gt;Installing the agent gets you a smart stranger. The context layer is what turns it into your agent: standing instructions it reads every session, so you stop re-explaining your work every time you connect.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Give Your Agent a Standing Instruction File
&lt;/h3&gt;

&lt;p&gt;Every major harness reads a standing instruction file at session start. The convention is the same; only the filename changes:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Harness&lt;/th&gt;
&lt;th&gt;Standing instruction file&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Codex CLI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;AGENTS.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gemini CLI&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GEMINI.md&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aider&lt;/td&gt;
&lt;td&gt;A conventions file (e.g. &lt;code&gt;CONVENTIONS.md&lt;/code&gt;) it is told to read&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;You keep one in your home folder for the system-level stuff — who you are, your projects, how you like work done — and the pattern some harnesses support is a global file plus a per-project file that overrides it. Write it once, in plain language: your name, what you're building, your rules, your preferences. Every session starts oriented instead of cold.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 2 (Optional, Deeper): A Full Personalization System
&lt;/h3&gt;

&lt;p&gt;If you want more than a file — persistent memory, custom skills, goal tracking — frameworks exist that build that layer on top of a harness. The one I run is &lt;strong&gt;PAI (Personal AI Infrastructure)&lt;/strong&gt;, Daniel Miessler's open-source framework for Claude Code: think of the harness as the engine and the framework as everything that makes it yours. Its shape is worth copying in any harness:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Persistent memory&lt;/strong&gt; — decisions and learnings carry across sessions&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Custom skills&lt;/strong&gt; — packaged instructions for the work you repeat&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Goal orientation&lt;/strong&gt; — your mission, beliefs, and strategies loaded into every session&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your context, in files you own&lt;/strong&gt; — mission, beliefs, strategies, editable any time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whatever harness you chose, build toward that shape: context in plain files, under your control, that the agent reads before it works.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Clone Your Projects
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; ~/projects
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects
git clone https://github.com/YOUR_USERNAME/your-repo.git
&lt;span class="nb"&gt;cd &lt;/span&gt;your-repo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For private repos, authenticate with a GitHub Personal Access Token (generate one at github.com/settings/tokens) and use it as the password when Git prompts during the clone.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Orient Your Agent on the Codebase
&lt;/h3&gt;

&lt;p&gt;Drop a project-level instruction file in the repo root — the same filename your harness reads (see the table above). It tells the agent about the project's architecture, conventions, tech stack, and current priorities. The global file handles who you are; the repo file handles what this project is.&lt;/p&gt;

&lt;p&gt;Then launch the agent in the project folder and tell it: &lt;em&gt;"Read the instruction files and orient on the codebase."&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Context Layer + Your Project = Full Stack
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Who you are&lt;/strong&gt; — goals, mission, beliefs (from your global context)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;What you're building&lt;/strong&gt; — architecture, conventions, priorities (from the repo's file)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent memory&lt;/strong&gt; — what happened in past sessions carries forward, if your setup keeps it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One pattern, any harness&lt;/strong&gt; — swap the agent and the context files still describe the same you&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 7: Add Browser Access via MCP
&lt;/h2&gt;

&lt;p&gt;MCP (Model Context Protocol) is a shared protocol — the same tool servers plug into many different harnesses, so this part is nearly identical no matter which agent you picked. The two most useful servers for a headless box: web browsing and URL fetching.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add Playwright (Headless Browser)
&lt;/h3&gt;

&lt;p&gt;Lets your agent navigate websites, fill forms, click buttons, take screenshots, and extract data — all without a display.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npm &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt; @playwright/mcp
claude mcp add playwright &lt;span class="nt"&gt;--&lt;/span&gt; npx @playwright/mcp@latest &lt;span class="nt"&gt;--headless&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Add Fetch Tool
&lt;/h3&gt;

&lt;p&gt;Lets your agent grab and read any URL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; pipx
pipx &lt;span class="nb"&gt;install &lt;/span&gt;uv
claude mcp add fetch &lt;span class="nt"&gt;--&lt;/span&gt; uvx mcp-server-fetch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  A Note on Syntax
&lt;/h3&gt;

&lt;p&gt;Those two &lt;code&gt;claude mcp add&lt;/code&gt; commands are Claude Code's form. The server definitions underneath — a name, the command &lt;code&gt;npx&lt;/code&gt; or &lt;code&gt;uvx&lt;/code&gt;, and its arguments — are the portable part: other harnesses take the same definitions in their own MCP configuration (a settings file or their own add command). Copy the command and args, not the wrapper.&lt;/p&gt;

&lt;h3&gt;
  
  
  Restart Your Agent
&lt;/h3&gt;

&lt;p&gt;After adding MCP servers, restart the agent session for them to load.&lt;/p&gt;

&lt;h3&gt;
  
  
  What This Unlocks
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Browse documentation while building features&lt;/li&gt;
&lt;li&gt;Test your web app's UI automatically&lt;/li&gt;
&lt;li&gt;Scrape websites for research&lt;/li&gt;
&lt;li&gt;Pull data from web services&lt;/li&gt;
&lt;li&gt;Read API docs, Stack Overflow, GitHub issues&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 8: Daily Workflow
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Starting a Session
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open &lt;strong&gt;Termius&lt;/strong&gt; on your iPhone&lt;/li&gt;
&lt;li&gt;Tap your droplet host to connect&lt;/li&gt;
&lt;li&gt;Reattach to your session:
&lt;/li&gt;
&lt;/ol&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; setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;You're right back where you left off — your agent, your project directory, everything intact&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  If Your Phone Disconnects
&lt;/h3&gt;

&lt;p&gt;No problem. Your tmux session keeps running on the server. Just SSH back in and reattach:&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; setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the step that makes the whole setup field-proof: the signal drops in a stairwell, the agent never notices.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting Fresh
&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; agent
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/your-repo
&lt;span class="c"&gt;# launch your agent: claude, codex, gemini, or aider&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  tmux Cheat Sheet
&lt;/h3&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;Keys&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Detach (leave session running)&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;Split screen vertical&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+B&lt;/code&gt; then `&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Split screen horizontal&lt;/td&gt;
&lt;td&gt;{% raw %}&lt;code&gt;Ctrl+B&lt;/code&gt; then &lt;code&gt;-&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;Switch windows&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+B&lt;/code&gt; then &lt;code&gt;0-9&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scroll up&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Ctrl+B&lt;/code&gt; then &lt;code&gt;[&lt;/code&gt; then arrow keys&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exit scroll mode&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Q&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;List all sessions&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tmux ls&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kill a session&lt;/td&gt;
&lt;td&gt;&lt;code&gt;tmux kill-session -t name&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Part 9: Optional — Browser-Based Terminal (ttyd)
&lt;/h2&gt;

&lt;p&gt;If you want to access your terminal from any browser without Termius:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;apt &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; ttyd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it with basic auth on a random port:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ttyd &lt;span class="nt"&gt;-p&lt;/span&gt; 9473 &lt;span class="nt"&gt;-c&lt;/span&gt; your_username:YourStrongPassword tmux attach &lt;span class="nt"&gt;-t&lt;/span&gt; setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then open Safari: &lt;code&gt;http://YOUR_DROPLET_IP:9473&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security notes:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use a random high port (not 80, 8080, etc.)&lt;/li&gt;
&lt;li&gt;Always use the &lt;code&gt;-c&lt;/code&gt; flag for basic authentication&lt;/li&gt;
&lt;li&gt;Open the port in your firewall: &lt;code&gt;ufw allow 9473/tcp&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;For production use, put it behind HTTPS with a reverse proxy&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Part 10: Cost Breakdown
&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;Monthly Cost&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Cloud server (DigitalOcean droplet)&lt;/td&gt;
&lt;td&gt;$6–16/mo&lt;/td&gt;
&lt;td&gt;Free for the first stretch via the $200 signup credit&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Termius&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;Free tier is sufficient&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Agent subscription (if you sign in with one)&lt;/td&gt;
&lt;td&gt;$20–200/mo&lt;/td&gt;
&lt;td&gt;Depends on vendor and plan — Claude Pro is $20/mo; heavier plans run more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;API usage (if you use keys instead)&lt;/td&gt;
&lt;td&gt;Pay-per-use&lt;/td&gt;
&lt;td&gt;Each provider's published per-token rates; replaces the subscription line, doesn't stack on it&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local models (Ollama route)&lt;/td&gt;
&lt;td&gt;$0 in model fees&lt;/td&gt;
&lt;td&gt;You supply the hardware; needs more than the $6–16 droplet to be useful&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$6–36/mo typical&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Server + one subscription covers most people; the range stretches if you run premium plans or heavy API volume&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The honest summary: the server is the fixed cost. Everything after that is a choice — subscription, metered API, or your own hardware — and you can change your mind per harness without rebuilding anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "command not found" when running your agent
&lt;/h3&gt;

&lt;p&gt;Its install location isn't on your PATH. npm-installed agents live in npm's global bin folder; Claude Code's installer uses &lt;code&gt;~/.local/bin&lt;/code&gt;:&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;echo&lt;/span&gt; &lt;span class="s1"&gt;'export PATH="$HOME/.local/bin:$PATH"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; ~/.bashrc
&lt;span class="nb"&gt;source&lt;/span&gt; ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Sign-in URL gives an "Invalid Request" error
&lt;/h3&gt;

&lt;p&gt;The URL got truncated during copy/paste. Use the API key method instead (Part 5, Option B) — it's the more reliable route from a phone anyway.&lt;/p&gt;

&lt;h3&gt;
  
  
  API key has spaces inserted by phone keyboard
&lt;/h3&gt;

&lt;p&gt;iPhone keyboards sometimes auto-insert spaces in long strings. Use the Termius text input bar at the bottom of the screen, or type the export command and carefully paste the key without spaces.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can't connect via SSH
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Check the droplet is running in the DigitalOcean dashboard&lt;/li&gt;
&lt;li&gt;Verify the IP address is correct&lt;/li&gt;
&lt;li&gt;Make sure you selected the right SSH key in Termius&lt;/li&gt;
&lt;li&gt;Try destroying and recreating the droplet if all else fails&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  tmux session gone
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tmux &lt;span class="nb"&gt;ls&lt;/span&gt;          &lt;span class="c"&gt;# List existing sessions&lt;/span&gt;
tmux new &lt;span class="nt"&gt;-s&lt;/span&gt; dev  &lt;span class="c"&gt;# Create a new one&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Agent not responding
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Verify the install (use your harness's name)&lt;/span&gt;
claude &lt;span class="nt"&gt;--version&lt;/span&gt;   &lt;span class="c"&gt;# or: codex --version / gemini --version / aider --version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Exit the session and relaunch the agent; check for an update command in its help if problems persist.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running out of disk space
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;df&lt;/span&gt; &lt;span class="nt"&gt;-h&lt;/span&gt;             &lt;span class="c"&gt;# Check usage&lt;/span&gt;
apt autoremove    &lt;span class="c"&gt;# Clean up&lt;/span&gt;
docker system prune  &lt;span class="c"&gt;# If using Docker&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  What You've Built
&lt;/h2&gt;

&lt;p&gt;You now have a full cloud development environment accessible from your iPhone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Termius&lt;/strong&gt; → SSH into your server from anywhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tmux&lt;/strong&gt; → Sessions persist through disconnects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your agent&lt;/strong&gt; → An AI coding agent — whichever harness and model you chose — with your full codebase and your standing context in reach&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP tools&lt;/strong&gt; → Your agent can browse the web and fetch URLs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; → Push code, create branches, manage your repo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a real dev setup. The same thing people run on $2,000 MacBooks, running on a $6/month server, controlled from your phone — and none of it is locked to one company's agent. Swap the harness next year and the server, the sessions, and the context files are still yours.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
    </item>
    <item>
      <title>The 6 AM Superintendent's Brief</title>
      <dc:creator>Theory</dc:creator>
      <pubDate>Wed, 21 Oct 2026 13:17:31 +0000</pubDate>
      <link>https://dev.to/luminosityfc/the-6-am-superintendents-brief-50j9</link>
      <guid>https://dev.to/luminosityfc/the-6-am-superintendents-brief-50j9</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://agentsinthetrades.com/use-cases/superintendent-morning-brief.html" rel="noopener noreferrer"&gt;Agents in the Trades&lt;/a&gt;, a daily library of real AI agent workflows from solar, construction, and field operations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Before the crew mobilizes, an agent assembles the day in one page — weather, crew, deliveries, and open loops sorted into Must, Should, and Could — so the superintendent starts with decisions made, not tabs open.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The numbers:&lt;/strong&gt; 30–45 min/day saved (typical) · Medium setup difficulty · Run by the superintendent&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;A superintendent's first hour is a scavenger hunt. Weather is in one app, the crew count in a text thread, deliveries in email, inspections on a calendar, and yesterday's unfinished business in his head. By the time it sits in one place, the crew is already waiting — and the day has started reacting instead of executing.&lt;/p&gt;

&lt;p&gt;The cost is what slips while he gathers: a delivery moved to the afternoon, a wind window that closes at noon, an item the office has awaited since Tuesday. None of it is hidden. It is just scattered, and scattered information gets found late.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the agent workflow works
&lt;/h2&gt;

&lt;p&gt;Overnight, the agent pulls the pieces together: jobsite weather, the calendar, the crew roster and any call-outs, scheduled deliveries and inspections, and open items carried from prior days.&lt;/p&gt;

&lt;p&gt;It checks weather against the work, not just the forecast — wind, heat, and lightning flagged against the planned scope, especially rooftop or lift work, with the risky window named plainly.&lt;/p&gt;

&lt;p&gt;It sorts the day into Must, Should, and Could. Must blocks the crew, an inspection, or a delivery today. Should keeps the week on track. Could can wait without cost.&lt;/p&gt;

&lt;p&gt;It adds the human layer: who is waiting on a reply, what changed overnight, and the one highest-leverage move — the action that unblocks the most work if it happens first.&lt;/p&gt;

&lt;p&gt;The brief lands before the day starts as one short page, in the same order every morning. Quick wins are marked separately from deep work.&lt;/p&gt;

&lt;p&gt;The superintendent edits, not assembles. He corrects the order, kills anything stale, and adds what only he knows. The agent never sends or promises anything on the back of the brief — it prepares the day; he runs it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need to set it up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Sources the agent can read each night: a calendar, an email inbox, the crew roster, and a weather source for the jobsite. A paper notebook stays invisible until someone types it in.&lt;/li&gt;
&lt;li&gt;Your priorities written down once: what counts as Must on your jobs, your weather thresholds, and who counts as waiting too long.&lt;/li&gt;
&lt;li&gt;A running open-items list the agent can carry forward. It can start as a simple document — the brief is only as current as that list.&lt;/li&gt;
&lt;li&gt;An agent platform connected to those sources. Cost is honest: a few hours of setup, plus agent tooling you already pay for — no new project software required.&lt;/li&gt;
&lt;li&gt;A fixed delivery time — one message, before mobilization, every workday. A brief that arrives after the toolbox talk is trivia, not a tool.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it breaks
&lt;/h2&gt;

&lt;p&gt;The brief is only as good as its inputs, and field inputs go stale fast. A call-out phoned in at 5:40, a delivery rescheduled in a call the agent never heard, a scope change agreed at the trailer door — none of that is in the overnight pull, so the brief can be confidently out of date by sunrise.&lt;/p&gt;

&lt;p&gt;Weather is the second limit: a forecast is a probability, not a call, and go or no-go on wind or lightning stays with the superintendent on site. The Must, Should, Could order is also a judgment; the agent will sometimes rank the loudest email above the quiet item that actually blocks the crew. Read it like a draft from a good assistant who was not on site yesterday — usually right, always worth a sixty-second check.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;Best fit for superintendents and foremen running traveling crews and a day that starts before the office does. It does not manage the job. It hands you the job, already gathered and sorted, early enough that your first decision is a decision — not a search.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More real agent workflows from the field — what each does, what it costs, and where it breaks — at &lt;a href="https://agentsinthetrades.com" rel="noopener noreferrer"&gt;Agents in the Trades&lt;/a&gt;, with a weekly newsletter at &lt;a href="https://daroys-newsletter.beehiiv.com" rel="noopener noreferrer"&gt;daroys-newsletter.beehiiv.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>construction</category>
      <category>management</category>
    </item>
    <item>
      <title>Daily Logs That Write Themselves from Delivery Ticket Photos</title>
      <dc:creator>Theory</dc:creator>
      <pubDate>Wed, 21 Oct 2026 02:03:00 +0000</pubDate>
      <link>https://dev.to/luminosityfc/daily-logs-that-write-themselves-from-delivery-ticket-photos-1ig3</link>
      <guid>https://dev.to/luminosityfc/daily-logs-that-write-themselves-from-delivery-ticket-photos-1ig3</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://usecases.daroyperkins.com/use-cases/procore-daily-log-automation.html" rel="noopener noreferrer"&gt;Agents in the Trades&lt;/a&gt;, a daily library of real AI agent workflows from solar, construction, and field operations.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Delivery tickets get photographed and emailed in during the day. By the time the superintendent sits down, the agent has already drafted the daily log — manpower, materials received, and notes — waiting for review instead of a blank form.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The numbers:&lt;/strong&gt; 3–5 hrs/week saved (typical) · Medium setup difficulty · Run by the superintendent&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;The daily log is the document of record for the job, and on most sites it gets written at the end of the day, from memory, by the person who is already the busiest on site. Manpower counts get reconstructed from whoever happened to be standing nearby. The delivery ticket for the morning's modules is in a truck visor, or folded into a pocket, or already in the dumpster. The log that reaches the office reads fine and matches the day only loosely.&lt;/p&gt;

&lt;p&gt;The information isn't missing — it passes through the site all day long. Tickets get signed, headcounts happen at the gate, work gets done in specific areas. It just never lands in one place while it's still fresh. By Friday, reconstructing Tuesday is guesswork, and when a quantity is disputed two months later, the log is what's left to argue from.&lt;/p&gt;

&lt;h2&gt;
  
  
  How the agent workflow works
&lt;/h2&gt;

&lt;p&gt;Every delivery ticket gets photographed at the gate or the laydown yard, before the truck leaves, and emailed to a dedicated project inbox. A phone photo is fine — readable beats pretty.&lt;/p&gt;

&lt;p&gt;The agent watches that inbox. Each photo is run through OCR and image reading: vendor, ticket number, date, material description, quantity, and unit are pulled into structured fields.&lt;/p&gt;

&lt;p&gt;Manpower comes in the same way. The roster or time record for the day — from the timekeeping system or a simple emailed headcount by crew and cost code — is rolled up into the log's manpower section.&lt;/p&gt;

&lt;p&gt;The agent assembles a draft daily log in the same structure the project platform uses: manpower by cost code, materials received with quantities and ticket numbers, plus a notes field summarizing the day's deliveries and any flagged exceptions.&lt;/p&gt;

&lt;p&gt;The superintendent reviews the draft — typically a few minutes — corrects anything the photos didn't capture, adds the day's work narrative, and posts it. Nothing reaches the official log without that review.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you need to set it up
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;A dedicated project email inbox that the agent can read on a schedule&lt;/li&gt;
&lt;li&gt;An agent or automation platform with OCR/image reading and email access, connected to your daily-log platform or producing a draft in its format&lt;/li&gt;
&lt;li&gt;A simple site rule, agreed with the crew: every ticket gets photographed before the truck leaves. This habit is the whole system.&lt;/li&gt;
&lt;li&gt;A defined reviewer — usually the superintendent — who approves every draft before it posts&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Where it breaks
&lt;/h2&gt;

&lt;p&gt;Handwritten ticket annotations are the weak point. OCR reads printed quantities well; a driver's scrawled correction, a grease-smudged number, or a photo taken at an angle in bad light will be misread or dropped, sometimes silently. Carbon-copy tickets with faint print are worse.&lt;/p&gt;

&lt;p&gt;The agent also cannot verify that what the ticket says matches what actually came off the truck — a short shipment signed for in a rush will be logged as received in full, because the paperwork says so. And if nobody photographs the ticket, the delivery simply does not exist for the system. The draft is a transcription tool, not an inspection. The reviewer's pass over quantities against what they saw on the ground is not optional overhead; it is the control that makes the log trustworthy.&lt;/p&gt;

&lt;h2&gt;
  
  
  The bottom line
&lt;/h2&gt;

&lt;p&gt;For a superintendent writing daily logs from memory every evening, this returns the end of the day and produces a log built from the day's own paperwork instead of recollection. The technology is the easy half — the photo habit at the gate is what makes it work.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;More real agent workflows from the field — what each does, what it costs, and where it breaks — at &lt;a href="https://usecases.daroyperkins.com" rel="noopener noreferrer"&gt;Agents in the Trades&lt;/a&gt;, with a weekly newsletter at &lt;a href="https://daroys-newsletter.beehiiv.com" rel="noopener noreferrer"&gt;daroys-newsletter.beehiiv.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>construction</category>
      <category>automation</category>
    </item>
  </channel>
</rss>
