<?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: Joey 、</title>
    <description>The latest articles on DEV Community by Joey 、 (@joey020907).</description>
    <link>https://dev.to/joey020907</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%2F4079773%2F1e9137a0-daed-4454-bf0c-9e261cec6ba8.png</url>
      <title>DEV Community: Joey 、</title>
      <link>https://dev.to/joey020907</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/joey020907"/>
    <language>en</language>
    <item>
      <title>Remote-controlling your computer from your phone: the security traps that worry me</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Mon, 17 Aug 2026 16:26:30 +0000</pubDate>
      <link>https://dev.to/joey020907/remote-controlling-your-computer-from-your-phone-the-security-traps-that-worry-me-3am</link>
      <guid>https://dev.to/joey020907/remote-controlling-your-computer-from-your-phone-the-security-traps-that-worry-me-3am</guid>
      <description>&lt;h1&gt;
  
  
  Remote-controlling the agent on your computer from your phone: what security traps worry you most?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;An open security discussion. I'll share four real concerns I've hit or thought about. I want your fuller list — I'm sure there's stuff I haven't thought of.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Remote control has always been a tug-of-war between "convenient" and "safe." After turning my phone into a remote for the agent on my computer, I've put together a few &lt;strong&gt;real&lt;/strong&gt; security concerns and would love to hear your complete checklist — there's definitely things I'm missing.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three I've handled so far
&lt;/h2&gt;

&lt;p&gt;Building &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt; (drive your desktop agent from your phone over 4G/5G), I dealt with at least three layers:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Token auth&lt;/strong&gt;: every endpoint requires &lt;code&gt;Authorization: Bearer&lt;/code&gt;; the token lives in a local &lt;code&gt;config.json&lt;/code&gt;, never in any repo (I scrubbed history once already).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approval cards&lt;/strong&gt;: before the agent does something risky (writing files, running commands) → a "authorization needed" card pops on the phone; allow/reject is a human decision. I believe this is the &lt;strong&gt;floor&lt;/strong&gt; for remote control — when you're not at the computer, authorization has to be interceptable.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Network isolation&lt;/strong&gt;: recommend Tailscale private-network direct access, don't expose the port raw to the public internet; if public, go through a reverse proxy + strong token.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The ones I'm honestly unsure about
&lt;/h2&gt;

&lt;p&gt;These have no clear answer from me yet — open to being corrected:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;MITM on 4G/5G&lt;/strong&gt;: Tailscale encrypts, but if exposed without it, is a bearer token over HTTP acceptable?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Agent privilege boundary&lt;/strong&gt;: an approval card can only block what I &lt;em&gt;know&lt;/em&gt; to block. Could an agent chain harmless steps into a harmful outcome (read a bunch of files, then quietly write one)?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lost phone&lt;/strong&gt;: unlocked phone = control over your desktop agent. Should there be a second factor / device PIN / expiring tokens?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Prompt injection on the model&lt;/strong&gt;: if I feed the agent a crafted prompt, could it run something unexpected? How granular should permissions really be?&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What I most want from you
&lt;/h2&gt;

&lt;p&gt;A good security checklist for remote control is something the community knows better than one person. Let's hear:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;When you remote-control your own computer, &lt;strong&gt;which class of risk worries you most&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;Besides "authorization interception", what mechanism do you consider &lt;strong&gt;essential&lt;/strong&gt;?&lt;/li&gt;
&lt;li&gt;What's your &lt;strong&gt;one-line objection&lt;/strong&gt; to "control your computer from your phone"?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I want to turn this into an &lt;strong&gt;open-source security checklist for remote-control tools&lt;/strong&gt; (and fold it into the project's &lt;code&gt;SECURITY.md&lt;/code&gt; if it's useful), so every reply gets read and credited.&lt;/p&gt;




&lt;p&gt;Project (MIT): &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;br&gt;
My security-ish implementation is open for review: &lt;code&gt;src/transport-lan.js&lt;/code&gt; (auth / approval relay)&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>security</category>
      <category>opensource</category>
      <category>selfhosted</category>
    </item>
    <item>
      <title>Your agent asked a question and froze the queue for 10 min — how do you all handle ask_user_question?</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Mon, 17 Aug 2026 16:26:27 +0000</pubDate>
      <link>https://dev.to/joey020907/your-agent-asked-a-question-and-froze-the-queue-for-10-min-how-do-you-all-handle-18g2</link>
      <guid>https://dev.to/joey020907/your-agent-asked-a-question-and-froze-the-queue-for-10-min-how-do-you-all-handle-18g2</guid>
      <description>&lt;h1&gt;
  
  
  Your agent casually asked a question and froze the queue for 10 minutes — how do you all handle &lt;code&gt;ask_user_question&lt;/code&gt;?
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;A real pain point. I'll share my solution and the traps I hit, but I really want to hear how the community actually deals with it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Quick one for everyone: &lt;strong&gt;do your agents randomly stop to ask you questions? And what happens to the running task when they do?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here's what happened to me: DeepSeek Harness's agent calls &lt;code&gt;ask_user_question&lt;/code&gt; mid-task — "should this module be sync or async?" "OK to run this high-risk command?" Sounds reasonable. But it deadlocked my &lt;strong&gt;entire task queue for 10 minutes&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem: a question = a silent deadlock
&lt;/h2&gt;

&lt;p&gt;The worst part: &lt;strong&gt;it doesn't error.&lt;/strong&gt; The task just hangs there, &lt;code&gt;pending&lt;/code&gt; keeps climbing, you think it's thinking — but it's actually waiting for a human answer that will never come. Because the question goes through the &lt;strong&gt;question channel&lt;/strong&gt; (&lt;code&gt;question/requested&lt;/code&gt;), which is &lt;em&gt;completely separate&lt;/em&gt; from the approval channel (&lt;code&gt;approval/requested&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;My first relay only listened to approvals, so:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Agent stops on the computer, waiting for a user
      ↓
question-channel messages silently dropped by my relay
      ↓
phone has no idea
      ↓
task hangs forever until timeout
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It took me two days to realize: it wasn't DSH hanging — &lt;strong&gt;the question just never reached a human.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  My fix: turn questions into "your answer needed" cards
&lt;/h2&gt;

&lt;p&gt;While building &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt; (remote-control your desktop agent from your phone), I made questions a &lt;strong&gt;card&lt;/strong&gt; that drops right into the message stream:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent asks → phone shows "your answer needed" card&lt;/li&gt;
&lt;li&gt;Pick an option / type a custom answer / skip&lt;/li&gt;
&lt;li&gt;Answer it and the task continues; ignore it and it waits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Protocol has to match the official Web GUI exactly (&lt;code&gt;{ok:true, value:{sessionId, answer:{answers:[{id, selected}]}}}&lt;/code&gt;), or DSH won't accept it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I'd really like to hear
&lt;/h2&gt;

&lt;p&gt;My fix only handles the "phone side." I want the broader community's practice:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Do you let agents ask you questions at all, or disable &lt;code&gt;ask_user_question&lt;/code&gt;?&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Granularity&lt;/strong&gt;: which questions are worth interrupting a human for, and which should the agent just decide?&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Async handling&lt;/strong&gt;: when a question blocks a task, what does your queue do — block, skip, or run around it?&lt;/li&gt;
&lt;li&gt;Has anyone set a "question budget" per task, or use an alternative tool?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Honestly my current stance is conservative (ask only if it must, always interrupt). But I suspect that's not optimal — &lt;strong&gt;"when to interrupt a human" is probably the deeper question than "how to interrupt."&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Would love to hear your practices below. And if you've had an agent-question deadlock too, drop a comment so I can gauge how common this actually is.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Implementation is open source (MIT): &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>deepseek</category>
      <category>agents</category>
      <category>ai</category>
      <category>productivity</category>
    </item>
    <item>
      <title>We made a 31-second promo to say one thing: your phone is the best remote for your agent</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 09:07:23 +0000</pubDate>
      <link>https://dev.to/joey020907/we-made-a-31-second-promo-to-say-one-thing-your-phone-is-the-best-remote-for-your-agent-2j1c</link>
      <guid>https://dev.to/joey020907/we-made-a-31-second-promo-to-say-one-thing-your-phone-is-the-best-remote-for-your-agent-2j1c</guid>
      <description>&lt;h1&gt;
  
  
  We made a 31-second promo to say one thing: your phone is the best remote for your agent
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;The DeepSeek Phone Harness promo is live. 31 seconds, 8 shots, one message: &lt;strong&gt;your phone controls your computer.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Watch it first
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;🎬 &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness · 31s promo&lt;/a&gt;&lt;/strong&gt; (grab &lt;code&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness/releases/download/v0.4.0/promo.mp4 (with BGM) / https://github.com/2903077918-lgtm/DeepSeek-phone-harness/releases/download/v0.4.0/promo-nobgm.mp4 (no BGM, SFX kept)&lt;/code&gt; from the repo)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In the dark, a phone screen glows gold. Messages type out on it. Tool cards fly in — which file was read, what command ran, done or failed, all visible. The agent asks a question; a card pops up for the answer. Model switching is a thumb-swipe. Finally, phone and computer connect across deep space: &lt;strong&gt;Phone in hand. Computer at your command.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Made with video-shotcraft — picked from 152 shot recipe cards: ink crosshair opening, graze-face tour, card dealing, line-carry transition, 3D terminals, overhead file reveal, segmented control, deep-space outro. Real screenshots, fictional demo data, 31 seconds, 8 shots.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the promo is really about
&lt;/h2&gt;

&lt;p&gt;One sentence: &lt;strong&gt;the phone is the best remote for your agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most people use agents by sitting at the computer watching them work. But the whole point of an agent is that it does the work &lt;em&gt;for&lt;/em&gt; you — and yet you have to babysit it. That's backwards.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the commute, want to dispatch a task: &lt;strong&gt;phone&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;In bed, want it to start running: &lt;strong&gt;phone&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Mid-meeting, it needs approval: &lt;strong&gt;phone, one tap&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Away from the desk, want to check progress: &lt;strong&gt;phone&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Mobile isn't a shrunken web page — it's a different paradigm: approvals, questions, and tool cards inline in the message stream, your thumb as the mouse, every step of the agent visible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it's worth a look
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Zero npm dependencies&lt;/strong&gt;: one Node process + one HTML file, clone and run&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct 4G/5G&lt;/strong&gt;: free Tailscale, no public IP&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tool cards show paths&lt;/strong&gt;: which file was read, what changed, the result — tap to expand&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No deadlocks&lt;/strong&gt;: the agent asks → a card pops up → answer → it continues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MIT open source&lt;/strong&gt;: ~4000 lines, stars/PRs/issues welcome&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Run it in three minutes
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/2903077918-lgtm/DeepSeek-phone-harness
&lt;span class="nb"&gt;cd &lt;/span&gt;DeepSeek-phone-harness &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cp &lt;/span&gt;config.example.json config.json
node agent.mjs &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;both
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Tailscale on the phone, open &lt;code&gt;http://&amp;lt;computer IP&amp;gt;:8788/&lt;/code&gt;, go.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;"Wherever you are, your agent is too."&lt;/strong&gt; — not a tagline. It's been my real life for two weeks.&lt;/p&gt;

&lt;p&gt;Repo: &lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;What would YOU make your desktop agent do from your phone? Comments open.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>video</category>
    </item>
    <item>
      <title>Where DeepSeek Phone Harness goes next — and how you can shape it</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 07:10:21 +0000</pubDate>
      <link>https://dev.to/joey020907/where-deepseek-phone-harness-goes-next-and-how-you-can-shape-it-gmm</link>
      <guid>https://dev.to/joey020907/where-deepseek-phone-harness-goes-next-and-how-you-can-shape-it-gmm</guid>
      <description>&lt;h1&gt;
  
  
  Where DeepSeek Phone Harness goes next — and how you can shape it
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;A roadmap, an honest status check, and a call for contributors. The most-requested feature ships first.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Two weeks ago this was a sketch. Today &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt; runs on my phone every day. Here's where it's headed — and where you come in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Status check (honest)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Working well:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Chat + streaming typewriter, multi-turn sessions&lt;/li&gt;
&lt;li&gt;Tool cards: icon, status, file path, expandable args/result&lt;/li&gt;
&lt;li&gt;Approval cards + &lt;code&gt;ask_user_question&lt;/code&gt; answer cards (no more deadlocks)&lt;/li&gt;
&lt;li&gt;Model switching, image attachments, thinking disclosure&lt;/li&gt;
&lt;li&gt;Terminal, file browser, task history, session management&lt;/li&gt;
&lt;li&gt;Zero npm dependencies; runs on any Node 22+&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Known limits (being honest):&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Web page, not a native app (PWA covers most of it)&lt;/li&gt;
&lt;li&gt;Terminal runs commands one at a time — no full PTY interactivity yet&lt;/li&gt;
&lt;li&gt;No push notifications yet — you poll, it doesn't call you&lt;/li&gt;
&lt;li&gt;Cloud channel requires deploying your own Worker&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Roadmap — most-requested first
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Push notifications&lt;/strong&gt; — task finished, approval needed → phone notifies without opening the page&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PWA offline shell&lt;/strong&gt; — add to home screen, feels native&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent PTY terminal&lt;/strong&gt; — interactive commands, not just run-and-collect&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-device / multi-account&lt;/strong&gt; — one agent, several controllers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Native shell (Tauri/Electron)&lt;/strong&gt; — if the demand shows up&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How you can shape it
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open an issue&lt;/strong&gt; with your most-wanted feature — the roadmap above is literally "what people asked for"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PR welcome&lt;/strong&gt;: the codebase is ~4000 lines of plain Node + one HTML file. No build step, no framework to learn. A focused PR is a weekend at most&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Report the ugly&lt;/strong&gt;: a weird hang, a wrong tool card, a confusing flow — file it, I read everything&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The rule
&lt;/h2&gt;

&lt;p&gt;The roadmap is ordered by request count, not by my preference. &lt;strong&gt;If your feature isn't on the list, that's because nobody asked for it yet.&lt;/strong&gt; So ask.&lt;/p&gt;

&lt;p&gt;Repo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;What's the one feature that would make you use this daily? One line is enough.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>deepseek</category>
      <category>community</category>
      <category>roadmap</category>
    </item>
    <item>
      <title>Why I open-sourced the tool I built "just for myself"</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 07:10:20 +0000</pubDate>
      <link>https://dev.to/joey020907/why-i-open-sourced-the-tool-i-built-just-for-myself-56j1</link>
      <guid>https://dev.to/joey020907/why-i-open-sourced-the-tool-i-built-just-for-myself-56j1</guid>
      <description>&lt;h1&gt;
  
  
  Why I open-sourced the tool I built "just for myself"
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;It started as a selfish project: a phone remote for my own desktop agent. Three reasons made me push it public. The third one surprised me.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;I built &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt; for one reason: I was in bed at 1 a.m., wanted to send a task to the agent on my computer, and refused to get up. Pure selfishness.&lt;/p&gt;

&lt;p&gt;It worked so well that I kept using it. And then I had to decide: keep it private, or open it up?&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason 1: the bug that cost me two days deserves a warning sign
&lt;/h2&gt;

&lt;p&gt;The hardest bug — the one that made tasks hang forever — was invisible until you knew it existed: &lt;strong&gt;DSH's agent-question channel is separate from its approval channel.&lt;/strong&gt; Miss it, and every &lt;code&gt;ask_user_question&lt;/code&gt; call deadlocks your pipeline silently.&lt;/p&gt;

&lt;p&gt;There's no way to discover this by reading docs. You have to capture a real event stream, notice a frame type nobody told you about, and chase it for two days. &lt;strong&gt;That kind of hard-won knowledge should be public&lt;/strong&gt; — someone else shouldn't have to re-pay that tuition.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason 2: the pattern deserves to be copied
&lt;/h2&gt;

&lt;p&gt;"Phone as a remote for a desktop agent" is a genuinely useful pattern. But right now it lives in scattered, platform-specific implementations. An MIT-licensed, zero-dependency reference implementation lowers the floor: anyone can clone it, read ~4000 lines, and build their own — for DeepSeek Harness, or any agent runtime with a similar event model.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reason 3 (the surprise): it changed how I write code
&lt;/h2&gt;

&lt;p&gt;Open-sourcing it forced me to do things I wouldn't have bothered with otherwise:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remove secrets from history (filter-branch, .gitignore — my token never touches GitHub)&lt;/li&gt;
&lt;li&gt;Write real docs and onboarding instead of "works on my machine"&lt;/li&gt;
&lt;li&gt;Structure the code so a stranger could read it&lt;/li&gt;
&lt;li&gt;Take feedback as a feature list instead of a threat&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The tool got better in the week after open-sourcing than in the week before.&lt;/strong&gt; That surprised me, and it's the reason I'll keep building in public.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I ask in return
&lt;/h2&gt;

&lt;p&gt;Nothing, really. But if you take one thing: &lt;strong&gt;when you fix a nasty bug nobody warned you about, write it down and put it where others can find it.&lt;/strong&gt; That's the entire spirit of this project.&lt;/p&gt;

&lt;p&gt;Repo (MIT, zero dependencies, three-minute setup):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Have you open-sourced something you built "for yourself"? What changed? I'd genuinely like to know.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>story</category>
      <category>deepseek</category>
    </item>
    <item>
      <title>Streaming a desktop agent to your phone with zero npm dependencies</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 07:05:08 +0000</pubDate>
      <link>https://dev.to/joey020907/streaming-a-desktop-agent-to-your-phone-with-zero-npm-dependencies-3728</link>
      <guid>https://dev.to/joey020907/streaming-a-desktop-agent-to-your-phone-with-zero-npm-dependencies-3728</guid>
      <description>&lt;h1&gt;
  
  
  A weekend project that streams a desktop agent to your phone — with zero npm dependencies
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;One WebSocket, one Node process, one HTML file. Here's the architecture behind DeepSeek Phone Harness, and the three decisions that made it work.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Last weekend I built &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt; — a mobile remote for DeepSeek Harness. The constraint I set myself: &lt;strong&gt;zero npm dependencies&lt;/strong&gt;. Not because I'm a purist, but because a tool like this should be "clone and run," not "install 47 packages and hope."&lt;/p&gt;

&lt;p&gt;Here's the architecture that made it work.&lt;/p&gt;

&lt;h2&gt;
  
  
  One process, three responsibilities
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Phone browser (relay.html)
   │  HTTPS / Tailscale
   ▼
Agent (Node, :8788)  ── http server + static page + WS relay
   │ 127.0.0.1:3080
   ▼
DeepSeek Harness gateway (dsh web)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Agent is a translator, not a replacement: it speaks REST to the phone and RPC to DSH.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision 1: one WebSocket for all realtime events
&lt;/h2&gt;

&lt;p&gt;DSH exposes &lt;code&gt;events.mux&lt;/code&gt; — a WebSocket stream carrying approvals, questions, and session events in one pipe. Instead of opening one connection per concern, I keep &lt;strong&gt;one persistent connection&lt;/strong&gt; and route frames locally:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Frame&lt;/th&gt;
&lt;th&gt;Goes to&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;approval/requested&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pending table → phone approval cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;question/requested&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;pending table → phone answer cards&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;session/event&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;ring buffer (200/session) → phone stream polling&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The phone polls &lt;code&gt;/api/events?afterSeq=N&lt;/code&gt; — each poll returns only new bytes, which keeps 4G streaming smooth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Decision 2: the question channel is NOT the approval channel
&lt;/h2&gt;

&lt;p&gt;The single most important bug I fixed: DSH agents call &lt;code&gt;ask_user_question&lt;/code&gt; through a &lt;strong&gt;separate channel&lt;/strong&gt; from approvals. If you only listen for &lt;code&gt;approval/requested&lt;/code&gt;, the moment the agent asks something the task deadlocks &lt;em&gt;forever&lt;/em&gt; — it's waiting for a human answer that the phone never shows.&lt;/p&gt;

&lt;p&gt;The answer protocol had to match the Web GUI exactly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"ok"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"value"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"sessionId"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"answer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"answers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"q1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"selected"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"..."&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Decision 3: tool calls become cards keyed by callId
&lt;/h2&gt;

&lt;p&gt;Every &lt;code&gt;tool/call&lt;/code&gt; event creates a tool card (name, icon, status, &lt;strong&gt;file path extracted from arguments&lt;/strong&gt;). Every &lt;code&gt;tool/result&lt;/code&gt; pairs back by &lt;code&gt;callId&lt;/code&gt; and flips the card to done/failed. Tapping expands the full arguments and result.&lt;/p&gt;

&lt;p&gt;One trap: DSH's &lt;code&gt;tool/result&lt;/code&gt; content is &lt;strong&gt;double-nested&lt;/strong&gt; (&lt;code&gt;content[].content[].text&lt;/code&gt;) — my first version read one level too shallow and results came back empty. Lesson: capture a real payload before trusting any schema.&lt;/p&gt;

&lt;h2&gt;
  
  
  The result
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;~4000 lines, zero dependencies&lt;/li&gt;
&lt;li&gt;Single-file frontend (&lt;code&gt;relay.html&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Streaming typewriter, tool cards, approval/answer cards, model switching, terminal, file browser&lt;/li&gt;
&lt;li&gt;4G/5G via Tailscale, no public IP&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;p&gt;"Phone remote for a desktop agent" sounds like it needs a platform team. It doesn't. The barrier to entry for this whole category just collapsed — &lt;strong&gt;anyone with Node 22+ can build or extend one in a weekend.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The code is open (MIT):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Questions about the architecture? Happy to go deeper in the comments.&lt;/p&gt;

</description>
      <category>node</category>
      <category>deepseek</category>
      <category>architecture</category>
      <category>websocket</category>
    </item>
    <item>
      <title>"Remote-controlling your agent from a phone" — the 10 questions everyone asks</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 07:00:00 +0000</pubDate>
      <link>https://dev.to/joey020907/remote-controlling-your-agent-from-a-phone-the-10-questions-everyone-asks-31ng</link>
      <guid>https://dev.to/joey020907/remote-controlling-your-agent-from-a-phone-the-10-questions-everyone-asks-31ng</guid>
      <description>&lt;h1&gt;
  
  
  "Remote-controlling your agent from a phone" — the 10 questions everyone asks, answered
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Collected from comments and DMs. Read this and you'll know whether this is for you.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Since building &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt;, the same 10 questions keep coming up. Let's answer them all at once.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q1: Is remote-controlling a desktop agent from a phone safe?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Depends on how you use it.&lt;/strong&gt; The project has two layers of protection: every API requires a Bearer token, and risky operations first show an "authorization needed" card that you allow or reject on your phone. But the safety ceiling of any remote-control tool is set by your network — &lt;strong&gt;use a private network like Tailscale&lt;/strong&gt;, and don't expose port 8788 raw to the public internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q2: Do I need a public IP? A server?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Neither.&lt;/strong&gt; 4G/5G connects directly to the computer via Tailscale (free); LAN works directly. A Cloudflare Worker is optional if you want a public entry.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q3: How is this different from remote desktop (TeamViewer/AnyDesk)?
&lt;/h2&gt;

&lt;p&gt;Remote desktop &lt;strong&gt;transmits a screen&lt;/strong&gt; — you look at the display and move the mouse. This &lt;strong&gt;transmits semantics&lt;/strong&gt; — instructions and results. You see the agent's reasoning, tool calls, and outcomes, not a shrunken screen. An order of magnitude less bandwidth, and far clearer on a phone.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q4: How much of the web experience does the phone have?
&lt;/h2&gt;

&lt;p&gt;Most of it: chat, streaming, model switching, image attachments, approvals, questions, terminal, files, tasks. On a few details mobile is actually ahead: &lt;strong&gt;approval/question cards inline in the message stream&lt;/strong&gt; (no context break), and &lt;strong&gt;tool calls as a vertical timeline&lt;/strong&gt; (made for portrait). Heavy work (large-scale editing) still belongs at a desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q5: Do tasks hang? What if the agent asks something?
&lt;/h2&gt;

&lt;p&gt;They used to — that was the biggest trap I hit. When an agent calls &lt;code&gt;ask_user_question&lt;/code&gt;, an unanswered task hangs forever. Now the question becomes a "your answer needed" card: &lt;strong&gt;pick an option / type a custom answer / skip.&lt;/strong&gt; Answer and it continues; ignore and it waits. Tasks never deadlock because "nobody's listening."&lt;/p&gt;

&lt;h2&gt;
  
  
  Q6: Can I see exactly what the agent is doing?
&lt;/h2&gt;

&lt;p&gt;Yes — and it's the part I'm proudest of. Every tool call is a &lt;strong&gt;tool card&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[📄 read]                          ● done
C:/Users/Joey/Documents/.../config.json
▾ tap to expand: full arguments + full result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Which file was read, what command ran, the outcome — all visible. The agent's reasoning folds into a collapsible block too.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q7: Is it smooth on 4G/5G?
&lt;/h2&gt;

&lt;p&gt;Yes. Streaming is incremental polling — each pull only fetches a few hundred new bytes; tool cards and approval cards are lightweight JSON. The typewriter effect stays smooth on 4G in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q8: Do I need an app? Any setup?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;No app&lt;/strong&gt; — the phone browser opens a page directly (PWA add-to-home-screen works). On the computer you need Node 22+ and a running DeepSeek Harness. Setup is one &lt;code&gt;config.json&lt;/code&gt; with a token.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q9: "Zero dependencies" — really? Is deployment easy?
&lt;/h2&gt;

&lt;p&gt;Really. The agent uses only Node built-ins (http / child_process / crypto / fs) — &lt;strong&gt;zero npm dependencies.&lt;/strong&gt; Clone → set token → &lt;code&gt;node agent.mjs --mode=both&lt;/code&gt;. The frontend is a single &lt;code&gt;relay.html&lt;/code&gt; file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Q10: What's the relationship with DeepSeek official?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pure community project, not official.&lt;/strong&gt; I just believed "controlling your desktop agent from a phone" was a need someone should fill, so I filled it. Official is building Harness itself; I built its "pocket remote."&lt;/p&gt;

&lt;h2&gt;
  
  
  Verdict
&lt;/h2&gt;

&lt;p&gt;Is it for you? One-line test: &lt;strong&gt;if you often want your agent to work while you're away from the desk — yes; if you're always at the desk — it's a nice-to-have.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open source (MIT):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Any other questions? Ask in the comments — I reply to every one.&lt;/strong&gt; Popular questions will keep updating this list.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>faq</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>The 5 agent tasks I most often run from my phone: a real list</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:59:59 +0000</pubDate>
      <link>https://dev.to/joey020907/the-5-agent-tasks-i-most-often-run-from-my-phone-a-real-list-20oa</link>
      <guid>https://dev.to/joey020907/the-5-agent-tasks-i-most-often-run-from-my-phone-a-real-list-20oa</guid>
      <description>&lt;h1&gt;
  
  
  The 5 agent tasks I most often run from my phone: a real list
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;No concepts — a list. These are real tasks I dispatched to my desktop agent from my phone over the past week.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;After building &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt;, I developed a habit: &lt;strong&gt;anything that can be done on the phone, never get up and walk to the study.&lt;/strong&gt; Here's last week's real log.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 1: Dispatch on the commute, collect the result on arrival
&lt;/h2&gt;

&lt;p&gt;Most used. On the subway, open the phone, send "list the 5 largest files in downloads, sorted by size." Get off and read the answer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Phone experience&lt;/strong&gt;: send, lock screen. The agent runs slowly on the computer; I sway slowly on the train. Tool cards show it running &lt;code&gt;dir&lt;/code&gt;, &lt;code&gt;du&lt;/code&gt; — every step in plain sight.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 2: Tweak config before bed, find it verified in the morning
&lt;/h2&gt;

&lt;p&gt;At night, in bed, send "change the timeout in config to 30 seconds, then run the tests." Next morning the tests are done, conclusion waiting on the phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why on the phone&lt;/strong&gt;: because I'm turning off the lights. If this task required the computer, I'd probably procrastinate it into oblivion.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 3: Tap approvals mid-meeting
&lt;/h2&gt;

&lt;p&gt;The agent needs authorization mid-task — previously that meant waiting until I was back at the desk. Now a "authorization needed" card pops up, &lt;strong&gt;thumb taps "Allow once"&lt;/strong&gt;, it continues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Best moment&lt;/strong&gt;: a colleague at the same table asked what I was doing in the meeting. "Greenlighting my desktop agent."&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 4: Quick code lookups from the couch
&lt;/h2&gt;

&lt;p&gt;Lying on the sofa, wanting to confirm whether a certain function exists in a file. Before: get up → study → open editor → search → come back. Now: phone → file browser → read → keep lying down.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tool cards shine here&lt;/strong&gt;: when the agent searches code, cards show exactly which file it's reading, path at a glance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Task 5: Model comparison experiments
&lt;/h2&gt;

&lt;p&gt;Want to compare deepseek-v4-flash vs v4-pro on the same task — tap the model name at the top, switch, re-send, compare side by side.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before&lt;/strong&gt;: edit CLI config, restart, retry. &lt;strong&gt;Now&lt;/strong&gt;: two taps.&lt;/p&gt;

&lt;h2&gt;
  
  
  The common thread
&lt;/h2&gt;

&lt;p&gt;All five tasks share one trait: &lt;strong&gt;none of them require you to be at the computer.&lt;/strong&gt; They only need:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Send an instruction&lt;/li&gt;
&lt;li&gt;See the process&lt;/li&gt;
&lt;li&gt;Make decisions at key moments (approvals/questions)&lt;/li&gt;
&lt;li&gt;Collect the result&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The phone happens to provide all four. And "not being at the computer" is exactly the most overlooked part of the agent experience.&lt;/p&gt;

&lt;h2&gt;
  
  
  The toolkit
&lt;/h2&gt;

&lt;p&gt;Open source (MIT):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;Direct 4G/5G (free Tailscale), three-minute setup&lt;/li&gt;
&lt;li&gt;Streaming output, tool cards (path/status/detail), approvals, question answers, model switching, terminal, files&lt;/li&gt;
&lt;li&gt;Zero npm dependencies, single-file frontend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Which agent tasks would you want to do from your phone?&lt;/strong&gt; List them — the most requested ones ship next.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>productivity</category>
      <category>agents</category>
      <category>opensource</category>
    </item>
    <item>
      <title>From "a thought in bed" to open source: one week of development diary</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:54:52 +0000</pubDate>
      <link>https://dev.to/joey020907/from-a-thought-in-bed-to-open-source-one-week-of-development-diary-iee</link>
      <guid>https://dev.to/joey020907/from-a-thought-in-bed-to-open-source-one-week-of-development-diary-iee</guid>
      <description>&lt;h1&gt;
  
  
  From "a thought in bed" to open source: one week of development diary
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;No glamorous start — just a late-night thought. A week of building DeepSeek Phone Harness, from zero to release.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Day 1 · 1 a.m., a thought
&lt;/h2&gt;

&lt;p&gt;In bed that night, I realized I could have the agent on my computer run a task early. Get up and walk to the study? Too much trouble. Give up? Unsatisfying.&lt;/p&gt;

&lt;p&gt;In that moment it hit me: &lt;strong&gt;the agent's value is doing work for me, yet I'm chained to the computer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next morning I opened the editor and decided to solve it myself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 2 · First version: a working "translator"
&lt;/h2&gt;

&lt;p&gt;The core idea was simple: the phone sends HTTP, an agent process translates it into DSH RPC, and translates responses back.&lt;/p&gt;

&lt;p&gt;That evening the first version worked: send a sentence from the phone, the agent on the computer executes, the result returns to the phone. &lt;strong&gt;Ugly, but it moved.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 3 · Deadlocked all day: ask_user_question
&lt;/h2&gt;

&lt;p&gt;On day three, tasks started "randomly hanging." I dug until late night and found: &lt;strong&gt;the agent asks the user questions, questions don't go through the approval channel, and I wasn't listening to the question channel.&lt;/strong&gt; Tasks waited forever on a question nobody answered.&lt;/p&gt;

&lt;p&gt;When it was fixed, my commit message said three words: "no more hangs."&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 4 · Make the work visible
&lt;/h2&gt;

&lt;p&gt;Results weren't enough — I wanted the phone to see &lt;strong&gt;what the agent does, step by step.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So tool cards were born: one card per tool call, with icon, status, the file path it touched, and expandable full arguments and results. The agent's reasoning also folds into a collapsible block.&lt;/p&gt;

&lt;p&gt;That night I sat watching the agent work on my phone for a long time. &lt;strong&gt;"Watching it think and move" versus "waiting for a result" are two completely different experiences.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 5 · Terminal, files, tasks: from usable to useful
&lt;/h2&gt;

&lt;p&gt;Added the terminal (remote commands), file browsing, task history (one-tap re-run), and session management (rename/delete/search).&lt;/p&gt;

&lt;h2&gt;
  
  
  Day 6 · Polishing
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Approval and question cards inserted directly into the message stream — no context breaks&lt;/li&gt;
&lt;li&gt;Model picker, image attachments, thinking disclosure&lt;/li&gt;
&lt;li&gt;Fixed browser caching that made users "never see the new UI"&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Day 7 · Open source
&lt;/h2&gt;

&lt;p&gt;Wrote the README, wrote the promo posts, pushed to GitHub. There was no ceremony — just &lt;code&gt;git push&lt;/code&gt; and a long exhale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;~4000 lines, zero npm dependencies, one Node process + one HTML file.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  A week later, now
&lt;/h2&gt;

&lt;p&gt;It runs stably: dispatch tasks on the commute, tweak config before bed, tap approvals mid-meeting. The phone became the agent's remote — &lt;strong&gt;"wherever you are, your agent is too"&lt;/strong&gt; is no longer just a slogan.&lt;/p&gt;

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

&lt;p&gt;Open source (MIT), three-minute setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/2903077918-lgtm/DeepSeek-phone-harness
&lt;span class="nb"&gt;cd &lt;/span&gt;DeepSeek-phone-harness &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cp &lt;/span&gt;config.example.json config.json
node agent.mjs &lt;span class="nt"&gt;--mode&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;both
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Install Tailscale on the phone, access over 4G/5G.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;If you were to build an open-source project "for yourself," what pain point would you solve first?&lt;/strong&gt; Comment below — the next viral project might start here.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>story</category>
      <category>deepseek</category>
      <category>node</category>
    </item>
    <item>
      <title>The agent's next stop is your pocket: why mobile may be the agent's best form</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:54:51 +0000</pubDate>
      <link>https://dev.to/joey020907/the-agents-next-stop-is-your-pocket-why-mobile-may-be-the-agents-best-form-3p10</link>
      <guid>https://dev.to/joey020907/the-agents-next-stop-is-your-pocket-why-mobile-may-be-the-agents-best-form-3p10</guid>
      <description>&lt;h1&gt;
  
  
  The agent's next stop is your pocket: why "mobile" may be one of the agent's best forms
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;We moved agents from the terminal to the browser. Now it's time to move them into your pocket. This isn't "mobile adaptation" — it's a shift in interaction paradigm.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;DeepSeek Harness just went open source, and the community is excited — models, tools, agent loops, all pluggable. But amid the noise I noticed something:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Everyone's discussing what agents &lt;strong&gt;can do&lt;/strong&gt;. Almost nobody discusses &lt;strong&gt;where you use them&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's talk about the second one — and I'll give you my own answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent usage is moving from "sit down" to "anytime"
&lt;/h2&gt;

&lt;p&gt;First generation: open a terminal, sit down, watch.&lt;/p&gt;

&lt;p&gt;Second generation (Web GUI): open a browser, sit down, watch.&lt;/p&gt;

&lt;p&gt;Essentially it's still &lt;strong&gt;"you must be seated at the computer."&lt;/strong&gt; But an agent's whole value is that it does the work &lt;em&gt;for&lt;/em&gt; you — and yet you have to babysit it. Is that reasonable?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the commute, I want it to start running first&lt;/li&gt;
&lt;li&gt;Before bed, I want to assign tomorrow's tasks&lt;/li&gt;
&lt;li&gt;Mid-meeting, it needs an approval — I want to tap once and let it continue&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All these share one trait: &lt;strong&gt;you're not at the computer, but the agent is working.&lt;/strong&gt; Who's the remote? The phone is the only answer.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mobile isn't a "shrunk webpage" — it's a new paradigm
&lt;/h2&gt;

&lt;p&gt;I used to think mobile = shrunk web. After actually building it, I found mobile's interaction logic is fundamentally different:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. From "multiple windows" to "a single timeline"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The web has panels side by side: conversation, tool output, approval dialogs. Mobile naturally has one &lt;strong&gt;vertical timeline&lt;/strong&gt; — user message, agent reasoning, tool cards, approval cards, question cards, all linear. The agent's work becomes a &lt;strong&gt;replayable pipeline&lt;/strong&gt;, which is clearer, not less.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. From "clicking around" to "making decisions"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On desktop you click everywhere. On mobile, thumb reach is limited, which forces interactions into &lt;strong&gt;"look once → decide"&lt;/strong&gt;: allow this tool call or not? How to answer this question? — judgment calls, not browsing sessions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. From "accompanying" to "async"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;On desktop you sit with the agent. On mobile you &lt;strong&gt;dispatch → leave → come back for results.&lt;/strong&gt; That pushes the agent side to do state management properly (task queues, result retention, failure notifications) — which is exactly where agent products are heading.&lt;/p&gt;

&lt;h2&gt;
  
  
  My answer: an open-source project that puts the agent in your pocket
&lt;/h2&gt;

&lt;p&gt;Based on the above, I built &lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;DeepSeek Phone Harness&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Control DeepSeek Harness on your computer from a mobile browser (4G/5G, Tailscale direct)&lt;/li&gt;
&lt;li&gt;Streaming output, tool cards (path/status/detail), approvals, question answers, model switching, terminal, files&lt;/li&gt;
&lt;li&gt;Zero npm dependencies, ~4000 lines, single-file frontend&lt;/li&gt;
&lt;li&gt;MIT open source, clone and run&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It's no revolutionary invention — just a plain answer: &lt;strong&gt;"when the agent works for you, you shouldn't have to be there."&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Your turn
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What do you think is the agent's next form?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mobile (a pocket remote)?&lt;/li&gt;
&lt;li&gt;Always-on cloud (unattended agents)?&lt;/li&gt;
&lt;li&gt;Something else?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Comment below — this is a topic worth arguing about.&lt;/p&gt;

</description>
      <category>agents</category>
      <category>deepseek</category>
      <category>opinion</category>
      <category>mobile</category>
    </item>
    <item>
      <title>Watching my agent work from the phone and the desktop at the same time</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:49:43 +0000</pubDate>
      <link>https://dev.to/joey020907/watching-my-agent-work-from-the-phone-and-the-desktop-at-the-same-time-1edm</link>
      <guid>https://dev.to/joey020907/watching-my-agent-work-from-the-phone-and-the-desktop-at-the-same-time-1edm</guid>
      <description>&lt;h1&gt;
  
  
  Watching my agent work from the phone and the desktop at the same time — I can't go back
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;You'd expect the phone to be a "downgraded" web page. After a side-by-side test, I found some experiences are actually better on mobile.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Before building DeepSeek Phone Harness, I set my own acceptance bar: &lt;strong&gt;the phone must reach 80% of the desktop web experience, or it's not done.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After finishing, I ran a controlled test: the same task, watched simultaneously on a desktop browser and a phone browser. The result surprised me — &lt;strong&gt;a few experiences are genuinely better on mobile.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The test: one task, both screens
&lt;/h2&gt;

&lt;p&gt;Task: let the agent read the project config, summarize current progress, and run a test.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Desktop web&lt;/th&gt;
&lt;th&gt;Phone&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Streaming output&lt;/td&gt;
&lt;td&gt;Fine&lt;/td&gt;
&lt;td&gt;Fine (typewriter)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Tool-call visibility&lt;/td&gt;
&lt;td&gt;Present&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Stronger&lt;/strong&gt;: each card shows the file path; tap for args + result&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Approvals&lt;/td&gt;
&lt;td&gt;Dialog/panel&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cards inline in the message stream&lt;/strong&gt; — no page switch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Questions&lt;/td&gt;
&lt;td&gt;Input takeover&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Option cards&lt;/strong&gt;, one tap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model switching&lt;/td&gt;
&lt;td&gt;Dropdown&lt;/td&gt;
&lt;td&gt;Bottom sheet, thumb-reachable&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Away from desk&lt;/td&gt;
&lt;td&gt;Must be at the computer&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Works from anywhere&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why mobile is better at some things
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Approvals/questions don't break context
&lt;/h3&gt;

&lt;p&gt;On desktop, an approval is a separate dialog that interrupts what you're reading. On mobile, I made approvals and questions &lt;strong&gt;cards inserted directly into the message stream&lt;/strong&gt; — the context of &lt;em&gt;where&lt;/em&gt; the agent is and &lt;em&gt;why&lt;/em&gt; it's asking stays continuous.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Tool cards are naturally built for portrait
&lt;/h3&gt;

&lt;p&gt;"Read file → run command → edit code" — a vertical sequence of tool calls is &lt;strong&gt;made for a portrait screen&lt;/strong&gt;. On desktop you juggle logs and lists; on mobile it's one clean timeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;[📄 read]   C:/.../config.json          ● done
[⚙️ pwsh]   npm test                    ● running…
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Your thumb is the best mouse
&lt;/h3&gt;

&lt;p&gt;Model switching, attachments, card expansion — everything lives within thumb reach.&lt;/p&gt;

&lt;h2&gt;
  
  
  An honest comparison
&lt;/h2&gt;

&lt;p&gt;Mobile is not a replacement for the desktop — &lt;strong&gt;heavy work (editing lots of code, digging logs, multi-terminal) still belongs at a desk.&lt;/strong&gt; But mobile closes the desktop's biggest gap: &lt;strong&gt;the moments you're not at the computer.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send a task on the commute, read the result when you arrive&lt;/li&gt;
&lt;li&gt;Tweak a config before bed, find it verified in the morning&lt;/li&gt;
&lt;li&gt;Approve an agent request mid-meeting with one tap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;"Wherever you are, your agent is too"&lt;/strong&gt; — that's mobile's real value, not "a smaller webpage."&lt;/p&gt;

&lt;h2&gt;
  
  
  The project
&lt;/h2&gt;

&lt;p&gt;Open source (MIT):&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Direct 4G/5G (free Tailscale), three-minute setup, zero npm dependencies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which of your agent tasks could be done while you're away from the desk?&lt;/strong&gt; List them below — I'll see what belongs on the roadmap.&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>mobile</category>
      <category>opensource</category>
      <category>agents</category>
    </item>
    <item>
      <title>3 traps I fell into while letting a phone control a desktop agent</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:49:42 +0000</pubDate>
      <link>https://dev.to/joey020907/3-traps-i-fell-into-while-letting-a-phone-control-a-desktop-agent-4gc6</link>
      <guid>https://dev.to/joey020907/3-traps-i-fell-into-while-letting-a-phone-control-a-desktop-agent-4gc6</guid>
      <description>&lt;h1&gt;
  
  
  3 traps I fell into while letting a phone control a desktop agent — it's harder than it looks
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;On the surface it's an HTTP layer and a web page. Underneath, every step fights your assumptions. Real pitfalls, so you can avoid them.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Before building DeepSeek Phone Harness, I assumed "mobile remote control for a desktop agent" was just moving a web page to a phone. After finishing it, I admit: &lt;strong&gt;the idea took 10 minutes; the bug-fixing took a week.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here are 3 real traps — each one made tasks "gracefully deadlock" in production.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trap 1: The moment the agent asks a question, the task hangs forever
&lt;/h2&gt;

&lt;p&gt;This is the nastiest one.&lt;/p&gt;

&lt;p&gt;Our relay listened to DSH's approval channel (&lt;code&gt;approval/requested&lt;/code&gt;) — all good. Until one day a test task &lt;strong&gt;never finished&lt;/strong&gt;. Not an error — just hung, &lt;code&gt;pending&lt;/code&gt; climbing.&lt;/p&gt;

&lt;p&gt;Two days of digging later: DSH agents can call the &lt;code&gt;ask_user_question&lt;/code&gt; tool to &lt;strong&gt;ask the user something&lt;/strong&gt; — and that goes through a &lt;em&gt;different&lt;/em&gt; channel (&lt;code&gt;question/requested&lt;/code&gt;), &lt;strong&gt;not&lt;/strong&gt; the approval channel. My relay only listened for approvals, so question frames were silently dropped.&lt;/p&gt;

&lt;p&gt;Result: the agent waits on the computer for a human answer, the phone has no idea, the task hangs forever. &lt;strong&gt;It only continues once the user answers.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fix: ingest question frames separately, forward them as "your answer needed" cards, and use the exact same answer protocol as the official Web GUI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson: in an agent's realtime event stream, every frame type exists for a reason. Miss one, and tasks die in ways you'd never guess.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trap 2: Tool results live two layers deep
&lt;/h2&gt;

&lt;p&gt;The phone shows "tool cards": tool name + file path + result. Name is easy, path is easy (extract from arguments). Result?&lt;/p&gt;

&lt;p&gt;I assumed &lt;code&gt;tool/result&lt;/code&gt; content was &lt;code&gt;[{type:'text', text:'...'}]&lt;/code&gt;. Naive. The real shape:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;content:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"tool-result"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"content"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"text"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;path&amp;gt;...&amp;lt;content&amp;gt;..."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Two levels of nesting&lt;/strong&gt;, with &lt;code&gt;toolCallId&lt;/code&gt; on the inner block. My first version only read one level: cards had names and paths, but results were always empty.&lt;/p&gt;

&lt;p&gt;Fix: recursive text collection + pairing calls to results via &lt;code&gt;source.callId&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson: no protocol doc beats capturing one real payload.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Trap 3: Mobile browser caching made users see a forever-old UI
&lt;/h2&gt;

&lt;p&gt;Changed the UI, opened the phone — &lt;strong&gt;still the old one.&lt;/strong&gt; Refresh, restart browser, switch browser — same.&lt;/p&gt;

&lt;p&gt;Not a network issue. It's &lt;strong&gt;caching&lt;/strong&gt;: the old page was cached, and &lt;code&gt;Cache-Control&lt;/code&gt; wasn't set.&lt;/p&gt;

&lt;p&gt;Fix: serve HTML with &lt;code&gt;no-store, no-cache, must-revalidate&lt;/code&gt;. Every open is now the latest.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson: for mobile web apps, cache strategy matters as much as feature code.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Why these traps are worth sharing
&lt;/h2&gt;

&lt;p&gt;Each one reveals the real complexity of "remote-controlling an agent from a phone":&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's not a static page — it's a &lt;strong&gt;faithful courier of a realtime event stream&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It's not a toy — it must handle &lt;strong&gt;approvals, questions, tool results&lt;/strong&gt; at production level&lt;/li&gt;
&lt;li&gt;It's not a demo — it must stay &lt;strong&gt;low-latency, retryable, recoverable&lt;/strong&gt; on 4G&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After fixing all of it, tool cards look like this on the phone:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[📄 read]                          ● done
C:/Users/Joey/Documents/.../config.json
▾ tap to expand: full arguments + full result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every step the agent takes — which file, what command, the outcome — is visible. Permission requests and questions become cards. &lt;strong&gt;Tasks never hang because "nobody answered."&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The project
&lt;/h2&gt;

&lt;p&gt;Open source (MIT). Stars / PRs / issues welcome:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/2903077918-lgtm/DeepSeek-phone-harness" rel="noopener noreferrer"&gt;https://github.com/2903077918-lgtm/DeepSeek-phone-harness&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;What's the weirdest bug you've hit while working with agents?&lt;/strong&gt; Share it below — I bet it beats mine.&lt;/p&gt;

</description>
      <category>node</category>
      <category>deepseek</category>
      <category>debugging</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
