Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Mixly

English | Português (BR)

License: MITPlatformGitHub release

Mixly is a per-app volume mixer for macOS — it lets you control the volume of individual applications independently, the same way Windows' built-in volume mixer works. macOS has never shipped this natively; Mixly adds it as a small menu bar app.

Playing music in one app while a video call is loud in another? Turn one down without touching the other, straight from the menu bar — no need to pause anything or dig through each app's own volume setting.

Mixly menu bar popup — dragging Discord's volume down and Chrome's volume up independently

Installation

Download the latest .dmg from Releases and drag Mixly.app to /Applications.

Note: This build isn't signed with an Apple Developer ID, so macOS Gatekeeper will warn on first launch. Right-click (or Control-click) Mixly.app and choose Open — or go to System Settings → Privacy & Security and click Open Anyway. You only need to do this once.

Features

  • Per-app volume mixing — see every app currently producing audio and adjust its volume (or mute it) independently, without touching the others.
  • Per-app output device routing — send an app's audio to a specific output device (e.g. Spotify to a USB headset while Chrome stays on the Mac speakers), independently for each app.
  • Lives in the menu bar — no dock icon, no window to manage. Click the icon, adjust, done.
  • Live audio activity — the list refreshes automatically as apps start making sound.
  • Helper process grouping — auxiliary processes (e.g. browser helpers) are grouped under their parent app, so multiple processes from the same app appear as one entry.

How it works

macOS doesn't expose a native per-app volume mixer, so Mixly builds one using Core Audio Process Taps:

  1. It enumerates the audio-producing processes registered with the system HAL (kAudioHardwarePropertyProcessObjectList) and groups them by owning application.
  2. When you change an app's volume or pick a custom output device, Mixly creates a process tap (ProcessTap.swift) for that app's processes with muteBehavior = .mutedWhenTapped, which silences the app's original output.
  3. A private aggregate device combines the tap with the chosen output device — the system default, or one you picked per app (AudioOutputDevice.swift enumerates the available devices). Mixly's IO proc reads the tapped audio, applies the chosen gain, and renders it back to that device.
  4. Setting the volume back to 100% and leaving the output device on "System Default" removes the tap entirely, restoring the app's original audio path. If a custom output device is selected, the tap stays alive at 100% volume too — it's the only way to redirect the audio at all.

This means Mixly doesn't just change a volume value — it actually re-renders each app's captured audio stream at the gain (and to the output device) you set.

Note: macOS reports an app's audio session as active for as long as the app keeps it open, which for most apps includes while paused — not just while actual sound is playing. So an app may stay in Mixly's list for a while after you pause it; it disappears once the app fully releases its audio session (usually on quit).

Requirements

  • macOS 26 (Tahoe) or later
  • Xcode 26+ to build
  • "Audio Capture" permission, granted on first use via System Settings → Privacy & Security → Screen & System Audio Recording

Building from source

git clone https://github.com/edilson14/Mixly.git
cd Mixly
xcodebuild build -scheme Mixly -configuration Release

Building & packaging a DMG

./build_and_distribute.sh YOUR_TEAM_ID

See DISTRIBUTION.md for the full build, signing, and notarization workflow.

Project structure

FilePurpose
MixlyApp.swiftApp entry point — sets up the MenuBarExtra scene
AudioKitController.swiftDiscovers audio processes, groups them by app, and manages taps
ProcessTap.swiftWraps AudioHardwareCreateProcessTap and the aggregate device used to re-render audio with gain to a chosen output device
AudioOutputDevice.swiftEnumerates the system's available output devices
AudioKitAppView.swiftPer-app mixer UI (list, sliders, mute, output device picker)
ContentView.swiftRoot view of the menu bar popover

License

MIT — see LICENSE.

About

Per-app volume mixer for macOS — control the volume of individual apps independently, like Windows' volume mixer. Lives in the menu bar, built with Core Audio Process Taps.

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages