I'm building Murmury, an open-source Mac app that listens to the other side of a video call and shows short answers from your own documents in a small floating window. The whole point is that the window is for you. When you share your screen, the other people should see your slides, not your notes.
macOS has a one-line way to do this. The interesting part was proving it actually works.
The one line
Every NSWindow has a sharingType. Set it to NSWindowSharingNone and macOS leaves the window out of screen captures. Murmury's UI is PySide6 (Qt), so I reach the native window through PyObjC:
import objc from AppKit import (NSFloatingWindowLevel, NSWindowCollectionBehaviorCanJoinAllSpaces, NSWindowCollectionBehaviorFullScreenAuxiliary, NSWindowSharingNone) window = objc.objc_object(c_void_p=int(widget.winId())).window() window.setHidesOnDeactivate_(False) # a Qt tool window is a panel, macOS hides it on app switch window.setLevel_(NSFloatingWindowLevel) window.setCollectionBehavior_(NSWindowCollectionBehaviorCanJoinAllSpaces | NSWindowCollectionBehaviorFullScreenAuxiliary) window.setSharingType_(NSWindowSharingNone) The other three lines are there because a floating helper is useless if it disappears: it has to stay on top when the call app is in front, follow you across Spaces and sit over full-screen apps.
"Trust me" wasn't good enough
There are a lot of forum posts saying this flag works, and some saying it doesn't on newer macOS. I didn't want to tell people "it's hidden" based on a forum post, so I wrote a test that measures it.
The idea is simple:
- Open two plain boxes on screen: a magenta one set up exactly like Murmury's window, and a green one that's an ordinary window.
- Capture the screen three different ways.
- Count the pixels of each color in every capture.
It passes only if the green box shows up in every capture (so the capture really worked) and the magenta box shows up in none.
The three captures:
- ScreenCaptureKit, which is what Zoom, Google Meet in Chrome and Teams use on current macOS. That needs a tiny Swift helper, because there's no handy Python binding.
-
screencapture, the same thing as a normal macOS screenshot. -
CGWindowListCreateImage, the older API some apps still use.
Counting pixels is a few lines of numpy:
def count(path, rgb): a = np.asarray(Image.open(path).convert("RGB")).astype(int) return int(np.all(np.abs(a - np.array(rgb)) < 25, axis=-1).sum()) And the ScreenCaptureKit side, in Swift:
let content = try await SCShareableContent.excludingDesktopWindows(false, onScreenWindowsOnly: true) let display = content.displays.first! let filter = SCContentFilter(display: display, excludingWindows: []) let cfg = SCStreamConfiguration() cfg.width = display.width cfg.height = display.height let img = try await SCScreenshotManager.captureImage(contentFilter: filter, configuration: cfg) Note the filter: excludingWindows: []. I'm not asking ScreenCaptureKit to skip anything. If the window disappears, it's because of the window's own sharing type.
What I measured
On my MacBook (macOS 26.6.2, October 2026): 0 pixels of the hidden window in all three captures, while the ordinary window was captured every time (between 93k and 369k pixels, depending on the capture).
Two things surprised me:
- ScreenCaptureKit still lists the window. Its title and position show up in the list of shareable windows. It just isn't drawn in the image. So an app could know a hidden window is there, it can't see what's in it.
- This can change with any macOS update. That's why the test lives in the repo instead of in a blog post. After every update I run
uv run python scripts/check_hidden.pyagain, and anyone can run it on their own Mac.
And the honest limits: this only covers software capture on your Mac. A phone pointed at your screen, an HDMI capture card or a second monitor that someone can see are a different story.
Funny side effect
When I wanted to record a demo GIF for the README, the recording came out with an empty space where the window should be. Of course. So the app has a testing flag, --show-in-screenshots, that switches the sharing type back to read-only. The GIF in the README is recorded with that flag on.
The rest of the app
If you're curious about the other parts: the call's audio comes from ScreenCaptureKit too (as 16 kHz float32 PCM from a small Swift helper), Whisper large-v3-turbo transcribes it on the Apple GPU with MLX, and each line goes in parallel to a quick "is this a question for me?" check and to the answer itself, so the answer starts right away and gets dropped if it wasn't a question. You bring your own key for Claude, OpenAI, Gemini, Grok, Groq, Mistral or OpenRouter.
It's free and GPL-3.0: github.com/GianlucaBave/murmury. If you run check_hidden.py on your Mac, I'd love to know what it prints, especially on older macOS versions.