<?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>The $10 server that runs Claude Code while you sleep</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Fri, 16 Oct 2026 08:00:00 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/the-10-server-that-runs-claude-code-while-you-sleep-g73</link>
      <guid>https://dev.to/getpullrequest-hq/the-10-server-that-runs-claude-code-while-you-sleep-g73</guid>
      <description>&lt;p&gt;Coding agents like Claude Code and Codex work best on a machine that stays on. Your laptop isn't that machine. It sleeps when you close the lid, it comes to meetings, and it runs out of battery on the train. So people start looking for a Claude Code VPS, a small server that stays on so the agent can keep working. The first answer is usually AWS.&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%2F90xymd35b7v4uujnahk3.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%2F90xymd35b7v4uujnahk3.png" alt="The $10 server that runs Claude Code while you sleep" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We priced it out across every cloud we could think of. The same kind of always-on box costs anywhere from &lt;strong&gt;$0 to $263 a month&lt;/strong&gt; , depending on where you rent it. Most of that spread pays for things a personal dev box never uses.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; A 4-core box running 24/7 costs about $121 a month on AWS or Azure, $98 on Google Cloud, $40 to $48 on Vultr or DigitalOcean, and $9.99 on Hetzner. An old laptop costs you about $2 a month in power. Add a $20 AI plan and GetPullRequest (GPR) on your phone, and you have a coding agent that works while you're away for about $30 a month.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How much server does Claude Code need?
&lt;/h2&gt;

&lt;p&gt;When Claude Code or Codex "thinks", that work happens on Anthropic's or OpenAI's servers. Your machine just sends the request and waits. What it actually runs is git, your editor tools, your package manager and your tests. Anthropic lists the &lt;a href="https://code.claude.com/docs/en/setup" rel="noopener noreferrer"&gt;minimum for Claude Code&lt;/a&gt; as 4 GB of RAM on an x64 or Arm processor.&lt;/p&gt;

&lt;p&gt;So the size of the box depends on your project, not on the agent. A Node or Python repo is happy on 2 cores and 4 GB. A Flutter app with an Android build, or three agents running test suites at the same time, wants 8 cores and 16 GB. Most people land at &lt;strong&gt;4 cores and 8 GB&lt;/strong&gt; , and that's what we compared.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Your project&lt;/th&gt;
&lt;th&gt;Box size that works&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scripts, small web apps, one agent&lt;/td&gt;
&lt;td&gt;2 vCPU, 4 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Typical app with a real test suite&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mobile builds, Docker, 2 to 3 agents at once&lt;/td&gt;
&lt;td&gt;8 vCPU, 16 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The prices, one by one
&lt;/h2&gt;

&lt;p&gt;All prices are US dollars for a month of 730 hours, Linux, checked on 16 October 2026. Follow the links, because cloud prices change.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS, Azure and Google Cloud: what the hyperscalers charge
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;Per hour&lt;/th&gt;
&lt;th&gt;Per month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS EC2&lt;/td&gt;
&lt;td&gt;t3.xlarge, 4 vCPU, 16 GB&lt;/td&gt;
&lt;td&gt;$0.166&lt;/td&gt;
&lt;td&gt;~$121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;B4ms, 4 vCPU, 16 GB&lt;/td&gt;
&lt;td&gt;$0.166&lt;/td&gt;
&lt;td&gt;~$121&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;e2-standard-4, 4 vCPU, 16 GB&lt;/td&gt;
&lt;td&gt;$0.134&lt;/td&gt;
&lt;td&gt;~$98&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Sources: &lt;a href="https://instances.vantage.sh/aws/ec2/t3.xlarge" rel="noopener noreferrer"&gt;AWS t3.xlarge&lt;/a&gt;, &lt;a href="https://instances.vantage.sh/azure/vm/b4ms" rel="noopener noreferrer"&gt;Azure B4ms&lt;/a&gt;, &lt;a href="https://instances.vantage.sh/gcp/e2-standard-4" rel="noopener noreferrer"&gt;GCP e2-standard-4&lt;/a&gt; (Vantage, us-east-1 / East US / us-central1).&lt;/p&gt;

&lt;p&gt;That's compute only. On AWS you also pay &lt;a href="https://aws.amazon.com/vpc/pricing/" rel="noopener noreferrer"&gt;$0.005 an hour for a public IPv4 address&lt;/a&gt;, which is $3.65 a month, and about &lt;a href="https://aws.amazon.com/ebs/pricing/" rel="noopener noreferrer"&gt;$0.08 per GB-month&lt;/a&gt; for the disk, so another $8 for 100 GB. The real AWS bill is closer to &lt;strong&gt;$133&lt;/strong&gt;. Data going out to the internet is billed on top.&lt;/p&gt;

&lt;p&gt;A one-year reservation brings the t3.xlarge down to about $0.104 an hour (~$76 a month). That's still more than seven Hetzner boxes.&lt;/p&gt;

&lt;p&gt;None of this is a rip-off. You're paying for dozens of regions, enterprise access controls and an uptime promise that production systems need. A box that runs your agent while you sleep needs none of it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Lightsail, DigitalOcean and Vultr: the simpler clouds
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Provider&lt;/th&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;Per month&lt;/th&gt;
&lt;th&gt;Traffic included&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/lightsail/pricing/" rel="noopener noreferrer"&gt;AWS Lightsail&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4 vCPU, 16 GB, 320 GB SSD&lt;/td&gt;
&lt;td&gt;$84&lt;/td&gt;
&lt;td&gt;6 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://aws.amazon.com/lightsail/pricing/" rel="noopener noreferrer"&gt;AWS Lightsail&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;2 vCPU, 8 GB, 160 GB SSD&lt;/td&gt;
&lt;td&gt;$44&lt;/td&gt;
&lt;td&gt;5 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.digitalocean.com/pricing/droplets" rel="noopener noreferrer"&gt;DigitalOcean Basic&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB, 160 GB SSD&lt;/td&gt;
&lt;td&gt;$48&lt;/td&gt;
&lt;td&gt;5,000 GiB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.vultr.com/pricing/" rel="noopener noreferrer"&gt;Vultr Regular&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB, 160 GB SSD&lt;/td&gt;
&lt;td&gt;$40&lt;/td&gt;
&lt;td&gt;4 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.vultr.com/pricing/" rel="noopener noreferrer"&gt;Vultr High Performance&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB, 180 GB NVMe&lt;/td&gt;
&lt;td&gt;$48&lt;/td&gt;
&lt;td&gt;6 TB&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;One flat price, with the disk, the IP address and a generous amount of traffic included. Lightsail is the same AWS underneath at about two thirds of the EC2 price. If you want AWS on the invoice, that's the one to pick.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hetzner vs DigitalOcean vs AWS: the cheapest paid option
&lt;/h3&gt;

&lt;p&gt;Hetzner raised cloud prices on &lt;a href="https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/" rel="noopener noreferrer"&gt;15 June 2026&lt;/a&gt;, some plans by more than double. It's still the cheapest paid option by a wide margin. On the same 4 vCPU, 8 GB box, Hetzner vs DigitalOcean is $9.99 against $48. Hetzner vs AWS is $9.99 against about $133.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Plan&lt;/th&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;Per month (Germany/Finland)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CX33&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB, 80 GB NVMe&lt;/td&gt;
&lt;td&gt;$9.99 (€8.49)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CAX21&lt;/td&gt;
&lt;td&gt;4 Arm vCPU, 8 GB, 80 GB NVMe&lt;/td&gt;
&lt;td&gt;$12.49 (€10.49)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CX43&lt;/td&gt;
&lt;td&gt;8 vCPU, 16 GB, 160 GB NVMe&lt;/td&gt;
&lt;td&gt;$18.49 (€15.99)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPX32&lt;/td&gt;
&lt;td&gt;4 vCPU, 8 GB, 160 GB NVMe&lt;/td&gt;
&lt;td&gt;$41.99 (€35.49)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Prices exclude VAT and a €0.50 public IPv4 fee. EU servers include &lt;a href="https://www.hetzner.com/cloud/cost-optimized" rel="noopener noreferrer"&gt;20 TB of traffic&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Two catches. The cheap CX and CAX plans are "cost-optimized", and on the day we checked, &lt;a href="https://www.hetzner.com/cloud/cost-optimized" rel="noopener noreferrer"&gt;Hetzner's page&lt;/a&gt; listed them as currently unavailable. They come back in batches, so keep trying. And the cheapest plans live in Europe. That matters less than you'd think. Your phone talks to the agent through our server, and the agent talks to the model's servers, so you never type into a laggy terminal across the Atlantic.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Oracle Cloud's free tier really free?
&lt;/h3&gt;

&lt;p&gt;Oracle's &lt;a href="https://docs.oracle.com/en-us/iaas/Content/FreeTier/resourceref.htm" rel="noopener noreferrer"&gt;Always Free tier&lt;/a&gt; gives you Arm compute worth 2 OCPUs and 12 GB of memory, plus 200 GB of disk, for $0. It's a real machine and it's enough for one agent.&lt;/p&gt;

&lt;p&gt;Yes, but read the limits. The catch is written in the same doc. Oracle may take back a free instance that looks idle for 7 days, meaning CPU, network and memory all under 20%. A dev box that waits for your next task looks exactly like that. Use it to try things. Don't build your week around it.&lt;/p&gt;

&lt;h3&gt;
  
  
  GitHub Codespaces
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://docs.github.com/en/billing/concepts/product-billing/github-codespaces" rel="noopener noreferrer"&gt;Codespaces&lt;/a&gt; charges $0.36 an hour for 4 cores. Used eight hours a day on workdays, that's about $63 a month. Left running all month so an agent can work overnight, it's &lt;strong&gt;$263&lt;/strong&gt;. Codespaces is built to stop when you stop, which is the opposite of what an agent box is for.&lt;/p&gt;

&lt;h3&gt;
  
  
  Your own machine
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Machine&lt;/th&gt;
&lt;th&gt;Up front&lt;/th&gt;
&lt;th&gt;Power per month&lt;/th&gt;
&lt;th&gt;Per month over 3 years&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Old laptop or desktop you already own&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;~$2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$2&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.omgubuntu.co.uk/2026/02/raspberry-pi-annouce-more-price-rises" rel="noopener noreferrer"&gt;Raspberry Pi 5, 8 GB&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$155&lt;/td&gt;
&lt;td&gt;~$0.70&lt;/td&gt;
&lt;td&gt;~$5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://techcrunch.com/2026/08/25/apples-latest-mac-mini-runs-on-a-new-m6-chip-and-starts-at-899/" rel="noopener noreferrer"&gt;Mac mini M6&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$899&lt;/td&gt;
&lt;td&gt;~$1.30&lt;/td&gt;
&lt;td&gt;~$26&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Power uses the US average of &lt;a href="https://www.eia.gov/outlooks/steo/report/elec_coal_renew.php" rel="noopener noreferrer"&gt;18.2 cents per kWh&lt;/a&gt; for 2026. Apple says the M6 Mac mini draws &lt;a href="https://support.apple.com/103253" rel="noopener noreferrer"&gt;4 watts at idle&lt;/a&gt;, and we assumed an average of 10 W with builds. The Pi got 5 W and the old laptop 15 W.&lt;/p&gt;

&lt;p&gt;The old laptop in the cupboard is the cheapest dev box there is. It already has your tools, your keys and a warm build cache. RAM prices pushed the Pi up 24% this year, but it's still a fine box for a light repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it costs all in
&lt;/h2&gt;

&lt;p&gt;The box is only half the bill. The agent needs a model plan too. &lt;a href="https://claude.com/pricing" rel="noopener noreferrer"&gt;Claude Pro&lt;/a&gt; is $20 a month and includes Claude Code. &lt;a href="https://chatgpt.com/pricing" rel="noopener noreferrer"&gt;ChatGPT Plus&lt;/a&gt; includes Codex.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Box&lt;/th&gt;
&lt;th&gt;AI plan&lt;/th&gt;
&lt;th&gt;GPR&lt;/th&gt;
&lt;th&gt;Total per month&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;AWS EC2, done "properly"&lt;/td&gt;
&lt;td&gt;~$133&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$153&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DigitalOcean&lt;/td&gt;
&lt;td&gt;$48&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$68&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hetzner CX33&lt;/td&gt;
&lt;td&gt;$9.99&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$30&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Old laptop at home&lt;/td&gt;
&lt;td&gt;~$2&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;~$22&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Oracle free tier&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;$20&lt;/td&gt;
&lt;td&gt;$0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$20&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Heavy users move to a bigger AI plan (&lt;a href="https://claude.com/pricing" rel="noopener noreferrer"&gt;Max starts at $100&lt;/a&gt;) long before they need a bigger box. That's where the money actually goes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Our take
&lt;/h2&gt;

&lt;p&gt;We tried hosted sandboxes first. Wiring our backend, Flutter app, database and daemon together inside someone else's sandbox was painful, every test meant a fresh checkout and a full build, and the bill was too high for a small startup whose laptops sat idle most of the day. (&lt;a href="https://www.getpullrequest.com/blogs/why-we-built-getpullrequest" rel="noopener noreferrer"&gt;The launch post&lt;/a&gt; tells the whole story.)&lt;/p&gt;

&lt;p&gt;So our view is simple. &lt;strong&gt;Spend on the model, not the machine.&lt;/strong&gt; The model is what writes the code. The machine just needs to be on, have your repo checked out, and run your tests. A $10 box does that as well as a $120 one.&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%2Fy3je8lrphq0eg1qlqz4g.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%2Fy3je8lrphq0eg1qlqz4g.png" alt="What a $30 a month setup looks like" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What $30 a month gets you
&lt;/h2&gt;

&lt;p&gt;With a small always-on box and GPR on your phone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Agents keep working when your laptop is closed.&lt;/strong&gt; Start a task on the train, close the app, check the result at lunch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tickets turn into pull requests.&lt;/strong&gt; Point an agent at a GitHub issue, a Jira ticket or a Slack thread, and a PR comes back.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Several tasks at once.&lt;/strong&gt; Each task gets its own git worktree, so two or three agents can work side by side on 8 GB.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Overnight runs.&lt;/strong&gt; Queue the boring backlog before bed and review the PRs from your phone in the morning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your agent, your choice.&lt;/strong&gt; &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 or any of the &lt;a href="https://www.getpullrequest.com/blogs/agent-client-protocol" rel="noopener noreferrer"&gt;eight ACP agents&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your code stays on a box you control,&lt;/strong&gt; not in a vendor's sandbox.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to install Claude Code on a VPS
&lt;/h2&gt;

&lt;p&gt;Rent the box (or dust off the laptop) and log in over SSH. Install the agent you use, then GPR. For Claude Code, that's the &lt;a href="https://code.claude.com/docs/en/setup" rel="noopener noreferrer"&gt;official installer&lt;/a&gt;, and you sign in by running &lt;code&gt;claude&lt;/code&gt; 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://claude.ai/install.sh | bash
claude
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://getpullrequest.com/install | bash
gpr setup ~/code/your-repo

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

&lt;/div&gt;



&lt;p&gt;Scan the QR code with the GPR app and you're done. The daemon connects out to our server, so you don't need to open any ports. Keep SSH on keys only and leave the firewall closed.&lt;/p&gt;

&lt;p&gt;A few habits that save money and pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start small. Moving up a size on most clouds takes a reboot, not a rebuild.&lt;/li&gt;
&lt;li&gt;Check &lt;code&gt;gpr status&lt;/code&gt; and &lt;code&gt;gpr doctor&lt;/code&gt; after a reboot, the same as any other machine.&lt;/li&gt;
&lt;li&gt;Watch the hourly clouds. A forgotten EC2 box with a big disk keeps billing whether you use it or not.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Questions people ask
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What's the best VPS for Claude Code?
&lt;/h3&gt;

&lt;p&gt;For most people, a 4 vCPU, 8 GB box. Hetzner's CX33 at $9.99 is the cheapest we found. If it's out of stock, Vultr ($40) and DigitalOcean ($48) are simple and reliable.&lt;/p&gt;

&lt;h3&gt;
  
  
  What's the cheapest VPS for Claude Code?
&lt;/h3&gt;

&lt;p&gt;Oracle's free tier at $0, if it doesn't get taken back for being idle. The cheapest paid one is Hetzner's CX23 (2 vCPU, 4 GB) at $6.49, which just meets Claude Code's 4 GB minimum.&lt;/p&gt;

&lt;h3&gt;
  
  
  How much RAM does Claude Code need?
&lt;/h3&gt;

&lt;p&gt;Anthropic says 4 GB or more. Plan for 8 GB if your tests or builds are heavy, or if you run more than one agent at once.&lt;/p&gt;

&lt;h3&gt;
  
  
  Is Hetzner cheaper than AWS?
&lt;/h3&gt;

&lt;p&gt;Yes, by about 13 times for an always-on 4-core box: $9.99 against roughly $133 with disk and IP address on AWS.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hetzner vs DigitalOcean pricing?
&lt;/h3&gt;

&lt;p&gt;For 4 vCPU and 8 GB, Hetzner is $9.99 and DigitalOcean is $48. Hetzner's cheapest plans are only in Europe, and they sell out.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can I run Claude Code on a Raspberry Pi?
&lt;/h3&gt;

&lt;p&gt;Yes. Claude Code supports Arm, and the 8 GB Pi 5 meets the memory minimum. It's slow for big builds but fine for a light repo.&lt;/p&gt;

&lt;h3&gt;
  
  
  Does my Claude Code VPS need open ports?
&lt;/h3&gt;

&lt;p&gt;Not for GPR. The daemon connects out to our server, so only SSH needs to be reachable, and only with keys.&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=dev-server-cost" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, pick the cheapest box on the chart above, and give it tomorrow's longest task.&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/run-ai-coding-agents-from-your-phone" rel="noopener noreferrer"&gt;Ship code from your phone with the AI coding agents you already pay for&lt;/a&gt;&lt;/li&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/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;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;p&gt;Prices checked 16 October 2026.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS: &lt;a href="https://instances.vantage.sh/aws/ec2/t3.xlarge" rel="noopener noreferrer"&gt;EC2 t3.xlarge&lt;/a&gt;, &lt;a href="https://aws.amazon.com/lightsail/pricing/" rel="noopener noreferrer"&gt;Lightsail pricing&lt;/a&gt;, &lt;a href="https://aws.amazon.com/vpc/pricing/" rel="noopener noreferrer"&gt;public IPv4 pricing&lt;/a&gt;, &lt;a href="https://aws.amazon.com/ebs/pricing/" rel="noopener noreferrer"&gt;EBS pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Azure: &lt;a href="https://instances.vantage.sh/azure/vm/b4ms" rel="noopener noreferrer"&gt;B4ms&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Google Cloud: &lt;a href="https://instances.vantage.sh/gcp/e2-standard-4" rel="noopener noreferrer"&gt;e2-standard-4&lt;/a&gt;, &lt;a href="https://cloud.google.com/compute/vm-instance-pricing" rel="noopener noreferrer"&gt;Compute Engine pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Hetzner: &lt;a href="https://docs.hetzner.com/general/infrastructure-and-availability/price-adjustment/" rel="noopener noreferrer"&gt;June 2026 price adjustment&lt;/a&gt;, &lt;a href="https://www.hetzner.com/cloud/cost-optimized" rel="noopener noreferrer"&gt;cost-optimized plans&lt;/a&gt;, &lt;a href="https://www.hetzner.com/cloud/regular-performance" rel="noopener noreferrer"&gt;regular performance plans&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;DigitalOcean: &lt;a href="https://www.digitalocean.com/pricing/droplets" rel="noopener noreferrer"&gt;Droplet pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Vultr: &lt;a href="https://www.vultr.com/pricing/" rel="noopener noreferrer"&gt;pricing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Oracle Cloud: &lt;a href="https://docs.oracle.com/en-us/iaas/Content/FreeTier/resourceref.htm" rel="noopener noreferrer"&gt;Always Free resources&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;GitHub Codespaces: &lt;a href="https://docs.github.com/en/billing/concepts/product-billing/github-codespaces" rel="noopener noreferrer"&gt;billing&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Mac mini M6: &lt;a href="https://techcrunch.com/2026/08/25/apples-latest-mac-mini-runs-on-a-new-m6-chip-and-starts-at-899/" rel="noopener noreferrer"&gt;TechCrunch, $899 starting price&lt;/a&gt;, &lt;a href="https://support.apple.com/103253" rel="noopener noreferrer"&gt;Apple power figures&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Raspberry Pi 5: &lt;a href="https://www.omgubuntu.co.uk/2026/02/raspberry-pi-annouce-more-price-rises" rel="noopener noreferrer"&gt;OMG! Ubuntu, February 2026 price rise&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Claude Code: &lt;a href="https://code.claude.com/docs/en/setup" rel="noopener noreferrer"&gt;setup and system requirements&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Electricity: &lt;a href="https://www.eia.gov/outlooks/steo/report/elec_coal_renew.php" rel="noopener noreferrer"&gt;EIA Short-Term Energy Outlook, October 2026&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;AI plans: &lt;a href="https://claude.com/pricing" rel="noopener noreferrer"&gt;Claude pricing&lt;/a&gt;, &lt;a href="https://chatgpt.com/pricing" rel="noopener noreferrer"&gt;ChatGPT pricing&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>claudecodevps</category>
    </item>
    <item>
      <title>OpenAI dots fall short on coding. Here's exactly where</title>
      <dc:creator>Hari N</dc:creator>
      <pubDate>Mon, 12 Oct 2026 11:09:00 +0000</pubDate>
      <link>https://dev.to/getpullrequest-hq/openai-dots-fall-short-on-coding-heres-exactly-where-4gcf</link>
      <guid>https://dev.to/getpullrequest-hq/openai-dots-fall-short-on-coding-heres-exactly-where-4gcf</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%2F0kz5c18xittk76f2oau1.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%2F0kz5c18xittk76f2oau1.png" alt="OpenAI dots fall short on coding. Here's exactly where" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On September 29, OpenAI launched &lt;a href="https://openai.com/index/introducing-dots/" rel="noopener noreferrer"&gt;dots&lt;/a&gt;. A dot is an always-on agent that works for you in the background. It has its own cloud computer and browser, connects to more than &lt;strong&gt;4,000&lt;/strong&gt; apps through plugins, and you talk to it in ChatGPT (desktop, web or mobile), Slack or Teams. Texting is "coming soon".&lt;/p&gt;

&lt;p&gt;One of the examples OpenAI gives is for developers. Your dot watches customer feedback for recurring requests, picks out small fixes, builds and tests them, and "brings you complete PRs to review with attached videos showing the changes." That is very close to what GetPullRequest (GPR) does, so we wanted to write down honestly how OpenAI dots and GPR compare. (Videos of the change are a nice touch. Ours don't do that.)&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Dots is a general assistant for everyone, running on OpenAI's cloud with OpenAI's model. GPR is only for developers. It runs the coding agent you already pay for (Claude Code, Codex, Cursor and others) on your own machine, takes work from a task board, GitHub, Jira or Slack, and lets you review and merge the pull request from your phone.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What dots and GPR have in common
&lt;/h2&gt;

&lt;p&gt;Both are built around the same idea. You shouldn't have to sit in front of a terminal while an agent works. You hand it the work, it gets on with it, it asks you when it needs a decision, and it comes back with something you can review.&lt;/p&gt;

&lt;p&gt;Both also keep a person in the loop. Dots come with built-in rules for when to act alone and when to ask, and you can add your own rules to allow, block or require approval for specific actions. In GPR, the agent asks you questions while it plans, and nothing gets merged until you merge it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where the agent runs
&lt;/h2&gt;

&lt;p&gt;This is the biggest difference.&lt;/p&gt;

&lt;p&gt;A dot works on its own cloud computer, and you can open that computer to see what it did. You can also give it permission to use your laptop, but by default your computer stays separate. For general work like drafting documents or checking accounts, that is a sensible design.&lt;/p&gt;

&lt;p&gt;For code, it matters more. Your repo, your build setup, your database and your test data are on your machine. Before we built GPR, we tried running agents in hosted sandboxes. Getting our backend, Flutter app, database and daemon all running in a sandbox took a lot of work, and every time we wanted to check a change we had to build everything from scratch. So GPR runs the agent on your machine, where everything is already set up. The agent runs your tests the same way you do. The GPR backend never clones your repo. It keeps the task board and the session history (the agent's messages, tool calls and diffs) so your phone can replay them, sends notifications, and opens the pull request through GitHub or GitLab when you've connected one.&lt;/p&gt;

&lt;p&gt;The trade-off is that your machine needs to be on. A dot can keep working when your laptop is closed. GPR waits until your machine is back, which is why some of us pair a second machine that stays on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Which agent does the work
&lt;/h2&gt;

&lt;p&gt;Dots run on OpenAI's GPT-6 Astra. You can ask your dot to start or manage tasks in Codex, and those count toward your normal ChatGPT usage limits. Just chatting with your dot doesn't.&lt;/p&gt;

&lt;p&gt;GPR doesn't have its own agent. It runs the agents developers are already paying for: Claude Code, Codex, Cursor, Kiro, OpenCode, Qwen, Cline and Copilot. It talks to all of them through the &lt;a href="https://www.getpullrequest.com/blogs/agent-client-protocol" rel="noopener noreferrer"&gt;Agent Client Protocol&lt;/a&gt;, so you can pick a different agent for each workspace. Our own team builds GPR with Cursor, Claude Code, Kiro and OpenCode, and nobody had to give up the one they liked.&lt;/p&gt;

&lt;p&gt;If your team is all-in on OpenAI, this difference might not matter to you. If your team uses Claude Code, or a mix of agents, it matters a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who it's for
&lt;/h2&gt;

&lt;p&gt;Dots is for everyone. OpenAI's examples include a sales lead, a scientist rerunning analyses as new data arrives, a content creator and someone running a product launch. One early tester's dot noticed he'd forgotten to invoice a publication, prepared the invoice and sent it once he approved.&lt;/p&gt;

&lt;p&gt;GPR only does one thing: it gets coding tasks done and turns them into pull requests. Tasks come from a board in the app, from GitHub or GitLab issues, from Jira tickets or from an &lt;a class="mentioned-user" href="https://dev.to/gpr"&gt;@gpr&lt;/a&gt; mention in Slack. Each task gets its own git worktree, and the agent plans, implements, verifies and opens a pull request. You can watch the session live, answer the agent's questions and merge the PR, all from your phone.&lt;/p&gt;

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

&lt;p&gt;Dots is rolling out to ChatGPT Pro and Business Premium, and Enterprise workspaces can try the beta once an admin turns it on. Your first dot comes with the plan at no extra cost, deeper work uses an allowance, and limits are extended for the first month. OpenAI hasn't published what happens after that, or pricing for more dots.&lt;/p&gt;

&lt;p&gt;GPR has a free tier that covers projects, sessions, and the GitHub and Slack connections. You only pay if you want more workspaces or more tasks running at the same time. You also keep paying for your coding agent the way you already do, whether that's a Claude plan, a Cursor plan or ChatGPT for Codex.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where dots fall short for developers
&lt;/h2&gt;

&lt;p&gt;Dots is two weeks old, so there isn't much hands-on feedback yet. We went through OpenAI's own docs, the first user reports on OpenAI's developer forum, and the threads on Reddit and Hacker News. Here's what matters if you want a dot to write code.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where it falls short&lt;/th&gt;
&lt;th&gt;What we found&lt;/th&gt;
&lt;th&gt;How GPR handles it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Who can get it&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Only ChatGPT Pro and Business Premium. Pro users in the EEA, Switzerland and the UK are &lt;a href="https://help.openai.com/en/articles/6825453-chatgpt-release-notes" rel="noopener noreferrer"&gt;left out at launch&lt;/a&gt;. One r/OpenAI thread is titled &lt;a href="https://www.reddit.com/r/OpenAI/comments/1wthevd/barrier_to_entry_with_dots_is_kinda_absurd/" rel="noopener noreferrer"&gt;"Barrier to entry with dots is kinda absurd"&lt;/a&gt;.&lt;/td&gt;
&lt;td&gt;Free tier. You keep the agent plan you already have.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Setting it up&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;You &lt;a href="https://help.openai.com/en/articles/20001530-getting-started-with-your-dot" rel="noopener noreferrer"&gt;can't create a dot on mobile&lt;/a&gt;, and mobile web isn't supported. Desktop app or desktop web only.&lt;/td&gt;
&lt;td&gt;Run &lt;code&gt;gpr setup&lt;/code&gt; once on the machine. Everything after that is from the phone.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Working on your machine&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Your computer has to stay online &lt;a href="https://help.openai.com/en/articles/20001530-getting-started-with-your-dot" rel="noopener noreferrer"&gt;with the ChatGPT app open&lt;/a&gt;.&lt;/td&gt;
&lt;td&gt;The daemon runs in the background. No app needs to be open, but the machine does need to be on.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Your build setup&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Cloud coding needs a Codex environment you &lt;a href="https://help.openai.com/en/articles/20001530-getting-started-with-your-dot" rel="noopener noreferrer"&gt;create first&lt;/a&gt;, with dependencies and tests set up again in OpenAI's cloud.&lt;/td&gt;
&lt;td&gt;Uses the build that's already on 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;GPT-6 Astra, and Codex for coding tasks.&lt;/td&gt;
&lt;td&gt;Claude Code, Codex, Cursor, Kiro, OpenCode, Qwen, Cline or Copilot.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cost you can plan&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Codex tasks your dot starts &lt;a href="https://openai.com/index/introducing-dots/" rel="noopener noreferrer"&gt;count toward your usage limits&lt;/a&gt;. Limits after the first month aren't published.&lt;/td&gt;
&lt;td&gt;Your agent bill doesn't change. GPR charges only for more workspaces or more tasks at once.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Seeing what's running&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The first user report on OpenAI's forum said it was &lt;a href="https://community.openai.com/t/early-dot-feedback-first-day/1402446" rel="noopener noreferrer"&gt;"harder to tell what was actually running, what needed attention and where the latest result lived."&lt;/a&gt; The same post said the dot couldn't confirm which model a task was using, and its prototype code "passed static checks but still contained mistakes."&lt;/td&gt;
&lt;td&gt;Every task is a card on the board with its state, and the verify step runs your tests before a PR opens. Agents still make mistakes, so you still review.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Company rules&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Enterprise is a beta and off by default. During the beta there's &lt;a href="https://learn.chatgpt.com/docs/enterprise/cloud-local-access" rel="noopener noreferrer"&gt;no data residency, no strict zero data retention&lt;/a&gt;, and no dots for FedRAMP or EKM workspaces.&lt;/td&gt;
&lt;td&gt;Your repo stays on your machine. GPR does store the session history, including diffs, so your phone can replay it.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;The only way to clear what a dot has saved is to &lt;a href="https://help.openai.com/en/articles/20001530-getting-started-with-your-dot" rel="noopener noreferrer"&gt;delete the dot&lt;/a&gt;.&lt;/td&gt;
&lt;td&gt;GPR keeps no memory of its own. The agent sees the task and its session, and you can scroll through both.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;None of this makes dots bad. It's a general assistant that also writes code, and OpenAI built it for everyone first. For a developer, though, it's one more place to set up your build, and one more model you didn't pick.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where GPR falls short today
&lt;/h2&gt;

&lt;p&gt;Dots can do far more than code. It can draft documents, prepare invoices and work across thousands of apps. GPR can't do any of that, and we don't plan to.&lt;/p&gt;

&lt;p&gt;GPR also needs your machine to be on, and the iOS app isn't in the App Store yet. We're actively working on getting it approved. Android is available today. Dots works from ChatGPT on desktop, web and mobile, and from Slack and Teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  So which one should you use?
&lt;/h2&gt;

&lt;p&gt;If you want one assistant that helps with all kinds of work, and you're happy with OpenAI's models and cloud, try dots.&lt;/p&gt;

&lt;p&gt;If you want an end-to-end assistant for your coding work, pick GPR. &lt;strong&gt;It gets the work done.&lt;/strong&gt; A ticket goes in, and a tested pull request comes out. It runs on your own machine, with the agent you already pay for, and you review and merge from your phone.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Dots helps with everything. GPR ships your code.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;You can also use both. If your dot is connected to GitHub, it can file an issue with the &lt;code&gt;gpr:agent&lt;/code&gt; label, and GPR will pick it up.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try GPR
&lt;/h2&gt;

&lt;p&gt;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=openai-dots" rel="noopener noreferrer"&gt;Google Play&lt;/a&gt;, then run this on the machine where your code lives:&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;h2&gt;
  
  
  Keep reading
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.getpullrequest.com/blogs/run-ai-coding-agents-from-your-phone" rel="noopener noreferrer"&gt;Ship code from your phone with the AI coding agents you already pay for&lt;/a&gt;&lt;/li&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/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;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/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>openaidots</category>
    </item>
    <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>
