A native macOS menubar application that limits audio volume on individual devices.
Features • Installation • Usage • Contributing • License
I have tinnitus and I couldn't find a reasonable app to limit volume on individual devices, so I decided to create it. Perhaps it helps someone out there.
TinniCap sits in your menubar and automatically limits volume on all your audio devices - from built-in speakers to Bluetooth headphones to external monitors.
Perfect for:
- 🎧 Preventing hearing damage from accidentally loud volumes
- 🏢 Maintaining safe audio levels in shared spaces
- 👨💻 Setting different limits for different devices
- 🌙 Keeping late-night audio at reasonable levels
- 🔊 Per-Device Volume Limits: Set individual limits for each audio device
- 🎯 Auto-Detection: Automatically detects all audio output devices
- Built-in speakers
- Bluetooth headphones and speakers
- USB audio interfaces
- HDMI/DisplayPort/Thunderbolt monitor audio
- 💾 Persistent Settings: Limits saved across system restarts
- ⚡️ Real-Time Monitoring: Checks volume every 500ms
- Hard Cap Mode (default): Automatically reduces volume when limit is exceeded
- Warning Only Mode: Shows notification but allows manual override
- Native Swift/SwiftUI application
- Minimal memory footprint
- No background processes beyond the menubar app
- Uses Apple's CoreAudio framework directly
- macOS 13.0 (Ventura) or later
- Xcode 15.0+ (for building from source)
-
Download the latest version (e.g.,
TinniCap-1.0.5.zip) from the releases page -
Unzip the file
-
Move
TinniCap.appto your Applications folder -
First launch: Since the app isn't signed with an Apple Developer certificate, macOS Gatekeeper will block it. Use one of these methods:
Method A: Right-click to open
- Right-click (or Control-click) on
TinniCap.app - Select "Open" from the menu
- Click "Open" in the security dialog
- The app will now run normally going forward
Method B: System Settings
- Try to open the app normally
- Open System Settings → Privacy & Security
- Scroll down to find "TinniCap was blocked from use"
- Click "Open Anyway"
- Confirm by clicking "Open"
Method C: Remove quarantine attribute (Terminal)
xattr -cr /Applications/TinniCap.app
- Right-click (or Control-click) on
# Clone the repository
git clone https://github.com/mujdat/tinnicap.git
cd tinnicap
# Open in Xcode
open TinniCap.xcodeproj
# Build and run (⌘+R)
# Or use the build script:
./build.sh
# Copy to Applications folder
cp -r ./build/Build/Products/Release/TinniCap.app /Applications/xcodebuild -project TinniCap.xcodeproj \
-scheme TinniCap \
-configuration Release \
build- Launch TinniCap - The app appears as a speaker icon in your menubar
- Click the icon - See all detected audio devices
- Set a limit - Click a device → "Set Volume Limit..." → Enter percentage (0-100)
- Done! - The limit is now active and will persist across restarts
Step-by-step guide
- Click the TinniCap menubar icon
- You'll see all detected audio devices listed
- Click on any device to open its submenu
- Select "Set Volume Limit..."
- Enter a percentage (0-100)
- Example: 75 = volume won't exceed 75%
- Click "Set"
- You'll see a confirmation notification
-
Hard Cap Mode: Click TinniCap icon → Select "Hard Cap (Enforce Limit)"
- Volume is automatically reduced when limit is exceeded
- Notification shows when enforcement occurs
-
Warning Only Mode: Click TinniCap icon → Select "Warning Only"
- Notification appears when limit is exceeded
- Volume can still be manually increased
- Click the device in the menubar menu
- Select "Remove Limit"
- The device will return to unrestricted operation
TinniCap/
├── TinniCapApp.swift # App entry point & lifecycle
├── MenuBarController.swift # UI and user interactions
├── AudioDeviceService.swift # CoreAudio integration
├── AudioDevice.swift # Data models
└── SettingsManager.swift # Persistence layer
- Device Discovery: Uses CoreAudio's
kAudioHardwarePropertyDevicesto enumerate output devices - Transport Detection: Identifies device types (Bluetooth, USB, etc.) via
kAudioDevicePropertyTransportType - Volume Monitoring: Polls
kAudioHardwareServiceDeviceProperty_VirtualMainVolumeevery 500ms - Volume Control: Sets volume via
AudioObjectSetPropertyDatawhen limits are exceeded - Persistence: Stores limits and preferences in
UserDefaults
| Device Type | Detection | Volume Control | Notes |
|---|---|---|---|
| Built-in Speakers | ✅ | ✅ | Fully supported |
| Bluetooth | ✅ | ✅ | May have slight delay |
| USB Audio | ✅ | ✅ | Most devices supported |
| HDMI/DisplayPort | ✅ | ✅ | Monitor audio supported |
| Pro Audio Interfaces | ✅ | Some don't support programmatic control |
Please see CONTRIBUTING.md for guidelines.
- Fork the repository
- Create your feature branch (
git checkout -b feature/AmazingFeature) - Commit your changes (
git commit -m 'Add some AmazingFeature') - Push to the branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Future enhancements planned:
- Launch at login option
- Slider instead of percentage input
- Decibel-accurate measurements (vs. percentage)
- Per-app volume limiting
This project is licensed under the MIT License - see the LICENSE file for details.
- 🐛 Bug reports: Open an issue
- 💡 Feature requests: Open an issue
