Brow (2026)

A Mac app that shows your Claude usage limits in the notch

Go to Brow on GitHub

Why does this exist

I use Claude Code for hours a day. To see how much of my plan was left, I had to stop and type "/usage" in my IDE or dig through the settings, so I found out I was near the limit by hitting it.

The notch on my MacBook sits where I already look, with room on both sides of it. I made it show my limits.

My role

Idea, design, direction and testing.

Platforms

macOS

Who did what

I design and don’t write Swift, so I built Brow with Claude Code and worked with it the way I’d work with an engineer. Claude wrote the Swift code and the install script. I wrote the brief and asked for the app in six small steps I could run one at a time, from a black shape on the notch to launch at login and settings.

I owned the idea and each screen and state in Figma, down to the colours, type, glow and spacing. I tested each build on my Mac, found what felt wrong and decided what to change. I also chose the name, made Brow hide when there’s no plan, and held Codex back for later.

Drawing around the notch

The notch is hardware with no pixels inside, so you can’t draw in it. Brow draws a black shape wider than the notch and lines it up so the two read as one longer notch. The logo and bar sit on the left and the reset time on the right, with the camera in the empty middle.

Brow measures the notch on each Mac from the screen, and keeps its sides short so they stay clear of menu bar icons.

One number at a glance

Closed, Brow shows the number I check most, how much of my 5 hour limit I’ve used and how long until it resets. Its bottom corners copy the curve of the real notch, and its top flares into the screen edge the way the hardware does.

Opening it

Click it and it grows down to show both limits, the 5 hour and the weekly, each with how much you’ve used and how long until it resets.

I wanted it to feel like the Dynamic Island. It opens on a spring with a little bounce and closes faster with none, and the numbers fade in from small and blurred instead of popping in.

Once the features settled, we went back over each animation. The glow now fades in step with the numbers, and the moves you see dozens of times a day slide faster. With Reduce Motion on, the pill changes size in place and keeps the fades.

The small things

I spent most of my time on details I noticed once I used it every day. I added a soft glow behind the name, a 42 pixel circle blurred the way I set it in Figma, and a tint when you hover the logo or the reset time. A shadow lifts the open shape off whatever sits behind it, and I took space out between the name and the numbers twice.

Others were bugs I spotted and we tracked down. Over full screen apps the black strip at the top runs a few points taller than the notch, so the pill looked short until we matched it to the menu bar. It also pinched in before growing, and at first it vanished whenever I swiped between full screen apps.

The glow took the most fixing. The pill clips everything inside it, so the light stopped in a hard line at its edge. We put a copy of the glow behind the pill and widened the window around it, and now the light fades out past the edge with no seam.

Full screen apps

A full screen app turns the whole menu bar strip black, and the open pill met it at a sharp corner. I wanted the curve the pill already has at the top of the screen, so we drew two small curves under the strip in a window of their own. They fade out when you switch apps and fade back in when you land in another full screen app.

Making room for long menus

macOS keeps app menus out of the notch, but it can’t see Brow. In apps with long menu bars, like Figma, the last few menus slid underneath it.

Now Brow checks how far the front app’s menus reach. When they get close, it slides right so its left edge lines up with the real notch, and the logo and bar join the reset time in one pill. Switch to an app with fewer menus and it slides back.

I noticed the menus disappearing and decided where Brow should move. To read where another app’s menus end, Brow needs the Accessibility permission.

Moving with your swipe

Brow waited for a swipe between Spaces to finish before it moved, so it trailed the screen by half a second. I wanted it to move with my fingers.

macOS gives apps no public way to know a swipe is under way. The Dock drives its animation from trackpad events another app can listen to with the Input Monitoring permission, so Brow listens too. It remembers how each Space looked the last time you visited, and while you swipe it moves toward the next Space’s layout as far as your fingers have gone.

Slow swipes worked on the first build. Fast flicks froze halfway, since macOS announces the switch up to a second after you lift your fingers. Now Brow guesses the Dock’s decision the moment you let go, from how far and how fast you swiped, and checks the guess a second later. Each round I tested and described what broke, like a logo that jumped instead of gliding and quick swipes back and forth tripping over each other, and we traced it in the swipe log.

I also switch Spaces with the side buttons on my mouse. Those send no swipe, so Brow learns which way each button goes and starts moving the moment you press it.

Keeping permissions

Each update made macOS forget Brow’s permissions, and I had to switch them back on in System Settings. We signed the app with a certificate made on my Mac, so Brow keeps the same identity between builds and macOS keeps the permissions.

Claude and Codex

I designed it for two AIs. With both, each side of the notch gets its own logo and bar, and the open view shows a section for each, Claude in its terracotta and Codex in white. Adding another AI means adding one more source of numbers. I use Claude Code day to day, so I haven’t connected Codex yet.

Where the numbers come from

Anthropic offers no official way to read plan limits. Other open source apps read what Claude Code saves on the Mac, so we started there. I asked how current that was, and the numbers turned out to run 20 minutes behind because I use Claude Code inside VS Code. We switched to a direct check with Anthropic, the same one Claude Code’s own usage command makes.

The first version asked once a minute. The next day I saw an empty bar while I was working, and we found Anthropic refusing the requests, because Claude Code checks the same endpoint with the same login. Brow now asks less often, and each time Anthropic says no it waits longer, up to an hour.

Brow checks every 3 minutes while I’m using Claude and every 10 minutes when I’m not, and pauses while the Mac sleeps. It reads the login Claude Code already has, never saves it and talks to Anthropic alone, using no noticeable CPU and about 30 MB of memory.

Without a plan, Brow hides itself, as if you never installed it.

What’s next

Next I’ll connect Codex, so the two AI layout shows real numbers too.


Brow (2026)

A Mac app that shows your Claude usage limits in the notch

Go to Brow on GitHub