TreeMap
무료 오픈소스 디스크 사용량 시각화 도구로, 사각형 트리맵·중복 파일 탐색·디스크 가득 예측·정리 시 파일을 휴지통으로만 이동한다
파일 선반, AirDrop·Spotlight 검색·AI 활용·캘린더·시스템 HUD를 MacBook 노치에 제공, 무료 오픈소스
Now playing, a file shelf with AirDrop, Spotlight-style search, AI usage, your calendar and system HUDs in your MacBook notch. Free and open source.
생산성Swift · JavaScriptGitHub @namekun온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
Your MacBook notch, finally useful: now playing, file shelf, quick search, AI usage, calendar and system HUDs. Free, native, 7 languages.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
Your MacBook notch, finally useful. Music, files, a Spotlight-style launcher, AI usage, your calendar and system HUDs, one hover away. Nunsseop (눈썹) is Korean for eyebrow, the little arch above your screen. It's free, open source, and has no account, subscription or tracking. 1. Grab Nunsseop- .dmg from Releases. 2. Drag Nunsseop into Applications. 3. The app isn't notarized yet, so run this once before the first launch (Homebrew does it for you): Needs macOS 14 Sonoma or later. Works on Apple silicon and Intel, and on screens without a notch.README 전문 보기 ↗
Nunsseop (눈썹) is Korean for eyebrow, the little arch above your screen. It's free, open source, and has no account, subscription or tracking.
Download Nunsseop.dmg, open it and drag Nunsseop to Applications. The app is signed and notarized by Apple, so it opens right away. When an update is out, Install Update in Settings › General › Updates shows what's new, installs it and restarts Nunsseop (copies older than 0.38.0 download the new DMG once more).
Or with Homebrew:
brew install --cask namekun/tap/nunsseop
To update, run brew update && brew upgrade --cask nunsseop; when an update is out, Settings › General › Updates copies that command to your clipboard.
Needs macOS 14 Sonoma or later. Runs on Apple silicon Macs (not Intel), including on screens without a notch.
There's no Dock icon. Nunsseop lives in the notch.
On a fresh install the notch also opens by itself after a second and walks you through four short steps: how it opens and closes, the tabs, files and Search, and connecting the agent tools found on this Mac (or "You're all set" when there are none). Skip, Esc or Done ends it, and Settings › General › Show the welcome tour again plays it once more. After an update, it opens once to say what's new in that version, then leaves you alone.
| Search. A launcher for apps, files, commands, clipboard, emoji and sums, on any shortcut you like. | AI usage. Claude Code and Codex limits, no login needed. |
| Shelf. Park files in the notch, or drop them on AirDrop. | Timer. Countdown, Pomodoro and stopwatch, any length you like. |
| Tools. Audio output, mic mute, keep awake, screen recording, color picker and text capture. | System. CPU, memory, disk, network and device batteries. |
| Emoji. Categories on the left, every emoji searchable, one click to copy. | HUDs. Volume, brightness, AirPods battery and more. |
| Calls. The call app and how long you've been talking. | At a glance. Pick what each side of the closed notch shows. |
🎵 Music
🗂️ Get things done
:) and sums like 12*(3+4), ranked by what you open most. Initials work: vsc finds Visual Studio Code. Arrow keys pick, Return opens.utm_ and fbclid are stripped from links you copy.💻 Your Mac
📞 Even when it's closed
🤖 For developers
apply_patch lists the files) and MCP tools work the same, with "Answer in terminal" in place of Always allow. OpenCode's permission prompts work the same way, and so do Paseo's tool approvals, with "Answer in Paseo" in place of "Answer in terminal". The approvals of GitHub Copilot, Antigravity (commands and file writes) and Cursor (shell commands and MCP calls) work the same way, with "Answer in Cursor" for Cursor. When a request leaves any doubt about what would run (a Cursor shell command that runs outside its sandbox, say), no card appears and the tool asks in its own prompt. Gemini CLI, Hermes and Amp show sessions and notices but no approvals. Claude Code's questions can be answered too: pick one or several answers, step through several questions, or choose "Answer in terminal" to hand it back; a question whose answers can't be shown faithfully stays in the terminal. Answer in the terminal first and the card goes away. What it asks stays in memory (turn it off in Settings › Alerts).🧩 Make it yours
Since 0.37.0 the app is signed and notarized by Apple and opens like any other. A copy older than that wasn't: download the latest DMG, or update with Homebrew (brew update && brew upgrade --cask nunsseop).
Nunsseop shows whatever macOS lists as Now Playing, so the player has to appear in Control Center. Most apps and browsers do. See how now playing works for the fallback.
Yes. Open Settings → General, click the shortcut and press ⌘Space. Nunsseop will point out that Spotlight uses it and open Keyboard Shortcuts, where you untick Show Spotlight search. Search also opens when its tab is hidden.
Right-click the notch → Settings → Notch, and switch off what you don't need. Turned-off features stop running entirely.
On a display without a notch, such as an external monitor with the lid closed, the closed notch is a small pill floating in the menu bar, with the eyebrow, a white brush stroke, on it. The eyebrow lifts when the pointer is over it, and opening it attaches the notch to the top edge at the usual size. HUDs, notices, lyrics and the sneak peek show on one line instead of around a camera. When unused, the eyebrow lowers like a closing eye and the pill fades out; turn that off or change the delay in Settings. With several displays, the closed notch moves to the display the pointer is on once it has finished closing, and HUDs, approvals and the sneak peek show up there too; pick one display in Settings to keep it in place.
By default, Claude's 5-hour and weekly percentages come from caches other tools write: the oh-my-claudecode HUD while you use Claude Code in a terminal, or gjc. The card shows when they were last updated. For limits that stay current, connect Claude Code's status line in Settings › Services › AI usage: Claude Code hands it your limits with every answer, and your own status line keeps working. If you use Claude elsewhere, turn on live Claude limits in the AI tab or Settings › Services instead. The most recent source wins, and the plan and per-model bars stay when it doesn't carry them. Token totals are always live.
Versions before 0.8.3 were signed in a way that made macOS forget the Accessibility permission on every update. Since 0.8.3 it's kept. If you came from an older version, remove Nunsseop from System Settings → Privacy & Security → Accessibility once and allow it again; it takes effect without a restart.
Nunsseop listens on 127.0.0.1:47750 for notifications from tools on your Mac. Requests must carry the secret token stored in ~/Library/Application Support/Nunsseop/notify-token.
Open Settings → Alerts and press Connect next to Claude Code, Codex, Gemini CLI, GitHub Copilot, Antigravity, Cursor, OpenCode, Hermes, Amp, omp, omo or pi. Only tools you have used on this Mac are listed. Nunsseop changes that tool's settings file (~/.claude/settings.json, ~/.codex/config.toml, ~/.codex/hooks.json, ~/.gemini/settings.json) or adds a plugin to ~/.config/opencode/plugins or a small extension to ~/.omp/agent/extensions (~/.omo and ~/.pi likewise), and keeps the old file with a .nunsseop-backup extension. Before it writes anything, a sheet shows how the file will change (added lines in green, removed ones in red, unchanged stretches folded away) and which backup is kept; Cancel writes nothing. Where the file is shared with other tools (Claude Code, Codex, Gemini CLI, Antigravity and Cursor), the hooks you already had stay as they are, and Disconnect removes only Nunsseop's. Codex allows only one notify command, so an existing one keeps running after Nunsseop's. Its hooks for the agents count go into ~/.codex/hooks.json beside other tools' hooks, and Codex asks you to trust them the next time it starts ("Review hooks" lets you trust only Nunsseop's; "Trust all and continue" trusts every tool's new hooks); until then it doesn't run them, and it asks again after an update that changes their text. The hook that lets you answer approvals in the notch is trusted the same way; if you connected before, Codex asks once more, so review it in /hooks. Disconnect undoes it. Sessions started afterwards send their notifications to the notch. gjc needs no connecting: its sessions are read from its own files while the agents count or the Agents tab is showing.
GitHub Copilot gets a hook file of its own, ~/.copilot/hooks/nunsseop.json; Antigravity (the agy command line) gets one entry in ~/.gemini/config/hooks.json, and Cursor entries in ~/.cursor/hooks.json, beside other tools' hooks. Hermes and Amp get a plugin of Nunsseop's (~/.hermes/plugins/nunsseop, ~/.config/amp/plugins/nunsseop.ts). Hermes loads a plugin only once you run hermes plugins enable nunsseop in a terminal; Settings shows that command and whether Hermes has it on. Amp's plugin API is experimental, so an Amp update may stop it from working. Once connected, Gemini CLI, GitHub Copilot, Antigravity, Cursor, Hermes and Amp report their sessions to the agents count and the Agents tab and send a notice when a turn finishes. Approvals from GitHub Copilot, Antigravity and Cursor show in the notch only while "Answer permission prompts and questions in the notch" is on in Settings › Alerts.
To set up Claude Code by hand, press Copy Claude Code hook command and add it to ~/.claude/settings.json:
{
"hooks": {
"Notification": [
{ "hooks": [{ "type": "command", "command": "<paste the copied command here>" }] }
]
}
}
Terminals and agent apps need no hook:
muxy activity list while Muxy runs. They show as notices (not while Muxy is in front), and the sessions only Muxy knows show in the Agents tab while they work or wait. Muxy 1, which kept a notifications file and a socket, isn't supported.tmux.conf isn't changed.~/.wezterm.lua.Each has a toggle under Settings › Alerts (WezTerm has a button that copies its config lines instead), shown only when the tool is installed. Tools already connected through their own hook aren't shown twice. Orca has no notification source of its own: its sessions show up only through the hooks and extensions connected above (Claude Code, Codex, OpenCode, pi and the like), which send its pane id.
Any script can send one too:
# notify-auth holds the Authorization header, so the token never shows in the process list.
curl -X POST http://127.0.0.1:47750/notify \
-H @"$HOME/Library/Application Support/Nunsseop/notify-auth" \
-d '{"title": "Build", "message": "Finished in 42 s"}'
A row's Go to terminal and Message buttons, and file drops, work where Nunsseop can be sure which terminal the session is in: it checks that the session's process really runs there. Text goes in through the terminal's own input API, never as simulated keystrokes. Where a message or a drop can't work, the button is dashed and its tooltip says why (tmux, zellij or screen in between; a prompt waiting for an answer; several Ghostty tabs in the same folder; and so on); Go to terminal still brings the terminal app forward then.
| Terminal | Go to its tab or pane | Message | Drop files | Resume from Recent |
|---|---|---|---|---|
| Ghostty | ✓¹ | ✓¹ | ✓¹ | ✓ |
| Terminal | ✓ | ✓ | — | ✓ |
| iTerm2 | ✓ | ✓ | ✓ | ✓ |
| WezTerm | ✓ | ✓ | ✓ | ✓ |
| kitty | ✓ | ✓ | ✓ | ✓ |
| cmux | ✓ | ✓ | ✓ | ✓ |
| herdr | ✓ | ✓ | ✓ | — |
| Muxy 2 | ✓ | ✓ | ✓ | ✓ |
| Orca | ✓ | ✓ | ✓ | ✓ |
| Paseo | ✓ | ✓ | — | ✓ |
¹ Claude Code sessions only.
wezterm cli, kitty @). kitty needs remote control turned on, with a socket it listens on.~/Library/Application Support/Nunsseop/muxy-bridge (Settings › Alerts › Show extension in Finder opens it) and turn the extension on. Without it, a click selects the session's project. Sessions that only Muxy lists (no hook) can be gone to but not typed into.orca command line; recent conversations resume in a new tab of the worktree that holds them while Orca has a window.paseo send and only to agents that aren't working (finished ones and those waiting for your turn included; it would interrupt a working one); a click opens the agent in Paseo (the first cell of its row), and archived agents come back from Recent.Nunsseop asks for most permissions only when you first use the feature that needs them. The exception is the folder it watches for screenshots (the Desktop by default, or the folder set for screenshots) and Downloads: macOS may ask about them when Nunsseop first starts.
| Feature | Permission | When it is asked |
|---|---|---|
| Calendar | Calendars | When you press Allow Access on the Home tab |
| Reminders | Reminders | When you press Allow Reminders on the Home tab |
| Mirror | Camera | When you press Allow Camera on the Mirror tab |
| Screen recording, and copying text from other apps' windows | Screen Recording | The first time you start a recording or capture text |
| Recording with sound | Microphone | The first time you record with microphone audio on |
| Taking over volume, brightness and keyboard backlight keys | Accessibility | When you turn the option on in Settings |
| Fallback now playing for Music, Spotify and browsers | Automation | Only if the MediaRemote helper is unavailable |
| Showing Google Meet, Zoom and Teams calls in a browser, and Meet's mute and camera buttons | Automation (that browser) | When a browser first uses the microphone |
| Adding new screenshots to the shelf, download alerts | Desktop and Downloads folders | macOS may ask when Nunsseop first starts (it watches the screenshot folder, the Desktop by default, and Downloads) |
| Per-app volume | System audio recording | The first time you turn an app down in the Tools tab |
| Mute button for Zoom and FaceTime calls, camera button for Zoom | Accessibility | Never asked for by itself: the buttons appear once Nunsseop is allowed in Accessibility (for example through the volume key option above) |
| Typing messages into agent sessions, going to a session's tab, resuming in a new tab (iTerm2 and Ghostty only) | Automation (Terminal, iTerm2, Ghostty) | The first time you do one in that app; for Ghostty also when the Agents tab first lists a session running in it |
| Launch at login | Login Items | When you turn it on in Settings |
Nunsseop doesn't collect or send personal data. It goes online only to:
api.github.com for a newer release once a day (can be turned off), and, when you install an update in a copy from the DMG, fetch the appcast.xml and DMG of the latest release from GitHub;lrclib.net (can be turned off);open-meteo.com for the city you enter (off until you enter one), asking Apple's geocoder for the city's location when Open-Meteo can't find it;api.anthropic.com for your Claude limits about once an hour, using Claude Code's sign-in from the Keychain, only if you turn live Claude limits on.Everything else stays on your Mac. The notification server only accepts connections from this Mac. AI usage is read from local files, including the limits the Claude Code status line keeps on this Mac, unless you turn on live Claude limits. Notices in the Notifications tab are kept in memory only. Recordings are saved next to your screenshots. The camera preview runs only while the Mirror tab is open and is never recorded. Clipboard history is cleared when Nunsseop quits.
Since macOS 15.4, the private MediaRemote framework only answers processes signed by Apple. Nunsseop ships a small helper library (Sources/NowPlayingHelper) that runs inside the system's /usr/bin/perl, reads the Now Playing state, sends play, pause, skip and seek commands, and streams JSON lines back to the app.
This relies on private API, so a future macOS update may break it. If it does, Nunsseop falls back to AppleScript for Music and Spotify and to reading media tabs in browsers. That fallback needs Allow JavaScript from Apple Events turned on in each browser. Dia has no menu item for it, so Nunsseop offers to restart it with --enable-applescript-javascript.
git clone https://github.com/namekun/Nunsseop.git
cd Nunsseop
./scripts/bundle.sh release # build/Nunsseop.app
./scripts/make-dmg.sh # build/Nunsseop-<version>.dmg
You need the Xcode command line tools with Swift 5.10 or later. scripts/bundle.sh builds the Swift package and wraps it in an ad-hoc signed app bundle.
MIT. Issues and pull requests are welcome.
claude --bg included. When Claude Code ends a turn while subagents or background shell commands still run, the session keeps counting as working for up to two hours, with a "Background · N tasks" chip in the Agents tab./rename name or its own title, Codex's thread name), the folder, tool and model, a chip when the permission mode isn't the default, a small context meter with the token count, and how long ago the state began. Every row has Go to terminal (Open in Paseo on a Paseo row) and Message buttons; a dashed one can't act now, and its tooltip says why. A session waiting for you unfolds with "Answer in terminal". The bottom line sums up the states ("1 waiting · 3 working · 1 idle"). Keys: ↑↓ select, ↵ goes to the terminal, ⌘M opens the message field; double-clicking a row goes to its terminal too. Open sessions you used in the last 3 hours show dimmed as Idle (the closed notch doesn't count them). When no session is open, Recent lists up to 5 conversations from the last week: click one (or press ↵) to resume it in the terminal chosen in Settings › Alerts (claude --resume, codex resume, or the tool's own option). It reads the folder, model, token count, permission mode, session name and last prompt from the tools' own session files on your Mac. Under a session at work, or one done with its turn, is its last step: the file it read or edited, the command it ran, the question it asked. An edit shows its +N −M and Show diff, which shows the changed lines in place of the list (← → for the turn's other changes, Esc goes back). While the tab shows a session at work, its session file is looked at every 2 seconds.