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.
Screen recordings with audio are written at 96 kHz AAC (loudnorm missing -ar)
Reported by davidstillson · filed Sep 9, 2026 · open at source
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?
- AreaOutside the audited area· Decided by agents · verified
- 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?
- Decided by agents and verified by a second, independent agent — see the decision.
Original report
What happened
Every screen recording made with audio is written at 96 kHz AAC instead of the 48 kHz that gpu-screen-recorder captured.
96 kHz AAC is unusual enough to be poorly supported downstream. DaVinci Resolve reads the container metadata correctly (reports AAC, 2ch, Sample Rate 96000) but decodes no samples — the clip imports and the video scrubs and plays fine, while the audio is silent and the timeline waveform is a blank rectangle. It also costs bitrate for no benefit, since the source audio was 48 kHz.
What I expected
Recordings keep the 48 kHz sample rate they were captured at.
Root cause
bin/omarchy-capture-screenrecording, in finalize_recording() (line 271):
args+=(-af "volume=enable='lt(t,0.4)':volume=0,afade=t=in:st=0.4:d=0.05,loudnorm=I=-14:TP=-1.5:LRA=11")ffmpeg's loudnorm analyses at 192 kHz and declares that as its output rate. With no -ar on the command, ffmpeg negotiates that rate with the AAC encoder, which caps at its own 96 kHz ceiling — so the finalize pass silently resamples 48 kHz up to 96 kHz.
gpu-screen-recorder is not at fault; the file is correct until finalize_recording() runs.
Steps to reproduce
Independent of the recorder — this reproduces with plain ffmpeg:
# stand in for a gsr recording: 48 kHz AAC
ffmpeg -y -f lavfi -i testsrc=size=320x240:rate=60 \
-f lavfi -i "sine=frequency=440:sample_rate=48000" \
-t 3 -c:v libx264 -c:a aac -ar 48000 gsr_sim.mp4
# exactly what finalize_recording() runs
ffmpeg -y -ss 0.1 -i gsr_sim.mp4 -c:v copy \
-af "volume=enable='lt(t,0.4)':volume=0,afade=t=in:st=0.4:d=0.05,loudnorm=I=-14:TP=-1.5:LRA=11" \
gsr_finalized.mp4
ffprobe -v error -select_streams a -show_entries stream=codec_name,sample_rate -of csv=p=0 gsr_sim.mp4
ffprobe -v error -select_streams a -show_entries stream=codec_name,sample_rate -of csv=p=0 gsr_finalized.mp4Result:
gsr output (before finalize): aac,48000
after finalize_recording(): aac,96000
same chain minus loudnorm: aac,48000 # isolates loudnorm as the causeOr end to end: omarchy screenrecord --fullscreen --with-desktop-audio, stop it, then ffprobe the file.
Suggested fix
Pin the output rate — add -ar 48000 to that invocation. Loudness normalization is unaffected; a -21.1 dB source still lands at -13.6 dB against the -14 LUFS target.
Happy to open a PR.
System details
- Omarchy 4.0.2-1
- gpu-screen-recorder 6.0.1
- ffmpeg n9.0.1
- Arch Linux, kernel 7.1.9-arch1-2
- AMD Radeon RX 7900 XTX (amdgpu)
View raw text
### What happened
Every screen recording made with audio is written at **96 kHz AAC** instead of the 48 kHz that `gpu-screen-recorder` captured.
96 kHz AAC is unusual enough to be poorly supported downstream. DaVinci Resolve reads the container metadata correctly (reports `AAC`, `2ch`, `Sample Rate 96000`) but decodes no samples — the clip imports and the video scrubs and plays fine, while the audio is silent and the timeline waveform is a blank rectangle. It also costs bitrate for no benefit, since the source audio was 48 kHz.
### What I expected
Recordings keep the 48 kHz sample rate they were captured at.
### Root cause
`bin/omarchy-capture-screenrecording`, in `finalize_recording()` (line 271):
```bash
args+=(-af "volume=enable='lt(t,0.4)':volume=0,afade=t=in:st=0.4:d=0.05,loudnorm=I=-14:TP=-1.5:LRA=11")
```
ffmpeg's `loudnorm` analyses at 192 kHz and declares that as its output rate. With no `-ar` on the command, ffmpeg negotiates that rate with the AAC encoder, which caps at its own 96 kHz ceiling — so the finalize pass silently resamples 48 kHz up to 96 kHz.
`gpu-screen-recorder` is not at fault; the file is correct until `finalize_recording()` runs.
### Steps to reproduce
Independent of the recorder — this reproduces with plain ffmpeg:
```bash
# stand in for a gsr recording: 48 kHz AAC
ffmpeg -y -f lavfi -i testsrc=size=320x240:rate=60 \
-f lavfi -i "sine=frequency=440:sample_rate=48000" \
-t 3 -c:v libx264 -c:a aac -ar 48000 gsr_sim.mp4
# exactly what finalize_recording() runs
ffmpeg -y -ss 0.1 -i gsr_sim.mp4 -c:v copy \
-af "volume=enable='lt(t,0.4)':volume=0,afade=t=in:st=0.4:d=0.05,loudnorm=I=-14:TP=-1.5:LRA=11" \
gsr_finalized.mp4
ffprobe -v error -select_streams a -show_entries stream=codec_name,sample_rate -of csv=p=0 gsr_sim.mp4
ffprobe -v error -select_streams a -show_entries stream=codec_name,sample_rate -of csv=p=0 gsr_finalized.mp4
```
Result:
```
gsr output (before finalize): aac,48000
after finalize_recording(): aac,96000
same chain minus loudnorm: aac,48000 # isolates loudnorm as the cause
```
Or end to end: `omarchy screenrecord --fullscreen --with-desktop-audio`, stop it, then ffprobe the file.
### Suggested fix
Pin the output rate — add `-ar 48000` to that invocation. Loudness normalization is unaffected; a -21.1 dB source still lands at -13.6 dB against the -14 LUFS target.
Happy to open a PR.
### System details
- Omarchy 4.0.2-1
- gpu-screen-recorder 6.0.1
- ffmpeg n9.0.1
- Arch Linux, kernel 7.1.9-arch1-2
- AMD Radeon RX 7900 XTX (amdgpu)
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
- Related PRpr/8809· confirmed
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.
- Out of scopeDecided by agents · verified · 2026-10-09 11:18 UTC