<?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: Kosuke Ishikawa</title>
    <description>The latest articles on DEV Community by Kosuke Ishikawa (@ksterx).</description>
    <link>https://dev.to/ksterx</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%2F4013851%2F310b030d-8f75-47d3-bef4-7796dcd8881e.jpg</url>
      <title>DEV Community: Kosuke Ishikawa</title>
      <link>https://dev.to/ksterx</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ksterx"/>
    <language>en</language>
    <item>
      <title>I Put a Crab in My Menu Bar So I'd Stop Ignoring Claude Code</title>
      <dc:creator>Kosuke Ishikawa</dc:creator>
      <pubDate>Fri, 03 Jul 2026 16:10:46 +0000</pubDate>
      <link>https://dev.to/ksterx/i-put-a-crab-in-my-menu-bar-so-id-stop-ignoring-claude-code-4pp9</link>
      <guid>https://dev.to/ksterx/i-put-a-crab-in-my-menu-bar-so-id-stop-ignoring-claude-code-4pp9</guid>
      <description>&lt;p&gt;If you use Claude Code seriously, you probably don't run &lt;em&gt;one&lt;/em&gt; session. You run three. A refactor grinding away in one terminal, a bug investigation in another, maybe a docs pass in a third. The agents are fine. They're patient, they're parallel, they never complain.&lt;/p&gt;

&lt;p&gt;The bottleneck is you.&lt;/p&gt;

&lt;p&gt;At some point one of those sessions finishes and asks a question — "should I also update the tests?" — and then it just... sits there. Silently. Behind four other windows. Twenty minutes later you tab over and realize the expensive AI coworker you're paying for has been waiting for a yes/no answer since before your coffee went cold. Multiply that by a few sessions a day and &lt;em&gt;you&lt;/em&gt; are the slowest component in the pipeline.&lt;/p&gt;

&lt;p&gt;I got tired of being the bottleneck, so I built &lt;a href="https://github.com/ksterx/MenubarCC" rel="noopener noreferrer"&gt;MenubarCC&lt;/a&gt;: a tiny macOS menu bar app where an animated pixel-art crab named &lt;strong&gt;Clawd&lt;/strong&gt; shows the live status of every Claude Code session at a glance. Think RunCat, except instead of telling you your CPU is busy, it tells you when your AI needs you.&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%2Fl1llwipwsuyhogydmpif.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%2Fl1llwipwsuyhogydmpif.gif" alt="Clawd cycling through his four states in the menu bar" width="600" height="148"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  One crab, four states
&lt;/h2&gt;

&lt;p&gt;Clawd has exactly four animations, and each one maps to an aggregate state across all your sessions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Walking&lt;/strong&gt; — Claude is working. Leave it alone. Go do something else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Bouncing&lt;/strong&gt; — a session finished and is &lt;strong&gt;waiting for your input&lt;/strong&gt;. This is the one that matters, so it takes priority over everything else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pulsing&lt;/strong&gt; — a session has been busy with no progress past a configurable threshold (5–60 minutes). Something is probably stuck in a loop or hung on a command.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Static&lt;/strong&gt; — everything is idle. Peace.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The priority order is deliberate: &lt;strong&gt;waiting &amp;gt; stuck &amp;gt; active &amp;gt; idle&lt;/strong&gt;. A walking crab means "all good"; a bouncing crab means "you are currently blocking a robot." After a couple of days it becomes reflexive — bounce appears in peripheral vision, you go answer the question, the crab starts walking again.&lt;/p&gt;

&lt;p&gt;Clicking the crab drops a menu that lists every session grouped by state — STUCK, ACTIVE, WAITING, IDLE — each with its project folder and how long it's been in that state:&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%2Fxbavn6eybiy2ivq3nrnt.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%2Fxbavn6eybiy2ivq3nrnt.png" alt="The session menu, grouped by state with project names and elapsed times" width="410" height="573"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you're not even looking at the menu bar, MenubarCC fires native macOS banner notifications headlined with the &lt;strong&gt;project name&lt;/strong&gt; — "MenubarCC: response finished", "dotfiles: permission requested" — so you know &lt;em&gt;which&lt;/em&gt; session wants you without opening anything. Sounds and banners are separate toggles, and you can assign a custom sound (mp3/wav/m4a, whatever) per event type. My permission requests go "ding", my finished responses go "pop". It's silly and it works.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install
&lt;/h2&gt;

&lt;p&gt;Homebrew:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap ksterx/tap &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; menubarcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or grab the DMG from the &lt;a href="https://github.com/ksterx/MenubarCC/releases/latest" rel="noopener noreferrer"&gt;releases page&lt;/a&gt; and drag it into Applications. On first launch, the app offers to install the Claude Code hook for you — one click, and one click to uninstall it later if you want. Requirements: macOS 13+, Apple Silicon.&lt;/p&gt;

&lt;p&gt;The app is Developer ID signed and Apple-notarized, so there's no "unidentified developer" dance. It's MIT-licensed and the whole thing is on GitHub.&lt;/p&gt;

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

&lt;p&gt;There's no magic and no cloud. Three moving parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Claude Code hooks.&lt;/strong&gt; Claude Code has a hooks system that fires on lifecycle events — session start, stop, notification, permission request. MenubarCC installs a small Python bridge script into your hook config that records "this session is waiting for input" flags and event metadata.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local state files.&lt;/strong&gt; Session status lands in JSON files under &lt;code&gt;~/.claude/sessions/&lt;/code&gt;. The app polls them every 10 seconds and derives each session's state from status + waiting flag + elapsed time. That's the entire "protocol": files on disk.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;A native Swift/AppKit app.&lt;/strong&gt; No Electron, no Python runtime, no frameworks. The crab animation frames are generated at runtime with CoreGraphics from a single PNG. The download is about &lt;strong&gt;150 KB&lt;/strong&gt; — smaller than most favicons' node_modules.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Everything stays on your machine. The only network call the app ever makes is checking GitHub releases for updates (there's a built-in auto-updater, because asking people to re-download DMGs is rude).&lt;/p&gt;

&lt;h2&gt;
  
  
  The war story: macOS 26 ate my Python app
&lt;/h2&gt;

&lt;p&gt;Here's the part fellow developers usually enjoy.&lt;/p&gt;

&lt;p&gt;MenubarCC v1.x was a Python app built on &lt;code&gt;rumps&lt;/code&gt;, packaged with py2app. It worked great — until macOS 26 Tahoe.&lt;/p&gt;

&lt;p&gt;Tahoe shipped the new Liquid Glass menu bar, and with it, my status item simply stopped rendering. Fine, I thought, some py2app/PyObjC incompatibility, I'll debug it. But it got weirder: macOS now &lt;strong&gt;caches NSStatusItem positions per bundle ID&lt;/strong&gt;, and my app had gotten itself cached into an invisible slot. Even after I fixed the rendering path, the icon stayed gone — the system remembered where my status item "belonged" and that place happened to be nowhere. Nuking preferences didn't help. The bundle ID itself was poisoned.&lt;/p&gt;

&lt;p&gt;I tried a native Objective-C launcher shim around the Python core. I tried increasingly cursed workarounds. Eventually I accepted the obvious: fighting a new OS through three layers of Python packaging glue was a losing game. v2.0 became a ground-up rewrite in Swift and AppKit — with a &lt;strong&gt;new bundle ID&lt;/strong&gt;, because the old one was permanently haunted.&lt;/p&gt;

&lt;p&gt;The rewrite hurt for about two days and paid for itself immediately. The Python version was a ~30 MB app bundle dragging a full interpreter around; the Swift version is 150 KB, launches instantly, animates smoothly, and talks to NSStatusItem like a first-class citizen instead of through a séance. If you maintain a menu bar app in a non-native stack, consider this your friendly heads-up about Tahoe.&lt;/p&gt;

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

&lt;p&gt;MenubarCC is free and open source:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;→ &lt;a href="https://github.com/ksterx/MenubarCC" rel="noopener noreferrer"&gt;github.com/ksterx/MenubarCC&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew tap ksterx/tap &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; brew &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--cask&lt;/span&gt; menubarcc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you run multiple Claude Code sessions and have ever discovered one waiting on you for half an hour, give Clawd a spot in your menu bar. Stars are appreciated, and issues are very welcome — feature requests, bug reports, or strong opinions about crab animation frame rates all count.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This is an English adaptation of my &lt;a href="https://zenn.dev/ksterx/articles/menubarcc-claude-code" rel="noopener noreferrer"&gt;original Japanese article on Zenn&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

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