Oblivi0n-arch

Irin

A menu bar app that keeps your Mac awake for exactly as long as you choose.

status
paused · as of
period
since Nov 2026
platform
macOS
stack
Swift, SwiftUI, AppKit, IOKit
source
repo ↗
The Irin panel in its active state

identity

I was set at the threshold of your night. When you can no longer stay awake, I keep my eye open over what you left behind: the download that will not hurry, the work that will not end before you sleep. I do not dream, I do not wander. I keep the hour you gave me, not one moment longer. And if the strength of your machine begins to fail, I will not spend the last of it; I will let it rest. When the hour is spent, I close my eye. Name the time. I will hold it.

— irin

idea

Irin is a remake of StayAwake, my earlier menu bar app. It worked, but its name was so forgettable I couldn't remember it myself, its README was chaos, and next to the menu bar apps that already did the same, it looked like a cheap knock-off, bad enough that I deleted the repo. The need stayed: sometimes a long download or build has to finish and the Mac must not fall asleep. So I started again from the metaphor itself: caffeinate is really a guard watching over a laptop so it doesn’t sleep. This time the name comes with an identity, so it’s easy to remember even though it’s unusual.

adr

  1. 001A large panel instead of a compact menuv0.1.0

    Most apps like this, caffeinate’s menu bar cousins included, live in a compact menu. Compact menus are fine — until you open one tired, late at night, and hit the wrong option, or squint to read it.

    That alone wouldn’t justify a panel this big, right? So here’s a stronger reason: Irin has exactly one job. If someone opens it, their goal is already clear — keep the Mac awake for a while — and for that moment it’s the only thing they’re focused on. So once they’re there, everything should be in plain sight: presets as large tiles, a custom time, two switches, and how much time is left.

    I chose a borderless panel, 680 points wide, centred under the menu bar of the screen that was clicked.

    The Irin panel open under the menu bar on an empty desktop

    The size also leaves room for the identity: the moment it starts watching, the eye opens and the progress line appears under the meander. It should feel like stirring up something ancient.

    The Irin panel in its active state

conclusions

Two days, everything I’d learned

Irin is small on purpose, and that’s what makes it a good summary of the months before it: semver from v0.1.0 to v1.0.0, a changelog generated from Conventional Commits, a branch for every release, and the logic covered by unit tests. Nothing new — just everything at once, on a project small enough to do it right. Despite its potential for more, it’s designed to stay small and do one thing.

Claude wrote the code, I set the rules

I worked with Claude — with a structure, not by vibe coding. Every rule the code follows was mine: one folder per part of the app, design tokens instead of raw values, a single version file as the source of truth, and logic that takes time, calendar and battery as parameters, so no test depends on the clock.