A community-driven fork of boring.notch with a modern plugin architecture, integrated community PRs, and clean codebase.
2026-03-08.18-47-45.mov
This is an extended fork of TheBoredTeam/boring.notch β the macOS app that transforms your MacBook's notch into a dynamic control center with music playback, calendar, file shelf, HUD replacements, and more.
This fork takes the original and adds:
- Plugin-first architecture β every feature is a
NotchPlugin. Built-in features use the same API that future third-party plugins will use. - Protocol-based dependency injection β zero
.sharedsingletons in views/services. Everything injected via@Environmentor init. @Observable+@MainActorthroughout β no legacyObservableObject/@Published.- Clean layer boundaries β Domain, Application, Infrastructure, Presentation layers with enforced import constraints.
- Service protocols for all system integrations (music, battery, calendar, weather, shelf, webcam, notifications, clipboard).
Cherry-picked and adapted the best community contributions that were pending on upstream:
| Feature | Original PR |
|---|---|
| Sneak peek duration customization | #897 |
| Auto-disable HUD on disconnected displays | #895 |
| Screen recording live activity | #804 |
| Mood face customization | #798 |
| Clipboard history + note-taking (SQLite-backed) | #788 |
| Animated face with mouse tracking | #751 |
- Teleprompter Pro β full-featured teleprompter with countdown timer, mic monitoring, hover-to-pause, keyboard shortcuts, AI text assist (refine/summarize/draft via Ollama), speed/font/color controls
- Habit Tracker β daily habit tracking with streaks, progress rings, and persistent storage
- Pomodoro Timer β focus timer with work/break intervals, session history, and notch-integrated controls
- Display Surface β generic display arbitration for surfacing prioritized content
- AI subsystem β
AIManager+AIProviderprotocol with Ollama backend for on-device text generation - Local API server β HTTP + WebSocket server for external integrations. Auth middleware, rate limiting, plugin API routes
notchctlCLI β command-line control of boringNotch via the Local API- App Intents & URL Scheme β Siri Shortcuts integration +
boringnotch://deep links
- Background service backoff β plugins and services automatically pause polling when the notch is closed (zero idle CPU)
- Phase 2 efficiency β isolated high-frequency progress updates into leaf reader views, event-driven geometry, XPC helper backoff
- TimelineView gating β music controls switch to static layout when closed (no 60fps background burn)
- GPU/CoreAnimation backoff β heavy blur/blend effects gated behind transition state
- Apple-quality animations β content reveal modifier, shadow easing, spring-tuned open/close choreography
- Dual hover zones β separate closed/open hover detection for accurate mouse tracking
- Heartbeat-based hover β replaced event-driven hover with a robust heartbeat controller (11 unit tests)
- Data export β
ExportablePluginprotocol with export UI in Settings - SOLID & DDD hardening β SRP extractions, type-safe
PluginIDenum, domain purity enforcement - CI pipeline β build, test, and architecture boundary checks on every push
- macOS 14 Sonoma or later
- Apple Silicon or Intel Mac
- macOS 14 or later
- Xcode 16 or later
- A free Apple Developer account (for code signing)
-
Clone this fork:
git clone https://github.com/larsboes/boring.notch.git cd boring.notch -
Open the project:
open boringNotch.xcodeproj
Xcode will automatically resolve Swift Package dependencies on first open. If it doesn't, go to File β Packages β Resolve Package Versions.
-
Fix code signing (required β the project ships with the maintainer's team/bundle ID):
- Select the boringNotch project in the sidebar
- For each target (
boringNotch,BoringNotchXPCHelper,boringNotchTests):- Go to the Signing & Capabilities tab
- Check Automatically manage signing
- Change Team to your personal team
- Change Bundle Identifier to something unique (e.g.,
com.yourname.boringnotch)
-
Build and run: Press
Cmd + R.
Note: If Xcode shows "Missing package product" errors, close and reopen the project. The package cache can be slow to sync on first open.
To get perfect, sub-second scrubber and duration sync for browser media like YouTube, install the bundled companion extension:
- Open Google Chrome (or Chromium-based browser).
- Navigate to
chrome://extensions/. - Toggle on Developer Mode in the top-right corner.
- Click Load Unpacked in the top-left corner.
- Select the
boringNotch-extensionfolder located inside the repository directory.
The extension connects directly to boringNotch via a local WebSocket to transmit metadata and receive media commands without any additional config!
SwiftUI Views -> PluginManager -> NotchPlugin instances -> Service Protocols -> System APIs
Every feature is a plugin. Plugins communicate via PluginEventBus, never by importing each other. See docs/ARCHITECTURE.md for the full reference and docs/PLUGIN_DEVELOPMENT.md for the plugin development guide.
This fork tracks TheBoredTeam/boring.notch as upstream. Periodic syncs pull in upstream fixes and features.
For the original project, downloads, Discord, and support, visit the upstream repo.
All credit for the original boring.notch concept and implementation goes to TheBoredTeam. This fork builds on their work.
- MediaRemoteAdapter β Now Playing source support for macOS 15.4+
- NotchDrop β Foundation for the Shelf feature
For a full list of licenses and attributions, see THIRD_PARTY_LICENSES.
