Audio
Switch the output or input, set the volume, mute
palupdated 2026-10-27SystemComes with palMenu bar: Volume, Microphone
Comes with pal, so a new install already has it; the button finds it in pal again if you removed it. This page can't see what your pal has installed.



What it does
Switch the sound output or input, set the volume and mute, from a list of every audio device.
- Every output and input in two sections, the default tagged, the volume and mute state on the right
entermakes a device the default for output or inputcmd+shift+vsets the volume to the percent you typecmd+mtoggles mute- The connection (Bluetooth, USB, built-in, HDMI) in the subtitle when the system reports it
Palettes 1
-
Audio
audioliveEvery output and input, the defaults tagged, with their volume.
- ↵Set as the default output or input
- ⌘⇧VSet the volume to the percent typed in the bar
- ⌘MMute or unmute
Actions
- Set as output / Set as inputMakes the row the default for its direction; the HUD names it.↵
- Set volumeThe percent typed in the bar, 0 to 100, on a device with a volume control.⌘⇧V
- Mute / UnmuteToggles mute and stays in the list.⌘M
Settings
No settings. It works out of the box.
The README
Everything Audio does, key by key, from the extension's own README.md
Audio
Every audio output and input, in two sections, over the core's audio
capability. The default of each direction carries a default tag, the
volume is the accessory, a muted device is tagged muted; the subtitle
says the direction and, when the OS reports it, the transport
(bluetooth, usb, builtin, hdmi). A headset shows once under Output
and once under Input, since it is one device in both directions. The
palette is live: the defaults and volumes are read again on every show,
so airpods at the root finds the row with its current volume.
One palette, Audio (audio). With no audio backend the one row says
which tool is missing.
Bar items
Volume shows where the sound is going: headphones for a Bluetooth output, a speaker for HDMI or AirPlay, and otherwise a three-step loudness ramp — one more arc on the same cone each step, with silence drawn as muted, since zero is the same fact rather than the bottom of the ramp. The glyph slot is a fixed width, so the arcs appear into space already reserved instead of shoving the neighbours along.
The level is not in the bar by default. It changes only when you change it,
so a percentage sitting there permanently is a number you stop reading; instead
it appears for three seconds after a change as feedback for the thing you just
did, then collapses back to one glyph. level picks between that (flash),
always and never; the standing answer either way is the popover, where the
level sits against the device it applies to. Only a change you made through the
item flashes it — a poll or a device change must not, or it would be permanent
again by another route. A change made with the keyboard's own volume keys is not
seen until the next poll, and does not flash: that needs a native audio event,
which the core does not have yet.
Click mutes or unmutes; on sketchybar, the wheel moves in 5% steps.
The popover leads with the device in use, on a card: its glyph, its name and what
it is, then a slider a click sets anywhere along it, the level beside it and a
mute switch. Under it the other outputs are rows — a click or Enter makes one the
default — and under those, the input in a single line, muted in red when it is,
so one popover is the whole picture rather than half of it. The cursor opens on
the first row rather than on the card, because the card is already the device you
are on and the rows are the only thing to choose between. m mutes, - and +
move by 5%, the digits 0–4 are the 0/25/50/75/100 presets, p opens the
Audio palette for the searchable list. A device the backend reports no level for
(an optical out, some interfaces) gets no slider rather than a dead one at zero.
Microphone stays out of the way while the default input is usable; it appears
red when that input is muted or absent, and a click restores an available input
to 75%. Its popover is the same shape the other way round: the microphone in use
on the card, the other inputs as rows, the output in the line beneath.
Whether a missing input shows is the item's missing rule (Hidden on
under Settings > Bar leaves it quiet). Either strip is kept up while it has nothing to say by the core's
show = "always" under its [bar.items."audio/<id>"] (docs/config.md):
the live microphone, or a missing output, as a muted glyph whose click
opens the popover. Both poll every five seconds until the core has a
native audio-change event. Their Bar settings offer representative mock
states.
volume item settings, [bar.items."audio/volume".settings]:
| key | type | default | what |
|---|---|---|---|
level |
select | flash |
Where the percentage lives: flash for three seconds after a change, always, or never. |
Rows
| part | what |
|---|---|
| icon | headphones for a Bluetooth output, a speaker for any other output, a microphone for an input |
| title | the device's name as the OS reports it |
| subtitle | Output · bluetooth, Input · usb; the direction alone when the OS gives no transport |
| accessories | muted (amber) when muted, the volume (45%), default (green) for the default of that direction |
| keywords | the direction and the transport, so bluetooth or input finds the rows |
| section | Output, then Input |
A device with a volume control carries one field in the bar, the percent
(argument volume); only Set volume reads it, Enter and Mute run as they
are. A pick without the field (a hotkey, a bare pal run) asks for it in
a form, and anything but 0 to 100 comes back on the field.
A hotkey can open the palette straight away, and an item hotkey can make
one device the default without showing pal, keyed on the row's id
(output:<uid> or input:<uid>):
[palettes.audio]
hotkey = "ctrl+alt+a"
[palettes.audio.item_hotkeys]
"output:BuiltInSpeakerDevice" = "ctrl+alt+s"
Keyboard
| keys | action |
|---|---|
enter |
Set as output / Set as input: makes the row the default for its direction; the HUD names it |
cmd+shift+v |
Set volume: the percent typed in the bar (argument volume) goes to the device; the HUD says so |
cmd+m |
Mute / Unmute: toggles mute and stays in the list |
A digital output without a volume control has no volume accessory and no Mute action. A setter that fails keeps the panel open with a toast carrying the backend's message.
Setup
Nothing to configure and nothing to install on macOS.
- macOS: the CoreAudio HAL, in-process. The device's UID is its id (stable across replugs); the volume is the virtual main volume the menu bar slider moves, with the per-channel scalar for a device without one.
- Linux:
wpctl(PipeWire), elsepactl -f json(PulseAudio 16 or later). With neither the palette is one row naming the missing tool.
No settings. Nothing beyond the panel: no permission prompt on either platform.
What it does not do
- No per-app volume, no balance, no sample rate: the capability exposes the default, the main volume and mute of each device, nothing finer.
- No AirPlay or Bluetooth pairing from here: the Bluetooth palette connects a paired device, the OS pairs it.
Platforms
macOS and Linux. The transport in the subtitle comes from CoreAudio, so on Linux the subtitle is the direction alone.








