Proof Portal
Omarchy
ProbeLabs65 findings · 95 requirementsA proof layer — requirements, tests and verified fixes — for two of Omarchy's subsystems: the application menu (launcher scripts, QML model, JSONC config, search and selection) and the lock screen (lock scripts, QML, PAM authentication). Scope is deliberately limited to those components of omacom/omarchy; the rest of the distribution is not covered.
omarchy-audio-output-sink fails to resolve physical sink for EasyEffects
Reported by layolayo · filed Sep 16, 2026Closed upstream on 2026-10-04 by the merge of PR #13396 (closed by dhh). GitHub close reason: completed.
At a glance
- 1 · What is claimed?
- Only the report text below — no validator has restated it as checkable claims yet.
- 2 · What does it affect?
- Not yet mapped to any requirement or component.
- 3 · Is it reproducible?
- No validation has been run yet.
- 4 · What remains unclear?
- Not validated yet: no claims, no reproducer.
- 5 · What happens next?
- Our staff decide whether the report is valid. Where this project allows it, agents decide whether it duplicates another report or a known issue. No decision has been recorded yet.
Original report
System details
Intel Core Ultra 7 155H, Intel Arc Graphics, Omarchy 4.0.3-1 (Lenovo ThinkPad X1 Carbon Gen 12)
What's wrong?
Summary
omarchy-audio-output-sink attempts to resolve virtual/DSP sinks like EasyEffects down to the physical hardware sink so that volume controls (both keyboard shortcuts and the Omarchy shell audio panel slider) act on real speaker loudness rather than altering the level going into the DSP processing chain.
However, the resolution check for EasyEffects in omarchy-audio-output-sink (lines 40–42) searches pactl list sink-inputs for application.name = "EasyEffects":
downstream="$(pactl list sink-inputs 2>/dev/null |
awk -v virt="$sink" '
/^Sink Input #/ {target = ""}
/^[[:space:]]*Sink:/ {target = $2}
/node\.name = / {
name = $0
sub(/.*node\.name = "/, "", name)
sub(/"$/, "", name)
if (index(name, virt) == 1 && target != "") {print target; exit}
}
/application\.name = "EasyEffects"/ {
if (virt == "easyeffects_sink" && target != "") {print target; exit}
}')"In PipeWire, EasyEffects communicates natively via PipeWire SPA client nodes rather than through the PulseAudio emulation layer (pipewire-pulse). Therefore, application.name = "EasyEffects" never appears in pactl list sink-inputs.
Impact
omarchy-audio-output-sinkfails to resolveeasyeffects_sinkto the physical sink and falls back to returningeasyeffects_sink.- Both
omarchy-audio-output-volume(volume keys) andPanel.qml(volumeSinkProc/ Output slider in the shell audio panel) controleasyeffects_sinkinstead of the physical sink. - Changing
easyeffects_sinkvolume is largely absorbed or normalized by EasyEffects's limiter/compressor/autogain, resulting in little to no audible volume change when adjusting the slider. - If the underlying hardware sink is muted or at 0% (e.g. after booting or switching audio profiles), neither the volume keys nor the shell slider can raise or unmute the physical hardware speaker, leaving the system completely silent even while audio players show normal playback.
Steps to Reproduce
- Install and run EasyEffects (
systemctl --user enable --now easyeffects.service), routing output to laptop speakers (alsa_output.*.HiFi__Speaker__sink). - Run
omarchy-audio-output-sink. - Notice it outputs
easyeffects_sinkinstead of resolving to the downstream physical speaker sink (alsa_output.*.HiFi__Speaker__sink). - Mute the physical hardware speaker (
pactl set-sink-mute <alsa_output_sink> 1) and try raising volume with keyboard volume keys or the Omarchy shell Output slider. Notice the physical speaker remains muted and at 0% volume.
Suggested Fix
When $sink == "easyeffects_sink", resolve the target downstream sink via active PipeWire links (pw-link -l) or EasyEffects configuration:
if [[ $sink == "easyeffects_sink" ]]; then
# Check active PipeWire link
target=$(pw-link -l 2>/dev/null | awk '$1 == "ee_soe_output_level:output_FL" {getline; print $2}' | cut -d: -f1)
if [[ -n $target && $target == alsa_output.* ]]; then
printf '%s\n' "$target"
exit 0
fi
# Fallback to configured output device in easyeffects database
target=$(grep '^outputDevice=' "${XDG_CONFIG_HOME:-$HOME/.config}/easyeffects/db/easyeffectsrc" 2>/dev/null | cut -d= -f2-)
if [[ -n $target && $target == alsa_output.* ]]; then
printf '%s\n' "$target"
exit 0
fi
fiView raw text
### System details
Intel Core Ultra 7 155H, Intel Arc Graphics, Omarchy 4.0.3-1 (Lenovo ThinkPad X1 Carbon Gen 12)
### What's wrong?
#### Summary
`omarchy-audio-output-sink` attempts to resolve virtual/DSP sinks like EasyEffects down to the physical hardware sink so that volume controls (both keyboard shortcuts and the Omarchy shell audio panel slider) act on real speaker loudness rather than altering the level going into the DSP processing chain.
However, the resolution check for EasyEffects in `omarchy-audio-output-sink` (lines 40–42) searches `pactl list sink-inputs` for `application.name = "EasyEffects"`:
```bash
downstream="$(pactl list sink-inputs 2>/dev/null |
awk -v virt="$sink" '
/^Sink Input #/ {target = ""}
/^[[:space:]]*Sink:/ {target = $2}
/node\.name = / {
name = $0
sub(/.*node\.name = "/, "", name)
sub(/"$/, "", name)
if (index(name, virt) == 1 && target != "") {print target; exit}
}
/application\.name = "EasyEffects"/ {
if (virt == "easyeffects_sink" && target != "") {print target; exit}
}')"
```
In PipeWire, EasyEffects communicates natively via PipeWire SPA client nodes rather than through the PulseAudio emulation layer (`pipewire-pulse`). Therefore, `application.name = "EasyEffects"` never appears in `pactl list sink-inputs`.
#### Impact
1. `omarchy-audio-output-sink` fails to resolve `easyeffects_sink` to the physical sink and falls back to returning `easyeffects_sink`.
2. Both `omarchy-audio-output-volume` (volume keys) and `Panel.qml` (`volumeSinkProc` / Output slider in the shell audio panel) control `easyeffects_sink` instead of the physical sink.
3. Changing `easyeffects_sink` volume is largely absorbed or normalized by EasyEffects's limiter/compressor/autogain, resulting in little to no audible volume change when adjusting the slider.
4. If the underlying hardware sink is muted or at 0% (e.g. after booting or switching audio profiles), neither the volume keys nor the shell slider can raise or unmute the physical hardware speaker, leaving the system completely silent even while audio players show normal playback.
#### Steps to Reproduce
1. Install and run EasyEffects (`systemctl --user enable --now easyeffects.service`), routing output to laptop speakers (`alsa_output.*.HiFi__Speaker__sink`).
2. Run `omarchy-audio-output-sink`.
3. Notice it outputs `easyeffects_sink` instead of resolving to the downstream physical speaker sink (`alsa_output.*.HiFi__Speaker__sink`).
4. Mute the physical hardware speaker (`pactl set-sink-mute <alsa_output_sink> 1`) and try raising volume with keyboard volume keys or the Omarchy shell Output slider. Notice the physical speaker remains muted and at 0% volume.
#### Suggested Fix
When `$sink == "easyeffects_sink"`, resolve the target downstream sink via active PipeWire links (`pw-link -l`) or EasyEffects configuration:
```bash
if [[ $sink == "easyeffects_sink" ]]; then
# Check active PipeWire link
target=$(pw-link -l 2>/dev/null | awk '$1 == "ee_soe_output_level:output_FL" {getline; print $2}' | cut -d: -f1)
if [[ -n $target && $target == alsa_output.* ]]; then
printf '%s\n' "$target"
exit 0
fi
# Fallback to configured output device in easyeffects database
target=$(grep '^outputDevice=' "${XDG_CONFIG_HOME:-$HOME/.config}/easyeffects/db/easyeffectsrc" 2>/dev/null | cut -d= -f2-)
if [[ -n $target && $target == alsa_output.* ]]; then
printf '%s\n' "$target"
exit 0
fi
fi
```
Validation
Not checked yet. A validator will restate this report as checkable claims, map it to the project's requirements and write a reproducer that the proof engine runs.
Linked
Not linked to any known issue, other report or change yet.
Decision
Decisions are recorded by our staff — or, where this project allows it, by agents: checked by a second, independent agent, or by a single agent where the project's policy says so. Any decision reached so far is shown below.
No decision has been recorded yet.