sotto v0.6.3Beta

One key. Every app.
Silent.

sotto voce · Italian, “under the voice”: in a hushed tone.

Mute your microphone system-wide from the menu bar, with push-to-talk and an icon that reads the device, not the app. No permissions required.

sotto's menu bar panel with the microphone mutedOn-screen feedback: muted

Highlights

Five things to know.

System-wide mute

One click, or one key. Every app goes silent, not just the one you are in.

Push to talk

Hold a key to open the mic. Let go to mute again.

An icon that can't lie

The glyph follows the device, not the app's memory of it.

F5

The microphone key

Claim the mic key and it mutes instead of starting Dictation.

0

No permissions

Installs and works before it has earned any trust.

Mute

The device, not the app.

Mute is a single piece of state, and sotto keeps it on the microphone itself. It writes the device’s own mute property through CoreAudio, so Zoom, Meet, Teams and everything else go silent at once.

Apps muted at once

All

The property lives on the device

Icon catches up in

< 1 sec

CoreAudio listeners, not polling

Permissions to mute

0

A property write and a Carbon hotkey

The panel while the microphone is live: device, gain, level test, mode and key The panel while muted Choosing the input device

Status, input device, gain, level test, the mode and the key. One panel, no settings window.

Muted from the menu, from the key, or from System Settings. sotto agrees within a second.

Pick the microphone sotto controls. It becomes the system default input, so every app records from it.

2×

Menu bar icon

Red when you are silent. Pulses twice on every change.

Input switching

Pick the mic. The mute state comes along.

5 sec

Gain and level test

A meter that opens the mic only while it runs.

On-screen feedback

You never wonder whether the shortcut landed.

$ sotto probe

Devices that can't be muted

Told plainly, not pretended.1

Push to talk

Hold to speak. Let go to vanish.

Flip the mode and the mic rests muted. It opens only while your key is held and mutes again the moment you release it. A bare modifier works too: hold right ⌥ to talk.

Failsafe

2 min

Closes the mic if a key-up is lost to sleep

Keys swallowed

1

The talk key never types into your app

Permission

1

Accessibility, asked only for this mode

HUD: live, while the key is held HUD: muted, after the key is released Push to talk mode with a talk key assigned

While the key is down the mic is open and the HUD stays up so you can see you are live.

Release, and you are muted again. If a release is ever lost, a two-minute failsafe closes the mic.

Switch the mode and the logic inverts: the mic rests muted and opens only while your key is down.

Inside

Nothing to grant. Nothing to trust.

Muting is a CoreAudio property write. The shortcut is a Carbon hotkey. The microphone key is claimed with a remap at the HID layer. None of those ask you for anything. Push-to-talk is the one exception: seeing a key’s release needs an event tap, so that mode alone asks for Accessibility.

Mute / unmuteCoreAudio property write. No permission.
Toggle shortcutCarbon RegisterEventHotKey. No permission.
Microphone keyHID key remap, below Dictation. No permission.
Level testAVAudioEngine. Microphone, only while testing.
Push to talkCGEventTap. Accessibility, only if you turn it on.
Launch at loginSMAppService, the same as Login Items.

The key, before Dictation.

macOS turns the microphone key into a Dictation trigger before any app sees it. sotto gets underneath by remapping the key itself, and hands it back when you unbind it, quit, or log out.

Source on GitHub →
[sotto]
# what the remap does
F5 (mic)  →  F13  →  sotto

# what your hardware exposes
$ /Applications/sotto.app/Contents/MacOS/sotto probe

Two ways

Get sotto.

Homebrew

Clears the quarantine flag for you

The tap
$ brew tap ugurcandede/tap
$ brew install --cask sotto
Tap
ugurcandede/tap
Update
brew upgrade --cask sotto

Direct download

Unzip, move to Applications, right-click, Open3

Download
sotto-macos.zip
Releases
All versions
Source
On GitHub

Quitting does not unmute: sotto mutes the device, not itself. Unmute first, then quit. Anonymous usage stats can be switched off in the menu.2

Specifications

What it needs. What it does.

RequiresmacOS 14 Sonoma or later, Apple silicon or Intel
PermissionsNone to mute. Microphone for the level test, Accessibility for push to talk
Written inSwift, SwiftUI and AppKit
MuteDevice mute property, gain fallback
Shortcut⌘⌥⌃⇧ + key, fn + F-key, or the microphone key
ModesMute / unmute, push to talk
Output audioUntouched. Input side only
InstallHomebrew cask or .zip
LicenseSource available

FAQ

Questions, answered.

Read the guide →

Does sotto need any permissions?

No. Muting is a CoreAudio property write and the global shortcut is a Carbon hotkey; neither requires a grant. The microphone key is claimed with an HID key remap, which also needs none.

There are two exceptions, both opt-in. The test button opens the microphone to measure your level, so macOS asks once and shows its orange dot while the meter runs. Push-to-talk needs an event tap to see your key, so switching that mode on asks for Accessibility.

Does sotto collect any data?

It sends anonymous usage events to Google Analytics — which features you use and how, with a random install id. No audio, no keystrokes, no device names. Turn it off any time by unchecking send anonymous usage stats in the menu.

What happens to Dictation when I use the 🎤 key?

It stays quiet while sotto owns the key. The key is remapped below the layer where macOS decides to start Dictation. Pick another key, choose none, or quit sotto and Dictation works exactly as before. A logout resets the mapping too, so nothing can get stuck.

Is push-to-talk supported?

Yes. Pick push to talk in the menu and hold your key: the mic opens while the key is down and mutes again the moment you let go. Holding a key means knowing when it is released, and the only macOS API that reports key-up globally is an event tap — so this one mode asks for Accessibility. Everything else keeps working without any grant.

Push to talk stopped working after an update

macOS ties the Accessibility grant to the exact binary it was given, and sotto’s builds are not yet notarized — so an update invalidates the grant while System Settings still shows sotto as enabled. sotto detects this, clears the dead record, and asks again; approve the prompt and push to talk comes back within seconds.

My shortcut won’t record

Two keys are rejected on purpose, and one is rejected by macOS:

  • A key on its own (a letter, a number) is ignored — binding it globally would swallow that key everywhere you type.
  • A bare F-key never reaches sotto if your function row is in media mode, which is the default. macOS turns F1–F12 into brightness and volume before any app sees them. Press fn + F7 and it records as F7.
  • The 🎤 key is the exception: sotto claims it at the HID layer, so it records as itself.

So: a modifier combination, fn with an F-key, or the microphone key.

Does sotto change my audio output?

No. It only touches the input side — the microphone’s mute property, its input gain, and which device is the system default input. Speakers, headphones and output volume are untouched.

Does it work with Zoom, Meet, Teams?

Yes, because sotto mutes the device rather than the app. The apps’ own mute buttons are separate: muting in sotto while Zoom shows you unmuted means you are, in fact, silent.

One caveat: Zoom’s Automatically adjust microphone volume raises input gain behind your back. On devices where sotto has to mute by zeroing gain, it watches that property and puts it back.

Why is my microphone still muted after quitting?

Because sotto mutes the device, not itself. Quitting does not unmute — it would be a surprise to have your microphone open again without asking. Unmute first, then quit, or use System Settings.

The menu says my device can’t be muted

Some devices — Continuity microphones in particular — expose neither a mute property nor a settable input gain. Nothing can mute them short of switching inputs. Run sotto probe to see the details for every device you have.

Why is the app not notarized?

It is ad-hoc signed. Notarization needs a paid Apple Developer account; until then Homebrew clears the quarantine flag for you, or you can right-click → Open on first launch.

From sotto/docs/faq.md

More from ~/apps

Next door.