<?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: nestor quiroga</title>
    <description>The latest articles on DEV Community by nestor quiroga (@nestor_quiroga_d0a1aef9d7).</description>
    <link>https://dev.to/nestor_quiroga_d0a1aef9d7</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4090683%2F2c352bf5-7e49-4073-a12a-40812a8a4c22.png</url>
      <title>DEV Community: nestor quiroga</title>
      <link>https://dev.to/nestor_quiroga_d0a1aef9d7</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nestor_quiroga_d0a1aef9d7"/>
    <language>en</language>
    <item>
      <title>I gave my AI coding agents a night shift</title>
      <dc:creator>nestor quiroga</dc:creator>
      <pubDate>Sun, 23 Aug 2026 10:34:52 +0000</pubDate>
      <link>https://dev.to/nestor_quiroga_d0a1aef9d7/i-gave-my-ai-coding-agents-a-night-shift-f60</link>
      <guid>https://dev.to/nestor_quiroga_d0a1aef9d7/i-gave-my-ai-coding-agents-a-night-shift-f60</guid>
      <description>&lt;p&gt;I use Claude Code and Codex every day. And I kept running into the same want: hand the agent a task at night — bump dependencies, keep the changelog current, fix the flaky test — and just review it in the morning over coffee.&lt;/p&gt;

&lt;p&gt;You can already schedule the agents. The catch is &lt;em&gt;where&lt;/em&gt; they run.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scheduling a prompt isn't the hard part
&lt;/h2&gt;

&lt;p&gt;Every scheduler I tried runs the agent on your working directory. That's fine at 2pm when you're watching. It's not fine at 3am when you're asleep: if the agent gets something wrong, it gets it wrong &lt;strong&gt;on your code&lt;/strong&gt;, on the branch you'll open tomorrow.&lt;/p&gt;

&lt;p&gt;I didn't want "an agent that runs unattended." I wanted "an agent whose overnight work is &lt;strong&gt;isolated and reviewable&lt;/strong&gt;."&lt;/p&gt;

&lt;h2&gt;
  
  
  The idea: a worktree per run, and a morning inbox
&lt;/h2&gt;

&lt;p&gt;So I built a small VS Code extension called &lt;strong&gt;TaskKeeper&lt;/strong&gt;. Each scheduled run happens inside a fresh &lt;strong&gt;Git worktree&lt;/strong&gt; created from the exact base commit. The agent works on a throwaway copy; your checkout is never touched. When it finishes, the result lands in a review inbox: the diff, the files it changed, what it cost, and two buttons — &lt;strong&gt;accept&lt;/strong&gt; (a local merge, never a push) or &lt;strong&gt;discard&lt;/strong&gt; (worktree and branch gone, nothing left behind).&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%2Fqbfs3bdvzhn5tszp9xm8.gif" 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%2Fqbfs3bdvzhn5tszp9xm8.gif" alt="A task runs overnight in an isolated worktree, then waits in the morning inbox — accept or discard" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The whole bet is that one line: &lt;em&gt;if it gets it wrong at 3am, it gets it wrong on a copy — and you decide in the morning.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What a finished run looks like
&lt;/h2&gt;

&lt;p&gt;You don't get a wall of JSON. You get a readable transcript with a summary header — cost, turns, files changed, which worktree — and the actions right there.&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%2Fj4399rf07djhlx4a7fmw.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%2Fj4399rf07djhlx4a7fmw.png" alt="The morning inbox: a finished run with a readable transcript and accept/reject" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Accept merges into your branch locally. Reject deletes the worktree and its branch. Either way, nothing ever leaves your machine on its own.&lt;/p&gt;

&lt;h2&gt;
  
  
  Creating a task starts from intent
&lt;/h2&gt;

&lt;p&gt;A task is really two independent choices: which conversation (new / resume / fork) and where it works (isolated worktree, or directly in the repo). Instead of making you think about that, the panel opens on the intent — &lt;em&gt;in a conversation&lt;/em&gt; or &lt;em&gt;isolated task in a repo&lt;/em&gt; — and fills in the rest. There's a small catalog of templates (bump dependencies, write the changelog, lint sweep, fix failing tests) to start from.&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%2F9p51nxv6108uyyajdqdr.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%2F9p51nxv6108uyyajdqdr.png" alt="Creating a task: templates, the two intents, repository and agent" width="800" height="581"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  It runs with VS Code closed
&lt;/h2&gt;

&lt;p&gt;There's no daemon of mine sitting in your tray. Each task is one entry in the &lt;strong&gt;operating system's own scheduler&lt;/strong&gt; — Windows Task Scheduler or macOS launchd. At the scheduled time a short-lived worker starts, takes a machine-wide slot, creates the worktree, launches the agent, and records everything in a local SQLite database. The extension only &lt;em&gt;reads&lt;/em&gt; that database. If your machine is on, the task runs; on Windows it can even wake the machine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keeping it safe
&lt;/h2&gt;

&lt;p&gt;Two things I wasn't willing to hand-wave:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Permission profiles per run.&lt;/strong&gt; Every run gets one of two explicit profiles — &lt;em&gt;audit (read-only)&lt;/em&gt; or &lt;em&gt;isolated changes&lt;/em&gt; — applied through a controlled settings profile that your personal Claude config can't widen. A read-only task stays read-only even if your interactive setup is permissive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first.&lt;/strong&gt; No telemetry, no account, no network call from the extension itself. Secrets that look like tokens are redacted from stored logs.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Catching the failure schedulers hide
&lt;/h2&gt;

&lt;p&gt;The scary failure mode of any scheduler isn't a task that errors — you see those. It's a task that &lt;strong&gt;silently stops running&lt;/strong&gt; because its OS trigger got unregistered. So there's a &lt;em&gt;Last night&lt;/em&gt; digest: what ran while you were away, and a health check that turns a task &lt;strong&gt;red&lt;/strong&gt; if its trigger went missing, instead of it quietly never running again.&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%2Fg4dbcu5zvw6bx6fiyu36.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%2Fg4dbcu5zvw6bx6fiyu36.png" alt="The Last night digest with scheduler health, flagging a missing trigger" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Watching the spend
&lt;/h2&gt;

&lt;p&gt;Overnight agents cost money, so there's a monthly cap the runner itself enforces — once the month hits the cap, the next task is skipped before it spends. A panel breaks the month down by day and by task.&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%2Ffrj94f9rfwzwwdy6gvq6.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%2Ffrj94f9rfwzwwdy6gvq6.png" alt="The Spend panel: month vs. cap, by day and by task" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Cost is reported by Claude; Codex doesn't report it, and the panel says so.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Three things I actually run it for
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Dependencies:&lt;/strong&gt; weekly, bump to latest compatible and run the tests. I review the diff, I don't babysit the upgrade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Changelog:&lt;/strong&gt; read-only, summarise the week's commits into a draft entry.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Flaky tests:&lt;/strong&gt; overnight, find the failing test and make it pass without changing intent — then I decide if the fix is real.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;It's free, local-first, no account. Windows and macOS (the macOS binaries are signed).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Marketplace: &lt;a href="https://marketplace.visualstudio.com/items?itemName=argalla.taskkeeper" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=argalla.taskkeeper&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open VSX: &lt;a href="https://open-vsx.org/extension/argalla/taskkeeper" rel="noopener noreferrer"&gt;https://open-vsx.org/extension/argalla/taskkeeper&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not affiliated with Anthropic or OpenAI — it launches the same CLIs you already use.&lt;/p&gt;

&lt;p&gt;I'm most interested in how other people handle unattended agent runs: worktrees, containers, throwaway branches, something else? What's held up for you?&lt;/p&gt;

</description>
      <category>vscode</category>
      <category>ai</category>
      <category>claude</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
