<?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: TaskHandoff</title>
    <description>The latest articles on DEV Community by TaskHandoff (@edgestorage1).</description>
    <link>https://dev.to/edgestorage1</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%2F4175501%2Fec0d9d08-ce57-4e40-8e40-beead3c54367.png</url>
      <title>DEV Community: TaskHandoff</title>
      <link>https://dev.to/edgestorage1</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/edgestorage1"/>
    <language>en</language>
    <item>
      <title>Where did I leave that? Managing AI agent sessions across machines</title>
      <dc:creator>TaskHandoff</dc:creator>
      <pubDate>Mon, 12 Oct 2026 04:32:50 +0000</pubDate>
      <link>https://dev.to/edgestorage1/where-did-i-leave-that-managing-ai-agent-sessions-across-machines-4clf</link>
      <guid>https://dev.to/edgestorage1/where-did-i-leave-that-managing-ai-agent-sessions-across-machines-4clf</guid>
      <description>&lt;p&gt;Running a coding agent has been getting easier for a while now. The hard part has quietly moved somewhere&lt;br&gt;
else.&lt;/p&gt;

&lt;p&gt;It's not the model. It's not the tooling. It's that &lt;strong&gt;you can't find the work you did yesterday.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  See if any of this is you
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;You have ten terminal windows open. Seven of them are called &lt;code&gt;codex&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You remember a session that had the tests almost passing. You don't remember which machine it was on.&lt;/li&gt;
&lt;li&gt;You closed your laptop, SSH dropped twice, and when you came back you weren't sure what you'd approved.&lt;/li&gt;
&lt;li&gt;One session has been running for two hours, and to see the step you actually care about you have to
scroll back through three hundred tool messages.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;None of these are about how smart the model is. They're about &lt;strong&gt;how your work is organized.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  This is now an entire product category
&lt;/h2&gt;

&lt;p&gt;Here's a funny way to see the problem clearly: there's a whole class of tools whose only job is answering&lt;br&gt;
&lt;em&gt;"where are my sessions?"&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://github.com/manaflow-ai/cmux" rel="noopener noreferrer"&gt;cmux&lt;/a&gt; (198 points on HN) — a terminal with &lt;strong&gt;vertical tabs and
notifications&lt;/strong&gt;, because you have too many sessions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/njbrake/agent-of-empires" rel="noopener noreferrer"&gt;Agent-of-empires&lt;/a&gt; (118 points) — literally a &lt;strong&gt;session
manager&lt;/strong&gt;. Its own README states the problem better than I can:
&amp;gt; "Each agent runs in its own tmux session, so your agents keep running when you close the TUI,
&amp;gt; &lt;strong&gt;disconnect SSH&lt;/strong&gt;, or your terminal crashes. &lt;strong&gt;Reopen &lt;code&gt;aoe&lt;/code&gt; and everything is where you left it.&lt;/strong&gt;"&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/obsessiondb/rudel" rel="noopener noreferrer"&gt;Rudel&lt;/a&gt; (144) does session analytics.
&lt;a href="https://github.com/es617/claude-replay" rel="noopener noreferrer"&gt;claude-replay&lt;/a&gt; (105) replays sessions like a video player.
&lt;a href="https://github.com/dchu917/ctx" rel="noopener noreferrer"&gt;Ctx&lt;/a&gt; (72) adds a &lt;code&gt;/resume&lt;/code&gt; that works across Claude Code and Codex.
&lt;a href="https://news.ycombinator.com/item?id=49743049" rel="noopener noreferrer"&gt;Skillsync&lt;/a&gt; (YC W26, 68) makes sessions portable between
agents. &lt;a href="https://github.com/pizza-bot-app/pizza-bot" rel="noopener noreferrer"&gt;Pizza Bot&lt;/a&gt; (61) gives agents an inbox.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even the vendors agree that many sessions at once is normal. Anthropic ships docs titled&lt;br&gt;
&lt;a href="https://code.claude.com/docs/en/agent-teams" rel="noopener noreferrer"&gt;Orchestrate teams of Claude Code sessions&lt;/a&gt; (396 points on HN)&lt;br&gt;
and &lt;a href="https://code.claude.com/docs/en/cross-session-messaging" rel="noopener noreferrer"&gt;Message your other Claude Code sessions&lt;/a&gt;&lt;br&gt;
(173 points).&lt;/p&gt;

&lt;p&gt;And their blog nails what bad session hygiene actually costs:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"In one session, Claude reads the test and the file it covers, makes the edit, and is done in a handful of&lt;br&gt;
turns. In another, it greps around the repo first, reads a dozen files on its way to the same two, and&lt;br&gt;
&lt;strong&gt;every one of those turns also drags along everything else that's been read into the conversation since&lt;br&gt;
this morning.&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Same fix. Very different bill.&lt;/p&gt;

&lt;h2&gt;
  
  
  All of those tools hit the same ceiling
&lt;/h2&gt;

&lt;p&gt;Almost every one of them is &lt;strong&gt;single-machine and single-agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The moment your sessions live on several machines — one at home, one at work, one on a customer's box, one in&lt;br&gt;
the cloud — the session manager can't see them, the replay tool can't replay them, and &lt;code&gt;/resume&lt;/code&gt; can't find&lt;br&gt;
them. Your session management silently drops to zero exactly when you need it most.&lt;/p&gt;

&lt;h2&gt;
  
  
  TaskHandoff organizes sessions around an idea called Story
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TaskHandoff&lt;/strong&gt; is an open-source (Apache-2.0) control plane. The unit it organizes work around is a&lt;br&gt;
&lt;strong&gt;Story&lt;/strong&gt;, and the documentation defines it in one line:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Story — Organize documents, sessions, preset actions, and automation by goal.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The key word is &lt;strong&gt;goal&lt;/strong&gt;, not time. If your goal is "finish the payments refactor," that's one Story holding&lt;br&gt;
the relevant documents, several sessions, the preset actions you keep reusing, and the automation around it —&lt;br&gt;
instead of four terminals you have to remember.&lt;/p&gt;

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

&lt;p&gt;Then there are three things sessions themselves do about the pain above.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. The session list marks unread sessions.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Session lists mark &lt;strong&gt;unread&lt;/strong&gt; AI sessions so you can quickly find work that needs attention.&lt;br&gt;
Switch sessions from the instance sidebar, AI board, or &lt;strong&gt;Story&lt;/strong&gt;."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Three places to switch sessions, and anything you haven't looked at is flagged. That answers "what did I miss."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Compact mode shows you one turn at a time.&lt;/strong&gt; This is the part I haven't seen anywhere else:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"TaskHandoff's default and distinctive session experience. It focuses on &lt;strong&gt;one selected task turn&lt;/strong&gt; and&lt;br&gt;
keeps only the prompt, AI response, live tool activity, approvals, queue, and sub-agent state needed for the&lt;br&gt;
current decision. &lt;strong&gt;This greatly reduces interference from long histories and repetitive process messages.&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A two-hour session stops burying today's decision under hundreds of process messages.&lt;/p&gt;

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

&lt;p&gt;And importantly, it doesn't achieve that by throwing data away:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Compact mode does &lt;strong&gt;not&lt;/strong&gt; summarize away or delete server-side session data. The complete history remains&lt;br&gt;
available in Conversation mode."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3. Conversation mode is there when you need to dig.&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Use it to &lt;strong&gt;reconstruct a task, find an earlier prompt or result, audit approvals and retries&lt;/strong&gt;, or&lt;br&gt;
understand context across multiple turns."&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;&lt;strong&gt;And one line in the docs is the whole answer to "across machines":&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"During a &lt;strong&gt;reconnect&lt;/strong&gt;, TaskHandoff reloads the &lt;strong&gt;authoritative session snapshot&lt;/strong&gt;.&lt;br&gt;
A temporary Reconnecting state does not imply that the background task stopped."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Switch devices, lose the connection, come back — you get the authoritative snapshot, not a partial cache, and&lt;br&gt;
"reconnecting" doesn't mean your background work died.&lt;/p&gt;

&lt;p&gt;One more thing worth stealing: &lt;strong&gt;Story decisions&lt;/strong&gt;. When a session produces something that needs a human&lt;br&gt;
call, it doesn't get buried in chat — it becomes a pending item in the approvals queue. "Something is waiting&lt;br&gt;
on you."&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/edgestorage/task-handoff/releases/latest/download/install-server.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;https://github.com/edgestorage/task-handoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.thandoff.com/en/sessions/" rel="noopener noreferrer"&gt;https://docs.thandoff.com/en/sessions/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The line worth ending on
&lt;/h2&gt;

&lt;p&gt;The last line of TaskHandoff's own "recommended practice" section is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Save important results in &lt;strong&gt;project files or Story documents&lt;/strong&gt;, not only chat history."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Chat history disappears. Goals don't.&lt;/p&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;p&gt;Story isn't magic that tidies your sessions for you. It gives you &lt;strong&gt;structure&lt;/strong&gt; — grouping by goal, unread&lt;br&gt;
markers, a pending-decisions queue — and whether you use that structure is still down to your own habits.&lt;/p&gt;

&lt;p&gt;If you only have one project on one machine, most of this won't matter to you yet. It's built for people&lt;br&gt;
whose sessions have already started to sprawl.&lt;/p&gt;

&lt;p&gt;TaskHandoff is also still Beta — the README says plainly that breaking changes may land between releases.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>productivity</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>You can build your own Codex Desktop. The glue is the hard part.</title>
      <dc:creator>TaskHandoff</dc:creator>
      <pubDate>Mon, 12 Oct 2026 04:26:38 +0000</pubDate>
      <link>https://dev.to/edgestorage1/you-can-build-your-own-codex-desktop-the-glue-is-the-hard-part-9k8</link>
      <guid>https://dev.to/edgestorage1/you-can-build-your-own-codex-desktop-the-glue-is-the-hard-part-9k8</guid>
      <description>&lt;p&gt;There's a genre of blog post you've definitely seen. The title is usually something like &lt;em&gt;"Own the Harness,&lt;br&gt;
Rent the Intelligence."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The argument is correct: your rules, your skills, your tooling should move with you when you change models&lt;br&gt;
or subscriptions — instead of being locked into somebody's account.&lt;/p&gt;

&lt;p&gt;Someone recently actually did it, and then wrote a very honest post-mortem.&lt;/p&gt;
&lt;h2&gt;
  
  
  He pulled it off. Then he went back to Codex Desktop.
&lt;/h2&gt;

&lt;p&gt;The post is &lt;a href="https://jorypestorious.com/blog/portable-agent-factory/" rel="noopener noreferrer"&gt;I Wanted to Own the Harness. Then Codex Desktop Won.&lt;/a&gt;&lt;br&gt;
(Jory Pestorious, Aug 2026). His original draft was called "Own the Harness, Rent the Intelligence."&lt;/p&gt;

&lt;p&gt;And he genuinely did achieve portability — "portability is what let me cancel Claude Max without abandoning&lt;br&gt;
my rules."&lt;/p&gt;

&lt;p&gt;But he ends up admitting he kept opening Codex Desktop anyway. And the reason he gives is the real thesis&lt;br&gt;
of this article:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I've built the rest myself more than once. One version combined a terminal harness, a provider,&lt;br&gt;
MCP servers, editor integration, &lt;strong&gt;remote access, a scheduler, notifications, voice&lt;/strong&gt;, and the code&lt;br&gt;
connecting them. &lt;strong&gt;A task started in one tool could not see the context in another.&lt;/strong&gt; An update broke a&lt;br&gt;
path I had forgotten was fragile. &lt;strong&gt;The pieces worked, but keeping them connected became its own project.&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Every piece worked. The glue became the project.&lt;/p&gt;

&lt;p&gt;He puts it even better a few lines later:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"&lt;strong&gt;'You can build it yourself' is true in the same way that 'you can change your own oil' is true.&lt;br&gt;
The missing number is what I wanted to do with that Saturday.&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  What he was actually staying for
&lt;/h2&gt;

&lt;p&gt;The interesting part is that he spells out why he stayed, and those two sentences read like a feature list:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Codex became the window I kept open. &lt;strong&gt;My work sat in visible tasks instead of terminal sessions&lt;br&gt;
I had to remember.&lt;/strong&gt;"&lt;/p&gt;

&lt;p&gt;"&lt;strong&gt;Remote setup took a QR code.&lt;/strong&gt; I could talk through an idea, &lt;strong&gt;pick up the work from my phone&lt;/strong&gt;, and&lt;br&gt;
let a scheduled task return to the conversation where it began."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not "the model is smarter." Not "there are more tools." It's:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Work you can see&lt;/strong&gt; — instead of terminals you have to remember.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote access that just connects&lt;/strong&gt; — a QR code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Picking it up from your phone&lt;/strong&gt; — no re-establishing context.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of that has anything to do with the model. That's a &lt;strong&gt;control plane&lt;/strong&gt;.&lt;/p&gt;
&lt;h2&gt;
  
  
  The open-source gap was never the agent
&lt;/h2&gt;

&lt;p&gt;Look at where the open-source energy has actually gone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OpenCode&lt;/strong&gt;, an open-source AI coding agent — &lt;strong&gt;1,274 points, 618 comments&lt;/strong&gt; on HN. The agent layer is
solved and thriving.&lt;/li&gt;
&lt;li&gt;Plandex, MyCoder, Sidekick, Agentty — there are more open-source agents than anyone can try.&lt;/li&gt;
&lt;li&gt;Meanwhile, "run your agent anywhere, on any machine" is &lt;strong&gt;almost entirely cloud products&lt;/strong&gt;:
&lt;a href="https://boxes.dev" rel="noopener noreferrer"&gt;Boxes.dev&lt;/a&gt; (105 points / 79 comments),
&lt;a href="https://news.ycombinator.com/item?id=46991591" rel="noopener noreferrer"&gt;Omnara&lt;/a&gt; (YC S25, 147 points / 161 comments).&lt;/li&gt;
&lt;li&gt;The one open-source project pointed the same way,
&lt;a href="https://github.com/proliferate-ai/proliferate" rel="noopener noreferrer"&gt;Proliferate&lt;/a&gt; — "open-source, self-hostable Codex for any
coding agent" — sits at 46 points and 16 comments. &lt;strong&gt;The seat is basically empty.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And on the other side of the ledger: the Codex app launch post has &lt;strong&gt;805 points and 638 comments&lt;/strong&gt; on HN.&lt;br&gt;
The "Linux support is finally in preview" post has &lt;strong&gt;469 points and 315 comments&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;So: &lt;strong&gt;the agent layer is open source and winning. The control plane is closed or hosted.&lt;/strong&gt;&lt;br&gt;
That gap is exactly why one person gluing it together by hand ends up with a project instead of a setup.&lt;/p&gt;
&lt;h2&gt;
  
  
  That's the seat TaskHandoff takes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TaskHandoff&lt;/strong&gt; is an open-source (Apache-2.0) control plane. It doesn't replace your agent — it replaces&lt;br&gt;
the glue that connects people, machines and sessions, and keeps them connected:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser / Desktop / Mobile
            │
            ▼
       Control Plane     ← one console: node inventory + instance board + session view
            │
            ▼
         Node Agent      ← one per machine (home, work, customer, cloud)
            │
            ▼
   Controlled Instance   ← one isolated container per session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mapped to the three things he was actually staying for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Work you can see&lt;/strong&gt; → the AI session center. Session state across instances streams in real time over
WebSocket, so ten machines are still one board.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Remote access that just connects&lt;/strong&gt; → install a Node Agent and that machine is a node. No signing up to
someone else's cloud, and no QR code handing control to a third party.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Picking it up from your phone&lt;/strong&gt; → a mobile client. iOS and Android connect directly to the Control
Plane you deployed.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Plus the parts that make it hold together: &lt;strong&gt;the Node Agent owns instance lifecycles&lt;/strong&gt; (restart the control&lt;br&gt;
plane, close your browser — the instances keep running, so "a scheduled task returns to the conversation&lt;br&gt;
where it began" doesn't require a hosted service), &lt;strong&gt;multi-node management&lt;/strong&gt;, &lt;strong&gt;environment templates&lt;/strong&gt;,&lt;br&gt;
&lt;strong&gt;Controlled Instances&lt;/strong&gt; with Docker isolation, and &lt;strong&gt;managed Git credentials scoped per remote&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;It doesn't swap Codex for another agent. You bring your own.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/edgestorage/task-handoff/releases/latest/download/install-server.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;https://github.com/edgestorage/task-handoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;https://docs.thandoff.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;p&gt;TaskHandoff is &lt;strong&gt;not&lt;/strong&gt; yet a product that competes with Codex Desktop on polish. There's no floating&lt;br&gt;
animated dog, no voice, none of that carefully finished desktop feel. It works on the layer underneath —&lt;br&gt;
how tasks, machines, sessions and credentials get seen and connected.&lt;/p&gt;

&lt;p&gt;If what you want is a beautiful integrated desktop experience, Codex Desktop is genuinely better at it&lt;br&gt;
right now. The author of that post made exactly that trade, and it's a reasonable one.&lt;/p&gt;

&lt;p&gt;TaskHandoff is also still Beta — the README says plainly that breaking changes may land between releases.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Paseo or TaskHandoff? The answer depends on where the code actually runs</title>
      <dc:creator>TaskHandoff</dc:creator>
      <pubDate>Sun, 11 Oct 2026 16:21:03 +0000</pubDate>
      <link>https://dev.to/edgestorage1/paseo-or-taskhandoff-the-answer-depends-on-where-the-code-actually-runs-3o5f</link>
      <guid>https://dev.to/edgestorage1/paseo-or-taskhandoff-the-answer-depends-on-where-the-code-actually-runs-3o5f</guid>
      <description>&lt;p&gt;If you go looking for an open-source way to run coding agents anywhere, you'll probably hit two projects in&lt;br&gt;
the same afternoon: &lt;strong&gt;Paseo&lt;/strong&gt; and &lt;strong&gt;TaskHandoff&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;They look almost identical from the outside. Both are open source. Both connect desktop and phone. Both run&lt;br&gt;
several agents at once. Both reach across more than one machine.&lt;/p&gt;

&lt;p&gt;One difference separates them completely, and it fits in a sentence: &lt;strong&gt;where does the code actually run?&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Let's be fair about Paseo first
&lt;/h2&gt;

&lt;p&gt;Paseo is the current leader in this space: &lt;strong&gt;20,000+ stars&lt;/strong&gt; on GitHub, Apache-2.0, very active. It bills&lt;br&gt;
itself as "orchestrate multiple coding agents from desktop and mobile," and it supports seven providers —&lt;br&gt;
Claude Code, Codex, Copilot, OpenCode, Pi, Antigravity, and Muse Code. It also has voice control, a plugin&lt;br&gt;
registry, schedules, and a built-in browser.&lt;/p&gt;

&lt;p&gt;Architecturally, it runs a &lt;strong&gt;daemon on your machine&lt;/strong&gt;, and the desktop app, mobile apps, web UI and CLI all&lt;br&gt;
connect to that daemon.&lt;/p&gt;

&lt;p&gt;And one line in its own README explains everything that follows:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Agents run on your machine with &lt;strong&gt;your full dev environment&lt;/strong&gt;. Use your tools, your configs, and your skills."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Paseo does ship a Docker image — but that image runs &lt;strong&gt;the daemon and its web UI&lt;/strong&gt;, not your sessions. The&lt;br&gt;
docs are explicit: the image &lt;strong&gt;does not bundle agent CLIs&lt;/strong&gt;; you add those with your own child image.&lt;/p&gt;

&lt;p&gt;So Paseo's default assumption is: &lt;em&gt;this machine is mine, this environment is trusted, let the agent use it&lt;br&gt;
directly.&lt;/em&gt; Most of the time, that assumption is correct. And it's exactly why Paseo feels so smooth — all&lt;br&gt;
your config, all your skills, all your tooling, right there.&lt;/p&gt;
&lt;h2&gt;
  
  
  TaskHandoff starts from the opposite assumption
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TaskHandoff&lt;/strong&gt; is also an open-source (Apache-2.0) control plane, but it assumes:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;this code might not be something you trust.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;So it's built in three layers:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Control Plane        ← the console you look at
     ↓
  Node Agent         ← one per machine
     ↓
Controlled Instance  ← one isolated container per session
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Every session runs in its own container&lt;/strong&gt;, not directly on the host. That single choice cascades into&lt;br&gt;
everything below.&lt;/p&gt;

&lt;h2&gt;
  
  
  So how do you actually choose?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  If you want to give the agent full access → TaskHandoff
&lt;/h3&gt;

&lt;p&gt;Here's the Codex help text for &lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"EXTREMELY DANGEROUS. &lt;strong&gt;Intended solely for running in environments that are externally sandboxed.&lt;/strong&gt;"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Those last four words are the whole argument. Turning approvals off on your own laptop is genuinely&lt;br&gt;
reckless. Turning them off inside a container you'll delete is the &lt;em&gt;documented, intended&lt;/em&gt; use.&lt;/p&gt;

&lt;p&gt;Paseo's default deployment is "agents on your machine, with your full dev environment." That's great — but it&lt;br&gt;
means &lt;strong&gt;the boundary is your host&lt;/strong&gt;, so you keep the approvals and you keep getting interrupted. If what you&lt;br&gt;
want is "no interruptions, and no worry," you need the container.&lt;/p&gt;

&lt;h3&gt;
  
  
  If the code isn't yours → TaskHandoff
&lt;/h3&gt;

&lt;p&gt;AI-generated code, a third-party PR, a script a customer handed you. None of that should get full access to&lt;br&gt;
your machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you have multiple customers or identities → TaskHandoff
&lt;/h3&gt;

&lt;p&gt;TaskHandoff has an actual model for Git credentials. They're scoped to a &lt;strong&gt;remote&lt;/strong&gt; (scheme + host + port +&lt;br&gt;
repository path prefix). Secrets are write-only after saving. HTTPS tokens exist only for the duration of a&lt;br&gt;
single credential-helper request. &lt;strong&gt;SSH private keys never leave the Node Agent&lt;/strong&gt; — instances get a public&lt;br&gt;
identity plus a signing proxy, and trust-on-first-use isn't allowed at all. A credential authorizes only the&lt;br&gt;
initial clone unless you explicitly retain it on that instance.&lt;/p&gt;

&lt;p&gt;When you're juggling several customers, that layer matters far more than raw speed.&lt;/p&gt;

&lt;h3&gt;
  
  
  If the environment has to be reproducible → TaskHandoff
&lt;/h3&gt;

&lt;p&gt;TaskHandoff has &lt;strong&gt;environment templates&lt;/strong&gt;: take a working container, commit it into a reusable template, and&lt;br&gt;
every new instance starts from that same environment. Instead of "it happens to work on my machine."&lt;/p&gt;

&lt;h3&gt;
  
  
  And when is Paseo the better choice?
&lt;/h3&gt;

&lt;p&gt;Let's just say it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You want to run several agents on &lt;strong&gt;your own laptop&lt;/strong&gt;, and you want &lt;strong&gt;voice&lt;/strong&gt;, a &lt;strong&gt;plugin registry&lt;/strong&gt;, and a
more polished mobile app.&lt;/li&gt;
&lt;li&gt;Your project only ever lives on your machine, and you don't need a boundary around the code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then &lt;strong&gt;Paseo is the better choice&lt;/strong&gt; — and it's more mature, with a much bigger community. Pretending&lt;br&gt;
otherwise would be silly.&lt;/p&gt;

&lt;h2&gt;
  
  
  The one-line version
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Paseo puts the agent on your machine. TaskHandoff puts the agent in a box.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Both are right. It depends on whether you trust the code.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/edgestorage/task-handoff/releases/latest/download/install-server.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;https://github.com/edgestorage/task-handoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;https://docs.thandoff.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;p&gt;TaskHandoff has single-digit stars and is in Beta — the README says plainly that breaking changes may land&lt;br&gt;
between releases. Its provider support is nowhere near Paseo's. It's a smaller, more focused, more cautious&lt;br&gt;
tool, not a bigger one.&lt;/p&gt;

&lt;p&gt;If you're picking between two strong options, pick using the four cases above — not the star count.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>opensource</category>
      <category>devtools</category>
      <category>docker</category>
    </item>
    <item>
      <title>Stop approving every command: put your AI agent in a container</title>
      <dc:creator>TaskHandoff</dc:creator>
      <pubDate>Sat, 10 Oct 2026 22:03:33 +0000</pubDate>
      <link>https://dev.to/edgestorage1/stop-approving-every-command-put-your-ai-agent-in-a-container-5bib</link>
      <guid>https://dev.to/edgestorage1/stop-approving-every-command-put-your-ai-agent-in-a-container-5bib</guid>
      <description>&lt;p&gt;If you've used a coding agent for more than a day, you know the rhythm.&lt;/p&gt;

&lt;p&gt;It writes a command. It stops. It asks you to approve. You click yes.&lt;br&gt;
It writes another command. It stops. It asks again.&lt;/p&gt;

&lt;p&gt;By lunchtime you've clicked yes forty times, and you've quietly stopped reading what you're approving. At&lt;br&gt;
that point the safety feature isn't protecting anything. It's just slowing you down.&lt;/p&gt;

&lt;p&gt;There's a way to get the safety without the clicking, and it isn't a setting. It's &lt;em&gt;where you run the agent&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the approval prompt is really for
&lt;/h2&gt;

&lt;p&gt;The prompt exists for one reason: the agent is about to run real code on your real computer.&lt;/p&gt;

&lt;p&gt;Your SSH keys are on that computer. Your cloud credentials are on that computer. Six months of&lt;br&gt;
uncommitted work is on that computer.&lt;/p&gt;

&lt;p&gt;So the real question the prompt is asking you is: &lt;em&gt;"Do you trust this command enough to let it run&lt;br&gt;
**here&lt;/em&gt;&lt;em&gt;?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;On your laptop, that's a great question.&lt;/p&gt;

&lt;p&gt;Inside a container you can delete with one click, it's a question with no stakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex already ships the answer
&lt;/h2&gt;

&lt;p&gt;Codex gives you three settings for exactly this. Straight from &lt;code&gt;codex --help&lt;/code&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--ask-for-approval never&lt;/code&gt; — stop asking me&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--approve-for-me&lt;/code&gt; — have a second AI review it instead of me&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--dangerously-bypass-approvals-and-sandbox&lt;/code&gt; — turn off both the asking and the sandbox&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That last one sounds like a bad idea, and the help text agrees with you. It says, in capitals:&lt;br&gt;
&lt;strong&gt;EXTREMELY DANGEROUS&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;But read the rest of the sentence:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;EXTREMELY DANGEROUS. &lt;strong&gt;Intended solely for running in environments that are externally sandboxed.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Read that twice, because it's the whole point.&lt;/p&gt;

&lt;p&gt;The person who wrote that flag isn't warning you away from it. They're telling you when to use it:&lt;br&gt;
&lt;em&gt;when the environment is already contained.&lt;/em&gt; Your laptop is not contained. A container is.&lt;/p&gt;

&lt;p&gt;Same flag, completely different meaning, depending on which box it runs in.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why "just turn them off" never felt safe
&lt;/h2&gt;

&lt;p&gt;Because on your laptop, you're right not to. And if you've tried to make the prompts behave, you've&lt;br&gt;
probably run into one of these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You allow a folder, and it still isn't trusted, even with the bypass flag on
(&lt;a href="https://github.com/openai/codex/issues/14345" rel="noopener noreferrer"&gt;#14345&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;"Allow for this session" is forgotten the moment you restart
(&lt;a href="https://github.com/openai/codex/issues/4212" rel="noopener noreferrer"&gt;#4212&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;You turn on Full Access, and it still asks anyway
(&lt;a href="https://github.com/openai/codex/issues/29235" rel="noopener noreferrer"&gt;#29235&lt;/a&gt;, &lt;a href="https://github.com/openai/codex/issues/28988" rel="noopener noreferrer"&gt;#28988&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Ordinary commands ask for approval in sandbox mode, so the sandbox does nothing but nag
(&lt;a href="https://github.com/openai/codex/issues/3140" rel="noopener noreferrer"&gt;#3140&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;Your MCP tools ask on every single call (&lt;a href="https://github.com/openai/codex/issues/16911" rel="noopener noreferrer"&gt;#16911&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These aren't rare edge cases. The best-known thread on the topic has 77 comments and the title&lt;br&gt;
"Unusable on Windows due to permission ask for every shell command"&lt;br&gt;
(&lt;a href="https://github.com/openai/codex/issues/2860" rel="noopener noreferrer"&gt;#2860&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;The pattern is always the same: the prompts are annoying when they work, and broken when you try to&lt;br&gt;
turn them off. That's not a bug in Codex. That's what happens when you put a security gate on a machine&lt;br&gt;
that isn't designed to be a security boundary.&lt;/p&gt;

&lt;h2&gt;
  
  
  The middle option, if "off" feels too far
&lt;/h2&gt;

&lt;p&gt;If you're not ready to go fully unattended, there's &lt;code&gt;--approve-for-me&lt;/code&gt;. Instead of asking you, Codex asks&lt;br&gt;
another model to review the command and lets the boring ones through automatically. Only the genuinely&lt;br&gt;
weird stuff reaches you. (Internally this is the "guardian" reviewer, and it's a stable feature —&lt;br&gt;
&lt;code&gt;guardian_approval&lt;/code&gt; shows up in &lt;code&gt;codex features list&lt;/code&gt;.)&lt;/p&gt;

&lt;p&gt;It's a fair trade, but be honest about what it costs: &lt;strong&gt;every decision is another model call.&lt;/strong&gt; You're&lt;br&gt;
spending tokens so that you don't have to look. That's often worth it. It's just not free.&lt;/p&gt;

&lt;h2&gt;
  
  
  A container changes what all of this costs
&lt;/h2&gt;

&lt;p&gt;Here's the same three settings, inside a disposable container:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setting&lt;/th&gt;
&lt;th&gt;On your laptop&lt;/th&gt;
&lt;th&gt;In a container&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ask me every time&lt;/td&gt;
&lt;td&gt;safe, but exhausting&lt;/td&gt;
&lt;td&gt;pointless — you'd be approving things that can't hurt you&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Review with AI&lt;/td&gt;
&lt;td&gt;a reasonable middle ground&lt;/td&gt;
&lt;td&gt;fine, but you're paying for protection you mostly don't need&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Never ask&lt;/td&gt;
&lt;td&gt;reckless&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;the documented, intended use&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Once the box is disposable, "never ask" stops being a dare and starts being the sensible default. You&lt;br&gt;
get no prompts, no waiting, and none of those loops where you say no, the agent re-plans, you say yes&lt;br&gt;
anyway — and pay for all of it in tokens&lt;br&gt;
(&lt;a href="https://github.com/openai/codex/issues/14593" rel="noopener noreferrer"&gt;#14593&lt;/a&gt; has 630 comments about exactly that kind of waste).&lt;/p&gt;

&lt;p&gt;So the order of decisions matters:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;First choose how much damage one bad command can do. Then choose how much freedom to give the agent.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Do it the other way around and your only two options are "too noisy" and "too risky."&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;TaskHandoff&lt;/strong&gt; is an open-source (Apache-2.0) control plane for running AI/Codex workspaces across your&lt;br&gt;
own machines. Every session runs inside a &lt;strong&gt;managed Linux Docker container&lt;/strong&gt; that you create, start, stop&lt;br&gt;
and throw away from one console.&lt;/p&gt;

&lt;p&gt;That container &lt;em&gt;is&lt;/em&gt; the "externally sandboxed environment" from the help text.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sessions run in a &lt;strong&gt;managed container&lt;/strong&gt;, not on your desktop.&lt;/li&gt;
&lt;li&gt;Workspaces are &lt;strong&gt;things you own and control&lt;/strong&gt;: create, snapshot, restore, delete, rebuild.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Templates&lt;/strong&gt; save a working toolchain once, so you don't rebuild it per project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multiple machines, one console&lt;/strong&gt; — run the heavy work on a Linux box and drive it from your laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Live session view&lt;/strong&gt; over WebSocket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't have to talk yourself into turning the prompts off. You just have to run the command somewhere&lt;br&gt;
that was meant to be thrown away.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/edgestorage/task-handoff/releases/latest/download/install-server.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Comes as a desktop app and a server (systemd on Debian/Ubuntu), with an English and Chinese UI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;https://github.com/edgestorage/task-handoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;https://docs.thandoff.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  One honest caveat
&lt;/h2&gt;

&lt;p&gt;Full access means the container is now the thing keeping you safe — so it has to really be disposable.&lt;br&gt;
Don't mount the only copy of your credentials into it, and don't use it as a password vault.&lt;/p&gt;

&lt;p&gt;And if your task genuinely needs your host machine, or Windows-only tools, keep the prompts on. These&lt;br&gt;
three settings aren't a religion. They're just tools, and now you know which one matches which box.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>docker</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Codex on Windows keeps fighting PowerShell — run it in a Linux container instead</title>
      <dc:creator>TaskHandoff</dc:creator>
      <pubDate>Sat, 10 Oct 2026 17:17:29 +0000</pubDate>
      <link>https://dev.to/edgestorage1/codex-on-windows-keeps-fighting-powershell-run-it-in-a-linux-container-instead-3njb</link>
      <guid>https://dev.to/edgestorage1/codex-on-windows-keeps-fighting-powershell-run-it-in-a-linux-container-instead-3njb</guid>
      <description>&lt;p&gt;If you run a coding agent on Windows for long enough, you'll notice a pattern: the agent writes a shell&lt;br&gt;
command, it fails, it rewrites the command, it fails again — three or four times — and only then finds&lt;br&gt;
something that works. On macOS or Linux the same task usually goes through on the first try.&lt;/p&gt;

&lt;p&gt;It's tempting to blame the model. Usually it isn't the model. It's the shell layer underneath it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's actually happening
&lt;/h2&gt;

&lt;p&gt;On native Windows, Codex doesn't hand your command to the OS as a plain &lt;code&gt;argv&lt;/code&gt; list. External CLI&lt;br&gt;
commands get wrapped and executed through PowerShell — closer to&lt;br&gt;
&lt;code&gt;pwsh.exe -Command "your-command ..."&lt;/code&gt; than a direct invocation&lt;br&gt;
(&lt;a href="https://github.com/openai/codex/issues/15294" rel="noopener noreferrer"&gt;#15294&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;That single design decision cascades:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Quoting and escaping.&lt;/strong&gt; PowerShell has its own quoting rules. A command that's perfectly valid in
bash can need different escaping here — and the model has to guess which dialect it's writing for.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Permission rules stop matching.&lt;/strong&gt; Because every command is rewritten into a PowerShell wrapper,
allow-rules like "everything starting with &lt;code&gt;dotnet&lt;/code&gt;" don't match reliably
(&lt;a href="https://github.com/openai/codex/issues/8537" rel="noopener noreferrer"&gt;#8537&lt;/a&gt;), which is why so many Windows users end up approving
every single command (&lt;a href="https://github.com/openai/codex/issues/2860" rel="noopener noreferrer"&gt;#2860&lt;/a&gt;, 77 comments).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basic file operations go through the shell too.&lt;/strong&gt; Even read/write/search were reported as
PowerShell operations rather than internal tools (&lt;a href="https://github.com/openai/codex/issues/3800" rel="noopener noreferrer"&gt;#3800&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment leaks.&lt;/strong&gt; A child &lt;code&gt;powershell.exe&lt;/code&gt; can inherit PowerShell 7's &lt;code&gt;PSModulePath&lt;/code&gt;, which breaks
module discovery and makes even &lt;code&gt;Get-FileHash&lt;/code&gt; unavailable (&lt;a href="https://github.com/openai/codex/issues/27117" rel="noopener noreferrer"&gt;#27117&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sandboxing is flaky.&lt;/strong&gt; Sandboxed PowerShell commands intermittently fail before the command even runs
(&lt;a href="https://github.com/openai/codex/issues/25497" rel="noopener noreferrer"&gt;#25497&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's noisy.&lt;/strong&gt; Every command can flash a console window (&lt;a href="https://github.com/openai/codex/issues/48074" rel="noopener noreferrer"&gt;#48074&lt;/a&gt;,
&lt;a href="https://github.com/openai/codex/issues/48422" rel="noopener noreferrer"&gt;#48422&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The requests keep coming: people have asked, repeatedly, for a configurable Windows shell&lt;br&gt;
(&lt;a href="https://github.com/openai/codex/issues/16717" rel="noopener noreferrer"&gt;#16717&lt;/a&gt;, &lt;a href="https://github.com/openai/codex/issues/31548" rel="noopener noreferrer"&gt;#31548&lt;/a&gt;,&lt;br&gt;
&lt;a href="https://github.com/openai/codex/issues/16579" rel="noopener noreferrer"&gt;#16579&lt;/a&gt;). Which tells you the community has already reached the&lt;br&gt;
obvious conclusion: &lt;strong&gt;the shell layer is the problem, not the task.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The retry loop is what actually costs you
&lt;/h2&gt;

&lt;p&gt;A failed command isn't just a wasted second. The agent has to reason about &lt;em&gt;why&lt;/em&gt; it failed, produce a&lt;br&gt;
different command, and try again — each round trip carries the whole context with it. On Windows this&lt;br&gt;
can happen several times per task, and you pay for all of it in tokens and in your own attention.&lt;/p&gt;

&lt;h2&gt;
  
  
  The usual workarounds, and what they cost
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;WSL.&lt;/strong&gt; Works, but now you maintain two environments, and the agent may or may not be running where your
project actually lives.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Switch to Git Bash as the primary shell.&lt;/strong&gt; Codex has been reported to chain Git Bash → PowerShell in
confusing ways (&lt;a href="https://github.com/openai/codex/issues/7298" rel="noopener noreferrer"&gt;#7298&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Approve everything.&lt;/strong&gt; Fast, and exactly as bad an idea as it sounds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait for a config option.&lt;/strong&gt; Reasonable, but you're blocked on someone else's roadmap.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A different move: stop running your agent on Windows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;TaskHandoff&lt;/strong&gt; is an open-source control plane (Apache-2.0) for running and managing AI/Codex workspaces&lt;br&gt;
across local and remote machines. Instead of fighting the host shell, each session runs inside a &lt;strong&gt;managed&lt;br&gt;
Linux Docker workspace&lt;/strong&gt; — and you drive it from one console.&lt;/p&gt;

&lt;p&gt;Concretely, that means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The agent always sees the &lt;strong&gt;same bash environment&lt;/strong&gt;, whether the machine underneath is Windows, macOS,
or Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker workspaces&lt;/strong&gt; are created, started, stopped and restored as first-class objects — no more
"it worked on my other machine".&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment templates&lt;/strong&gt; let you snapshot a container's toolchain and reuse it, so a working setup
doesn't have to be rediscovered per project.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Multi-node management&lt;/strong&gt; puts local and remote machines on one board — run heavy work on a Linux box and
still drive it from your Windows laptop.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI session center&lt;/strong&gt; streams session state in real time over WebSocket.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don't need to teach the model PowerShell. You just stop asking it to.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/edgestorage/task-handoff/releases/latest/download/install-server.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ships as a Desktop app and a server (systemd on Debian/Ubuntu), with an English/Chinese UI.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;https://github.com/edgestorage/task-handoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;https://docs.thandoff.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest caveats
&lt;/h2&gt;

&lt;p&gt;Running your workspace in a container doesn't magically fix every Windows problem — if your project&lt;br&gt;
genuinely needs Windows-only tooling, you'll want a Windows node. But for the large class of tasks where&lt;br&gt;
the agent is looping on shell syntax and permissions, removing the host shell from the equation is the&lt;br&gt;
cheapest fix available today.&lt;/p&gt;




</description>
      <category>ai</category>
      <category>docker</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>TaskHandoff: one console for AI coding workspaces across local and remote machines</title>
      <dc:creator>TaskHandoff</dc:creator>
      <pubDate>Sat, 10 Oct 2026 15:23:04 +0000</pubDate>
      <link>https://dev.to/edgestorage1/taskhandoff-one-console-for-ai-coding-workspaces-across-local-and-remote-machines-ie3</link>
      <guid>https://dev.to/edgestorage1/taskhandoff-one-console-for-ai-coding-workspaces-across-local-and-remote-machines-ie3</guid>
      <description>&lt;p&gt;If you run AI coding sessions (Codex, agents, background jobs) for more than a few weeks, they start to sprawl. One session on the laptop, one on a home server, a couple inside Docker containers on a remote VM — and no single place that tells you &lt;em&gt;what is running, where it lives, and how to hand it off&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TaskHandoff&lt;/strong&gt; is an open-source control plane (Apache-2.0, TypeScript) that pulls those AI workspaces into one board. I've been using it to keep local and remote machines in the same view, and it's finally at a state worth sharing.&lt;/p&gt;

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

&lt;p&gt;Once AI sessions spread across machines, you end up juggling:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SSH tabs, container shells, and a half-dozen config files&lt;/li&gt;
&lt;li&gt;No shared view of "what's running where"&lt;/li&gt;
&lt;li&gt;Rebuilding the same container toolchain over and over&lt;/li&gt;
&lt;li&gt;Copy-pasting context between a chat app and the machine that actually does the work&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Multi-node management&lt;/strong&gt; — local and remote machines in a single board&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Managed Docker workspaces&lt;/strong&gt; — create, run, and restore workspaces as first-class objects&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment templates&lt;/strong&gt; — snapshot a container's tools + config and reuse it elsewhere&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI session center&lt;/strong&gt; — real-time sessions over WebSocket, attach/detach at will&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Repository workflows&lt;/strong&gt; — files, changes, branches, and git worktrees from the UI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scoped Git credentials&lt;/strong&gt; — hand each workspace only the credentials it needs&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Chat integrations&lt;/strong&gt; — route tasks from Telegram, DingTalk, WeChat, or Lark&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App catalog + mobile client&lt;/strong&gt; — plus a Desktop app and a server, with an English/Chinese UI&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quick start
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://github.com/edgestorage/task-handoff/releases/latest/download/install-server.sh | &lt;span class="nb"&gt;sudo &lt;/span&gt;sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ships as a Desktop client and a server (systemd on Debian/Ubuntu). Once the server is up, open the console and add your machines.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it exists
&lt;/h2&gt;

&lt;p&gt;Most AI tooling optimizes the &lt;em&gt;model&lt;/em&gt;. TaskHandoff optimizes the &lt;em&gt;plumbing&lt;/em&gt; — the boring, error-prone part of running those models somewhere real, across more than one box, without losing track of your sessions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Repo: &lt;a href="https://github.com/edgestorage/task-handoff" rel="noopener noreferrer"&gt;https://github.com/edgestorage/task-handoff&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Docs: &lt;a href="https://docs.thandoff.com/" rel="noopener noreferrer"&gt;https://docs.thandoff.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Apache-2.0. Stars, issues, and PRs are all welcome — and I'd love to hear how you're juggling multi-machine AI sessions today.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>ai</category>
      <category>docker</category>
      <category>devtools</category>
    </item>
  </channel>
</rss>
