<?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>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>
    <item>
      <title>DeepSeek Harness is useless when you leave the desk — so I open-sourced a fix</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:44:30 +0000</pubDate>
      <link>https://dev.to/joey020907/deepseek-harness-is-useless-when-you-leave-the-desk-so-i-open-sourced-a-fix-ml8</link>
      <guid>https://dev.to/joey020907/deepseek-harness-is-useless-when-you-leave-the-desk-so-i-open-sourced-a-fix-ml8</guid>
      <description>&lt;h1&gt;
  
  
  DeepSeek Harness is useless when you leave the desk — so I open-sourced a way to run it over 4G
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;Your desktop agent is only as good as your presence in front of the computer. Until your phone can command it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Let's get this straight first: &lt;strong&gt;this post is about disproving something — my own previous belief.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I loved DeepSeek Harness. Then one day I was out and wanted the agent on my computer to organize some files. That's when reality hit:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;I'm not at the computer. The agent is a decoration.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At work. On the commute. At dinner. On the couch. &lt;strong&gt;Any moment you're away from the desk, you can't use it.&lt;/strong&gt; Is that reasonable? No. So I built something.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I built
&lt;/h2&gt;

&lt;p&gt;An open-source mobile remote-control project that lets your phone operate DeepSeek Harness on your computer from any network:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct 4G/5G&lt;/strong&gt; (via Tailscale, free) — no public IP needed&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Real-time streaming&lt;/strong&gt; — the agent's words appear on your phone character by character&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Full tool-call visibility&lt;/strong&gt; — which file was read, what command ran, the result — one card per call&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approvals + questions&lt;/strong&gt; — permission card pops up, question card pops up, tasks never hang&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Model switching&lt;/strong&gt;, &lt;strong&gt;image attachments&lt;/strong&gt;, &lt;strong&gt;terminal&lt;/strong&gt;, &lt;strong&gt;file browsing&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How light is it?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Zero npm dependencies.&lt;/strong&gt; ~4000 lines. Frontend is a single HTML file.&lt;/p&gt;

&lt;p&gt;No cloud server. No database. No framework. No &lt;code&gt;npm install&lt;/code&gt;. &lt;strong&gt;Clone → set a token → run.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Real scenarios (all true)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Scenario 1&lt;/strong&gt;: On the subway, opened the page, sent a task to the desktop agent. By the time I got off, the result was already on my phone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 2&lt;/strong&gt;: The agent needed permission mid-task — previously that meant waiting until I got back. Now a card pops up on my phone, I tap "Allow once", it continues.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scenario 3&lt;/strong&gt;: The agent asked me a question. I picked an option on a card. Task resumed. &lt;strong&gt;A question used to mean a deadlocked task; now it's a 10-second fix.&lt;/strong&gt;&lt;/p&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;, enter the token, go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest talk
&lt;/h2&gt;

&lt;p&gt;It's not perfect: it's a web page (not a native app), commands run one at a time (no full PTY), and the cloud channel needs you to deploy a Worker. &lt;strong&gt;But "fully controlling your desktop agent from your phone" is done — open source and free.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repo (stars, PRs and 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 would YOU most want to do with your desktop agent from your phone?&lt;/strong&gt; Or any concerns about remote control? Drop them in the comments — I read every one.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Community project, not affiliated with DeepSeek.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>opensource</category>
      <category>agents</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I turned my phone into a remote for DeepSeek Harness — and it changed how I use agents</title>
      <dc:creator>Joey 、</dc:creator>
      <pubDate>Sun, 16 Aug 2026 06:39:22 +0000</pubDate>
      <link>https://dev.to/joey020907/i-turned-my-phone-into-a-remote-for-deepseek-harness-and-it-changed-how-i-use-agents-5emj</link>
      <guid>https://dev.to/joey020907/i-turned-my-phone-into-a-remote-for-deepseek-harness-and-it-changed-how-i-use-agents-5emj</guid>
      <description>&lt;h1&gt;
  
  
  I turned my phone into a remote for DeepSeek Harness — and it changed how I use agents
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;No cloud server. No public IP. No database. One Node process, one HTML file, and a 4G connection.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;Let me ask you something: &lt;strong&gt;how many times have you wanted to send a task to your desktop agent after you left the room?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I had that moment at 1 a.m., in bed, with my computer in the study. My options were:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Get up, walk over, operate the computer, walk back&lt;/li&gt;
&lt;li&gt;Pretend I never thought of it&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Use my phone&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Option 3 didn't exist. DeepSeek Harness lives on the computer; the phone can't reach it. So I spent a weekend writing an open-source project that fixed exactly that.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Your phone browser becomes a remote for DeepSeek Harness.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Send tasks, watch the agent work in &lt;strong&gt;real-time streaming&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Every tool call is visible: &lt;strong&gt;which file it read, what command it ran, the result&lt;/strong&gt; — tap to expand full arguments and output&lt;/li&gt;
&lt;li&gt;Agent needs permission? An &lt;strong&gt;approval card&lt;/strong&gt; pops up on your phone — allow once / reject&lt;/li&gt;
&lt;li&gt;Agent asks a question? A &lt;strong&gt;question card&lt;/strong&gt; pops up — pick an option or type an answer&lt;/li&gt;
&lt;li&gt;Switch models in one tap, attach &lt;strong&gt;images&lt;/strong&gt; with the &lt;code&gt;+&lt;/code&gt; button, open a &lt;strong&gt;terminal&lt;/strong&gt;, browse &lt;strong&gt;files&lt;/strong&gt;, re-run &lt;strong&gt;tasks&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why ~4000 lines
&lt;/h2&gt;

&lt;p&gt;Because it has &lt;strong&gt;zero npm dependencies&lt;/strong&gt;. No framework, no database, no &lt;code&gt;npm install&lt;/code&gt;. One Node process using built-ins only: HTTP server, DSH RPC wrapper, WebSocket event relay. Clone and &lt;code&gt;node agent.mjs&lt;/code&gt; — done.&lt;/p&gt;

&lt;p&gt;The frontend is a single &lt;code&gt;relay.html&lt;/code&gt; file that opens directly in your mobile browser.&lt;/p&gt;

&lt;h2&gt;
  
  
  The detail that sold me
&lt;/h2&gt;

&lt;p&gt;While the agent works, the phone shows &lt;strong&gt;tool cards&lt;/strong&gt;, live:&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;Not a vague "running…" — but &lt;strong&gt;exactly what step is happening, which file it touches, and what came back&lt;/strong&gt;. Watching the agent work from bed feels almost identical to sitting at the desk.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try 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 (free) on both devices, open &lt;code&gt;http://&amp;lt;computer IP&amp;gt;:8788/&lt;/code&gt; on your phone over 4G/5G, enter the token, go.&lt;/p&gt;

&lt;p&gt;No public IP, no router config, no cloud server. &lt;strong&gt;Three minutes.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Open source
&lt;/h2&gt;

&lt;p&gt;MIT licensed:&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 would YOU want to control on your desktop agent from your phone?&lt;/strong&gt; Drop it in the comments — the most requested feature ships next.&lt;/p&gt;

&lt;p&gt;A star is the cheapest and most effective way to support open source. Thank you 🫡&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Community project, not affiliated with DeepSeek.)&lt;/em&gt;&lt;/p&gt;

</description>
      <category>deepseek</category>
      <category>opensource</category>
      <category>story</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
