<?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: Sabr Systems</title>
    <description>The latest articles on DEV Community by Sabr Systems (@pilothousedev).</description>
    <link>https://dev.to/pilothousedev</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%2F4212087%2Feed5bd17-88c8-453d-bbeb-fcb149ef8b58.png</url>
      <title>DEV Community: Sabr Systems</title>
      <link>https://dev.to/pilothousedev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pilothousedev"/>
    <language>en</language>
    <item>
      <title>Why we built Pilothouse: One inbox and PreToolUse rules for Claude Code, Codex, OpenCode, and Grok Build</title>
      <dc:creator>Sabr Systems</dc:creator>
      <pubDate>Mon, 02 Nov 2026 16:41:43 +0000</pubDate>
      <link>https://dev.to/pilothousedev/why-we-built-pilothouse-one-inbox-and-pretooluse-rules-for-claude-code-codex-opencode-and-grok-3agg</link>
      <guid>https://dev.to/pilothousedev/why-we-built-pilothouse-one-inbox-and-pretooluse-rules-for-claude-code-codex-opencode-and-grok-3agg</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://pilothouse.dev/blog/why-we-built-pilothouse" rel="noopener noreferrer"&gt;pilothouse.dev/blog/why-we-built-pilothouse&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update, 2 November 2026:&lt;/strong&gt; Pilothouse 0.4 can link several computers into one inbox. Run &lt;code&gt;pilothouse link add&lt;/code&gt; on the machine your phone is paired with and &lt;code&gt;pilothouse link join&lt;/code&gt; on the others. The app then shows every machine's sessions together, labelled by machine, and approvals, replies and the live terminal go to the machine running the agent. Each machine checks your device's signature itself, so the hub can't approve anything for you. Rules and tasks stay per machine. Setup: &lt;a href="https://pilothouse.dev/docs/machines" rel="noopener noreferrer"&gt;Several machines&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update (October 26, 2026):&lt;/strong&gt; Pilothouse 0.2 adds OpenCode and Grok Build support, questions and plan approval from your phone, replies, activity and usage tracking, and two-way Telegram.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you run coding agents seriously, your day probably looks like this: three or four Claude Code sessions in different repos, a Codex session reviewing a PR, maybe an OpenCode or Grok Build session running in another tab or on a server over SSH. Each of them will, at some unpredictable moment, stop and wait for you.&lt;/p&gt;

&lt;p&gt;Sometimes you’re right there. Often you’re in another tab, in a meeting, making coffee, or asleep — and the agent sits idle for an hour because it wanted to run &lt;code&gt;npm install&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://pilothouse.dev" rel="noopener noreferrer"&gt;Pilothouse&lt;/a&gt; exists to fix that, without making the rest of your setup worse.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problems we kept hitting
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Blocked prompts you don’t see.&lt;/strong&gt; Agents tell you they need you in the terminal they run in. If that terminal is behind three other windows, you find out when you go looking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Every vendor solves it for itself.&lt;/strong&gt; Claude Code has Remote Control and push notifications. Codex has the ChatGPT apps. They’re good — for their own agent. If you use more than one agent, you have multiple inboxes, multiple apps, and separate sets of rules, and none of them know about the others.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Permission prompts are the wrong place for rules.&lt;/strong&gt; We wanted “never force-push” and “ask me before anything touches &lt;code&gt;main&lt;/code&gt;” to hold for every agent. But a tool that only sees permission prompts can’t enforce that: if the agent’s settings already allow &lt;code&gt;git push&lt;/code&gt;, it never asks, so there is nothing to intercept.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Most tools want you to move in.&lt;/strong&gt; A lot of the tooling around agents is a new terminal, a new multiplexer, or a new desktop app you have to run your agents inside. Some of them are excellent. But we already have terminals we like, and &lt;code&gt;tmux&lt;/code&gt; or &lt;code&gt;herdr&lt;/code&gt; sessions on servers that aren’t going anywhere.&lt;/p&gt;

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

&lt;p&gt;Why the name? A pilothouse is the enclosed room on a ship’s bridge where the ship is steered from. Your agents are the crew; you steer every one of them from one place — at the desk or from your phone.&lt;/p&gt;

&lt;p&gt;Pilothouse is a single Go binary that runs a small daemon per machine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Hooks, not screen scraping.&lt;/strong&gt; It watches Claude Code, Codex, and Grok Build sessions through their official hooks (and OpenCode via a lightweight plugin). No terminal emulation, so it works in Ghostty, iTerm2, VS Code, SSH, &lt;code&gt;tmux&lt;/code&gt;, or &lt;code&gt;herdr&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;code&gt;PreToolUse&lt;/code&gt; policy engine.&lt;/strong&gt; It checks your rules before every tool call. Rules are YAML with globs, plus optional CEL expressions when you need logic (&lt;code&gt;command.matches("(--force|-f)\\b")&lt;/code&gt;). Any &lt;code&gt;deny&lt;/code&gt; wins, then &lt;code&gt;ask&lt;/code&gt;, then &lt;code&gt;allow&lt;/code&gt;. A repo can ship its own &lt;code&gt;.pilothouse/policy.yaml&lt;/code&gt;, but until you trust it, it can only make things stricter.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Presence-aware routing.&lt;/strong&gt; At your desk, Pilothouse stays out of the way and the agent shows its own dialog, exactly as before. Step away, and the request is held and pushed to your phone (or two-way Telegram). Come back, and it’s handed back to the terminal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cryptographically signed phone approvals.&lt;/strong&gt; Your phone talks to a web app served by your own machine over Tailscale Serve (or two-way Telegram without Tailscale), and you can link several machines into one inbox. Pairing is a QR code; each device generates a non-exportable P-256 signing key and every decision it sends is signed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No account, no cloud, no telemetry.&lt;/strong&gt; Everything stays on your own machines and your tailnet. The only network call is an anonymous update check, which you can disable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Design choices we care about
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Hooks over pixels.&lt;/strong&gt; Reading the bottom of a terminal and guessing what an agent is doing works surprisingly often and fails in surprising ways. Hooks give us the exact tool call, the exact command, and a synchronous way to say yes or no. When a session’s state looks wrong, &lt;code&gt;pilothouse explain&lt;/code&gt; shows the evidence behind it instead of shrugging.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Two checkpoints.&lt;/strong&gt; Policy runs on every &lt;code&gt;PreToolUse&lt;/code&gt; and never waits for a person, so it’s fast. People are only asked when the agent would ask anyway — or when a rule says &lt;code&gt;ask&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Don’t freeze the terminal.&lt;/strong&gt; The naive version of “approve from your phone” holds every prompt for the phone, which makes the terminal worse for the person sitting at it. Presence routing is the fix: only hold when you’re actually away.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fail open, by default.&lt;/strong&gt; If Pilothouse crashes, your agents carry on as if it weren’t installed. If you’d rather they stop, set &lt;code&gt;approvals.fail_closed: true&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Be honest about limits.&lt;/strong&gt; An agent runs as you. Pilothouse makes it hard for an agent to approve its own request — socket-only local decisions, a process-ancestry check, signed remote decisions, and a built-in rule that asks before an agent touches Pilothouse — but it is defense in depth, not a sandbox.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it in 30 seconds
&lt;/h2&gt;

&lt;p&gt;Want to see the real web app with pretend agents asking for approvals in a temporary folder before touching your setup?&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://pilothouse.dev/install.sh | sh
pilothouse demo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or install via Homebrew / shell and wire up your agents in under five minutes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;sabr-software/tap/pilothouse
pilothouse setup
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pilothouse is free and open source under Apache-2.0: &lt;strong&gt;&lt;a href="https://pilothouse.dev" rel="noopener noreferrer"&gt;https://pilothouse.dev&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

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