<?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: GetPullRequest</title>
    <description>The latest articles on DEV Community by GetPullRequest (getpullrequest-hq).</description>
    <link>https://dev.to/getpullrequest-hq</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%2Forganization%2Fprofile_image%2F15167%2Fbfba4e4b-2077-4ee4-8a32-6ff86cdfa062.png</url>
      <title>DEV Community: GetPullRequest</title>
      <link>https://dev.to/getpullrequest-hq</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/getpullrequest-hq"/>
    <language>en</language>
    <item>
      <title>Ship code from your phone with the AI coding agents you already pay for</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Tue, 06 Oct 2026 11:31:34 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/ship-code-from-your-phone-with-the-ai-coding-agents-you-already-pay-for-13f9</link>
      <guid>https://dev.to/getpullrequest-hq/ship-code-from-your-phone-with-the-ai-coding-agents-you-already-pay-for-13f9</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe3exgrzyyyzxpqef16ew.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%2Fe3exgrzyyyzxpqef16ew.png" alt="Ship code from your phone with the AI coding agents you already pay for" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We run AI coding agents like Cursor, Claude Code and Codex from our phones. The agents don't run in a vendor's cloud sandbox. They run on our own laptops, and each of us has also paired a cloud desktop as a second machine. The phone is how we give them work and check on them. The tool that does this is GetPullRequest (GPR), and we have been building GPR with GPR since May. Every branch a GPR task or session creates is named &lt;code&gt;gpr/task-tsk_…&lt;/code&gt;, and by now that is most of our branch list.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; GPR runs the AI coding agents you already pay for (Cursor, Claude Code, Codex and five more) on your own machine, using the Agent Client Protocol. Tasks can come from the app, GitHub, GitLab, Jira or Slack. You answer the agent's questions and merge its pull request from your phone. Your machine needs to be on.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This post covers how a task runs, why we keep the agent on your machine, and some of the strange problems we ran into while building it. If you want the story of why we built GPR in the first place, read &lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;the launch post&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code remote control, Codex, Cursor background agents: why not just use those?
&lt;/h2&gt;

&lt;p&gt;It's a fair question. &lt;a href="https://www.getpullrequest.com/blogs/claude-code-remote-control-from-phone" rel="noopener noreferrer"&gt;Claude Code has Remote Control&lt;/a&gt;, Codex works with the ChatGPT app, and Cursor has background agents (now called Cloud Agents) that you can start from Slack or their iOS app. If you only use one agent and just want to check on one session from your phone, those tools are good and you should use them.&lt;/p&gt;

&lt;p&gt;The problem is that each one is a chat with a single vendor's agent. Claude Code's Remote Control, for example, only works with Anthropic's models and a claude.ai login. If you run Claude Code with an API key or through OpenRouter, Remote Control won't start. Our team was using four different agents, and nobody wanted to switch to just one. Our work also didn't start as a chat. It came in as GitHub issues, Jira tickets from the product team, and screenshots posted in Slack. What we wanted was an assistant for every developer that owns a task board, keeps track of the work on it, and gets it done with whichever agent fits.&lt;/p&gt;

&lt;h2&gt;
  
  
  How a task actually runs
&lt;/h2&gt;

&lt;p&gt;You create a task on the board in the app. It can also come from a GitHub issue with the &lt;code&gt;gpr:agent&lt;/code&gt; label, from a Jira project, or from an &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; mention in Slack. The task goes to the workspace where you ran &lt;code&gt;gpr setup&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The GPR daemon on that machine picks up the task and creates a git worktree for it under &lt;code&gt;~/.gpr/worktrees/&lt;/code&gt;. This keeps the agent away from the branch you are working on. The daemon then starts the agent you chose for that workspace, and the agent plans, implements, verifies, writes a commit summary and opens a pull request. GPR saves a checkpoint after each step, so if something interrupts the run, it &lt;strong&gt;continues from the last checkpoint&lt;/strong&gt; instead of starting again.&lt;/p&gt;

&lt;p&gt;If the agent has a question while it is planning, the task moves to &lt;strong&gt;"Needs your input"&lt;/strong&gt; and you get a notification on your phone. You reply on the task and the agent continues. When the pull request is open, the task stays in "In review" until it is merged. You can also open the live session at any time and watch what the agent is doing.&lt;/p&gt;

&lt;p&gt;None of this is complicated on paper. Most of our time went into making it work reliably on real laptops, real networks and with real agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why AI coding agents should run on your machine: faster, and already paid for
&lt;/h2&gt;

&lt;p&gt;Our repo is an Nx monorepo with a FastAPI backend, a Flutter app, a Go daemon, a generated Dart SDK and a couple of other products. Building it from a fresh checkout takes quite a few steps.&lt;/p&gt;

&lt;p&gt;We tried hosted sandboxes first, using Daytona. The first problem was &lt;strong&gt;setup&lt;/strong&gt;. We had to get the backend, the Flutter app, the database and the daemon running together inside a sandbox, and keep them working as the code changed. The second problem was &lt;strong&gt;cost&lt;/strong&gt; , which was hard to justify for a startup when our laptops were sitting idle half the day. The biggest problem was &lt;strong&gt;testing&lt;/strong&gt;. Every time we wanted to check an agent's change, someone had to check out the branch and build everything from scratch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"We were paying to rebuild an environment in the cloud that was already fully built on the laptop in front of us."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;When the agent runs on your machine, it runs the tests the same way you do. Your code, your agent's login and your API keys stay on your machine. The GPR backend only holds the board and the task queue, passes the session to your phone and sends notifications. &lt;strong&gt;It never has a copy of your repo.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The downside is that &lt;strong&gt;your machine has to be on.&lt;/strong&gt; If your laptop goes to sleep, the task waits as "Waiting for machine" and continues when the laptop wakes up. That's why each of us also paired a cloud desktop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Everything works with nothing connected
&lt;/h2&gt;

&lt;p&gt;Our first plan was to get diffs and merge status from GitHub. We dropped it before writing any code. The agent's changes are on your machine, often not even committed yet, so GitHub doesn't know about them. GPR reads them with git on your machine instead. If you connect GitHub, it adds a bit extra, like whether the PR can be merged or is behind the base branch.&lt;/p&gt;

&lt;p&gt;This became a rule for the whole product, and we call it &lt;strong&gt;the enrichment model&lt;/strong&gt;. Coding, reviewing, merge checks, resolving conflicts and changing a task's base branch all work using the daemon and git on your machine. Integrations bring work in and handle things like opening the pull request on GitHub. They never replace information your machine already has.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Works with nothing connected&lt;/th&gt;
&lt;th&gt;Added when you connect a provider&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Coding, plan/implement/verify&lt;/td&gt;
&lt;td&gt;Issues synced in from GitHub, GitLab or Jira&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Diffs and merge checks from local git&lt;/td&gt;
&lt;td&gt;"Mergeable" and "behind" hints from GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resolving conflicts, changing base branch&lt;/td&gt;
&lt;td&gt;Opening the hosted PR&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The board, queue, live session and &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; mentions&lt;/td&gt;
&lt;td&gt;Tasks started from Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In the code, each provider lives in its own folder and plugs into a shared interface. We added GitHub first, then GitLab (which mostly copied the GitHub structure), then Jira and Slack. In August we found GitHub-specific code in places that were supposed to work for every provider, and we spent some time cleaning that up. It still isn't perfect.&lt;/p&gt;

&lt;p&gt;This approach helped us in September. Atlassian removed an old Jira search endpoint, and our Jira calls started failing with &lt;strong&gt;410 Gone&lt;/strong&gt;. The agents kept working as normal. Only the syncing of new tickets stopped. We wrote the fix up as a Jira ticket, and GPR picked it up and opened the pull request.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some weird issues we hit while building it
&lt;/h2&gt;

&lt;p&gt;I want to share a few of these because building reliable software takes time, even when agents write a lot of the code. In most cases, finding the problem took much longer than fixing it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The connection that was dead on one side.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
A Windows machine had a connection that looked fine from the machine's side, but the relay could not reach it. The daemon thought it was online, so it never reconnected. Tasks sent to that machine just waited and nothing happened.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Split brain after a deploy.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
When we deploy a new version of the backend, the old servers keep running for a short time before they shut down. The daemon's live connection stayed on one of those old servers, while its normal API calls went to the new ones. So one part of the backend thought the machine was connected, and another part thought it was not. We fixed both problems the same way: the backend now starts the reconnect itself, and the daemon checks its status regularly and reconnects if the two don't agree.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;52 agents on one laptop.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
In August one developer's machine had &lt;strong&gt;52 agent processes&lt;/strong&gt; running, each using about 300 MB of memory, a few minutes after the daemon started. Several Cursor agents had started at the same time and were all trying to use the same config file, so their startup failed. We retried, but the failed agents did not stop when we asked them to. We had also stopped tracking them, so nothing ever cleaned them up. Now we give an agent two seconds to stop, and if it is still running, we kill it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tasks marked done with no changes.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Sometimes an agent said it was done and wrote a good summary, but it had not changed any code. GPR still marked the task as successful. Now a task with no commits is marked as failed. In another case, a log line that should have explained why tasks were timing out printed nothing useful, because it used Go formatting in Python code. When we fixed the log, it showed us a second bug where one session could start two agents. Both stories are in &lt;a href="https://www.getpullrequest.com/blogs/software-factory-dark-factory" rel="noopener noreferrer"&gt;AI can run the software factory. It can't turn the lights off yet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Updates on Windows.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
On some Windows machines &lt;code&gt;gpr update&lt;/code&gt; did nothing, but the output looked the same as a successful update. Windows does not let you replace a program while it is running, but it does let you rename it. So now we rename the old program and put the new one in its place. Every change to the daemon has to work on macOS, Linux and Windows, and Windows caused most of these problems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Duplicate Slack messages.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Slack sends us every &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; mention twice, but only one of the two has the screenshot attached. We were reading the other one, so screenshots people attached to bug reports were lost.&lt;/p&gt;

&lt;p&gt;You may have noticed that several of these problems came from the agents themselves, like the Cursor processes that would not stop. That happens because GPR runs coding agents from existing vendors instead of an agent we built ourselves. We chose that on purpose, early on, and the next section explains why.&lt;/p&gt;
&lt;h2&gt;
  
  
  Agent Client Protocol: why we never built our own coding agent
&lt;/h2&gt;

&lt;p&gt;Almost every developer we talked to was already paying for a coding agent, whether that was a Cursor plan, a Claude subscription or ChatGPT for Codex. Asking them to pay for another agent just to try GPR would have been a barrier, and they would be paying twice for the same thing. That's also why I find it hard to justify paying for Devin on top of those plans.&lt;/p&gt;

&lt;p&gt;What we didn't know was how to support all of these agents without building a separate integration for each one. Then I watched &lt;a href="https://www.youtube.com/watch?v=n11pDnBXPgk" rel="noopener noreferrer"&gt;a video with Ben Brandt from Zed and people from JetBrains&lt;/a&gt; about the Agent Client Protocol (ACP). Without a shared protocol, every editor needs its own integration with every agent. With ACP, each editor and each agent only has to support the protocol once.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;If Zed and JetBrains were building this standard for editors, a phone app could use it too.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Here is how GPR uses it. The daemon talks to the agent using ACP on your machine. The daemon also connects out to our relay over a WebSocket, and the relay sends the same messages on to your phone. The relay keeps a copy of the session, so if your phone goes offline it can catch up later, and it sends you a notification when the agent needs you. Because of this, &lt;strong&gt;the app doesn't have to read a terminal screen.&lt;/strong&gt; It receives the plan, tool calls, diffs and the agent's slash commands as structured data, which is why one app works with every agent.&lt;/p&gt;

&lt;p&gt;Cursor and Kiro support ACP directly, so they were the first agents we fully supported, in July. Claude Code and Codex need an adapter, and we added them in September. Today the daemon supports &lt;strong&gt;eight&lt;/strong&gt; agents: Cursor, Claude Code, Codex, Kiro, OpenCode, Qwen, Cline and Copilot. &lt;a href="https://www.getpullrequest.com/blogs/agent-client-protocol" rel="noopener noreferrer"&gt;Our ACP post&lt;/a&gt; explains the protocol in more detail, including how it differs from MCP.&lt;/p&gt;

&lt;p&gt;We built GPR using Cursor, Claude Code, Kiro and OpenCode, and nobody on the team had to give up the agent they liked. &lt;strong&gt;370 commits&lt;/strong&gt; in our repo are co-authored by GPR. Each agent starts up, logs in and shuts down a little differently, and the daemon handles those differences. Switching agents is just a dropdown in the app.&lt;/p&gt;
&lt;h2&gt;
  
  
  What a phone is actually good for (the Claude Code mobile app question)
&lt;/h2&gt;

&lt;p&gt;A lot of people search for a Claude Code mobile app. In practice, the things you need to do on a phone are fairly small: answer a question about the plan, approve a command, read a short diff, give feedback and merge. On Android you can also share a screenshot from your gallery directly into an agent session, and a lot of our own bug reports now start that way.&lt;/p&gt;

&lt;p&gt;We spent a lot of time making these small things easy on a small screen. You can leave a comment on a diff by tapping or long-pressing the line, and the agent picks it up in the next round. Long agent sessions have a conversation minimap, so you can jump to the part you care about instead of scrolling through everything. The slash commands in the app are the ones your agent actually supports, and switching the model or the agent is a single dropdown. When you add reviewers to a pull request, you pick them by name and photo, because nobody remembers GitHub usernames on a phone. If the base branch has moved, you can update the pull request from the phone, and the agent fixes any conflicts in new commits so you can see exactly what it changed. And if your phone loses signal halfway through a session, it catches up from where it left off when it reconnects.&lt;/p&gt;

&lt;p&gt;A phone is &lt;strong&gt;not&lt;/strong&gt; the right place to review a big architectural change. When I need to compare big files side by side, still i prefer big screen. But this pushes to keep agent tasks small, and agents do better work on small tasks anyway. You can read more about how we review and merge from the phone. If you're wondering why a person still needs to approve the merge at all, &lt;a href="https://www.getpullrequest.com/blogs/software-factory-dark-factory" rel="noopener noreferrer"&gt;the software factory post&lt;/a&gt; covers that in detail.&lt;/p&gt;
&lt;h2&gt;
  
  
  Still rough
&lt;/h2&gt;

&lt;p&gt;The iOS app isn't in the App Store yet. Live preview of your running app on the phone is still being built. Diffs come from git on your machine, so if your laptop is asleep, you can't see the diff either. And when an agent's login expires, GPR can tell you that the agent failed to start, but someone still has to go to the machine and log in again.&lt;/p&gt;
&lt;h2&gt;
  
  
  Trying it
&lt;/h2&gt;

&lt;p&gt;To try it, you need the Android app from &lt;a href="https://play.google.com/store/apps/details?id=com.pullrequest&amp;amp;utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=pillar" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt; (iOS app coming soon), a Mac, Linux or Windows machine, and one coding agent installed on it. GPR is free for projects, sessions, and the GitHub and Slack connections. You pay only for more workspaces or more tasks running at once.&lt;br&gt;
&lt;/p&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://getpullrequest.com/install | bash
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/your-repo
gpr setup &lt;span class="c"&gt;# scan the QR code with the app&lt;/span&gt;
gpr discover &lt;span class="c"&gt;# lists which agents are ready&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We'd suggest starting with a small task, something you've been putting off, so you can see how it works before giving it anything bigger.&lt;/p&gt;

&lt;h2&gt;
  
  
  Related posts
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;Your AI coding agent is stuck in a terminal you have to babysit. So we built GetPullRequest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/software-factory-dark-factory" rel="noopener noreferrer"&gt;AI can run the software factory. It can't turn the lights off yet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/claude-code-remote-control-from-phone" rel="noopener noreferrer"&gt;Claude Code Remote Control is great. It's also not enough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/agent-client-protocol" rel="noopener noreferrer"&gt;Agent Client Protocol (ACP) is the most important AI coding standard nobody's talking about&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>showdev</category>
      <category>ai</category>
      <category>productivity</category>
      <category>github</category>
    </item>
    <item>
      <title>Agent Client Protocol (ACP) is the most important AI coding standard nobody's talking about</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Tue, 06 Oct 2026 07:10:19 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/agent-client-protocol-acp-is-the-most-important-ai-coding-standard-nobodys-talking-about-1jgg</link>
      <guid>https://dev.to/getpullrequest-hq/agent-client-protocol-acp-is-the-most-important-ai-coding-standard-nobodys-talking-about-1jgg</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnenxmv4t61qqr6oj2vy2.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%2Fnenxmv4t61qqr6oj2vy2.png" alt="Agent Client Protocol (ACP) is the most important AI coding standard nobody's talking about" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Agent Client Protocol is a standard way for a code editor to talk to a coding agent. Zed started it in 2025. JetBrains joined in October 2025 to bring it to IntelliJ and the rest. If an agent speaks ACP, any ACP editor can drive it. If an editor speaks ACP, it gets every ACP agent for free.&lt;/p&gt;

&lt;p&gt;We built GetPullRequest (GPR) on it. Slightly odd, because GPR isn't an editor. It's a phone app that runs coding agents on your own machine. Protocol first, then what we did with it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; ACP is to coding agents what LSP was to language tooling. Agents implement it once, clients implement it once. GPR treats your phone as an ACP client and runs eight agents through it: Cursor, Claude Code, Codex, Kiro, OpenCode, Qwen, Cline and Copilot.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The problem the Agent Client Protocol solves
&lt;/h2&gt;

&lt;p&gt;Before ACP, every editor that wanted an agent wrote its own integration, and every agent that wanted to be in an editor did the same backwards. M editors, N agents, &lt;strong&gt;M × N&lt;/strong&gt; bits of glue, each broken in its own way. ACP makes it &lt;strong&gt;M + N&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Same trick the Language Server Protocol pulled. It's why your editor can autocomplete Rust without anyone at your editor's company knowing much Rust.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;For a local agent, the client starts the agent as a subprocess and they swap JSON-RPC messages over stdin and stdout. Remote transports over HTTP or WebSocket are still being worked out in the spec. The messages carry what a coding UI needs: the plan, tool calls and their results, file diffs, terminal output, permission requests, slash commands, model choices. Where it can, ACP reuses MCP's JSON shapes, and adds its own types for coding-specific UI like diffs.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://agentclientprotocol.com" rel="noopener noreferrer"&gt;spec and SDKs are at agentclientprotocol.com&lt;/a&gt;. Not every agent speaks it natively. Claude Code and Codex get wrapped by small adapter binaries that translate.&lt;/p&gt;

&lt;p&gt;In January Zed and JetBrains also launched the &lt;a href="https://zed.dev/blog/acp-registry" rel="noopener noreferrer"&gt;ACP Registry&lt;/a&gt;: an agent registers once and shows up in every ACP client, installed about the way you'd install an extension. Claude Code, Codex CLI, GitHub Copilot CLI and OpenCode were in it at launch. That's the point where ACP stopped being a Zed thing and started looking like the default.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Client Protocol vs MCP
&lt;/h2&gt;

&lt;p&gt;The names rhyme, so people mix them up.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;ACP&lt;/th&gt;
&lt;th&gt;MCP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Connects&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A client (editor, phone) to the agent&lt;/td&gt;
&lt;td&gt;The agent to tools and data&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Typical messages&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Plans, diffs, tool calls, permission requests&lt;/td&gt;
&lt;td&gt;Tool calls, resources, prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Example&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Zed or GPR driving Claude Code&lt;/td&gt;
&lt;td&gt;Claude Code reading your database&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;In a normal setup the editor talks ACP to the agent and the agent talks MCP to its tools. You use both.&lt;/p&gt;

&lt;h2&gt;
  
  
  How we found it
&lt;/h2&gt;

&lt;p&gt;GPR doesn't ship its own coding agent. Nearly every developer already pays for one or two: Cursor, a Claude plan, ChatGPT for Codex, Copilot through work. Making them buy another before they can try GPR is friction, and paying twice. We wanted to reuse what people already have. We just didn't know how without writing and maintaining one integration per agent.&lt;/p&gt;

&lt;p&gt;Then we watched &lt;a href="https://www.youtube.com/watch?v=n11pDnBXPgk" rel="noopener noreferrer"&gt;a video where Ben Brandt from Zed and people from JetBrains walk through ACP&lt;/a&gt;. Our exact problem, solved for editors, and nothing in it required the client to be an editor.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A phone could be just another client.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What GPR does with ACP
&lt;/h2&gt;

&lt;p&gt;GPR's daemon runs on your machine and talks ACP to the agent over stdio, same as Zed would. The daemon dials out to our relay over a WebSocket, so nothing on your machine listens for incoming connections, and the relay passes the same messages on to the app. It keeps the stream, so a phone that dropped off in a lift picks up from the last event it saw, and it sends a push when the agent needs you. &lt;strong&gt;So the phone isn't screen-scraping a terminal.&lt;/strong&gt; It gets plans, tool calls, diffs and terminal output as structured messages, and that's why one mobile UI works for every agent.&lt;/p&gt;

&lt;p&gt;The daemon recognises &lt;strong&gt;eight&lt;/strong&gt; today: Cursor (&lt;code&gt;cursor-agent&lt;/code&gt;), Claude Code, Codex, Kiro, OpenCode, Qwen, Cline, Copilot. We built GPR with four of them (Cursor, Claude Code, Kiro, OpenCode) and nobody had to agree on one. &lt;code&gt;gpr discover&lt;/code&gt; tells you which are ready, which are installed but missing an adapter, which aren't installed. Pick one per workspace. Switch with a dropdown. We don't pull agents from the ACP Registry yet. Anything listed there already speaks the protocol, though, so adding one is a small job for us rather than a new integration.&lt;/p&gt;

&lt;p&gt;Some things just fall out of using the protocol properly. The slash commands in the app are whatever the agent advertises over ACP, not a list we maintain, so a new command just shows up. Model switching uses ACP's config options, and if an agent also advertises a models slash command, the app hides it so there's one way to switch everywhere. Agents can send their own extension messages; Cursor and Kiro both do, and they were the first two we supported properly, in July. Not every extension earns its place. In September we hid Kiro's MCP status widget from the chat. It was noise.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agent Client Protocol with Claude Code
&lt;/h2&gt;

&lt;p&gt;People search for this specifically. Claude Code doesn't speak ACP natively. It goes through an adapter that sits next to the &lt;code&gt;gpr&lt;/code&gt; binary, and the installer puts it there. That's also why it was late for us: Cursor and Kiro speak ACP out of the box and got proper support in July, while Claude Code (and Codex) landed on September 18.&lt;/p&gt;

&lt;p&gt;The adapter route has one nice side effect. If you run Claude Code on an API key, or through OpenRouter or a company gateway, you set that in GPR's &lt;code&gt;agents.json&lt;/code&gt; and it just works. Anthropic's own Remote Control refuses all of those setups. The &lt;a href="https://www.getpullrequest.com/blogs/claude-code-remote-control-from-phone" rel="noopener noreferrer"&gt;Claude Code post&lt;/a&gt; has the details.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the protocol doesn't fix
&lt;/h2&gt;

&lt;p&gt;ACP standardises the conversation. It doesn't standardise how agents behave as processes, and running them unattended for hours shows it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents that won't stop.&lt;/strong&gt; Stop some agents halfway through startup and they ignore the polite signal and keep running. Start several at once and they can trip over the same config file. In August that combination left &lt;strong&gt;52 agent processes&lt;/strong&gt; on one of our machines, about 300 MB each (the Cursor post has the story). The daemon now gives an agent two seconds to exit, then kills it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Agents that go quiet.&lt;/strong&gt; Some stop talking mid-turn without saying why. GPR fails the task after 90 seconds of silence rather than wait forever, so it shows up on your phone as failed instead of sitting at "running" all afternoon.&lt;/p&gt;

&lt;p&gt;These tools mostly weren't built to be long-running background processes, and a protocol can't change that. Somebody has to absorb it. For us that's the daemon.&lt;/p&gt;

&lt;h2&gt;
  
  
  Your keys stay where they are
&lt;/h2&gt;

&lt;p&gt;Your own agent means your own login. Anthropic key, &lt;code&gt;codex login&lt;/code&gt;, Cursor account, all stay on your machine, and any keys or gateway settings the daemon needs go in &lt;code&gt;~/.gpr/agents.json&lt;/code&gt; there too (&lt;a href="https://www.getpullrequest.com/docs/reference/agents-json" rel="noopener noreferrer"&gt;reference&lt;/a&gt;). GPR's backend never sees them, and your model bill doesn't change.&lt;/p&gt;

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

&lt;p&gt;GPR is free for projects, sessions, and the GitHub and Slack connections. You pay only for more workspaces or more tasks running at once. Get the app on &lt;a href="https://play.google.com/store/apps/details?id=com.pullrequest&amp;amp;utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=agent-client-protocol" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, then:&lt;br&gt;
&lt;/p&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://getpullrequest.com/install | bash
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/your-repo &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; gpr setup
gpr discover

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agent-specific guides: &lt;a href="https://www.getpullrequest.com/blogs/claude-code-remote-control-from-phone" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt;, Codex, Cursor. Running several at once across machines: parallel coding agents.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep reading
&lt;/h2&gt;

&lt;p&gt;New here? The launch post, &lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;Your AI coding agent is stuck in a terminal you have to babysit. So we built GetPullRequest&lt;/a&gt;, is the why. The pillar, We ditched cloud AI coding agents. Our laptops were faster, and already paid for, is the how.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/claude-code-remote-control-from-phone" rel="noopener noreferrer"&gt;Claude Code Remote Control is great. It's also not enough&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Codex CLI remote control: stop babysitting the terminal and let it ship PRs while you're out&lt;/li&gt;
&lt;li&gt;Cursor background agents charge you twice for compute you already own&lt;/li&gt;
&lt;li&gt;Run parallel coding agents on every machine you own, from one phone&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/software-factory-dark-factory" rel="noopener noreferrer"&gt;AI can run the software factory. It can't turn the lights off yet&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
      <category>agents</category>
      <category>programming</category>
    </item>
    <item>
      <title>Claude Code Remote Control is great. It's also not enough</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Mon, 05 Oct 2026 15:25:00 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/claude-code-remote-control-is-great-its-also-not-enough-5kc</link>
      <guid>https://dev.to/getpullrequest-hq/claude-code-remote-control-is-great-its-also-not-enough-5kc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Flnavh5vms0k8c57yn8wu.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%2Flnavh5vms0k8c57yn8wu.png" alt="Claude Code Remote Control is great. It's also not enough" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If all you want is to check on a Claude Code session from your phone, use Anthropic's Remote Control. It's built in, it comes with Pro or Max, and for that one job it beats what we make. We sell a competing product. Still true.&lt;/p&gt;

&lt;p&gt;The rest of this is how to set Claude Code remote control up, why it sometimes refuses to start, and the point where it stopped being enough for us. That point is where GetPullRequest (GPR) comes in, and it won't be the same point for everyone. The short version: Remote Control is a chat window into one Claude session, running Anthropic's models. GPR is a universal remote for the dev tools you already use, whichever agent, whichever model, wherever the task came from.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Remote Control is a chat with one Claude Code session, on Anthropic's models and a claude.ai login. For that, it's the quicker tool. GPR is a universal remote: Claude Code, Codex, Cursor and five more agents, tasks from GitHub, Jira and Slack, any model or gateway you've configured, and a pull request at the end.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setting up Claude Code remote control
&lt;/h2&gt;

&lt;p&gt;On the machine where your repo lives:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;claude remote-control

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That starts a server that waits for your phone. Press space, a QR code shows up, scan it with the Claude app, and you're in the session. Already inside Claude Code? &lt;code&gt;/remote-control&lt;/code&gt;, or &lt;code&gt;/rc&lt;/code&gt;, does it for the conversation you have open. &lt;code&gt;claude --remote-control&lt;/code&gt; starts a normal terminal session that's also reachable from the phone.&lt;/p&gt;

&lt;p&gt;Everything still runs on your machine: files, MCP servers, tests. The phone sends messages, can attach a photo or a file, and gets a push when Claude finishes something or needs a decision. Server mode runs several sessions from one process (up to 32 by default), and &lt;code&gt;--spawn worktree&lt;/code&gt; gives each new one its own git worktree, which you want if you're starting more than one. It's gotten noticeably better this year. If your laptop sleeps, it reconnects when it wakes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Claude Code remote control not working?
&lt;/h2&gt;

&lt;p&gt;It's nearly always one of these.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're on an API key.&lt;/strong&gt; Remote Control needs a claude.ai subscription login (Pro, Max, Team or Enterprise). &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; won't do it, and neither will a token from &lt;code&gt;claude setup-token&lt;/code&gt;. Run &lt;code&gt;claude auth login&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You're not talking to Anthropic's API directly.&lt;/strong&gt; Remote Control isn't available if you run Claude Code through Amazon Bedrock, Google Cloud's Agent Platform or Microsoft Foundry, if &lt;code&gt;ANTHROPIC_BASE_URL&lt;/code&gt; points at an LLM gateway or company proxy (unset it), or if you sign in through an enterprise Claude apps gateway. That rules out a lot of companies that buy Claude through their cloud provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your org hasn't turned it on.&lt;/strong&gt; On Team and Enterprise an owner has to enable it in the Claude Code admin settings. Orgs with Zero Data Retention can't enable it at all, because the transcript syncs through Anthropic's servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The process died.&lt;/strong&gt; Close the terminal and the session goes offline. &lt;code&gt;claude remote-control --continue&lt;/code&gt; brings it back for about four hours after that; later than that you start fresh. On a remote box, put it in &lt;code&gt;tmux&lt;/code&gt;. In server mode, lose the network for about ten minutes and the process exits.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://code.claude.com/docs/en/remote-control" rel="noopener noreferrer"&gt;Anthropic's Remote Control docs&lt;/a&gt; cover all of it, and they're good.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it stopped being enough for us
&lt;/h2&gt;

&lt;p&gt;Remote Control is a chat app. A good one, but you're talking to one Claude Code session, on Claude models, through Anthropic's own API. We wanted to hand off a task to whichever agent suited it and come back to a pull request.&lt;/p&gt;

&lt;p&gt;We build GPR with GPR, and the agents doing that were Cursor, Claude Code, Kiro and OpenCode. Not just Claude. Tasks show up as GitHub issues, Jira tickets, Slack messages. Not as chats we start. Jira ticket PET2-4 became our PR #500 without anyone opening a terminal. Remote Control can't do that; it's one agent and a session you started.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"For a couple of months we used Claude Code in a terminal to build a product that couldn't run Claude Code yet."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's not a figure of speech. Claude Code wasn't one of the first agents GPR could run. Cursor and Kiro speak the Agent Client Protocol natively, so they got proper support in July. Claude Code doesn't. It needs an adapter sitting between it and any ACP client, and getting that working properly through GPR took us until September 18. Mildly embarrassing, but not really our call.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Claude Code Remote Control&lt;/th&gt;
&lt;th&gt;GPR&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Agents&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;Claude Code, Codex, Cursor and 5 more&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Models&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Anthropic's Claude models, via Anthropic's API&lt;/td&gt;
&lt;td&gt;Whatever each agent supports, including through your own gateway&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where tasks come from&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A session you started&lt;/td&gt;
&lt;td&gt;App board, GitHub, GitLab, Jira, Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Login&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;claude.ai subscription only&lt;/td&gt;
&lt;td&gt;Subscription, API key, or a proxy/gateway via &lt;code&gt;agents.json&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What it is&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A chat with one session&lt;/td&gt;
&lt;td&gt;A remote for your whole dev workflow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What you end with&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A conversation&lt;/td&gt;
&lt;td&gt;A PR you can merge from the phone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Machine has to be on&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One Claude session and a question to answer from the couch: Remote Control. Six tickets, three agents, each planned, built, tested and turned into a PR: GPR. The API key thing matters more than it sounds if your company pays for Claude through the API and not through claude.ai seats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Running Claude Code through GPR
&lt;/h2&gt;

&lt;p&gt;Claude Code stays on your machine, in your repo, on your login, API key or gateway. GPR's daemon starts it and talks to it over the Agent Client Protocol, through a small adapter binary. The app shows the session live, buzzes when Claude has a question, and lets you review and merge the PR from your phone.&lt;br&gt;
&lt;/p&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://getpullrequest.com/install | bash
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/your-repo
gpr setup

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;gpr setup&lt;/code&gt; registers the folder as a workspace, installs a startup service and prints a QR code. Scan it in the app under Settings → Connections. On Windows it's &lt;code&gt;irm 'https://getpullrequest.com/install.ps1' | iex&lt;/code&gt; in PowerShell.&lt;/p&gt;

&lt;p&gt;Install the &lt;code&gt;claude&lt;/code&gt; CLI and log in. The Claude ACP adapter has to sit next to the &lt;code&gt;gpr&lt;/code&gt; binary, and the installer handles that.&lt;/p&gt;

&lt;p&gt;On an API key, or going through a proxy or LLM gateway? Put it in &lt;code&gt;~/.gpr/agents.json&lt;/code&gt; rather than exporting it in your terminal. The daemon runs as a background service, so it never sees your shell profile. This one points Claude Code at OpenRouter:&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;"agents"&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;"claude"&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;"command"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"claude-agent-acp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"env"&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;"ANTHROPIC_BASE_URL"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://openrouter.ai/api"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ANTHROPIC_AUTH_TOKEN"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk-or-your-key"&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;p&gt;Use &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; instead for a plain Anthropic key. Keep the &lt;code&gt;command&lt;/code&gt; line even though it looks redundant, because env on its own doesn't override the built-in agent. Then &lt;code&gt;gpr restart&lt;/code&gt;, since the daemon only reads the file at startup. The &lt;a href="https://www.getpullrequest.com/docs/reference/agents-json" rel="noopener noreferrer"&gt;agents.json reference&lt;/a&gt; has the rest.&lt;/p&gt;

&lt;p&gt;That exact setup is one Remote Control refuses. Point Claude Code at OpenRouter, or any gateway, and you lose remote control altogether. Through GPR the phone still works, because GPR never needed Anthropic's relay in the first place.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gpr discover

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&lt;code&gt;ready&lt;/code&gt;&lt;/strong&gt; means you're fine. &lt;strong&gt;&lt;code&gt;needs adapter&lt;/code&gt;&lt;/strong&gt; means the CLI is there but the adapter isn't next to &lt;code&gt;gpr&lt;/code&gt;. &lt;strong&gt;&lt;code&gt;not installed&lt;/code&gt;&lt;/strong&gt; means &lt;code&gt;claude&lt;/code&gt; isn't on your PATH. Then pick Claude Code in the workspace settings in the app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Giving Claude a task
&lt;/h2&gt;

&lt;p&gt;Make a task on the board, label a GitHub issue &lt;code&gt;gpr:agent&lt;/code&gt;, or mention &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; in Slack. The daemon makes a worktree under &lt;code&gt;~/.gpr/worktrees/&lt;/code&gt; so your own checkout isn't touched, runs plan, implement and verify, and opens a PR.&lt;/p&gt;

&lt;p&gt;If Claude has a question while planning, the task goes to "Needs your input", the phone buzzes, you answer in a sentence, and it carries on from the checkpoint. One question beats a PR built on a wrong guess.&lt;/p&gt;

&lt;p&gt;"Fix the avatar bug" gets you an interpretation. "Settings crashes when &lt;code&gt;avatarUrl&lt;/code&gt; is null; show initials; add a widget test" gets you something you can merge. Writing the task is where the actual design happens, which is most of the argument in &lt;a href="https://www.getpullrequest.com/blogs/software-factory-dark-factory" rel="noopener noreferrer"&gt;AI can run the software factory. It can't turn the lights off yet&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Rough edges
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Logins expire.&lt;/strong&gt; When Claude's login runs out, the agent fails to start and GPR marks the task failed and says why. Someone still has to go to the machine and log in. We can't fix that from a phone and aren't sure we should.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Idle sessions get parked.&lt;/strong&gt; Long Claude sessions sit idle a lot, so after &lt;strong&gt;three hours&lt;/strong&gt; with no activity GPR stops the Claude process to free memory and the next message starts it again.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The machine has to be on.&lt;/strong&gt; Both tools need it. A phone doesn't change that. That's the point of keeping the agent local, and why some of us pair a second machine.&lt;/p&gt;

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

&lt;p&gt;GPR is free for projects, sessions, and the GitHub and Slack connections. You pay only for more workspaces or more tasks running at once. Get the app on &lt;a href="https://play.google.com/store/apps/details?id=com.pullrequest&amp;amp;utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=claude-code-remote-control" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, run the installer above, and send Claude something small you've been putting off.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep reading
&lt;/h2&gt;

&lt;p&gt;New here? The launch post, &lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;Your AI coding agent is stuck in a terminal you have to babysit. So we built GetPullRequest&lt;/a&gt; would give a glimpse of what we are up against. Its the why we ditched cloud AI agents.&lt;/p&gt;

&lt;p&gt;Further reading -&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Agent Client Protocol (ACP) is the most important AI coding standard nobody's talking about&lt;/li&gt;
&lt;li&gt;Codex CLI remote control: stop babysitting the terminal and let it ship PRs while you're out&lt;/li&gt;
&lt;li&gt;Cursor background agents charge you twice for compute you already own&lt;/li&gt;
&lt;li&gt;Devin AI alternatives: why pay for another AI engineer when you already pay for Claude, Codex and Cursor?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claude</category>
      <category>ai</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>AI can run the software factory. It can't turn the lights off yet</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Sun, 04 Oct 2026 08:23:00 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/ai-can-run-the-software-factory-it-cant-turn-the-lights-off-yet-1cjj</link>
      <guid>https://dev.to/getpullrequest-hq/ai-can-run-the-software-factory-it-cant-turn-the-lights-off-yet-1cjj</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fav3sjd5q6ck7haxvrdba.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%2Fav3sjd5q6ck7haxvrdba.png" alt="AI can run the software factory. It can't turn the lights off yet" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In 2018 Elon Musk admitted that excessive automation on the Model 3 line had been a mistake, and added: &lt;em&gt;"Humans are underrated."&lt;/em&gt; Software is now having the same argument.&lt;/p&gt;

&lt;p&gt;In January Dan Shapiro wrote up &lt;a href="https://www.danshapiro.com/blog/2026/01/the-five-levels-from-spicy-autocomplete-to-the-software-factory/" rel="noopener noreferrer"&gt;five levels of AI coding&lt;/a&gt;. Level 5 is the &lt;strong&gt;dark software factory&lt;/strong&gt; , "a place where humans are neither needed nor welcome." A couple of weeks later StrongDM described how their AI team works, and &lt;a href="https://simonwillison.net/2026/feb/7/software-factory/" rel="noopener noreferrer"&gt;Simon Willison wrote it up&lt;/a&gt;. Their rules:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code must not be written by humans. Code must not be reviewed by humans. If you haven't spent at least &lt;strong&gt;$1,000 on tokens today&lt;/strong&gt; per human engineer, your software factory has room for improvement.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We build GetPullRequest with coding agents, every day, and have since May (&lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;the launch post&lt;/a&gt; has the backstory). Most weeks it does feel like a software factory. It has never been dark, and below are a couple of the reasons why, straight out of our commit history.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; An AI software factory, where agents do most of the work from ticket to pull request, is real, and we run one. The dark version, where no human writes or reviews anything, breaks on something manufacturing never had to solve: every unit of software is a new design, and working out whether it's right is the hard part. Automate the line, keep people at the few stations where judgment happens, and let them get there without sitting at a desk.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Manufacturing repeats a design. Software makes a new one every time
&lt;/h2&gt;

&lt;p&gt;Lights-out manufacturing is real. FANUC has a plant where robots build robots and can run for long stretches with nobody on the floor, and there are a lot of videos of Chinese "dark factories" going around.&lt;/p&gt;

&lt;p&gt;It works because the part was designed once and gets made a million times. The spec is a drawing with tolerances. Did the bracket come out at 40.00 mm, plus or minus 0.05? A gauge tells you, every time, for almost nothing. The design work happened months earlier, in another building, with the lights on.&lt;/p&gt;

&lt;p&gt;Software doesn't have the million-copies part. &lt;code&gt;git clone&lt;/code&gt; is the entire production line. Every ticket is a new design, so a "dark software factory" really means automating design and the checking of design. That's the part real factories never automated.&lt;/p&gt;

&lt;h2&gt;
  
  
  What broke when nobody was looking
&lt;/h2&gt;

&lt;p&gt;Here's what that looks like in practice. Every one of these comes straight from our own commit history.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agent said "done". There was nothing in it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When an agent finished a task without changing any code, GitHub refused to open a PR, because there was nothing to compare. We'd decided early on that this wasn't really an error, since the task had run and nothing had crashed. So GPR quietly skipped the PR step and moved the task to Done anyway.&lt;/p&gt;

&lt;p&gt;What we saw on the board was a green task, a "PR opened" event in its timeline, and no PR. Every automated signal agreed it was a success. The agent had exited cleanly and written a confident summary, and no test failed because there was nothing new to test. An agent that never touched the repo looked exactly like one that had finished the job, unless a person went looking for the diff. The checker had the same blind spot as the worker. In August we flipped it: no commits now means the task &lt;strong&gt;failed&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One wrong character hid two bugs.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tasks were timing out after 90 seconds and we couldn't see why. The log line meant to explain it came out as an empty template, because it used &lt;code&gt;%q&lt;/code&gt;, a Go formatting code, inside Python. Python choked on it, the logger swallowed the error, and the one number we needed (had the agent replied at all?) never got printed.&lt;/p&gt;

&lt;p&gt;Worse, a test had been failing on exactly this for a while, and we'd been writing it off as an environment problem. Once the log was fixed, the next bug showed up behind it: under the right timing the daemon could start &lt;strong&gt;two agents for one session&lt;/strong&gt; , and the extra one became a ~300 MB process nothing would ever clean up. Production showed one session spawned twice within 2.2 seconds. Even after both fixes, the original timeout still wasn't explained. We'd only made the next one visible.&lt;/p&gt;

&lt;p&gt;A pipeline that just wants CI green, with nobody reading logs, would have called that test flaky and rerun it. That's what we did too, until someone read the log.&lt;/p&gt;

&lt;p&gt;StrongDM's answer to this kind of problem is smart. They keep &lt;strong&gt;scenarios&lt;/strong&gt; , end-to-end user stories, outside the codebase like a holdout set so the agents can't game them, and they score "satisfaction" probabilistically rather than pass/fail. Right instinct. But someone writes the scenarios, and someone decides what satisfied means. That's review, moved upstream.&lt;/p&gt;

&lt;h2&gt;
  
  
  The digital twin doesn't know the world changed
&lt;/h2&gt;

&lt;p&gt;StrongDM's other big idea is the &lt;strong&gt;Digital Twin Universe&lt;/strong&gt; : behavioural clones of Okta, Jira, Slack and Google Docs, so agents can test at volumes the real APIs would rate-limit. Hitting real Slack in a loop is miserable, so we get it. Two of our worst integration bugs this year would have gone straight through one, though.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jira changed under us.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In September Atlassian removed an old search endpoint and our Jira calls started coming back &lt;strong&gt;410 Gone&lt;/strong&gt;. A Jira twin built in August would have kept happily returning results. The fix was itself a Jira ticket, PET2-4, which GPR picked up and turned into &lt;strong&gt;PR #500, tests passing first try&lt;/strong&gt;. So the factory part was fine. It needed someone to notice the 410 and write the ticket.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Slack ate our screenshots.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Slack delivers every &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; mention &lt;strong&gt;twice&lt;/strong&gt; , and the attached files are only on one of the copies. We were reading the other one, so the screenshots people attached to bug reports silently disappeared (more in the Slack post). Nobody puts that in a clone, because nobody knows about it until a real person's screenshot goes missing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Our real environment wouldn't fit in a sandbox.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before GPR we tried hosted sandboxes, with Daytona. Getting our backend, Flutter app, database and Go daemon to come up together in there was a project of its own, and we gave up (more in the pillar post). Then there's Windows, where connections went half-open without the daemon noticing and our pairing QR code printed as an empty box in Windows Terminal. No twin was going to tell us any of that.&lt;/p&gt;

&lt;p&gt;As for the $1,000 a day: Simon called it "more of a business model exercise", and it isn't the real problem anyway. Spend that much with no reliable way to tell whether the output is right and you've bought a faster way to ship things nobody checked.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Manufacturing dark factory&lt;/th&gt;
&lt;th&gt;"Dark" software factory&lt;/th&gt;
&lt;th&gt;What we run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Each unit is&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A copy of one design&lt;/td&gt;
&lt;td&gt;A new design&lt;/td&gt;
&lt;td&gt;A new design&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;"Is it right?"&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A gauge, cheap and certain&lt;/td&gt;
&lt;td&gt;Agents grading agents&lt;/td&gt;
&lt;td&gt;Agents first, then a person merges&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;When the world changes&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Rarely&lt;/td&gt;
&lt;td&gt;The twin doesn't know&lt;/td&gt;
&lt;td&gt;Whoever's on the board notices&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  What our software factory looks like
&lt;/h2&gt;

&lt;p&gt;It is a factory. Tickets come in from GitHub issues with a label, from Jira, from a Slack mention. A daemon on one of our machines picks each up, makes a git worktree, starts whichever agent suits it, runs plan, implement, verify, and opens a PR. &lt;strong&gt;370 commits&lt;/strong&gt; in our repo carry &lt;code&gt;Co-authored-by: GPR&lt;/code&gt;, and the branch list is mostly &lt;code&gt;gpr/task-tsk_…&lt;/code&gt;. The conversation minimap in the task screen was PR #318, which GPR opened against its own repo.&lt;/p&gt;

&lt;p&gt;The lights are on at three stations. Somebody writes the task, which is where the design happens; a vague ticket gets you a confident, wrong PR. Somebody answers the agent when it stops to ask, which happens more than you'd think and is honestly the most useful thing it does. And somebody reads the diff and merges.&lt;/p&gt;

&lt;p&gt;Most of what a person does at those stations is small. Answer "should I keep the old endpoint as a fallback?", approve a command, read a 40-line diff, merge. &lt;strong&gt;None of it needs a desk.&lt;/strong&gt; That's basically the product: agents run on your machine, your phone buzzes when one needs you, and you review and merge from there. If you only ever drive one Claude session, Claude Code Remote Control does the phone part fine.&lt;/p&gt;

&lt;p&gt;It's not frictionless. PR #502, worktree badges leaking into unrelated chat sessions, took &lt;strong&gt;four agent rounds&lt;/strong&gt;. PR #490, inline comment gestures not registering on diffs, took &lt;strong&gt;five&lt;/strong&gt;. Somebody looked at every round. That's a normal week.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where we might be wrong
&lt;/h2&gt;

&lt;p&gt;Models will get better at checking their own work, and holdout scenarios are a real step. For a CRUD service with great coverage and no third-party APIs, a mostly dark pipeline could probably work today. And if review really goes away, the phone half of our product matters a lot less. Worth saying, since we're the ones selling it.&lt;/p&gt;

&lt;p&gt;Our bet is that the stations move and don't disappear. Fewer people typing, more people deciding what gets built and saying yes or no to what comes back.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;Your AI coding agent is stuck in a terminal you have to babysit. So we built GetPullRequest&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;We ditched cloud AI coding agents. Our laptops were faster, and already paid for&lt;/li&gt;
&lt;li&gt;We merge pull requests from our phones. It's less reckless than it sounds&lt;/li&gt;
&lt;li&gt;A Jira AI agent fixed our Jira integration&lt;/li&gt;
&lt;li&gt;Devin AI alternatives: why pay for another AI engineer?&lt;/li&gt;
&lt;li&gt;Agent Client Protocol (ACP) is the most important AI coding standard nobody's talking about&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try the lit version
&lt;/h2&gt;

&lt;p&gt;GPR is free for projects, sessions, and the GitHub and Slack connections; you pay only for more workspaces or more tasks running at once. Get the app on &lt;a href="https://play.google.com/store/apps/details?id=com.pullrequest&amp;amp;utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=software-factory" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt; (iOS app coming soon), then on a Mac, Linux or Windows machine with one coding agent installed:&lt;br&gt;
&lt;/p&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://getpullrequest.com/install | bash
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/your-repo
gpr setup &lt;span class="c"&gt;# scan the QR code with the app&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Give it something small and boring first, then go do something else until your phone buzzes.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>discuss</category>
      <category>codereview</category>
    </item>
    <item>
      <title>Your AI coding agent is stuck in a terminal you have to babysit. So we built GetPullRequest</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Fri, 02 Oct 2026 17:03:00 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/your-ai-coding-agent-is-stuck-in-a-terminal-you-have-to-babysit-so-we-built-getpullrequest-1jng</link>
      <guid>https://dev.to/getpullrequest-hq/your-ai-coding-agent-is-stuck-in-a-terminal-you-have-to-babysit-so-we-built-getpullrequest-1jng</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fta63far8rpc5k6hp2uni.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%2Fta63far8rpc5k6hp2uni.png" alt="Your AI coding agent is stuck in a terminal you have to babysit. So we built GetPullRequest" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The agents got good.&lt;/strong&gt; Claude Code, Codex, Cursor and the rest can take a well-written ticket and produce a change you'd actually merge. What didn't change is &lt;em&gt;everything around them&lt;/em&gt;. The agent lives in a terminal on your laptop. It stops to ask a question while you're in a meeting, and the question sits there for two hours. When it finishes, the PR waits until you're back at a desk.&lt;/p&gt;

&lt;p&gt;We felt this every day, because we were building a product with four of these agents at once. GetPullRequest (GPR) is what we built to fix it, and we've built GPR with GPR since May. This post explains the gap we saw, where GPR fits, what it's bad at, and where we think this is going.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; GPR runs the coding agent you already pay for, on the machine that already builds your project. Tasks come in from GitHub, GitLab, Jira or Slack, and a pull request comes back to your phone. It's free to start.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Two answers, both from the vendors
&lt;/h2&gt;

&lt;p&gt;The industry has offered two answers to "my agent is stuck at my desk".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The first is to move the agent into the vendor's cloud.&lt;/strong&gt; Devin, GitHub's Copilot coding agent, Codex cloud and Cursor's Cloud Agents all work this way. You hand over a ticket, a VM somewhere clones your repo, and a PR comes back. For a project that builds from a clean checkout in two minutes, that's great.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ours doesn't.&lt;/em&gt; Our repo has a FastAPI backend, a Flutter app, a database and a Go daemon that all need to come up together. We tried hosted sandboxes first, with Daytona, and gave up for three reasons. &lt;strong&gt;Wiring all four pieces together&lt;/strong&gt; inside a sandbox, and keeping them working as the code changed, was a project in itself. &lt;strong&gt;It cost money&lt;/strong&gt; a small startup didn't want to spend while our own laptops sat idle half the day. And &lt;strong&gt;testing was slow&lt;/strong&gt; : every check meant a checkout and a full build to recreate an environment that already existed, fully built, on the laptop in front of us. Hosted agents also usually mean another subscription, billed per task or at API prices, on top of the agent plans we already paid for.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The second answer is a remote for your own machine.&lt;/strong&gt; Claude Code has Remote Control, and Codex now connects to the ChatGPT app. These keep the agent local, which we think is right. But each one is a remote for one vendor's agent, and it's built around a session you started yourself. Our work doesn't arrive that way. It arrives as a GitHub issue, a Jira ticket from someone in product, or a screenshot in Slack. It goes to whichever agent suits it, and it should end as a pull request, not a chat log.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Work doesn't arrive as a chat session. It arrives as a GitHub issue, a Jira ticket from someone in product, or a screenshot in Slack."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;Put those side by side and one combination is missing. Nothing ran the agent you already pay for, on the machine that already builds your project, fed by the tools where work actually gets asked for, and handed back a PR you could review from anywhere.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Vendor cloud agents&lt;/th&gt;
&lt;th&gt;Vendor remotes&lt;/th&gt;
&lt;th&gt;GetPullRequest&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where the agent runs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Their VM&lt;/td&gt;
&lt;td&gt;Your machine&lt;/td&gt;
&lt;td&gt;Your machine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Which agent&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Theirs&lt;/td&gt;
&lt;td&gt;Theirs&lt;/td&gt;
&lt;td&gt;Any ACP agent you already pay for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Where tasks come from&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Their app, sometimes GitHub&lt;/td&gt;
&lt;td&gt;A session you started&lt;/td&gt;
&lt;td&gt;GitHub, GitLab, Jira, Slack, the app&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;What comes back&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;A PR&lt;/td&gt;
&lt;td&gt;A chat&lt;/td&gt;
&lt;td&gt;A PR you merge from your phone&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;That's GetPullRequest.&lt;/strong&gt; A small daemon runs on your machine. It takes tasks from the board in our phone app, from GitHub issues labelled &lt;code&gt;gpr:agent&lt;/code&gt;, from Jira, or from an &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; mention in Slack. For each task it creates a git worktree, starts your agent, and runs plan, implement and verify. Then it opens a PR. Your phone shows the session live, buzzes when the agent has a question, and lets you read the diff and merge.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two decisions that shaped everything
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;We don't ship our own agent.&lt;/strong&gt; Developers already pay for one or two. Asking them to buy another before they can try GPR is friction, and it's paying twice for the same thing. We didn't know how to support every agent without writing an integration per agent. Then we watched &lt;a href="https://www.youtube.com/watch?v=n11pDnBXPgk" rel="noopener noreferrer"&gt;Ben Brandt from Zed and people from JetBrains explain the Agent Client Protocol&lt;/a&gt;. ACP solves the editors-times-agents problem for IDEs, and we realised &lt;em&gt;a phone could be just another client&lt;/em&gt;. GPR now runs Cursor, Claude Code, Codex, Kiro, OpenCode, Qwen, Cline and Copilot through it. The ACP post goes deeper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The cloud only enriches.&lt;/strong&gt; Everything core works with nothing connected: the board, the queue, the agent run, the diff and the merge check. The diff and merge check come from git on your machine, because that's where the agent's work actually is, including changes GitHub has never seen. GitHub, GitLab, Jira and Slack plug in as adapters behind ports, and they only add to what's there. When Atlassian removed an old search endpoint in September and our Jira calls started returning 410 Gone, &lt;strong&gt;agents kept working&lt;/strong&gt;. Only new tickets stopped syncing. The fix was ticket PET2-4, which GPR picked up from Jira and turned into PR #500, with tests passing on the first attempt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Built with itself
&lt;/h2&gt;

&lt;p&gt;By the time of writing, the GPR code had &lt;strong&gt;about 450 commits&lt;/strong&gt;. &lt;strong&gt;370 of them are co-authored by GPR.&lt;/strong&gt; Our branch list is full of &lt;code&gt;gpr/task-tsk_…&lt;/code&gt; names, which is what GPR calls the branches it creates. The conversation minimap in the task screen was PR #318, opened by GPR against its own repo. When worktree badges started leaking into unrelated chat sessions, the fix was PR #502, and its squash shows four agent iterations before the change was right.&lt;/p&gt;

&lt;p&gt;Building it this way also meant we hit every rough edge first. In August one machine had &lt;strong&gt;52 &lt;code&gt;cursor-agent&lt;/code&gt; processes&lt;/strong&gt; running after six and a half minutes, about 300 MB each, because they raced on a config file and ignored SIGTERM. Windows sockets went half-open and the daemon never noticed. Agents finished turns with no commits and GPR marked them done. Each of those is fixed now, and &lt;em&gt;most of the fixes were written by agents through GPR&lt;/em&gt;. The stories are spread across the posts in this series.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it's not good at
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;A machine has to be on.&lt;/strong&gt; If your laptop sleeps, its tasks wait until it wakes, so people who want agents working overnight end up pairing a desktop. &lt;strong&gt;The Android app is live, and iOS isn't in the App Store yet.&lt;/strong&gt; The phone is good for answering a question, approving a command, reading a small diff and merging. It's &lt;em&gt;not&lt;/em&gt; good for reviewing a big architectural change, and we don't pretend otherwise. If you only use one agent and want to poke at one session, Claude Code Remote Control or the ChatGPT app is simpler. But still its not smooth with other tools that you are operating with. You have to deal with lot of rough edges which GPR is designed to handle.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this is going
&lt;/h2&gt;

&lt;p&gt;Our bet is that most engineering work will look like what our team already does. Engineers spend less time typing code and more time deciding what should be built, writing tasks an agent can finish, and reviewing what comes back. The code still gets built and tested where it always was, on machines the team controls. The agents become interchangeable, and you pick one per task the way you'd pick a library. Work arrives from wherever people already talk about it.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The useful product isn't another agent. It's the layer between where work is asked for and where it's done.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In that world, the useful product isn't another agent. It's the layer between where work is asked for and where it's done, and the thing in your pocket that lets you keep up with it. That's what we're building GetPullRequest into.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next on this blog
&lt;/h2&gt;

&lt;p&gt;Over the next two weeks we'll publish the rest of this series. Each post takes one tool people already use and is honest about where it beats us:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude Code Remote Control is great. It's also not enough&lt;/li&gt;
&lt;li&gt;Agent Client Protocol (ACP) is the most important AI coding standard nobody's talking about&lt;/li&gt;
&lt;li&gt;Cursor background agents charge you twice for compute you already own&lt;/li&gt;
&lt;li&gt;Codex CLI remote control: stop babysitting the terminal and let it ship PRs while you're out&lt;/li&gt;
&lt;li&gt;Slack AI agents should open pull requests, not summarize threads&lt;/li&gt;
&lt;li&gt;A Jira AI agent fixed our Jira integration&lt;/li&gt;
&lt;li&gt;Devin AI alternatives: why pay for another AI engineer?&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;GPR is free for projects, sessions, and the GitHub and Slack connections. You pay only for more workspaces or more tasks running at once. Get the app on &lt;a href="https://play.google.com/store/apps/details?id=com.pullrequest&amp;amp;utm_source=blog&amp;amp;utm_medium=organic&amp;amp;utm_campaign=launch" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, (iOS app coming soon) then on a Mac, Linux or Windows machine with one coding agent installed:&lt;br&gt;
&lt;/p&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://getpullrequest.com/install | bash
&lt;span class="nb"&gt;cd&lt;/span&gt; ~/code/your-repo
gpr setup &lt;span class="c"&gt;# scan the QR code with the app&lt;/span&gt;
gpr discover &lt;span class="c"&gt;# lists which agents are ready&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Start with a small, boring task,&lt;/em&gt; something you'd normally put off, and see what's waiting for you when you get back.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mobile</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
