A case study by Chance Peragine October 2026

I wanted to run my AI agents from my phone.

In April I didn't trust AI with a real computer. By September my agents were waiting on me. In between, over five setups in six months, I learned how the model and I fit together.

  1. Apr OpenClaw
  2. May Hermes
  3. Jul A homemade bridge
  4. Aug Nado
  5. Sep Ophio

At a glance

Problem
I wanted to start real coding work from my phone, see what was actually happening, and stop it when I needed to. Each setup I tried failed around the model, not in it: missing tools, false status, lost answers, a Stop that didn't stop.
My part
I designed, ran and steered five setups over six months. AI agents, mostly Claude Code, wrote most of the code. I decided what done meant, tested it, and cut what didn't work.
Method
Use it every day, write everything down before acting, and test the failure itself rather than the happy path. For this page, I had Claude check my records against the originals, then interview me about every choice.
Data
2,655 messages to Nado over 59 days. 4,468 answers delivered and 3 never delivered. 21 Stop trials, with all 105 late actions refused.
Status
Nado runs every day. Ophio, the Android app and desktop companion, isn't finished, and I use it alongside Nado.

The short version

In April I was texting an AI agent on Telegram. It lived on an old laptop under my desk. Six months later I'm building Ophio, an Android app and desktop companion meant to let me start real coding work from my phone, watch it happen, and stop it.

Along the way I kept expecting the next, smarter model to fix things. It didn't, because the model was rarely the part that broke. What broke was everything around it. Did the agent have its real tools? When it said “working,” was it? Did the answer ever reach me? When I pressed Stop, did it stop?

Then the models got good enough that the slowest part of the whole setup was me, and I finally saw what each of us brings.

I've spent my life building context, and it's heavily compressed. The model's is a million tokens of detail, and none of it lived. We cover each other's weaknesses.

The agents needed my half more often than I could sit at a desk to give it. Ophio is my answer to that.

This is the story in my own words, with the numbers I kept along the way.

How I worked

The same habits run through all five setups. Each one shows up in a lesson below.

  1. Use it every day. Every setup was my daily driver, not a demo. Real use is what turned up the failures, and it's why I have records of them.
  2. Find the part that broke. When something went wrong, I asked which piece failed: the chat app carrying messages, the model, the agent using the tools, or the computer keeping track. It was rarely the model. That split became the design for Ophio.
  3. Write it down before acting. Nado saves each message before it works on it, and keeps each answer until Telegram confirms it. A restart picks up where it left off, and the records show what happened.
  4. Test the failure, not the happy path. A crash test has to crash at the worst moment. A Stop test needs an agent that keeps trying to act after the tap. A test that passes without reaching the failure proves nothing.
  5. Measure, then choose. I timed encoders before picking a default, and I compared models blind, on the real work, before trusting a cheaper setup. What didn't earn its place came out.
  6. Check the record, not my memory. For this page, I had Claude go through my records without changing them. It scanned 86,668 messages by keyword and went back to 64 of the originals to confirm the details. It worked the Stop numbers out again from each of the 21 saved trials and checked them against the saved summary. Nothing was rerun. These are fresh calculations from old records. Then it interviewed me, and the reasons on this page are my answers. I remembered why I made each choice. Claude found when, and how many times. I chose the story, and I stand behind it.

Five setups in six months

  1. April

    OpenClaw on an old laptop

    I'd tried AI plenty of times before, and it always felt like a fancy autocomplete. OpenClaw looked like more than that, so I gave it a computer I could afford to lose: ChachaClaw, a laptop with a 2012 Intel chip and 16 GB of memory. I didn't think it would be good enough, or safe enough, for anything better. I had no goal. I was just curious.

    It blew me away and changed my mind completely. That's why I kept building. Even then, most of my time went into pairing, allowlists and permissions rather than actual work, which was my first hint about where the hard problems would be.

  2. May

    Hermes

    OpenClaw was working fine. I moved to Hermes, an open-source agent, on May 25 because I wanted to see how other people were going about it. The migration moved 9 things, archived 4, skipped 31, and refused to overwrite 2 that conflicted. I liked that it didn't pretend everything carried over.

    I used Hermes hard for ten weeks: 3,309 sessions and 63,399 model calls. I also started changing it. I added a step that stripped stale context out of each request, and routing that picked a model by the kind of work. Hermes taught me a lot, including what I didn't want.

  3. July

    A homemade bridge, and a new computer

    By July I wanted coding work done by Claude Code itself, with its own tools, instead of an agent steering it from outside. I built a small bridge from Telegram straight to Claude Code and, on July 26, switched it to Claude Code's native events.

    That same day I committed to Workhorse, a desktop with a Ryzen 9 9950X and 64 GB of memory. I already had most of the parts. I wanted my own server for my data and my own machine set up my way, and this got me both at once. The computer I already had became a home server running Proxmox. Workhorse became my new machine and the always-on home for the agents. I built it on August 2, then spent a day chasing black screens.

  4. August

    Nado

    By August I'd worked out what bothered me about Hermes. It did too much. Whenever I told it how I wanted a project run, it saved that as a skill and used it on every project after. Its own records show it wrote 118 skills by itself and edited them 1,072 times. On July 26 I told it skills were mine to keep, not something to make at random. On July 29 it wrote 18 in a single day.

    All those skills bloated its context, and every lesson landed on every project. But each project needs its own touch. Some need a quick, bare-bones prototype. Others need to push the hardware to its limits. With every lesson in play at once, some projects spun their wheels for days, and others got far more complicated than they needed to be.

    I'd lost the fine control I need. Hermes put the vision in the agent's hands and left the software to me, and that felt backwards. AI makes most of the big technical calls as well as I do, often better. But software and websites are art. They need someone with a vision and strong opinions, and that's the part I want to keep.

    So I rewrote the whole thing in Rust and called it Nado. Over the next weeks it split into separate bots with separate jobs: Chanado to talk, Planado to plan, Claudenado to build. Hermes ran its last Telegram session on August 5. Nado received its first message on August 6, and it has had messages every day since.

  5. September

    Ophio

    By September the models were so good that I had become the blocker. Agents finished work and waited for me to review it and ask for changes, and I couldn't be at my desk as often as they needed me. Projects sat waiting and my backlog grew. To keep something moving I'd start a new project, which only gave me one more project waiting on me.

    So late in September I started Ophio, a real Android app with a companion on the desktop. The phone stops being a chat window and becomes a remote control for the agents on my computer, so I can review work and ask for changes from a hike or a plane. You bring your own AI accounts and tools. The desktop keeps the record of what is actually running.

    My own setup had already freed me from the desk, and I wanted other people to have that too. Ophio isn't finished. For now I use it alongside Nado while I keep building it.

Messages to Nado, every day since it started

Incoming messages to Nado per dayBar chart of 59 days, August 6 to October 3. Every day has messages. The median is 35 a day and the busiest day is August 9 with 183. Numbered markers: 1 on Aug 8; 2 on Aug 14; 3 on Sep 7; 4 on Sep 26; 5 on Oct 2.501001502000Aug 6Sep 1Oct 1183median 3512345Incoming messages to Nado per dayBar chart of 59 days, August 6 to October 3. Every day has messages. The median is 35 a day and the busiest day is August 9 with 183. Numbered markers: 1 on Aug 8; 2 on Aug 14; 3 on Sep 7; 4 on Sep 26; 5 on Oct 2.501001502000Aug 6Sep 1Oct 118312345
  1. Aug 8 I took Hermes out from under the conversation bot.
  2. Aug 14 Planning got its own bot, Planado.
  3. Sep 7 Picking from a menu started the work, with no extra “continue.”
  4. Sep 26 I started planning Ophio.
  5. Oct 2 I reverted eight commits of account security that guarded against the wrong thing.
Incoming messages to Nado's bots per day, August 6 to October 3: 2,655 in all, a median of 35 a day, and 183 on the busiest day, August 9. Messages aren't tasks. This shows how much I leaned on it, not how much got done.

What broke, and what I changed

Every one of these started as a message I sent to one of my bots.

The agent needed its own tools

In July I noticed that picking a model isn't the same as picking an agent. A request sent straight to a model could skip the coding agent's own tools, permissions and sign-in. And my homemade bridge worked out what was happening by reading text off a terminal screen, which can say “done” when nothing is. On July 26 I switched the bridge to listen to Claude Code's own events instead.

By August 8 I had wrapped and patched Hermes so heavily that I asked whether it was still earning its place. It wasn't. The conversation bot kept everything it could do, got a new engine underneath, and stayed separate from the bot that builds, without disturbing the others while it changed. Doing that made me see my setup as four separate pieces: the chat app that carries messages, the model, the agent that actually uses the tools, and the computer that remembers what's going on. Any one of them can change without breaking the others.

Ophio is built on that idea. You sign in with your own accounts and each agent uses its own native tools. Ophio never sits between you and the AI provider.

Finished work kept getting lost

By late July the failures had a pattern. Work sat in a queue that nothing picked up. A bot said it was working when nothing was running. An agent finished, and the answer never arrived.

It happened more times than I can count. An agent would tell me it was waiting on a review, or on some research. Then the conversation ended and took every process with it. Hours later I'd check in and find nothing done and everything lost. Across several projects, that cost me days.

So Nado writes everything down before it acts. Each incoming message is saved first. Each conversation runs in order. Each answer goes into an outbox and stays there until Telegram confirms it. If Nado restarts, it picks up where it left off. “The work is done” and “you got the answer” are two different facts, and Nado keeps track of both.

answers delivered
4,468
delivered within 1 second
Half
delivered within 39 seconds
90%
the slowest one
7 h 15 m
never delivered
3
Nado's outbox from August 6 to October 3, timed from the moment an answer was saved to the moment Telegram accepted it. It says nothing about how long the work took, or whether I read the answer.

One test taught me not to trust a green checkmark. It was meant to prove that answers survive a crash, so it killed Nado halfway through sending. It passed. But the fake agent in the test was so fast that every message had already gone out before the kill, so it never tested the crash at all. The rewritten test holds the second message in place, checks exactly what was saved, and only then kills the process. Against the old code it failed 20 times out of 20. With the fix it passed 10 out of 10.

Stop had to really stop

On a phone, the most important button is Stop. If I see an agent heading the wrong way, I need it to stop now, not after it finishes the file it's in the middle of. Chat apps blur a few things together that Ophio keeps apart. Stop ends the work. Pause holds it. Watching never sends input. And a message sent mid-run either steers the current work or waits its turn, and you choose which.

To test Stop, I used a lab setup: the phone screen running in a browser, a desktop in a virtual machine, and a scripted agent that kept trying to act after the tap. In 21 trials, every Stop held. The agent tried 105 more actions after Stop, and all 105 were refused. Once the phone showed the stop as confirmed, nothing more happened on the desktop in the 3.5 seconds the test kept watching.

How fast Stop took hold, in 21 trials

Time for Stop to take hold in each trialDot plot of 21 trials on a logarithmic scale. Agent lost permission to act: from 30.7 to 638.9 ms, median 41.3 ms. Phone confirmed the stop: from 163.5 to 980.8 ms, median 230.0 ms. The slowest in both rows is trial 13.25501002505001,000 msAgent lost permissionmedian 41 mstrial 13Phone confirmed the stopmedian 230 mstrial 13Time for Stop to take hold in each trialDot plot of 21 trials on a logarithmic scale. Agent lost permission to act: from 30.7 to 638.9 ms, median 41.3 ms. Phone confirmed the stop: from 163.5 to 980.8 ms, median 230.0 ms. The slowest in both rows is trial 13.301003001,000 msAgent lost permissionmedian 41 mstrial 13Phone confirmed the stopmedian 230 mstrial 13
Each dot is one trial. Top row: time from the tap until the agent lost permission to act, a median of 41 ms. Bottom row: time until the phone showed the stop as confirmed, a median of 230 ms. The scale is logarithmic so the slow one, trial 13, fits on the page.

The opposite of Stop is “go,” and I typed it a lot. In Nado's history I sent “continue” 39 times and “yes” 22 times. Of my 66 go-aheads, 22 came right after the bot had asked me a question. Some questions deserved an answer. Others only stalled the work, so in September I made picking an option from a menu start the work directly.

A lot of progress was taking things out

The changes I'm proudest of mostly removed something.

  • No fake failover. I planned automatic failover to a Raspberry Pi, then dropped it on August 5. Both machines shared the same weak points and the queues weren't copied between them, so it would have looked like safety without being safe. An honest restart beats that.
  • Review at the handoff. On July 24 I moved code review from after every small task to the moment work gets handed off, so the fast lane stayed fast.
  • A boring boot. After unreliable reboots on September 23, I set Workhorse to boot a plain default every time, with the experimental setup available for one boot at a time.

Even performance work came down to choosing what not to add. Ophio streams the desktop to the phone as JPEG images. In these tests the encoder written in pure Rust was two to three and a half times slower than TurboJPEG, a well-known C library. It's still the default, because it builds without a C toolchain. TurboJPEG is there as an option.

Time to encode one full 1080p frame

Milliseconds to encode one 1080p frame, by screen and encoder
EncoderBarTime
Text-heavy screen
Pure Rust (default)22.0 ms
TurboJPEG (optional)6.4 ms
Code editor
Pure Rust (default)16.7 ms
TurboJPEG (optional)7.4 ms
NASA Blue Marble photo
Pure Rust (default)13.4 ms
TurboJPEG (optional)5.6 ms
Median of nine runs on Workhorse, September 27, at JPEG quality 75. Shorter is faster. After the first frame, updates that carry only what changed took about a millisecond with either encoder. Capture, network and the phone itself aren't included.

Cheaper, but never worse

I'm always looking for ways to spend less on models, but never at the expense of quality. The agents often tell me an idea won't work. I try it anyway.

Twice in one week, they were right. The first was automatic model picking. I have a lot of models, and I wanted every task to go to the cheapest one that could do it well, without me stopping to think. On September 28 the agent told me it wouldn't save much. I argued for having it pick the model and the effort level for each task, and it came around and built that. By October 1 I couldn't see any value in it, and I took it out of Nado's default path. It wasn't my first try, either. On September 4 I'd already made an earlier automatic router optional, so I could pick the model myself.

The second was video. Opus 5.5 makes far better videos than Sol 6.1, but Sol is far more efficient. So I had them work as a pair: Opus made a few short calls on taste, and Sol did the heavy lifting. On September 30 I ran a blind test. The same request for a 15-second ad went to Opus alone, Sol alone and the pair, and nothing said which was which. Opus alone was light years better. The pair was passable. Sol alone was unusable. I dropped the pair that evening. It was a good experiment, but it wasn't worth it.

Both times the lesson was the same. The wrong model can wreck a codebase, or turn out days of mediocre work that gets thrown away, and the savings never cover that. It's better to take a minute, think about what the work needs, and pick the model yourself. When you can't tell, test them on the real work.

What does work is giving each model the job it's best at. Opus 5.5 is by far the better builder, but in code review Sol 6.1 catches a lot of bugs. So Opus does the work and sends what's finished to Sol for review. On September 30, Sol reviewed all of Tributary, a Salesforce app I'm building, and found 30 problems. Seven were serious enough to block its AppExchange submission. Opus fixed all 30, and Sol checked the fixes twice more. Each covers the other's weak side.

My part in it

I want to be clear about my part. I build with AI agents, mostly Claude Code, and they wrote most of the code in this story. Ophio's history alone has 1,546 commits from its first seven days, which tells you how fast agents write code, not how good it is. Making it good is the part I own: deciding what done means, testing it, and sending it back when it isn't. I didn't start from zero, either. I'd been writing code for years, and I'm decent with Python, though it isn't my strongest language.

Most AI tools still picture you at the computer, writing code alongside the model. That's where the model is strongest. It can hold a whole codebase at once and has read more than any of us ever will, so it finds bugs a person would miss. What it doesn't have is a life. I understand people, art and how things really go in the world, even if I've lost most of the details along the way. So I bring vision and direction: deciding what to build and how it should feel, choosing the right model for the job, noticing when something is off, and cutting what doesn't work. Finding something genuinely new is hard for an AI. It takes a lot of steering, and that's my part.

Steering sometimes means a hard no. When I asked for password sign-in on Ophio, I said the accounts couldn't leak. I meant safe from the outside world. The agent read it as walling everything off, my own agents included. It built hardware-backed approvals, a private desktop mode to keep my agents out, and much more, and none of it ever reached a working Accounts screen. An agent I run on my own computer can already read my credentials, so walling it off was pretend security. I vetoed it. On October 2 I reverted eight commits, about 22,000 lines, and pointed the security work at the real threat: someone from outside getting in.

What I'd do differently

I'd trust it sooner. In April I was so skeptical that I wasn't really trying to get the most out of it. I'd see a good result and still feel like it was a fluke. In fairness, the models were weaker then than they are now.

What this doesn't show

Where it stands

Nado still runs every day. It has had messages on every one of its 59 days. Ophio isn't finished, and I use the two side by side while I build it.

Over these six months the models kept getting better. The hard questions stayed the same. Does the agent have its real tools? Is “working” true? Did the answer arrive? Did Stop hold? Ophio is built around those four.

What I wanted in April is still what I want. Start real work from my phone, see what's actually happening, and stop it when I need to.