Ezkiel Notch 🦁
A living notch for your Mac (and now your Windows PC), made for ezkielyna.store.
Ezkiel the lion lives in your MacBook's notch. Hover (or click) and it opens into a small workspace where every feature has its own name and colour: Den, Hunt, Scratch, Purr, Stash, Oasis, plus small Whiskers notifications beside the camera. Native SwiftUI + AppKit, macOS 13+, universal (Apple Silicon + Intel). Free and open source (Apache-2.0).
Screenshots come from the app itself (--self-test --snapshots <dir> --fake-notch --data <demo.json>), with demo data.
Download
Get the latest DMG or ZIP from ezkielyna.store/notch or Releases.
- Open the DMG and drag Ezkiel Notch to Applications.
- The app is ad-hoc signed (not notarised). On first launch: right-click the app → Open, or run
xattr -cr "/Applications/Ezkiel Notch.app" once.
- macOS asks once for each permission a feature needs: Automation (Purr controls Spotify/Music), Calendar (Rally), Desktop/Downloads (Pounce). Each feature is off until you switch it on, except Purr.
Windows (Preview)
The same rooms on Windows 10 (2004) and 11, x64 and ARM64: a native WPF app in windows/ with the Mac's names, colours, Bahasa Indonesia and the same data.json (copy it between ~/Library/Application Support/EzkielNotch and %APPDATA%\EzkielNotch).
- Download
EzkielNotch-windows-win-x64.zip (or -win-arm64.zip for Snapdragon PCs) from the newest windows-v… release, unzip it anywhere and run EzkielNotch.exe.
- The Preview isn't code-signed yet, so SmartScreen asks once: More info → Run anyway.
- Hover the top centre of the screen, click it, or press Ctrl+Alt+N. Settings › General › Launch at login keeps Ezkiel there.
How the Mac features map to Windows:
| Mac | Windows |
|---|
| Purr: Spotify / Music via Apple Events | Any app in Windows' media controls (Spotify, Media Player, browsers) |
| Roar: Dock badges | Windows' notification database: taskbar badge numbers, else notifications waiting in Notification Center (counts only, no permission) |
| Scout: distributed notification | Same senders (--claude-hook, --codex-notify, --notify, ezkielnotch://), delivered over a per-user named pipe |
| Rally: EventKit | Your calendar's private iCal address (Windows gives calendar access only to Store apps) |
| Stash: AirDrop / Share | Windows' share sheet (Nearby sharing, mail, chats) |
| Prowl: CoreAudio / CoreMediaIO | The camera/microphone consent store Windows keeps |
| Whiskers volume HUD | Windows' own volume flyout (Caps Lock, keyboard language, network, headphones and battery peeks are there) |
| Liquid Glass | Not on Windows |
Build and test (works on macOS too, with the .NET 8 SDK):
cd windows
dotnet test EzkielNotch.Core.Tests # data format, timers, lyrics, calendar, Scout, updates
dotnet publish EzkielNotch.Windows -c Release -r win-x64 --self-contained -p:PublishSingleFile=true
tools/check_format.sh # the Mac's own Swift code reads what Windows writes, and back
EzkielNotch.exe --self-test --snapshots <dir> # on Windows: drives the real island, exit 0 = pass
CI (.github/workflows/windows.yml) builds both architectures and runs the tests and the self-test on a Windows runner; pushing a windows-v* tag publishes a release with both zips and SHA256SUMS-windows.txt (windows-release.yml).
Bahasa Indonesia — cara pakai singkat
- Arahkan kursor ke notch → terbuka. Klik juga bisa. Gerakkan kursor menjauh → notch menutup lagi.
- ⌃⌥N membuka/menutup notch dari aplikasi mana pun (bisa diganti di Settings). Klik notch sekali, lalu Space memulai Den, Esc menutup, ⌘1…⌘8 pindah tab.
- Den = timer fokus + statistik & streak. Hunt = tugas + Rally (rapat berikutnya, tombol Join). Scratch = catatan + Catch (klip). Purr = musik + Chorus (lirik sinkron). Stash = rak file + AirDrop + Pounce (screenshot & unduhan baru). Oasis = minum air.
- Island (mulai 1.6): Pengaturan › Umum › Gaya → Island. Melayang seperti Dynamic Island, ukuran dan jaraknya bisa diatur, bisa pakai Liquid Glass. Mata singa Ezkiel di tengah notch tertutup berkedip dan bereaksi.
- Update satu klik (mulai 1.5): kalau ada versi baru, buka Pengaturan › Tentang lalu klik Update sekarang. App mengunduh, mengecek SHA-256, mengganti dirinya sendiri, lalu terbuka lagi. Datamu tetap.
- Windows: versi Preview untuk Windows 10/11 (x64 & ARM64) ada di rilis windows-v…. Ekstrak zip-nya, jalankan
EzkielNotch.exe, lalu klik More info → Run anyway sekali. Datanya sama dengan Mac (data.json).
- Bahasa Indonesia: Pengaturan › Umum › Bahasa → Indonesia. Cuaca di header (ketik kotamu di Pengaturan › Fitur, tanpa izin lokasi), Prowl (titik hijau/oranye saat kamera/mikrofon menyala), Cermin kamera sebelum rapat, dan pilihan output suara di Purr.
- Roar = jumlah pesan belum dibaca dari WhatsApp, Telegram, Teams, Mail, Slack, dan app lain yang punya badge di Dock (cuma angkanya, tanpa izin apa pun, isi pesan tidak dibaca). Scout = kabar dari agen AI: Claude Code dan Codex memberi tahu saat selesai atau butuh kamu (sambungkan di Settings › Roar).
- Whiskers: volume, Caps Lock, bahasa keyboard, Wi-Fi, AirPods, dan baterai muncul sebentar di samping kamera.
- Hapus sesuatu tanpa sengaja? Tekan Undo di pesan yang muncul.
- Semua data disimpan lokal di
~/Library/Application Support/EzkielNotch/data.json.
What's inside
| Feature | What it does |
|---|
| Den | Focus timer: 15/25/45/60-minute blocks, breaks, pause. Wall-clock based and saved, so it survives sleep and restarts. Today's minutes, the streak and the last 7 days. Countdown in the closed notch. |
| Hunt | Tasks with reminders (15m, 1h, 3h, tomorrow 9:00, or an exact time with Pick time…). Type the time into the task itself ("call mum at 3pm", "ingatkan kul 3", "besok jam 9", "15 menit lagi") and it becomes the reminder, shown before you press Return. Rally puts today's next meeting on top and peeks 5 minutes before with Join for Zoom, Meet, Teams and Webex links; "in 5m" counts down in the closed notch. |
| Scratch | Notes with titles, saved as you type. Catch keeps up to 30 clips you capture from the clipboard (only when you press Capture). |
| Purr | Spotify and Apple Music: artwork with a glow in its own colour, seeking, previous/play/next, and a sound-output switcher (AirPods, speakers, display). Chorus shows synced lyrics from LRCLIB: lines light up as they're sung, click one to jump; the closed notch sings along. |
| Roar | Unread counts from WhatsApp, Telegram, Teams, Mail, Slack and any app with a Dock badge, read from LaunchServices like lsappinfo does: only the number, no permission, no message content. Optionally also from the Dock itself (Accessibility), so closed apps count too, and apps like WhatsApp that only show their number in the Dock. A peek with the app's icon when a count goes up (not while that app is in front); click to open the app. Mute any app. |
| Scout | AI agents and scripts. Claude Code and Codex CLI connect from Settings › Roar (a hook in ~/.claude/settings.json / notify in ~/.codex/config.toml, backed up first). The closed notch shows an agent working or waiting for you; a peek when it finishes or needs you, if you're in another app. AI desktop apps' badges (Claude, ChatGPT, Cursor) show here too. Any script: open "ezkielnotch://notify?title=Build%20done&body=All%20green" or EzkielNotch --notify "title" "body". |
| Weather | Temperature and sky beside the header (hover for today's range and rain chance). Type your city in Settings › Features; Open-Meteo, no account and no Location permission. Off until you pick a city. |
The open notch is 440pt wide and only as tall as the open feature. Idle, it uses about 0.1% CPU (the lion only animates when its mood changes).
Why it no longer "ignores clicks"
IslandDesk 2.1 resized its window every animation frame and to a different height for each tab, and only enabled its content after the resize settled; it also closed while a pop-up menu was open. Ezkiel Notch fixes this at the root:
- The panel has a fixed frame; only the SwiftUI notch shape animates, so hit-testing never moves under the cursor.
- The hosting view accepts the first click and claims clicks only inside the visible notch; everywhere else the panel ignores the mouse, so the menu bar and windows below keep working.
- The notch never auto-closes while a menu is tracking, a mouse button is held (dragging a file out) or you are typing (for up to 20 seconds after the pointer leaves).
- No pop-up pickers inside the notch: every choice is an inline chip.
- Apple Events run on a background queue and only target players that are already running.
Build from source
Requires Xcode 15+ (Swift 5.9+), no third-party dependencies.
swift test # model tests
./scripts/build_app.sh # dist/Ezkiel Notch.app + DMG + ZIP (universal)
open "dist/Ezkiel Notch.app"
"dist/Ezkiel Notch.app/Contents/MacOS/EzkielNotch" --self-test # drives the real panel, exit 0 = pass
ARCHS=arm64 ./scripts/build_app.sh builds Apple Silicon only. CI (.github/workflows/build.yml) runs the tests, builds the app, runs the self-test on a macOS runner and uploads the DMG/ZIP; pushing a v* tag (or running the workflow with release checked) publishes a GitHub Release.
Layout
Sources/NotchCore/ Pure models: data, focus clock, water log, JSON store (unit-tested)
Sources/EzkielNotch/
App/ Entry point, AppDelegate, global hotkey, icon renderer, self-test
Window/ Fixed-frame NSPanel, click-through hosting view, hover/drag controller
Model/ AppModel (single source of truth), NotchChrome, types
Design/ Ezkielyna palette, notch shape, buttons, chips, rings, transitions
Mascot/ Ezkiel the lion (vector, animated)
System/ Music (Apple Events), lyrics, battery, system events, Pounce, Rally (EventKit), thumbnails
Views/ Compact, peek, expanded and every tab
windows/
EzkielNotch.Core/ Plain .NET: the shared data.json format, focus clock, stats, lyrics, iCal, Scout, updates
EzkielNotch.Core.Tests/ xUnit tests (run on any OS)
EzkielNotch.Windows/ WPF app: Island (window, shapes, eyes), Rooms (every tab), Platform (Windows APIs)
tools/ export_strings.py (Indonesian from the Mac table), check_format.sh (Mac ⇄ Windows data)
Design follows the MacBook notch and the Dynamic Island (a pure-black, top-attached body with concave ears, spring motion, live activities, peek cards), built natively for macOS in SwiftUI and AppKit. Each feature has its own Apple-style two-stop accent: Den amber, Hunt coral, Rally purple, Scratch yellow, Purr pink (or the artwork's colour), Stash indigo, Oasis blue; the app's own accent is lion gold #FFCF87.