<?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: Nat</title>
    <description>The latest articles on DEV Community by Nat (@nataiden).</description>
    <link>https://dev.to/nataiden</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%2F3967632%2Ffe911ddc-0c50-4b86-a121-15f8ab9e94d0.jpeg</url>
      <title>DEV Community: Nat</title>
      <link>https://dev.to/nataiden</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nataiden"/>
    <language>en</language>
    <item>
      <title>Aiden: A Physical AI Agent Device for the Phone You Already Have</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Wed, 16 Sep 2026 08:22:51 +0000</pubDate>
      <link>https://dev.to/aidenagent/aiden-a-physical-ai-agent-device-for-the-phone-you-already-have-3b5e</link>
      <guid>https://dev.to/aidenagent/aiden-a-physical-ai-agent-device-for-the-phone-you-already-have-3b5e</guid>
      <description>&lt;p&gt;Hi, dev.to community. We're Aiden, and this is our first post here, so let's start with the obvious question: what are we actually building?&lt;/p&gt;

&lt;p&gt;The problem we started with&lt;/p&gt;

&lt;p&gt;AI agent phones are coming. OpenAI's won't ship until 2028. If you've been following the "agentic AI" space, you've probably noticed the same pattern we did: the interesting hardware is always a year or two out, locked to a specific new device you have to buy, and not something you can actually touch today.&lt;/p&gt;

&lt;p&gt;We didn't want to wait for a new phone. So we built a small piece of hardware that plugs into the phone or computer you already own.&lt;/p&gt;

&lt;p&gt;What Aiden actually is&lt;/p&gt;

&lt;p&gt;Aiden is a physical mobile AI agent device. You connect it via USB to your phone or computer, no app install required. Once connected, it sees the screen, hears your voice, and operates the device for you: navigating apps, sending messages, checking things, completing tasks, the way a person would if they were sitting next to you holding your phone.&lt;/p&gt;

&lt;p&gt;The goal isn't to replace your phone. It's to give any phone or computer you already own genuine agentic capability, without waiting for a manufacturer to build it in.&lt;/p&gt;

&lt;p&gt;The hardware, honestly&lt;/p&gt;

&lt;p&gt;We're currently at dev-board stage. Early Access, no public price or launch date yet. Here's what's actually inside:&lt;/p&gt;

&lt;p&gt;MCU: RV1106G3, ARM Cortex-A7 at 1.2GHz&lt;br&gt;
RAM: 256MB&lt;br&gt;
NPU: 1 TOPS&lt;br&gt;
Connectivity: WiFi 6, BLE 5.x&lt;br&gt;
Battery: 1500mAh (~18 hours)&lt;br&gt;
Ports: USB-C, HDMI 1080p capture&lt;br&gt;
Storage: microSD up to 256GB&lt;/p&gt;

&lt;p&gt;We're being upfront about the "dev-board stage" part because we'd rather you know exactly what you're looking at than oversell a roadmap. This is real hardware doing real work today, not a rendering of what's coming.&lt;/p&gt;

&lt;p&gt;The firmware, and why it's open source&lt;/p&gt;

&lt;p&gt;Aiden's firmware is open source, and it's where most of the actual engineering happens. A few things worth knowing if you're the kind of person who reads dev.to:&lt;/p&gt;

&lt;p&gt;Language mix: primarily Go, with C++ for hardware-level work and Python for tooling and benchmarks&lt;br&gt;
Package management: OPKG/Entware&lt;br&gt;
Persistent memory: Aiden remembers context across sessions instead of starting fresh every time&lt;br&gt;
Provider flexibility: one-click switching between LLM, STT, and TTS providers, so you're not locked into one model or vendor&lt;br&gt;
Cross-platform: works across iPhone, Android, macOS, Windows, and Linux&lt;br&gt;
Updates: free, and shipped regularly&lt;/p&gt;

&lt;p&gt;We publish real PR numbers, real technical writeups, and real dev-board caveats, not polished announcement copy. If you check our blog, you'll find posts about things like the actual architecture behind coordinating real-time voice with background device-control tasks, or the discipline of distinguishing "acknowledged a request" from "verified it actually happened." That's the level of detail we think is actually useful to share.&lt;/p&gt;

&lt;p&gt;Where Aiden sits next to everything else&lt;/p&gt;

&lt;p&gt;We're not the only people building in this space, and we don't think we should pretend otherwise. A few honest comparisons:&lt;/p&gt;

&lt;p&gt;Rabbit R1 is probably the closest hardware form factor to what we're doing.&lt;br&gt;
Humane AI Pin is a cautionary tale worth knowing: discontinued, acquired by HP for $116M in 2025.&lt;br&gt;
Plaud Note overlaps in the efficiency-focused audience but serves a genuinely different function (capture vs. execution).&lt;br&gt;
UiPath / Automation Anywhere represent the enterprise RPA end of the spectrum. Aiden is closer to the accessible, consumer-facing alternative.&lt;br&gt;
Android Accessibility + ADB scripts are the DIY route for technical users who'd rather build this themselves than buy hardware. Respect to anyone doing that.&lt;/p&gt;

&lt;p&gt;If you're into embedded systems, agent architecture, voice interfaces, or on-device AI, we'd genuinely like you looking at what we're doing and telling us where it's wrong. That's not a courtesy line. Some of our best fixes have come directly from people testing dev-board hardware and reporting back exactly what broke.&lt;/p&gt;

&lt;p&gt;Firmware: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware &lt;/a&gt;&lt;br&gt;
Discord: &lt;a href="https://discord.com/invite/bcJavjcnYz" rel="noopener noreferrer"&gt;discord.gg/bcJavjcnYz &lt;/a&gt;&lt;br&gt;
Site: &lt;a href="https://aidenai.io/" rel="noopener noreferrer"&gt;aidenai.io&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll be posting real technical writeups here regularly, not just announcements. If you want the unfiltered version of what we're building, this is a good place to start.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Aiden Extends Phone Bridge to Remote Mobile Agent Benchmarks</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Mon, 14 Sep 2026 12:58:49 +0000</pubDate>
      <link>https://dev.to/nataiden/aiden-extends-phone-bridge-to-remote-mobile-agent-benchmarks-3bc5</link>
      <guid>https://dev.to/nataiden/aiden-extends-phone-bridge-to-remote-mobile-agent-benchmarks-3bc5</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fviq8ycnuw1p696rt6kuy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fviq8ycnuw1p696rt6kuy.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PRs #636, #643, #655, and #656 extend Aiden's environment bridge mode so it can proxy Phone Bridge traffic between a bridge Agent and a remote Agent, giving benchmark daemons a direct relay route instead of requiring the benchmark layer to act as the final device-control endpoint.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;The bridge Agent stays the endpoint your Aiden App connects to. When an environment bridge endpoint is configured, the bridge Agent can proxy eligible traffic to a remote Agent through that route.&lt;/p&gt;

&lt;p&gt;Foreground traffic uses bidirectional WebSocket forwarding, active communication flows both directions, and the proxy reports remote connection status. Background traffic takes a different path: commands go through the configured bridge's HTTP queue, where they're queued, polled, and routed toward the remote device environment, with results returning through the same route.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed in command handling
&lt;/h2&gt;

&lt;p&gt;Empty command polls now return an empty array, a defined no-command response rather than an ambiguous one. Clipboard writes validate text before queueing, input validation added to the background relay path, though that doesn't confirm the write completed on the target device. Input routing (iOS keyboard actions, &lt;code&gt;enter_text&lt;/code&gt;) skips local USB HID isolation and goes through the remote path, but only when an environment bridge endpoint is actually configured, not a general change to local HID behavior.&lt;/p&gt;

&lt;p&gt;Benchmark daemons can now relay Phone Bridge commands through the device environment Agent, giving a benchmark a route through the device environment instead of requiring it to be the final control endpoint itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  The distinction that matters most
&lt;/h2&gt;

&lt;p&gt;Command handling states stay explicitly separate. A queued acknowledgement means the queue accepted the request. A routed command means transport directed it through the configured bridge. Neither proves the remote Agent executed it or the target device completed the action. Confirmed device-side outcome requires actual returned evidence.&lt;/p&gt;

&lt;p&gt;Validation covered Go tests plus a manual &lt;code&gt;clipboard_read&lt;/code&gt; round trip through benchmark relay mode, confirming one clipboard-read path was exercised and returned correctly, not universal coverage.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary
&lt;/h2&gt;

&lt;p&gt;Merged code with reviewed validation, not confirmation of deployment to every device, benchmark environment, or app installation, and not a claim of complete benchmark coverage or universal iOS/Android compatibility.&lt;/p&gt;

&lt;p&gt;PRs: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/636" rel="noopener noreferrer"&gt;#636&lt;/a&gt;, &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/643" rel="noopener noreferrer"&gt;#643&lt;/a&gt;, &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/655" rel="noopener noreferrer"&gt;#655&lt;/a&gt;, &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/656" rel="noopener noreferrer"&gt;#656&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What's routed through this path?&lt;/strong&gt; App-related interactions, URL capabilities, clipboard operations, calendar commands, contact commands, and local-notification capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does a routed command mean it executed?&lt;/strong&gt; No — routing confirms transport, not execution. Confirmed outcome needs explicit returned evidence.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this a general USB HID behavior change?&lt;/strong&gt; No — the remote-path input routing only applies when an environment bridge endpoint is configured.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>mobile</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Aiden Adds a Self-Knowledge Skill for Clearer Agent Boundaries</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Mon, 14 Sep 2026 12:52:40 +0000</pubDate>
      <link>https://dev.to/nataiden/aiden-adds-a-self-knowledge-skill-for-clearer-agent-boundaries-5dcn</link>
      <guid>https://dev.to/nataiden/aiden-adds-a-self-knowledge-skill-for-clearer-agent-boundaries-5dcn</guid>
      <description>&lt;p&gt;&lt;strong&gt;PR #624 merges a self-knowledge Skill into Aiden's firmware, giving the Agent a bundled, project-specific reference for describing its own hardware ownership, routing, setup, and recovery boundaries instead of answering those questions from broad assumptions.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Questions about an agent's own environment need answers grounded in the actual project, not inference. Ask Aiden what it owns, where work routes, which setup path applies, or how recovery should proceed, and the honest answer depends on distinguishing documented context from a guess.&lt;/p&gt;

&lt;p&gt;Related but non-interchangeable subjects were the real issue: a request might involve routing, a device setting, or a recovery path, and the correct response depends on what's actually documented for that specific part of the system.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the Skill actually does
&lt;/h2&gt;

&lt;p&gt;It's bundled reference material covering hardware ownership, runtime routing, Phone Bridge behavior, board configuration, phone setup, observation, verification, and recovery boundaries. Where companion-app context is relevant, it stays limited to public behavior and settings — it doesn't expose internals.&lt;/p&gt;

&lt;p&gt;The part worth calling out specifically: the Skill reinforces that an acknowledgement is not proof a task is complete. An acknowledgement shows a request was received or accepted. Verified completion requires actual evidence from the relevant observation or verification path. This is a narrower, more useful standard for agent runtime boundaries — it helps stop status language from getting ahead of what the agent can actually verify.&lt;/p&gt;

&lt;p&gt;Recovery guidance is a good example of the same discipline: during frame-service recovery specifically, stale images must not be treated as evidence for deciding what happened or claiming recovery succeeded. That's a rule scoped to frame-service recovery, not a blanket statement about every image-related workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;p&gt;Merged with &lt;code&gt;skillopt&lt;/code&gt; lint reporting zero issues, YAML frontmatter validation, focused Agent skill-loader tests, and git diff checks. That confirms the content is formatted, loadable, and reviewed in the firmware repo — it doesn't guarantee every future answer, setup attempt, or recovery action succeeds.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary
&lt;/h2&gt;

&lt;p&gt;This makes the Agent's description of its own project clearer. It doesn't make the Agent infallible, guarantee every answer, or grant automatic discovery of every configuration. Merged open-source firmware content, not a deployment announcement for every device or environment.&lt;/p&gt;

&lt;p&gt;PR: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/624" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware/pull/624&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Does this let Aiden discover its own configuration automatically?&lt;/strong&gt; No — it's a bundled reference for what's already documented, not a general capability-discovery mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does the acknowledgement-vs-completion distinction apply everywhere?&lt;/strong&gt; The principle is general, but specific guidance (like the frame-service recovery rule) is scoped to the path it was written for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this live on every Aiden device?&lt;/strong&gt; It's merged into the open-source firmware repo — that's separate from deployment across every device or product configuration.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>ai</category>
    </item>
    <item>
      <title>Aiden Can Now Install AI Agent Skills Directly from a URL</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Mon, 07 Sep 2026 10:00:32 +0000</pubDate>
      <link>https://dev.to/nataiden/aiden-can-now-install-ai-agent-skills-directly-from-a-url-1o7</link>
      <guid>https://dev.to/nataiden/aiden-can-now-install-ai-agent-skills-directly-from-a-url-1o7</guid>
      <description>&lt;p&gt;&lt;strong&gt;PR #586 gives Aiden a dedicated way to install AI agent skills from remote URLs. Give it a supported HTTP(S), GitHub tree, or GitHub blob Skill URL, and it routes to &lt;code&gt;skill_manage install&lt;/code&gt; — staging, validating, and publishing the skill in one controlled flow.&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;Before this, a remote Skill URL could get interpreted as a general content-retrieval request instead of an installation request. The agent might reach for a web scraper, call shell or curl, create files manually, then patch them into place — an indirect path for something with a clear, single intent.&lt;/p&gt;

&lt;p&gt;The extra steps also made installation status hard to reason about. Content could get retrieved before the agent had even established whether the expected skill files and structure were supported. A failed step meant digging through multiple tool calls to figure out what had actually been downloaded, written, or changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  What changed
&lt;/h2&gt;

&lt;p&gt;The reviewed real-agent reproduction for &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/586" rel="noopener noreferrer"&gt;PR #586&lt;/a&gt; tested this with a natural-language prompt containing a GitHub Skill URL. After the routing change, the full trace used exactly one &lt;code&gt;skill_manage install&lt;/code&gt; call — no web scraper, no shell, no curl, no manual create-and-patch.&lt;/p&gt;

&lt;p&gt;The new &lt;code&gt;install&lt;/code&gt; action gives remote skill installation its own path: Aiden downloads &lt;code&gt;SKILL.md&lt;/code&gt; and supported companion files into a staging area first. The staged content gets validated before it becomes an active skill. If validation passes, Aiden publishes the completed skill atomically instead of exposing files one at a time mid-installation.&lt;/p&gt;

&lt;p&gt;Retrieval prepares a candidate. Validation checks it against supported requirements. Publication happens only after acceptance. The action also returns concise metadata — file writes, changes, integrity result — and when a patch expects content that no longer matches the current file state, you get more useful mismatch details instead of a silent failure.&lt;/p&gt;

&lt;h2&gt;
  
  
  What you can do with it
&lt;/h2&gt;

&lt;p&gt;If you maintain a skill at a supported HTTP(S) location or a GitHub tree/blob, hand its URL to Aiden in a natural-language request. No more guiding the agent through content fetching and manual file assembly. Useful for testing a skill revision, sharing a skill location with another Aiden environment, or reproducing an extension setup from a known URL.&lt;/p&gt;

&lt;h2&gt;
  
  
  The boundary
&lt;/h2&gt;

&lt;p&gt;This is merged into the open-source firmware repo — that doesn't mean it's deployed to every Aiden device or product yet. Direct installation is limited to supported URL formats and files that pass validation; Aiden doesn't treat arbitrary websites, repos, or software packages as installable through this path. Validation also doesn't replace your own responsibility to review third-party skill content before using it.&lt;/p&gt;

&lt;p&gt;PR: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/586" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware/pull/586&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What URL formats are supported?&lt;/strong&gt; HTTP(S), GitHub tree, and GitHub blob Skill URLs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does this work for any GitHub repo?&lt;/strong&gt; No — only supported files that pass validation get installed. Arbitrary repos or packages aren't treated as installable through this path.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Is this live on all Aiden devices?&lt;/strong&gt; It's merged into the open-source firmware repo. That's a different thing from being deployed across every device or product.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>How Aiden Agents Survive Running Out of Context Mid-Task: A Technical Deep Dive</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Tue, 25 Aug 2026 14:37:36 +0000</pubDate>
      <link>https://dev.to/nataiden/how-aiden-agents-survive-running-out-of-context-mid-task-a-technical-deep-dive-4oph</link>
      <guid>https://dev.to/nataiden/how-aiden-agents-survive-running-out-of-context-mid-task-a-technical-deep-dive-4oph</guid>
      <description>&lt;p&gt;Every long-running agent hits the same wall: the context window can't hold everything the task needs. This is a structural certainty, not an edge case, for any agent running multi-step tasks over a bounded window. Here's how Aiden's firmware handles it, and why, shipped this week across &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/497" rel="noopener noreferrer"&gt;#497&lt;/a&gt;, &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/498" rel="noopener noreferrer"&gt;#498&lt;/a&gt;, &lt;a href="https://github.com/AidenAI-IO/aiden-firmware/pull/530" rel="noopener noreferrer"&gt;#530&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two overflow conditions, one bad outcome
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cumulative overflow&lt;/strong&gt;: enough turns accumulate that history exceeds the limit, even with no single large message. &lt;strong&gt;Single-event overflow&lt;/strong&gt;: one tool call returns more than fits, regardless of prior history.&lt;/p&gt;

&lt;p&gt;Two naive responses exist, both unacceptable in production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hard failure&lt;/strong&gt; — task stops, no resume path.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blind restart&lt;/strong&gt; — agent repeats work it already did, because it lost the record of what happened. On a physical agent that can tap buttons and submit forms, this isn't cosmetic. A context error says nothing about whether the &lt;em&gt;external&lt;/em&gt; device state changed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What shipped: three coordinated behaviors
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Context compression&lt;/strong&gt; — reduces active material. Explicitly lossy; never sufficient alone to justify continuing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Session switching&lt;/strong&gt; — moves to a fresh session. Still requires preserved task info; not a blank-slate restart.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Saved-result-file recovery&lt;/strong&gt; — the core mechanism. Task state persists &lt;em&gt;outside&lt;/em&gt; the active context window, read back deliberately at recovery time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The recovery read: four pieces of evidence
&lt;/h2&gt;

&lt;p&gt;Before deciding whether to continue, the system reads:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Continuation ID&lt;/td&gt;
&lt;td&gt;Anchors recovery to the specific execution chain&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saved state&lt;/td&gt;
&lt;td&gt;Progress: completed, pending, current phase&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saved errors&lt;/td&gt;
&lt;td&gt;Distinguishes benign overflow from a different failure&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output tail&lt;/td&gt;
&lt;td&gt;Recent activity clue — not a full execution history&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The actual design contribution is the &lt;strong&gt;three-way branch&lt;/strong&gt;: continue, verify-then-retry, or stop-and-surface-to-user. Not binary continue-or-fail. Treating "uncertain" as a first-class outcome, distinct from success &lt;em&gt;and&lt;/em&gt; failure, is what makes this a decision rather than a default.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;overflow detected
  → compress context / switch session
    → read saved result file
      → continuation ID, state, errors, output tail
        → enough evidence to continue safely?
            yes         → resume
            no/unclear  → stop, surface to user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Why external state, not in-context summarization
&lt;/h2&gt;

&lt;p&gt;Task bookkeeping (what step, what a tool returned, what errored) isn't reasoning content — it doesn't need to survive in the same budget-constrained space the model uses to think. Conflating the two means an overflow event destroys both simultaneously. Externalizing bookkeeping means overflow only costs the reasoning state, not the facts about what happened.&lt;/p&gt;

&lt;p&gt;Related prior art: &lt;a href="https://langchain-ai.github.io/langgraph/concepts/durable_execution/" rel="noopener noreferrer"&gt;LangGraph's durable execution&lt;/a&gt; checkpoints workflow state for resume-from-last-step. &lt;a href="https://developers.openai.com/api/docs/guides/conversation-state" rel="noopener noreferrer"&gt;OpenAI's conversation-state guidance&lt;/a&gt; offers persistent conversation objects to avoid re-deriving context per request. Aiden's approach is closer to the checkpoint model — the artifact is read selectively (four fields), not replayed wholesale.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ties to the broader reliability loop
&lt;/h2&gt;

&lt;p&gt;Aiden's device-interaction loop follows observe → interpret → act → verify — a conceptual pattern, not a specific architecture claim. Context recovery adds a continuity check: inspect persisted evidence before the next action, and for interface-facing tasks, re-observe the current interface rather than trust a stale checkpoint. Saved record = what the agent &lt;em&gt;believed&lt;/em&gt; happened. Fresh observation = what's &lt;em&gt;currently&lt;/em&gt; true. Neither substitutes for the other.&lt;/p&gt;

&lt;h2&gt;
  
  
  Explicit limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Compression is lossy by construction.&lt;/li&gt;
&lt;li&gt;Saved state can be missing, stale, partial, or corrupted — recovery has to handle an untrustworthy artifact, not just the happy path.&lt;/li&gt;
&lt;li&gt;Doesn't cover provider outages, network failures, unrelated tool failures, auth issues, or unexpected device states.&lt;/li&gt;
&lt;li&gt;No formal exactly-once execution guarantee — this reduces duplicate/lost work, it doesn't eliminate it.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Test matrix
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test area&lt;/th&gt;
&lt;th&gt;What to validate&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Provider-limit recovery&lt;/td&gt;
&lt;td&gt;All four evidence fields read before continuation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oversized tool outputs&lt;/td&gt;
&lt;td&gt;No silent discarding of critical info&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Malformed saved files&lt;/td&gt;
&lt;td&gt;Fails safely, not silently&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Partial completion&lt;/td&gt;
&lt;td&gt;Correct behavior mid-step interruption&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Duplicate-action risk&lt;/td&gt;
&lt;td&gt;Distinguishes completed / partial / unstarted work&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Session handoff&lt;/td&gt;
&lt;td&gt;Bounded relevant info, not a blind start&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Changed device state&lt;/td&gt;
&lt;td&gt;Forces fresh observation, doesn't trust stale checkpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human controls&lt;/td&gt;
&lt;td&gt;Pause/redirect/confirm function mid-recovery&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The malformed-file and changed-device-state tests specifically expose implementations that look correct in a demo and fail under real conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest summary
&lt;/h2&gt;

&lt;p&gt;Turns one common failure — running out of context mid-task — into a decision grounded in persisted evidence instead of "restart and hope." No unlimited context, no guarantee every task finishes safely, no replacement for human oversight on consequential actions.&lt;/p&gt;

&lt;p&gt;Firmware: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware&lt;/a&gt;&lt;br&gt;
Discord: &lt;a href="https://discord.com/invite/bcJavjcnYz" rel="noopener noreferrer"&gt;discord.com/invite/bcJavjcnYz&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
    </item>
    <item>
      <title>Browser Agents Can Use the Web. Aiden Is Built to Use the Device.</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Tue, 18 Aug 2026 18:51:36 +0000</pubDate>
      <link>https://dev.to/nataiden/browser-agents-can-use-the-web-aiden-is-built-to-use-the-device-5e22</link>
      <guid>https://dev.to/nataiden/browser-agents-can-use-the-web-aiden-is-built-to-use-the-device-5e22</guid>
      <description>&lt;p&gt;Perplexity Comet is capable inside a browser session. Aiden is being built as a device automation agent for work that moves across visible phone and computer interfaces — beyond what any browser session can reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  Comet deserves the comparison
&lt;/h2&gt;

&lt;p&gt;Perplexity positions Comet as an AI-first browser and personal assistant, available across Mac, Windows, iPhone, iPad, and Android, with a usable free tier. For research, page-level questions, tab-heavy synthesis, and supported web actions, that browser-native model is genuinely strong.&lt;/p&gt;

&lt;p&gt;The distinction isn't that browser agents are less useful — it's that every agent works through a control surface. Comet's surface is the browser session: tabs, webpages, browser-accessible documents, web apps. Aiden's surface is the connected device itself.&lt;/p&gt;

&lt;p&gt;This is a real, expanding category, not a single-product comparison:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Fellou&lt;/strong&gt; — explicit "self-driving browser" positioning for multi-step web tasks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dia&lt;/strong&gt; (The Browser Company) — strong cross-tab context, though more suggestive than autonomous&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Opera Neon&lt;/strong&gt; — experimental, agentic, broader creation-workflow emphasis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each reflects the same direction: AI moving from answering questions to participating in interface work. The practical difference is where that participation can continue.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the browser boundary actually shows up
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Workflow moment&lt;/th&gt;
&lt;th&gt;Browser-session strength&lt;/th&gt;
&lt;th&gt;Where the boundary appears&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Researching sources&lt;/td&gt;
&lt;td&gt;Web search, reading, tab comparison&lt;/td&gt;
&lt;td&gt;Task stays browser-contained&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Filling a web form&lt;/td&gt;
&lt;td&gt;Browser-rendered fields, on-page actions&lt;/td&gt;
&lt;td&gt;External identity checks or system dialogs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Saving findings&lt;/td&gt;
&lt;td&gt;Web notes, browser-accessible docs&lt;/td&gt;
&lt;td&gt;Native notes/desktop app needs another path&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Working with local files&lt;/td&gt;
&lt;td&gt;Downloads, web uploads&lt;/td&gt;
&lt;td&gt;File pickers, desktop software, permission prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Continuing on a phone&lt;/td&gt;
&lt;td&gt;Mobile browser context&lt;/td&gt;
&lt;td&gt;Native apps, device settings, cross-app handoffs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart LR
    A[User instruction] --&amp;gt; B{Current control surface}
    B --&amp;gt; C[Browser session]
    C --&amp;gt; D["Tabs, webpages, web apps"]
    D --&amp;gt; E[Browser-supported action]
    E --&amp;gt; F[Review browser outcome]
    B --&amp;gt; G[Connected device interface]
    G --&amp;gt; H["Browser, native app, desktop app, or system dialog"]
    H --&amp;gt; I[Observe visible state]
    I --&amp;gt; J[Propose next action]
    J --&amp;gt; K[User confirms, redirects, or stops]
    K --&amp;gt; L[Execute supported interaction]
    L --&amp;gt; M[Review outcome]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  How Aiden actually works
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;Aiden's firmware repo&lt;/a&gt; documents a development-board implementation: HDMI-based screen capture, USB HID input. It observes a connected screen and sends keyboard, pointer, or touch-style input — no app-specific integration required on the target device.&lt;/p&gt;

&lt;p&gt;That's evidence of a documented dev-board implementation. It's not a claim of universal compatibility, task-success guarantees, or consumer availability. Aiden's being developed for Android and iPhone workflows specifically, and the team is upfront that real-device interaction has real constraints — setup conditions, OS versions, accessibility settings, interface variability.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing between the two isn't a category war
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Need&lt;/th&gt;
&lt;th&gt;Browser-first (Comet)&lt;/th&gt;
&lt;th&gt;Device-level (Aiden)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Research across webpages&lt;/td&gt;
&lt;td&gt;Strong fit&lt;/td&gt;
&lt;td&gt;Relevant only if research continues onto a device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Native mobile app handoff&lt;/td&gt;
&lt;td&gt;Depends on integrations&lt;/td&gt;
&lt;td&gt;Core workflow category Aiden targets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Desktop application interaction&lt;/td&gt;
&lt;td&gt;Depends on external access paths&lt;/td&gt;
&lt;td&gt;Relevant when visible desktop interfaces matter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Consequential decisions&lt;/td&gt;
&lt;td&gt;User review required&lt;/td&gt;
&lt;td&gt;User confirmation/interruption stays central&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Aiden isn't presented as a Comet replacement. Use a browser agent for web research and browser-native tasks; use the device-level approach when a real interface handoff becomes necessary.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware&lt;/a&gt;&lt;br&gt;
Discord: &lt;a href="https://discord.com/invite/bcJavjcnYz" rel="noopener noreferrer"&gt;discord.com/invite/bcJavjcnYz&lt;/a&gt; — engineers active, technical questions welcome.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Does Aiden Store Your Data? A Straight Answer on Privacy and Self-Hosting</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Wed, 12 Aug 2026 14:08:52 +0000</pubDate>
      <link>https://dev.to/nataiden/does-aiden-store-your-data-a-straight-answer-on-privacy-and-self-hosting-4okn</link>
      <guid>https://dev.to/nataiden/does-aiden-store-your-data-a-straight-answer-on-privacy-and-self-hosting-4okn</guid>
      <description>&lt;p&gt;Short answer: our current dev-board architecture has no Aiden-hosted backend. Longer answer: that doesn't mean no data is ever stored anywhere, and we'd rather explain the actual data path than let you assume either way.&lt;/p&gt;

&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;

&lt;p&gt;Aiden runs on a bring-your-own-provider model. The board captures a connected device's display via HDMI capture, sends screenshots to a multimodal model endpoint &lt;strong&gt;you&lt;/strong&gt; configure, and controls the target device through USB HID (keyboard, pointer, touch). Voice works the same way — audio goes to the STT, LLM, and TTS endpoints you've selected.&lt;/p&gt;

&lt;p&gt;What that means concretely:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No Aiden-hosted backend in the current architecture.&lt;/li&gt;
&lt;li&gt;Screenshots, audio, and text go to &lt;em&gt;your configured endpoints&lt;/em&gt; — not to us.&lt;/li&gt;
&lt;li&gt;You can point it at a cloud provider, a self-hosted model, or something fully local.&lt;/li&gt;
&lt;li&gt;Firmware is open source — inspect it yourself.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is a deliberate split from the usual pattern where the product company, the storage layer, and the model provider are the same entity. We separated those roles on purpose.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it gets more nuanced
&lt;/h2&gt;

&lt;p&gt;Aiden also supports persistent context, preferences, and skill optimization. So "no backend" doesn't mean "nothing is ever stored" — a deployment can retain local context. We haven't yet published the exact schema, retention period, or deletion process for that, and we're not going to pretend we have.&lt;/p&gt;

&lt;p&gt;Same caveat applies to screenshots specifically: they may leave the board if you've configured a remote endpoint, and we haven't published a complete account of how caching/buffering works or what each provider retains on their end.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we haven't documented yet (full list, no spin)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Topic&lt;/th&gt;
&lt;th&gt;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Data retention periods&lt;/td&gt;
&lt;td&gt;Not published yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local memory deletion workflow&lt;/td&gt;
&lt;td&gt;Not published yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data export&lt;/td&gt;
&lt;td&gt;Not published yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Default logging/diagnostics&lt;/td&gt;
&lt;td&gt;Not published yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Telemetry/analytics use&lt;/td&gt;
&lt;td&gt;No public statement yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Storage jurisdictions&lt;/td&gt;
&lt;td&gt;Not published yet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Encryption/key management&lt;/td&gt;
&lt;td&gt;Not published yet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We're listing this because the absence of a published policy shouldn't be read either way — not as "they're hiding something" and not as "everything's fine." We just haven't written it up yet.&lt;/p&gt;

&lt;h2&gt;
  
  
  The part that actually matters for builders
&lt;/h2&gt;

&lt;p&gt;Your configuration is doing as much work as the hardware. A cloud endpoint, a self-hosted model, and a fully local model produce three different data-flow outcomes from the exact same physical device. Before you point Aiden at sensitive workflows, check what your chosen model/STT/TTS provider actually does with inputs — that's now part of your privacy surface, not an implementation detail.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware&lt;/a&gt;&lt;br&gt;
Discord: &lt;a href="https://discord.com/invite/bcJavjcnYz" rel="noopener noreferrer"&gt;discord.com/invite/bcJavjcnYz&lt;/a&gt; — our engineers answer technical questions directly.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>privacy</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Building Aiden: a physical AI agent device that plugs into any phone/computer over USB and operates it like a human would. Go + C++ + Python stack, no API needed. https://github.com/AidenAI-IO/aiden-firmware, AMA on the architecture if curious.</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Thu, 06 Aug 2026 07:23:16 +0000</pubDate>
      <link>https://dev.to/nataiden/building-aiden-a-physical-ai-agent-device-that-plugs-into-any-phonecomputer-over-usb-and-operates-21hk</link>
      <guid>https://dev.to/nataiden/building-aiden-a-physical-ai-agent-device-that-plugs-into-any-phonecomputer-over-usb-and-operates-21hk</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2Fdba704c46a475ce238345dfb06ad332dcc893c93bfc48ace8cc9a769652a21e4%2FAidenAI-IO%2Faiden-firmware" height="400" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - AidenAI-IO/aiden-firmware: AI Agent hardware for mobile phone · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            AI Agent hardware for mobile phone. Contribute to AidenAI-IO/aiden-firmware development by creating an account on GitHub.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
    <item>
      <title>AI Agents and Apps With No API: The Real Engineering Tradeoffs</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Tue, 04 Aug 2026 09:20:48 +0000</pubDate>
      <link>https://dev.to/nataiden/ai-agents-and-apps-with-no-api-the-real-engineering-tradeoffs-20ho</link>
      <guid>https://dev.to/nataiden/ai-agents-and-apps-with-no-api-the-real-engineering-tradeoffs-20ho</guid>
      <description>&lt;p&gt;"Just automate it through the UI" sounds simple until you're the one maintaining that integration. When an API is missing, incomplete, or unsuitable for a task, an agent can often operate through the visible interface instead, the same DOM, accessibility tree, or screen pixels a person would use. That's a real capability. It's also a different engineering problem than an API integration, not an easier one.&lt;/p&gt;

&lt;h2&gt;
  
  
  The interface as integration layer
&lt;/h2&gt;

&lt;p&gt;An API is built for software-to-software communication: defined actions, structured data, predictable error responses. Strip that away and an agent has to work with whatever's actually on screen:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A web page's DOM and browser state&lt;/li&gt;
&lt;li&gt;An accessibility tree exposing control names, roles, and values&lt;/li&gt;
&lt;li&gt;A desktop app's window and UI controls&lt;/li&gt;
&lt;li&gt;A mobile UI hierarchy&lt;/li&gt;
&lt;li&gt;Screen pixels interpreted via OCR or computer vision&lt;/li&gt;
&lt;li&gt;Standard keyboard, pointer, touch, and gesture input&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core loop changes shape: observe state, pick one bounded action, perform it, verify the result, then pause or recover if the evidence is insufficient. "Can click" isn't the bar. Whether the system can recognize uncertainty and stop safely is the actual bar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Six methods, ranked by how much structure you get
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;What it uses&lt;/th&gt;
&lt;th&gt;Best fit&lt;/th&gt;
&lt;th&gt;Main limitation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Browser automation&lt;/td&gt;
&lt;td&gt;DOM, browser protocol, page state&lt;/td&gt;
&lt;td&gt;Stable browser tools and web forms&lt;/td&gt;
&lt;td&gt;Selectors and page states can change&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Accessibility interaction&lt;/td&gt;
&lt;td&gt;Roles, labels, values, control hierarchy&lt;/td&gt;
&lt;td&gt;Accessible web/desktop/mobile UIs&lt;/td&gt;
&lt;td&gt;Metadata may be missing or inaccurate&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Screen and OCR interaction&lt;/td&gt;
&lt;td&gt;Pixels, screenshots, visible text&lt;/td&gt;
&lt;td&gt;Legacy apps, remote desktops&lt;/td&gt;
&lt;td&gt;Visual interpretation is less deterministic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keyboard/pointer/touch input&lt;/td&gt;
&lt;td&gt;Standard user input&lt;/td&gt;
&lt;td&gt;Cross-app and real-device tasks&lt;/td&gt;
&lt;td&gt;Needs pairing with reliable observation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RPA&lt;/td&gt;
&lt;td&gt;Rules, selectors, OCR, files&lt;/td&gt;
&lt;td&gt;Narrow, repeatable legacy workflows&lt;/td&gt;
&lt;td&gt;Exception handling grows over time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hybrid API + UI&lt;/td&gt;
&lt;td&gt;Approved APIs for some steps, UI for gaps&lt;/td&gt;
&lt;td&gt;Partially integrated workflows&lt;/td&gt;
&lt;td&gt;Requires careful state reconciliation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The pattern worth internalizing: &lt;strong&gt;pick the most structured permitted method for the specific task&lt;/strong&gt;, not the one with the broadest reach. Broad reach (screen + OCR) is also the least deterministic option, reach for it because you need to, not because it's the default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Browser automation&lt;/strong&gt; (&lt;a href="https://www.w3.org/TR/webdriver/" rel="noopener noreferrer"&gt;W3C WebDriver&lt;/a&gt;, &lt;a href="https://playwright.dev/docs/intro" rel="noopener noreferrer"&gt;Playwright&lt;/a&gt;) is usually the strongest option for stable web apps, locate by semantic role and label, wait for load state, verify the confirmation state actually appeared. Still breaks on dynamic rendering, nested frames, A/B tests, and expiring sessions, explicit post-transition checks matter more than assuming a click worked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Accessibility-tree interaction&lt;/strong&gt; (&lt;a href="https://www.w3.org/TR/wai-aria-1.2/" rel="noopener noreferrer"&gt;WAI-ARIA&lt;/a&gt;, &lt;a href="https://www.w3.org/TR/accname-1.2/" rel="noopener noreferrer"&gt;Accessible Name and Description Computation&lt;/a&gt;, plus platform frameworks like &lt;a href="https://learn.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-overview" rel="noopener noreferrer"&gt;Microsoft UI Automation&lt;/a&gt;, &lt;a href="https://developer.android.com/training/testing/other-components/ui-automator" rel="noopener noreferrer"&gt;Android UI Automator&lt;/a&gt;, &lt;a href="https://developer.apple.com/documentation/xctest" rel="noopener noreferrer"&gt;Apple XCTest&lt;/a&gt;) gives you a semantic layer instead of raw pixels, when the app actually implements accessibility correctly. When it doesn't, you're back to guessing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Screen and OCR interaction&lt;/strong&gt; is the fallback for legacy apps and remote desktops with no exposed structure at all, and it's exactly as fragile as it sounds. Least deterministic, most universally applicable, use it when nothing else works, not as a default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Authorization comes before method selection, not after
&lt;/h2&gt;

&lt;p&gt;This is the part that's easy to skip past: no-API access doesn't override terms of service, platform rules, or the account owner's actual permissions. Before picking a method, confirm the task is something the agent (and the person deploying it) is actually authorized to do. A capability existing isn't the same as it being sanctioned.&lt;/p&gt;

&lt;p&gt;Two hard lines, regardless of which method you're using:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CAPTCHAs and MFA prompts are boundaries, not obstacles.&lt;/strong&gt; Pause and hand control back to a person, or use a vendor-approved path. Never attempt to defeat them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Consequential actions need a human checkpoint.&lt;/strong&gt; Sending a message, submitting a form, changing account settings, moving money, anything hard to reverse, should require confirmation before it executes, no matter how confident the agent's reasoning looks in the logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What actually needs verification
&lt;/h2&gt;

&lt;p&gt;Real production systems working this way need instrumentation that API-only systems mostly don't:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screen-state capture at each step&lt;/li&gt;
&lt;li&gt;Action traces (what was observed, what was decided, what was sent)&lt;/li&gt;
&lt;li&gt;Replayable sessions for debugging failures after the fact&lt;/li&gt;
&lt;li&gt;Explicit post-action verification, not an assumption that the action succeeded&lt;/li&gt;
&lt;li&gt;Failure classification (expired session vs. layout change vs. genuinely blocked)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you're building or evaluating a system like this, the useful question isn't "can it click the button." It's "when the button isn't where it expected, what happens next, and can a human see exactly what the agent tried."&lt;/p&gt;

&lt;p&gt;We build &lt;a href="https://aidenai.io" rel="noopener noreferrer"&gt;Aiden&lt;/a&gt; around this exact problem for physical devices, HDMI-based screen capture plus USB HID input, no API dependency, verification and human confirmation built into the action loop rather than bolted on after. Repo: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Curious what verification patterns others here have found actually catch failures early, screenshot diffing, structured re-query of the accessibility tree, something else?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Command+V Silently Fails on iOS When a Keyboard and Mouse Are Both Present (Real Bug, Not Ours)</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Thu, 30 Jul 2026 14:38:46 +0000</pubDate>
      <link>https://dev.to/nataiden/commandv-silently-fails-on-ios-when-a-keyboard-and-mouse-are-both-present-real-bug-not-ours-1g8k</link>
      <guid>https://dev.to/nataiden/commandv-silently-fails-on-ios-when-a-keyboard-and-mouse-are-both-present-real-bug-not-ours-1g8k</guid>
      <description>&lt;p&gt;We build &lt;a href="https://aidenai.io" rel="noopener noreferrer"&gt;Aiden&lt;/a&gt;, a physical mobile AI agent that connects to a phone over USB and presents itself as a keyboard and mouse to reproduce real-world iPhone interactions. During real-device testing, we hit a bug that took controlled experiments to actually isolate, and it turned out to live inside iOS itself, not our stack.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  The symptom
&lt;/h2&gt;

&lt;p&gt;Ordinary letters worked fine. Modifier-key combinations intermittently didn't.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Input&lt;/th&gt;
&lt;th&gt;Expected result&lt;/th&gt;
&lt;th&gt;Affected result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;x&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inserts &lt;code&gt;x&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;Inserts &lt;code&gt;x&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Shift+X&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Inserts &lt;code&gt;X&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;May insert lowercase &lt;code&gt;x&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Command+A&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Selects all&lt;/td&gt;
&lt;td&gt;No selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Command+V&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Pastes into the active field&lt;/td&gt;
&lt;td&gt;No paste action&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Our write to the Linux USB Gadget device at &lt;code&gt;/dev/hidg0&lt;/code&gt; completed successfully every time. Nothing happened on the phone's screen.&lt;/p&gt;

&lt;p&gt;Two iOS settings matter here: &lt;strong&gt;AssistiveTouch&lt;/strong&gt; has to be enabled for an external mouse to work on iPhone at all, and &lt;strong&gt;Show Onscreen Keyboard&lt;/strong&gt; (inside AssistiveTouch) keeps the software keyboard available while a physical keyboard is connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  First finding: it's not the HID layer
&lt;/h2&gt;

&lt;p&gt;System logs distinguish plain keyboard events from modifier-based key commands, and log the &lt;code&gt;KeyboardFocus&lt;/code&gt; target each command resolves to.&lt;/p&gt;

&lt;p&gt;Working case:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd-v -&amp;gt; &amp;lt;keyboardFocus; pid: 9085; token: MobileNotes&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Broken case, identical keypress:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cmd-v -&amp;gt; &amp;lt;keyboardFocus; pid: 3738; token: com.apple.springboard&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;iOS recognized &lt;code&gt;Command+V&lt;/code&gt; correctly both times. In the broken case, it routed the resulting command to SpringBoard (the Home Screen process, hosting a lot of system-level interactions) instead of the actual foreground app. The keystroke arrived fine, the routing afterward is where it breaks. We call this "iOS keyboard focus loss" internally, not an Apple term, just our shorthand: the keyboard stays connected, plain keys still land correctly, but modifier commands stop reaching the foreground app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ruling things out
&lt;/h2&gt;

&lt;p&gt;Checked and did &lt;strong&gt;not&lt;/strong&gt; fix it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full Keyboard Access toggle (Settings &amp;gt; Accessibility &amp;gt; Keyboards &amp;amp; Typing), reproduced with it both on and off&lt;/li&gt;
&lt;li&gt;Boot Keyboard &lt;code&gt;protocol=1/subclass=1&lt;/code&gt; declaration&lt;/li&gt;
&lt;li&gt;LED output behavior&lt;/li&gt;
&lt;li&gt;Apple keyboard descriptor and handshake sequence&lt;/li&gt;
&lt;li&gt;Keystroke timing&lt;/li&gt;
&lt;li&gt;Stale HID file descriptors after USB re-enumeration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some of these fixed real, separate edge cases. None touched the core failure.&lt;/p&gt;

&lt;p&gt;We also suspected toggling AssistiveTouch off/on after connecting broke the keyboard session, since that sequence reliably triggered the bug. A later round of tests removed AssistiveTouch toggling entirely and just added a mouse to an already-stable keyboard-only setup. Bug came back anyway. Demoted from root cause to one of several triggers.&lt;/p&gt;

&lt;h2&gt;
  
  
  The A/B test that actually isolated it
&lt;/h2&gt;

&lt;p&gt;With AssistiveTouch left on throughout:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test setup&lt;/th&gt;
&lt;th&gt;Device topology&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Aiden emulated composite device&lt;/td&gt;
&lt;td&gt;Keyboard + pointer/mouse&lt;/td&gt;
&lt;td&gt;Intermittently routed to SpringBoard when switching between apps&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Physical gaming keyboard&lt;/td&gt;
&lt;td&gt;Keyboard + firmware-declared virtual mouse&lt;/td&gt;
&lt;td&gt;Command/Shift/Option commands routed to SpringBoard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Aiden keyboard-only&lt;/td&gt;
&lt;td&gt;Keyboard-only, pointer: 0&lt;/td&gt;
&lt;td&gt;32 Command+V attempts, 0 SpringBoard-only events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Same keyboard + physical USB mouse&lt;/td&gt;
&lt;td&gt;Keyboard-only + separate mouse&lt;/td&gt;
&lt;td&gt;11 attempts, 4 SpringBoard-only events&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Keychron K2 Max, Bluetooth mode&lt;/td&gt;
&lt;td&gt;BLE keyboard + mouse collection&lt;/td&gt;
&lt;td&gt;32 attempts, 26 SpringBoard-only events&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The critical pair is rows 3 and 4: identical keyboard implementation, identical iOS settings, identical test procedure. Plugging in an ordinary USB mouse brought the failure back. Unplugging it, all 22 follow-up runs succeeded.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion: with AssistiveTouch enabled, if iOS detects pointer or mouse capability on the connected device at the same time as a keyboard, it can misroute modifier-based commands to SpringBoard instead of the foreground app.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This isn't specific to our HID implementation, it reproduces on a real gaming keyboard declaring a virtual mouse, and on a Bluetooth keyboard with a mouse collection in its report descriptor. That rules out an Aiden-specific compatibility explanation. The logs place the fault boundary inside iOS: the system receives the modifier key, generates the correct key command, then routes &lt;code&gt;KeyboardFocus&lt;/code&gt; to SpringBoard anyway. Without iOS source access, we can't say &lt;em&gt;why&lt;/em&gt; pointer/mouse capability affects that resolution, only that it reliably does.&lt;/p&gt;

&lt;p&gt;We also tried substituting an HID touchscreen/digitizer for the mouse, keeping &lt;code&gt;pointer: 0&lt;/code&gt;. Six Command+V attempts, all landed correctly. Further support for the pointer/mouse link, but any keyboard interface present still makes iOS hide the software keyboard, and a one-time Eject only restores it briefly, so this isn't viable for our actual product experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our workaround
&lt;/h2&gt;

&lt;p&gt;Aiden only needs modifier keys when executing a shortcut, and the trigger is tied specifically to pointer/mouse capability being present. So:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Two separate USB HID profiles: normal operation keeps keyboard + pointer; a modifier-key action first re-enumerates to keyboard-only&lt;/li&gt;
&lt;li&gt;Different USB Product IDs and serial numbers between the two profiles, so iOS doesn't reuse stale state from the mouse-equipped profile&lt;/li&gt;
&lt;li&gt;Once the shortcut completes, pointer capability is restored&lt;/li&gt;
&lt;li&gt;Switching scope covers a whole agent action, not a single keypress, to avoid the software keyboard popping and retracting repeatedly mid-action&lt;/li&gt;
&lt;li&gt;The normal profile is restored on action completion, error, cancellation, or panic cleanup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be direct: this is a workaround, not a fix. For the brief window a modifier key needs to take effect, we simply don't let iOS see pointer/mouse capability at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  Has anyone else hit this?
&lt;/h2&gt;

&lt;p&gt;It reproduces on hardware that has nothing to do with us, so if you're driving iOS with an external keyboard plus pointer and have seen a shortcut silently fail, this might be why.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ios</category>
      <category>debugging</category>
      <category>hid</category>
      <category>agents</category>
    </item>
    <item>
      <title>AI Agent vs Automation App: Why 'It Taps Like You Do' Matters</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Tue, 28 Jul 2026 14:09:19 +0000</pubDate>
      <link>https://dev.to/nataiden/ai-agent-vs-automation-app-why-it-taps-like-you-do-matters-4k60</link>
      <guid>https://dev.to/nataiden/ai-agent-vs-automation-app-why-it-taps-like-you-do-matters-4k60</guid>
      <description>&lt;p&gt;"Just use an AI agent instead of automation" and "just use automation instead of an agent" are both wrong the same amount of the time. The actual question isn't which category is better, it's which control model your workflow needs.&lt;/p&gt;

&lt;h2&gt;
  
  
  It's a control-model difference, not a generation gap
&lt;/h2&gt;

&lt;p&gt;A workflow automation app follows a predefined pattern: trigger happens, run a fixed set of actions. Predictable, testable, brittle when the input or integration changes shape.&lt;/p&gt;

&lt;p&gt;An AI agent interprets a goal, chooses steps, uses tools, and adapts to context within boundaries (this is close to how &lt;a href="https://www.ibm.com/think/topics/ai-agents" rel="noopener noreferrer"&gt;IBM frames it&lt;/a&gt; too). More flexible, harder to evaluate with a simple pass/fail test.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Automation app&lt;/th&gt;
&lt;th&gt;AI agent&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Follows&lt;/td&gt;
&lt;td&gt;Predefined rules and triggers&lt;/td&gt;
&lt;td&gt;Goals, context, tools, policies&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Best fit&lt;/td&gt;
&lt;td&gt;Stable, repeatable workflows&lt;/td&gt;
&lt;td&gt;Fragmented or ambiguous tasks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main strength&lt;/td&gt;
&lt;td&gt;Predictability&lt;/td&gt;
&lt;td&gt;Adaptability&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Main risk&lt;/td&gt;
&lt;td&gt;Brittleness when inputs change&lt;/td&gt;
&lt;td&gt;Misreading context, wrong next step&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Human role&lt;/td&gt;
&lt;td&gt;Configure and monitor&lt;/td&gt;
&lt;td&gt;Observe, interrupt, redirect, confirm&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Simple rule: every step known in advance, reach for automation. Path depends on screen state or ambiguous intent, an agent is worth the added complexity.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where automation apps actually break down
&lt;/h2&gt;

&lt;p&gt;Automation apps are the right call more often than agent enthusiasm suggests. But real workflows expose gaps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No API exists for the action you need&lt;/li&gt;
&lt;li&gt;Connectors expose only part of an app's functionality&lt;/li&gt;
&lt;li&gt;OAuth scopes, admin approvals, or platform rules block execution&lt;/li&gt;
&lt;li&gt;UI scripts break when layouts or labels change&lt;/li&gt;
&lt;li&gt;Branching logic gets ugly once the task needs judgment, not rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's not a knock on automation apps, they're optimized for known paths. They're excellent at "when X happens, do Y." They're bad at "look at what's on screen, decide what matters, and ask before submitting."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[User task] --&amp;gt; B{Is every step known in advance?}
    B -- Yes --&amp;gt; C[Use a workflow automation app]
    B -- No --&amp;gt; D{Does the task depend on screen state or context?}
    D -- Yes --&amp;gt; E[Consider AI agent automation]
    D -- No --&amp;gt; F[Use a simple script or manual process]
    E --&amp;gt; G{Could the action have real-world consequences?}
    G -- Yes --&amp;gt; H[Pause for human confirmation]
    G -- No --&amp;gt; I[Proceed within defined boundaries]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  "It taps like you do" is an observability claim, not a trust claim
&lt;/h2&gt;

&lt;p&gt;UI interaction automation means the system operates the visible interface: clicking, typing, navigating, reading the screen. &lt;a href="https://www.anthropic.com/news/developing-computer-use" rel="noopener noreferrer"&gt;Anthropic's computer use&lt;/a&gt; does this for Claude; it's explicitly labeled beta with acknowledged risks, worth reading directly rather than assuming maturity.&lt;/p&gt;

&lt;p&gt;The phrase gets misread constantly. What it actually buys you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent acts through the visible UI, same as a human would&lt;/li&gt;
&lt;li&gt;You can watch the sequence of actions as it happens&lt;/li&gt;
&lt;li&gt;You can review what was visible at each step&lt;/li&gt;
&lt;li&gt;The system can pause before something consequential&lt;/li&gt;
&lt;li&gt;You can interrupt or redirect mid-task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What it does &lt;strong&gt;not&lt;/strong&gt; mean: that the agent understands consequences the way a person would. Visible tapping improves inspectability. It does not improve correctness. Those are different properties and conflating them is where overconfidence creeps in.&lt;/p&gt;

&lt;p&gt;This is genuinely different from hidden API automation, which can be faster when good APIs exist, but gives you less visible context about what actually happened during a run.&lt;/p&gt;

&lt;h2&gt;
  
  
  The control points that matter for any UI-level agent
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Control point&lt;/th&gt;
&lt;th&gt;Why it matters&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Visible execution&lt;/td&gt;
&lt;td&gt;You see what's happening instead of trusting a black box&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Interruptibility&lt;/td&gt;
&lt;td&gt;Stop the task when the path looks wrong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Redirection&lt;/td&gt;
&lt;td&gt;Correct the goal without restarting from zero&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Confirmation gates&lt;/td&gt;
&lt;td&gt;Consequential actions pause for approval&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action traces&lt;/td&gt;
&lt;td&gt;Developers can inspect what happened during a run&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boundaries&lt;/td&gt;
&lt;td&gt;Defined tools, allowed actions, stop conditions&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery paths&lt;/td&gt;
&lt;td&gt;Stop, retry, escalate, or ask, don't just fail silently&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Consequential actions specifically deserve a hard confirmation gate: sending external messages, submitting forms, deleting or overwriting data, changing account settings, initiating payments. No amount of model capability substitutes for a pause here.&lt;/p&gt;

&lt;p&gt;Evaluation changes too. Standard automation gets tested with logs and integration checks. UI-level agents need: screen-state capture, step-by-step action traces, replayable sessions, failure classification, before/after visual review, and confirmation-behavior tests specifically.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flowchart TD
    A[Agent observes current screen] --&amp;gt; B[Agent proposes next action]
    B --&amp;gt; C{Low-risk navigation?}
    C -- Yes --&amp;gt; D[Proceed visibly]
    C -- No --&amp;gt; E{Could this affect another person, account, data, or money?}
    E -- Yes --&amp;gt; F[Pause for human confirmation]
    E -- No --&amp;gt; G[Proceed within policy]
    D --&amp;gt; H{User interrupts?}
    H -- Yes --&amp;gt; I[Stop or redirect]
    H -- No --&amp;gt; J[Continue to next screen state]
    F --&amp;gt; K{User approves?}
    K -- Yes --&amp;gt; J
    K -- No --&amp;gt; L[Cancel or revise plan]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Where Aiden sits in this
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://aidenai.io" rel="noopener noreferrer"&gt;Aiden&lt;/a&gt; is a physical mobile AI agent device built around real smartphone and computer interfaces, not a chatbot, not a conventional automation connector. The current development-board architecture uses HDMI-based screen capture and USB HID input, with a Go-based agent runtime that sends screenshots to a configured multimodal model and writes resulting input commands to device nodes. In plain terms: it sees the screen and acts through input, rather than depending on app-specific automation APIs existing at all.&lt;/p&gt;

&lt;p&gt;That matters specifically for the "no API" failure mode above. If the app you need to operate has no exposed API and no clean accessibility hooks, a UI-level agent doesn't care, it drives the interface the same way a person would.&lt;/p&gt;

&lt;p&gt;Real setup caveat, stated plainly rather than glossed over: &lt;strong&gt;iOS control currently requires AssistiveTouch to be enabled&lt;/strong&gt; on the target device. That's a genuine setup step, not a one-tap connection. Android and iPhone workflows are both in active development, but the path isn't identical on both yet.&lt;/p&gt;

&lt;p&gt;For anyone evaluating this kind of system, the useful questions aren't "can it tap":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What screen state did it act on?&lt;/li&gt;
&lt;li&gt;What model made the next-action decision?&lt;/li&gt;
&lt;li&gt;What input event got sent, and what happened after?&lt;/li&gt;
&lt;li&gt;Where did it pause, and could a human actually stop it there?&lt;/li&gt;
&lt;li&gt;Can the run be reproduced or debugged after the fact?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's the actual engineering case for "it taps like you do", it turns agent behavior into something inspectable instead of a background process you have to trust blind.&lt;/p&gt;

&lt;h2&gt;
  
  
  The practical takeaway
&lt;/h2&gt;

&lt;p&gt;Reach for automation when the task is stable, repetitive, trigger-based, and API-accessible. Reach for an agent when the task is fragmented across apps, dependent on visual screen state, or too ambiguous to express as fixed rules.&lt;/p&gt;

&lt;p&gt;Agents don't make automation obsolete, they extend what's attemptable into the territory where workflows cross from structured data into messy real interfaces. That extension is exactly why the guardrails above matter more, not less.&lt;/p&gt;

&lt;p&gt;Repo (HID config, capture pipeline, agent runtime): &lt;a href="https://github.com/AidenAI-IO/aiden-firmware" rel="noopener noreferrer"&gt;github.com/AidenAI-IO/aiden-firmware&lt;/a&gt;. Community and engineering discussion: &lt;a href="https://discord.com/invite/bcJavjcnYz" rel="noopener noreferrer"&gt;Aiden Discord&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Curious how others here draw the line between "add a confirmation gate" and "just don't automate this step at all", where's that boundary sat for you in practice?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>automation</category>
    </item>
    <item>
      <title>What Can an AI Agent Actually Do on Your Phone? 12 Tasks, and the Execution Problem Behind Them</title>
      <dc:creator>Nat</dc:creator>
      <pubDate>Tue, 28 Jul 2026 08:40:25 +0000</pubDate>
      <link>https://dev.to/nataiden/what-can-an-ai-agent-actually-do-on-your-phone-12-tasks-and-the-execution-problem-behind-them-8m5</link>
      <guid>https://dev.to/nataiden/what-can-an-ai-agent-actually-do-on-your-phone-12-tasks-and-the-execution-problem-behind-them-8m5</guid>
      <description>&lt;p&gt;Most "AI agent on your phone" demos show the happy path: one clean voice command, one flawless run, cut before anything breaks. The interesting engineering is in everything the demo skips: permissions, app support, screen state that lies, and the confirmation boundary before an irreversible action.&lt;/p&gt;

&lt;p&gt;This post walks through the 12 tasks phone agents are actually asked to do, but from an execution angle rather than a feature-list one: what each task needs to touch, where it gets hard, and why the &lt;em&gt;interface an agent uses to act&lt;/em&gt; changes what's even possible. At the end I'll get into the screen-capture + USB HID approach we're building with &lt;a href="https://aidenai.io" rel="noopener noreferrer"&gt;Aiden&lt;/a&gt;, because it makes a different set of trade-offs than the app-only assistants most of these tasks assume.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real question isn't "can AI control my phone"
&lt;/h2&gt;

&lt;p&gt;It's "which tasks are safe, useful, and realistic &lt;em&gt;today&lt;/em&gt; — and what does the agent have to touch to do them?"&lt;/p&gt;

&lt;p&gt;Three execution models are competing right now, and they fail differently:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;App/API assistants&lt;/strong&gt; — call documented APIs. Reliable where an API exists, blind where it doesn't.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;OS-level integrations&lt;/strong&gt; (Apple Intelligence, Copilot+) — deep access, but locked to one vendor's hardware and app set.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Screen-aware agents&lt;/strong&gt; — interpret the UI visually and drive it. Work anywhere there's a screen, but inherit every ambiguity of reading pixels.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Keep those three in mind; each of the 12 tasks below lands differently depending on which one you're using.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 12 tasks, ranked by how hard they actually are
&lt;/h2&gt;

&lt;p&gt;Feasibility varies a lot. Reminders and research summaries are reliable today. Calendar, email, messages, meetings, travel, shopping, expenses and smart-home sit in a solid middle tier. Form filling and health support are the least mature — either because they touch fiddly interfaces or because they edge toward decisions that should stay with a human.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Task&lt;/th&gt;
&lt;th&gt;Hard part (the bit demos skip)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Reminders / task capture&lt;/td&gt;
&lt;td&gt;Almost none. Parse natural language → structured task. The reliable baseline.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Calendar scheduling&lt;/td&gt;
&lt;td&gt;Timezone math, conflict detection, write-access confirmation before it sends invites.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Email triage + draft&lt;/td&gt;
&lt;td&gt;Drafting is easy; &lt;strong&gt;sending to the wrong recipient&lt;/strong&gt; is the failure that kills trust.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;Message summarization&lt;/td&gt;
&lt;td&gt;Group-chat context windows and knowing which thread "that" refers to.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;Research summarization&lt;/td&gt;
&lt;td&gt;Source quality and not fabricating a citation. Reliable when read-only.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Meeting notes + follow-ups&lt;/td&gt;
&lt;td&gt;Audio capture permissions and turning talk into action items without hallucinating owners.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Travel planning&lt;/td&gt;
&lt;td&gt;Multi-app, multi-step state that goes stale mid-run (prices, availability).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;Form filling / navigation&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;The API-less wall.&lt;/strong&gt; No endpoint, no accessibility tree — this is where execution model matters most.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;Shopping / price comparison&lt;/td&gt;
&lt;td&gt;Cross-site state, and the confirmation boundary right before "buy".&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;Receipt / expense organization&lt;/td&gt;
&lt;td&gt;OCR quality and structured extraction from messy inputs.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;11&lt;/td&gt;
&lt;td&gt;Smart-home automation&lt;/td&gt;
&lt;td&gt;Device API fragmentation across ecosystems.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;12&lt;/td&gt;
&lt;td&gt;Health / fitness habits&lt;/td&gt;
&lt;td&gt;Non-clinical only. The hard part is &lt;em&gt;refusing&lt;/em&gt; to give medical advice.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Two of these — &lt;strong&gt;8 (form filling / navigation)&lt;/strong&gt; and &lt;strong&gt;9 (shopping)&lt;/strong&gt; — are where the execution model stops being an implementation detail and becomes the whole game. Let's zoom in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 8 is where most agents hit a wall
&lt;/h2&gt;

&lt;p&gt;Form filling and in-app navigation is the task that separates the three models, because a huge number of real apps expose &lt;strong&gt;no API and no clean accessibility tree&lt;/strong&gt;. An app/API assistant simply can't act there. An OS-level integration can, but only inside its vendor's boundaries.&lt;/p&gt;

&lt;p&gt;This is the case for a screen-level approach: if the agent can &lt;em&gt;see&lt;/em&gt; the rendered screen and &lt;em&gt;send input&lt;/em&gt; like a human does, it doesn't need the app to cooperate. No SDK, no integration, no waiting for a vendor to ship an API.&lt;/p&gt;

&lt;p&gt;The catch — and it's a real one — is &lt;strong&gt;observability&lt;/strong&gt;. If you only send input blindly, you can't tell whether the tap landed, whether a spinner resolved to success or an error, or whether the screen even changed. Reading pixels to infer state is where screen agents get brittle.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a screen-capture + USB HID approach handles it
&lt;/h2&gt;

&lt;p&gt;This is the part I actually work on, so here's the concrete version rather than the marketing one.&lt;/p&gt;

&lt;p&gt;Aiden is a physical mobile AI agent device: a small board that plugs into a phone or computer over USB. It &lt;strong&gt;captures the target's display over HDMI&lt;/strong&gt; and &lt;strong&gt;sends actions back as a standard USB HID keyboard/mouse&lt;/strong&gt;. To the phone, it looks like an external monitor plus a keyboard — no app installed on the target device, no root, no ADB.&lt;/p&gt;

&lt;p&gt;That combination is a direct answer to the Task 8 wall &lt;em&gt;and&lt;/em&gt; the observability problem underneath it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Acting without an API&lt;/strong&gt; — HID input drives any app that accepts keyboard/pointer/touch, which is all of them. The app doesn't need to expose anything.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Closing the observability gap&lt;/strong&gt; — because Aiden also reads the screen over HDMI capture, the same loop that acts can &lt;em&gt;see&lt;/em&gt; the result, instead of firing input blindly.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Privacy posture&lt;/strong&gt; — there's no Aiden backend; screenshots and audio go only to whatever model endpoint you configure, and the whole thing is self-hostable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the current development board, the agent runtime runs on-device (Go), with frame capture, a voice loop with VAD, the decision loop, and HID output as independent goroutines. It's a dev board, not a finished consumer product — the repo is the open-source firmware and agent runtime, not a shipping SKU:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;github.com/AidenAI-IO/aiden-hardware-demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The honest caveats stand: reading pixels to verify an action still breaks when loading states lie, and any screen-reading agent inherits the prompt-injection surface of whatever it looks at. Those are unsolved for &lt;em&gt;everyone&lt;/em&gt; in this space, not just us — worth saying plainly on a dev audience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The pattern across all 12 tasks
&lt;/h2&gt;

&lt;p&gt;Whichever model you build on, the tasks that work today share a shape: &lt;strong&gt;bounded workflow, low blast radius, human confirmation before anything irreversible.&lt;/strong&gt; Reminders and summaries are safe because the worst case is a bad note. Email, payments, account changes and health decisions are exactly where you want an explicit confirmation gate, no matter how good the model is.&lt;/p&gt;

&lt;p&gt;The useful design question isn't "can the agent do more?" It's "can the user reliably stop or redirect it mid-run, and does the agent verify before it commits?"&lt;/p&gt;

&lt;h2&gt;
  
  
  FAQ
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Which of these tasks are safe to automate without confirmation?&lt;/strong&gt;&lt;br&gt;
Reminders, research summaries, and read-only organization. Anything that sends, buys, changes an account, or touches health decisions should require an explicit user confirmation step.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why can't a normal app-based assistant do form filling in every app?&lt;/strong&gt;&lt;br&gt;
Because many apps expose no API and no accessibility tree. Without one, an API-based assistant has nothing to call. Screen-level approaches get around this by reading the rendered UI and sending human-style input instead.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the catch with screen-reading agents?&lt;/strong&gt;&lt;br&gt;
Observability and injection. Inferring success from a re-read of the screen breaks when loading states lie, and an agent that reads screens will read whatever an attacker puts on them. Both are open problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Does Aiden run on the phone?&lt;/strong&gt;&lt;br&gt;
No — it's an external board that plugs in over USB, captures the screen over HDMI, and sends input over USB HID. Nothing is installed on the target phone. It's currently a development board, and the firmware/agent runtime is open source.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can I self-host the model?&lt;/strong&gt;&lt;br&gt;
Yes. There's no vendor backend in the loop; model, STT and TTS endpoints are whatever you configure, so you can keep everything on your own infrastructure.&lt;/p&gt;




&lt;p&gt;If the execution side of this is interesting, the firmware, HID gadget config and capture pipeline are all in the open-source repo: &lt;code&gt;github.com/AidenAI-IO/aiden-firmware&lt;/code&gt;. More on the project at &lt;a href="https://aidenai.io" rel="noopener noreferrer"&gt;aidenai.io&lt;/a&gt;. Curious how others here are handling the observability problem on screen-driven agents — verifying an action actually landed is the part I keep coming back to.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mobile</category>
      <category>opensource</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
