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.
Intel IPU6 MIPI camera Raptor Lake not working
Reported by vitorpacheco · filed May 8, 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
System details
- CPU: Intel Raptor Lake (13th Gen) — also affects Tiger Lake (11th Gen) and Alder Lake (12th Gen)
- Sensor: OmniVision OV02C10 (ACPI ID: OVTI02C1) — also likely affects OV01A10, OV08X40, HM11B1 and other IPU6 sensors
- OS: Arch Linux / Omarchy (latest)
- Kernel: 6.x with
ipu6-driversout-of-tree modules
What's wrong?
Built-in MIPI camera on Intel IPU6 hardware is completely broken out of the box in Omarchy:
- Camera not visible in Chromium (Discord, Google Meet show "No camera found")
- Camera not visible in Firefox/Zen Browser without extra config
- wireplumber crashes (segfault in
libgallium) on camera access attempts
Root causes discovered (after extensive debugging)
1. Missing AUR packages
IPU6 cameras require packages not installed by Omarchy:
intel-ipu6-camera-hal-git # Intel HAL (AUR)
libcamera-ipu6 # libcamera fork with IPU6 support (AUR)
libcamera-ipu6-ipa # IPA algorithms (AUR)
gst-plugin-libcamera-ipu6 # GStreamer plugin (AUR)
pipewire-libcamera # PipeWire ↔ libcamera bridge (extra)2. Wrong pipeline selected
libcamera defaults to the broken ipu6 HAL pipeline. Must force the simple pipeline (software ISP):
`~/.config/systemd/user/wireplumber.service.d/20-egl-vendor.conf`:
[Service]
Environment=LIBCAMERA_PIPELINES_MATCH_LIST=simple,uvcvideo
Environment=LIBCAMERA_SOFTISP_MODE=cpu
Environment=__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.jsonWhy each variable:
- LIBCAMERA_PIPELINES_MATCH_LIST=simple,uvcvideo — skips the broken ipu6 HAL, uses SoftwareISP
- LIBCAMERA_SOFTISP_MODE=cpu — critical for Chromium: GPU (EGL) debayering produces DMA-BUF with stride=2048 that Chromium's PipeWire buffer allocator rejects (stride mismatch vs expected 1920 → EINVAL). CPU debayering produces system memory DMA-BUF with correct compact stride.
- __EGL_VENDOR_LIBRARY_FILENAMES — forces Mesa EGL over NVIDIA EGL to prevent cross-device DMA-BUF crash in libgallium on NVIDIA+Intel hybrid systems.
3. Missing video group membership
User must be in the video group to open /dev/dri/renderD128:
sudo usermod -aG video $USERWithout this: wireplumber segfaults in DebayerEGL::debayerGPU() → libgallium crash when NVIDIA EGL tries to import Intel DMA-BUF across devices.
4. Chromium does not use PipeWire camera by default
Must add to ~/.config/chromium-flags.conf:
--enable-features=...,WebRtcPipeWireCamera
--disable-gpu-sandboxWebRtcPipeWireCamera enables the portal camera path. --disable-gpu-sandbox is needed for the portal flow to work correctly.
5. Firefox/Zen Browser needs explicit PipeWire camera pref
`~/.config/zen/<profile>/user.js` (or Firefox user.js):
user_pref("media.webrtc.camera.allow-pipewire", true);6. xdg-desktop-portal loses PipeWire connection on restart
After any wireplumber restart the portal shows connection error. Fix with a drop-in:
`~/.config/systemd/user/xdg-desktop-portal.service.d/auto-restart.conf`:
[Unit]
BindsTo=pipewire.service
After=pipewire.service7. Missing sensor calibration file
libcamera falls back to uncalibrated.yaml without /usr/share/libcamera/ipa/simple/ov02c10.yaml. A minimal file based on the ov01a10 (same OmniVision family) helps:
sudo tee /usr/share/libcamera/ipa/simple/ov02c10.yaml << 'EOF'
# SPDX-License-Identifier: CC0-1.0
%YAML 1.1
---
version: 1
algorithms:
- BlackLevel:
black: 16
- Awb:
- Adjust:
- Agc:
...
EOFCurrent state after all fixes
✅ Camera visible and working in Chromium (Discord, Google Meet)
✅ Camera visible and working in Zen Browser / Firefox
✅ No more wireplumber crashes
⚠️ Image quality is poor — see below
Known remaining limitation: image quality
The OV02C10 sensor has no upstream calibration data in libcamera (intel/ipu6-drivers#431). The software ISP runs without tuned CCM, AWB convergence is unreliable in low light (hardcoded 4.0× max gain causes strong color casts). This is an upstream libcamera limitation that cannot be fixed in Omarchy config.
Help wanted
Looking for others with IPU6 hardware who have:
1. Found better ov02c10.yaml / CCM tuning values
2. Tested on other IPU6 sensors (OV01A10, OV08X40, HM11B1)
3. Ideas for packaging these fixes cleanly in Omarchy (install script, migration)
4. Experience with the hardware ISP path (intel-ipu6-camera-hal-git) that could give better image quality
Check if affected: grep -r "OVTI\|INTC\|HM11" /sys/bus/acpi/devices/*/hid 2>/dev/null
View raw text
## System details
- **CPU**: Intel Raptor Lake (13th Gen) — also affects Tiger Lake (11th Gen) and Alder Lake (12th Gen)
- **Sensor**: OmniVision OV02C10 (ACPI ID: OVTI02C1) — also likely affects OV01A10, OV08X40, HM11B1 and other IPU6 sensors
- **OS**: Arch Linux / Omarchy (latest)
- **Kernel**: 6.x with `ipu6-drivers` out-of-tree modules
## What's wrong?
Built-in MIPI camera on Intel IPU6 hardware is completely broken out of the box in Omarchy:
- Camera not visible in **Chromium** (Discord, Google Meet show "No camera found")
- Camera not visible in **Firefox/Zen Browser** without extra config
- **wireplumber crashes** (segfault in `libgallium`) on camera access attempts
## Root causes discovered (after extensive debugging)
### 1. Missing AUR packages
IPU6 cameras require packages not installed by Omarchy:
```
intel-ipu6-camera-hal-git # Intel HAL (AUR)
libcamera-ipu6 # libcamera fork with IPU6 support (AUR)
libcamera-ipu6-ipa # IPA algorithms (AUR)
gst-plugin-libcamera-ipu6 # GStreamer plugin (AUR)
pipewire-libcamera # PipeWire ↔ libcamera bridge (extra)
```
### 2. Wrong pipeline selected
libcamera defaults to the broken `ipu6` HAL pipeline. Must force the `simple` pipeline (software ISP):
**`~/.config/systemd/user/wireplumber.service.d/20-egl-vendor.conf`:**
```ini
[Service]
Environment=LIBCAMERA_PIPELINES_MATCH_LIST=simple,uvcvideo
Environment=LIBCAMERA_SOFTISP_MODE=cpu
Environment=__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json
```
Why each variable:
- `LIBCAMERA_PIPELINES_MATCH_LIST=simple,uvcvideo` — skips the broken ipu6 HAL, uses SoftwareISP
- `LIBCAMERA_SOFTISP_MODE=cpu` — **critical for Chromium**: GPU (EGL) debayering produces DMA-BUF with stride=2048 that Chromium's PipeWire buffer allocator rejects (stride mismatch vs expected 1920 → `EINVAL`). CPU debayering produces system memory DMA-BUF with correct compact stride.
- `__EGL_VENDOR_LIBRARY_FILENAMES` — forces Mesa EGL over NVIDIA EGL to prevent cross-device DMA-BUF crash in `libgallium` on NVIDIA+Intel hybrid systems.
### 3. Missing `video` group membership
User must be in the `video` group to open `/dev/dri/renderD128`:
```bash
sudo usermod -aG video $USER
```
Without this: wireplumber segfaults in `DebayerEGL::debayerGPU()` → `libgallium` crash when NVIDIA EGL tries to import Intel DMA-BUF across devices.
### 4. Chromium does not use PipeWire camera by default
Must add to `~/.config/chromium-flags.conf`:
```
--enable-features=...,WebRtcPipeWireCamera
--disable-gpu-sandbox
```
`WebRtcPipeWireCamera` enables the portal camera path. `--disable-gpu-sandbox` is needed for the portal flow to work correctly.
### 5. Firefox/Zen Browser needs explicit PipeWire camera pref
**`~/.config/zen/<profile>/user.js`** (or Firefox `user.js`):
```javascript
user_pref("media.webrtc.camera.allow-pipewire", true);
```
### 6. xdg-desktop-portal loses PipeWire connection on restart
After any wireplumber restart the portal shows `connection error`. Fix with a drop-in:
**`~/.config/systemd/user/xdg-desktop-portal.service.d/auto-restart.conf`:**
```ini
[Unit]
BindsTo=pipewire.service
After=pipewire.service
```
### 7. Missing sensor calibration file
libcamera falls back to `uncalibrated.yaml` without `/usr/share/libcamera/ipa/simple/ov02c10.yaml`. A minimal file based on the ov01a10 (same OmniVision family) helps:
```bash
sudo tee /usr/share/libcamera/ipa/simple/ov02c10.yaml << 'EOF'
# SPDX-License-Identifier: CC0-1.0
%YAML 1.1
---
version: 1
algorithms:
- BlackLevel:
black: 16
- Awb:
- Adjust:
- Agc:
...
EOF
```
## Current state after all fixes
✅ Camera visible and working in Chromium (Discord, Google Meet)
✅ Camera visible and working in Zen Browser / Firefox
✅ No more wireplumber crashes
⚠️ **Image quality is poor** — see below
## Known remaining limitation: image quality
The OV02C10 sensor has **no upstream calibration data** in libcamera ([intel/ipu6-drivers#431](https://github.com/intel/ipu6-drivers/issues/431)). The software ISP runs without tuned CCM, AWB convergence is unreliable in low light (hardcoded 4.0× max gain causes strong color casts). This is an upstream libcamera limitation that cannot be fixed in Omarchy config.
## Help wanted
Looking for others with IPU6 hardware who have:
1. Found better `ov02c10.yaml` / CCM tuning values
2. Tested on other IPU6 sensors (OV01A10, OV08X40, HM11B1)
3. Ideas for packaging these fixes cleanly in Omarchy (install script, migration)
4. Experience with the hardware ISP path (`intel-ipu6-camera-hal-git`) that could give better image quality
Check if affected: `grep -r "OVTI\|INTC\|HM11" /sys/bus/acpi/devices/*/hid 2>/dev/null`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.
- Out of scopeDecided by agents · verified · 2026-10-09 02:55 UTC