A tiny native macOS menu-bar noise player. It generates audio in real time and has its own volume control, independent of the macOS system volume setting. Its lunar-wave icon represents the app's dark sound and low-frequency waves.
- Left-click the waveform in the menu bar to start or stop playback.
- Right-click it to choose among your three favorite sounds and adjust the current sound's volume.
- Choose Open Nullwave Settings… for the complete sound library, descriptions, per-sound volume, and favorite ordering.
- Enable Launch at Login to keep it waiting in the menu bar after signing in.
- Nullwave checks its signed update feed daily; use Check for Updates… in General Settings whenever you want to check immediately.
- Every sound remembers its own volume across restarts; new installs default to Dark at 30%.
- Detect headset call mode optionally pauses when the same device becomes both the system input and output. It resumes afterward only when Nullwave was previously playing. It does not inspect applications or record microphone audio, and it can be disabled for audio setups that do not follow this pattern.
- Choose Quit Nullwave in the settings window to close the app.
Nullwave uses standard macOS controls throughout. Sliders adjust with the arrow keys when focused, and the application menu provides these commands whenever Nullwave is active:
- Space — play or stop from Quick Controls
- Command-Shift-N — show Quick Controls
- Command-Shift-P — play or stop Nullwave
- Command-, — open Settings
- Command-Q — quit
Use Control-F2 (or Fn-Control-F2, depending on your keyboard settings) to move keyboard focus to the macOS menu bar and reach the Nullwave status item.
Requires macOS 14 or newer and Xcode 16 or newer.
make runThis creates an ad-hoc signed app at dist/Nullwave.app and opens it. You
can drag that app into /Applications if you want to keep it. For development,
you can open Nullwave.xcodeproj in Xcode and run the shared Nullwave scheme.
The Xcode project references the same source and resource files as SwiftPM, so
the Makefile workflow remains fully supported.
make xcode-build
make xcode-testThe Xcode target supports normal Run, Test, Profile, and Archive workflows. App Store distribution will additionally require selecting an Apple Developer team, enabling the App Sandbox and appropriate entitlements, and configuring the App Store signing/profile settings for the final bundle identifier.
For direct distribution outside the App Store, make release VERSION=1.1.0
runs tests, builds, signs, notarizes, staples, packages, updates the signed
Sparkle appcast, commits the release metadata, and publishes the GitHub
release. It expects the
Developer ID Application: Jason Lotito (47UF97CY9G) identity and a
notarytool Keychain profile named nullwave-notary. Override either without
editing the project when necessary:
make release VERSION=1.1.0 \
DEVELOPER_IDENTITY="Developer ID Application: Example (TEAMID)" \
NOTARY_PROFILE="example-notary"The private Sparkle EdDSA key remains in Keychain under the nullwave account.
GitHub Actions copies the newest private release asset into the public Pages
deployment, so downloads and in-app updates work without making the source
repository public or committing release binaries.
If you enable Launch at Login while running the development copy, the app
offers to install itself as /Applications/Nullwave.app, relaunches the
installed copy, and completes login-item registration. It uses a distinct
bundle identifier and will not replace the existing Dark Noise application.
If Nullwave was playing before the move, the installed copy resumes the same
noise type and volume automatically.
The build also creates dist/nullwavectl. It controls an existing Nullwave
process and never launches the app itself:
./dist/nullwavectl play
./dist/nullwavectl stop
./dist/nullwavectl toggle
./dist/nullwavectl volume 35
./dist/nullwavectl noise brownIf Nullwave is installed, the same tool is available inside its bundle at
/Applications/Nullwave.app/Contents/MacOS/nullwavectl.
In Nullwave Settings → General → Command Line, choose Install Command-Line
Tool… to make nullwavectl available system-wide. macOS asks for an
administrator password before creating /usr/local/bin/nullwavectl.
Developers can perform the same installation with:
make install-cli
nullwavectl playThe installed command is a symlink into /Applications/Nullwave.app, so it
continues to work after Nullwave updates itself. The Make target accepts
NULLWAVE_APP and CLI_INSTALL_DIR overrides when needed.
Available sounds are Dark, Brown, Pink, White, Gray, Blue, Violet, Deep, Fan, Cabin, and Ocean.
make testDark noise does not have one standardized acoustic definition. This app's Dark setting is a very low-passed, bass-heavy noise intended to sound softer and deeper than brown noise.