<?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: Lumio</title>
    <description>The latest articles on DEV Community by Lumio (@lumiomac).</description>
    <link>https://dev.to/lumiomac</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%2F4209057%2Faeebaf48-263e-4bc4-b9b7-636bc3a5ac12.png</url>
      <title>DEV Community: Lumio</title>
      <link>https://dev.to/lumiomac</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/lumiomac"/>
    <language>en</language>
    <item>
      <title>A control center for AI coding agents, in the MacBook notch</title>
      <dc:creator>Lumio</dc:creator>
      <pubDate>Mon, 26 Oct 2026 15:56:34 +0000</pubDate>
      <link>https://dev.to/lumiomac/a-control-center-for-ai-coding-agents-in-the-macbook-notch-5d1p</link>
      <guid>https://dev.to/lumiomac/a-control-center-for-ai-coding-agents-in-the-macbook-notch-5d1p</guid>
      <description>&lt;p&gt;We run several coding agents at once: Claude Code in two terminals, Codex in its app, sometimes Cursor. The annoying part was never the code. It was the waiting: an agent stops to ask "may I run &lt;code&gt;npm install&lt;/code&gt;?", and you only notice ten minutes later, because its window is behind three others.&lt;/p&gt;

&lt;p&gt;So we built Lumio: a small control center that lives in the MacBook notch. Hover the notch and you see every agent session: working, waiting for you, done. You can approve a command or pick an answer to an agent's question right there, without finding the window. There is also a tiny pixel office where every session is a person at a desk, which started as a joke and became the part people like most.&lt;/p&gt;

&lt;p&gt;Version 1.2 went out last week, with Cursor and GitHub Copilot joining Claude Code and Codex. Version 1.3 lands on Wednesday with OpenCode, Kilo and Pi. Here is how it works under the hood.&lt;/p&gt;

&lt;h2&gt;
  
  
  Every agent talks differently
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; has hooks, which made it the easy one. Lumio adds its own hook to &lt;code&gt;~/.claude/settings.json&lt;/code&gt; &lt;em&gt;next to&lt;/em&gt; whatever hooks you already have (we keep a backup and restore the file byte for byte when you disconnect). The hook is a tiny Perl script: it drops the heavy fields, appends one JSON line to a log and exits. Lumio watches that file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Codex&lt;/strong&gt; was harder. Its only notification slot was already taken on our machines by another tool, so hooks were out. Instead we read the session logs Codex writes anyway (&lt;code&gt;~/.codex/sessions/.../rollout-*.jsonl&lt;/code&gt;) and translate them into the same events Claude's hooks produce: a &lt;code&gt;function_call&lt;/code&gt; becomes "running a command", &lt;code&gt;apply_patch&lt;/code&gt; becomes "editing files", &lt;code&gt;task_complete&lt;/code&gt; becomes "done". "Waiting for you" turned out to be a call with &lt;code&gt;sandbox_permissions: require_escalated&lt;/code&gt; that has no output yet. Read-only, no patches to Codex.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; needed a small bridge extension for approvals, because its own hooks don't let an outside app answer.&lt;/p&gt;

&lt;p&gt;The lesson: there is no standard. Every new agent costs us a week, and half of it is finding out how it &lt;em&gt;says&lt;/em&gt; "I'm waiting".&lt;/p&gt;

&lt;h2&gt;
  
  
  A notch app must cost nothing
&lt;/h2&gt;

&lt;p&gt;An app that sits on screen all day can't eat CPU. Our first music equalizer was a SwiftUI &lt;code&gt;repeatForever&lt;/code&gt; animation and cost about 10% CPU. Rewritten on Core Animation, it costs 0.5%. Then we found the less obvious bill: WindowServer. Every frame of an always-on animation in an overlay window cost it roughly 15% at 30 fps. So ambient effects run at 15 fps, there are no masks on animated layers (we bake the fade into the image), and the collapsed window is only as big as the notch. Idle target: under 1% CPU, checked after every change.&lt;/p&gt;

&lt;p&gt;The hotkey (a single tap of the right ⌥) polls the key state at 40 Hz instead of using an event tap, so Lumio needs neither Accessibility nor Input Monitoring permission. We wanted zero scary permission dialogs, and we got there.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why a pixel office
&lt;/h2&gt;

&lt;p&gt;It looks like a toy, and that's the point. A list of statuses is easy to ignore. A little person who stands up from his desk when his agent needs you, or walks to the coffee machine when the task is done, you notice from the corner of your eye. The office runs only while its window is open, at 30 fps or less, and is fully unloaded when you close it.&lt;/p&gt;

&lt;p&gt;Lumio is free for Mac: &lt;a href="https://lumiomac.com/?s=dt" rel="noopener noreferrer"&gt;lumiomac.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A question for you:&lt;/strong&gt; if you run more than one coding agent, how do you notice that one of them is waiting for you? We're curious what people actually do: a second monitor, sounds, just checking every few minutes?&lt;/p&gt;

</description>
      <category>ai</category>
      <category>showdev</category>
      <category>productivity</category>
      <category>agents</category>
    </item>
  </channel>
</rss>
