Proof Portal

Project overview

Omarchy

ProbeLabs65 findings · 95 requirements

A 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.

Inbox
ReportR-442GitHub issuePublicReceived

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.

Received and recorded verbatim. Nothing has been checked yet.

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

omarchy-audio-output-sink fails to resolve physical sink for EasyEffectsrevision 1 · captured 2026-09-28 21:23 UTC via poll

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

  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:

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
View 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.