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-1211GitHub issuePublicDecided· Out of scope

Screensaver saturates 5+ CPU cores and thermally throttles on HiDPI displays (foot is software-rendered, hardcoded --frame-rate 120)

Reported by markvogel · filed Aug 30, 2026 · open at source

Decided: Out of scope — decided by agents · verified 4 days ago.

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

Screensaver saturates 5+ CPU cores and thermally throttles on HiDPI displays (foot is software-rendered, hardcoded --frame-rate 120)revision 1 · captured 2026-09-28 21:24 UTC via poll

Summary

On a HiDPI display, the screensaver saturates several CPU cores and drives the
machine into sustained thermal throttling. The cost scales with **device
pixels**, so it gets bad on a single 4K/5K panel and worse with more monitors.

Root cause is a combination of three things, all in the default configuration:

  1. omarchy-launch-screensaver opens one fullscreen terminal per monitor.
  2. omarchy-screensaver runs ttfx with a hardcoded --frame-rate 120.
  3. Omarchy's only shipped/listed terminal is foot, which is a software

renderer — it rasterizes with libpixman into a wl_shm buffer and links no
libGL/libEGL/libvulkan.

Every screensaver frame is therefore rasterized on the CPU, full-screen, at
120fps, at native panel resolution.

Measurements

Captured live while the screensaver was up (Framework 13, Core Ultra 7 165H,
Intel Arc iGPU, 3 monitors):

WindowMonitorLogicalScaleDevice pxCPU
footeDP-1 (laptop)1440x96022880x1920125%
footDP-4 (ASUS 1440p)2560x144012560x1440103%
footDP-3 (ViewSonic 5K)2560x144025120x2880303%

Total ≈ 531% CPU (5.3 cores). Meanwhile Hyprland stayed at 9-11% and all
ttfx processes combined stayed under 10% — the compositor and the effect
generator are both cheap. The cost is entirely foot's CPU rasterization.

Thermals over roughly three minutes of screensaver:

  • Package temp: 60 C -> 97 C (crit 110)
  • Fan: 2421 -> 5682 RPM
  • package_throttle_count: 638 -> 1097

The two 1440p windows isolate the variable

DP-3 and DP-4 both got a 2560x1440 logical window — identical character
grid, identical font size, identical effect. The only difference is scale:
DP-3 renders 4x the device pixels and costs ~3x the CPU (303% vs 103%).

That rules out monitor count, grid size and effect complexity as the driver.
It is pixel-bound software rasterization. A single 5K display with no other
monitors attached would still cost ~300%.

Isolating ttfx

Running ttfx alone into an off-screen pty at the same grid (232x60) and
--frame-rate 120 costs 1.2% CPU. ttfx is not the problem; it is cheap
regardless of framerate. All of the cost is on the terminal-rendering side.

Why this is the default path

  • default/xdg-terminal-exec/hyprland-xdg-terminals.list lists only foot.desktop
  • install/omarchy-base.packages installs only foot
  • omarchy-screensaver also supports Alacritty / Ghostty / Kitty, which are all

OpenGL-accelerated and would be dramatically cheaper — but a stock install
never takes that path.

Additional notes

  • --frame-rate 120 is requested against 60Hz panels, so a portion of the

generated and parsed output can never be displayed.
- The idle cycle re-arms, so an unattended machine repeats the ~150s burn every
cycle rather than doing it once.

Suggestions

Offered as options, not a prescription:

  • Cap the framerate to the monitor's refresh rate, or lower the default well

below 120 (30-60 looks identical for these effects).
- Scale the framerate down as device-pixel count rises.
- Expose the framerate as a setting in shell.json alongside
idle.screensaver / idle.lock, so it can be tuned without editing a
package-owned file in /usr/share/omarchy/.
- Consider skipping or simplifying the screensaver above some pixel threshold.

Workaround

omarchy toggle screensaver, or set idle.lock close to idle.screensaver in
~/.config/omarchy/shell.json so hyprlock takes over quickly.

System details

Omarchy   4.0.1-1
Hyprland  0.56.2-1
foot      1.27.0-2
ttfx      0.3.2-1
mesa      1:26.2.1-1
kernel    7.1.9-arch1-2
CPU       Intel Core Ultra 7 165H (22 threads)
GPU       Intel Arc / Meteor Lake-P [8086:7d55], i915
Laptop    Framework
Monitors  eDP-1 2880x1920@120 scale2 / DP-3 5120x2880@60 scale2 / DP-4 2560x1440@60 scale1
View raw text
## Summary

On a HiDPI display, the screensaver saturates several CPU cores and drives the
machine into sustained thermal throttling. The cost scales with **device
pixels**, so it gets bad on a single 4K/5K panel and worse with more monitors.

Root cause is a combination of three things, all in the default configuration:

1. `omarchy-launch-screensaver` opens one fullscreen terminal **per monitor**.
2. `omarchy-screensaver` runs `ttfx` with a hardcoded `--frame-rate 120`.
3. Omarchy's only shipped/listed terminal is **foot**, which is a *software*
   renderer — it rasterizes with `libpixman` into a `wl_shm` buffer and links no
   `libGL`/`libEGL`/`libvulkan`.

Every screensaver frame is therefore rasterized on the CPU, full-screen, at
120fps, at native panel resolution.

## Measurements

Captured live while the screensaver was up (Framework 13, Core Ultra 7 165H,
Intel Arc iGPU, 3 monitors):

| Window | Monitor | Logical | Scale | Device px | CPU |
|---|---|---|---|---|---|
| foot | eDP-1 (laptop) | 1440x960 | 2 | 2880x1920 | 125% |
| foot | DP-4 (ASUS 1440p) | 2560x1440 | 1 | 2560x1440 | 103% |
| foot | DP-3 (ViewSonic 5K) | 2560x1440 | 2 | 5120x2880 | **303%** |

Total ≈ **531% CPU** (5.3 cores). Meanwhile `Hyprland` stayed at 9-11% and all
`ttfx` processes combined stayed under 10% — the compositor and the effect
generator are both cheap. The cost is entirely foot's CPU rasterization.

Thermals over roughly three minutes of screensaver:

- Package temp: 60 C -> **97 C** (crit 110)
- Fan: 2421 -> **5682 RPM**
- `package_throttle_count`: 638 -> **1097**

### The two 1440p windows isolate the variable

DP-3 and DP-4 both got a **2560x1440 logical** window — identical character
grid, identical font size, identical effect. The only difference is scale:
DP-3 renders 4x the device pixels and costs ~3x the CPU (303% vs 103%).

That rules out monitor count, grid size and effect complexity as the driver.
It is pixel-bound software rasterization. A single 5K display with no other
monitors attached would still cost ~300%.

## Isolating ttfx

Running `ttfx` alone into an off-screen pty at the same grid (232x60) and
`--frame-rate 120` costs **1.2% CPU**. `ttfx` is not the problem; it is cheap
regardless of framerate. All of the cost is on the terminal-rendering side.

## Why this is the default path

- `default/xdg-terminal-exec/hyprland-xdg-terminals.list` lists only `foot.desktop`
- `install/omarchy-base.packages` installs only `foot`
- `omarchy-screensaver` also supports Alacritty / Ghostty / Kitty, which are all
  OpenGL-accelerated and would be dramatically cheaper — but a stock install
  never takes that path.

## Additional notes

- `--frame-rate 120` is requested against 60Hz panels, so a portion of the
  generated and parsed output can never be displayed.
- The idle cycle re-arms, so an unattended machine repeats the ~150s burn every
  cycle rather than doing it once.

## Suggestions

Offered as options, not a prescription:

- Cap the framerate to the monitor's refresh rate, or lower the default well
  below 120 (30-60 looks identical for these effects).
- Scale the framerate down as device-pixel count rises.
- Expose the framerate as a setting in `shell.json` alongside
  `idle.screensaver` / `idle.lock`, so it can be tuned without editing a
  package-owned file in `/usr/share/omarchy/`.
- Consider skipping or simplifying the screensaver above some pixel threshold.

## Workaround

`omarchy toggle screensaver`, or set `idle.lock` close to `idle.screensaver` in
`~/.config/omarchy/shell.json` so hyprlock takes over quickly.

## System details

```
Omarchy   4.0.1-1
Hyprland  0.56.2-1
foot      1.27.0-2
ttfx      0.3.2-1
mesa      1:26.2.1-1
kernel    7.1.9-arch1-2
CPU       Intel Core Ultra 7 165H (22 threads)
GPU       Intel Arc / Meteor Lake-P [8086:7d55], i915
Laptop    Framework
Monitors  eDP-1 2880x1920@120 scale2 / DP-3 5120x2880@60 scale2 / DP-4 2560x1440@60 scale1
```

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/7193· 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 10:08 UTC