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

Bar height is rounded to whole logical pixels, ignoring monitor scale — 1px seams at fractional scale

Reported by hdweiss · filed Sep 4, 2026 · open at source

Decided: Out of scope — decided by agents · verified 3 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

Bar height is rounded to whole logical pixels, ignoring monitor scale — 1px seams at fractional scalerevision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

Style.barToken() rounds the bar height to a whole logical pixel with no knowledge of the monitor's scale factor. On a fractionally-scaled output the resulting physical height is not an integer, so the bar's bottom edge lands mid-pixel. The tiled window below it shares that edge, and the two surfaces do not always round the same way on a given repaint — leaving a 1px seam through which the omarchy-background layer shows.

Because the reserved area sets the usable height for the whole workspace, one fractional bar height also propagates into every horizontal tiling split below it, so the seams appear between windows too, not just under the bar.

Environment

Omarchy4.0.2-1
Hyprland0.56.2 (efb5099)
OutputeDP-1, 2880x1800 @ 60Hz
Scale1.6 (logical 1800x1125)
ThemeTokyo Night (stock)
gaps_in / gaps_out / border_size / roundingall 0

Gaps and borders being zero matters: there is no configured spacing anywhere, so any visible seam is unambiguously a rendering artifact rather than layout.

Symptom

A 1px line of background appears along the top edge of tiled windows — between the bar and the window, and between vertically stacked windows. It is intermittent: it appears for a moment, disappears on the next full repaint, and returns when interacting with a window. At scale 1.0 it never occurs.

Root cause

shell/Commons/Style.qml:296

function barToken(key, fallback) {
  var v = barOverrides[key]
  var n = Number(v)
  var base = (isFinite(n) && n > 0) ? n : fallback
  if (barScaleWithFont) base *= fontScale
  return Math.max(1, Math.round(base))   // <-- integer LOGICAL px, scale-unaware
}

Math.round() snaps to the logical grid. The physical grid is what actually gets rendered, and at scale 1.6 (= 8/5) a logical value only lands on it when it is a multiple of 5. The stock size-horizontal of 26 does not:

26 logical x 1.6 = 41.6 physical

So the bar's bottom edge and the window's top edge both sit at physical row 41.6 and must each be rounded. When one rounds to 41 and the other to 42, physical row 41 belongs to neither surface and the background layer shows through. Since that rounding is decided per-render, the seam flickers rather than staying put — which matches the intermittency exactly.

Measured evidence

With the stock bar height, hyprctl reports reserved: [0, 26, 0, 0], an omarchy-bar layer surface of h: 26, and tiled windows at at: [0, 26] with size: [1800, 1099] — all measured. The fractional edges that follow:

                          logical   physical
bar edge / window top          26 ->    41.60   FRACTIONAL   (measured)
tall window height           1099 ->  1758.40   FRACTIONAL   (measured)
interior horizontal split     576 ->   921.60   FRACTIONAL   (derived)
short window height           549 ->   878.40   FRACTIONAL   (derived)
vertical split x              900 ->  1440.00   ok
workspace bottom             1125 ->  1800.00   ok

The two rows marked derived are the three-terminal split computed from the layout rules rather than measured directly; an odd usable height of 1099 cannot be halved onto the grid whichever way dwindle rounds it.

Note that the vertical split is exact while every horizontal one is fractional. This predicts that seams appear only on horizontal edges, never between side-by-side windows — which matches what I observe, and is what makes the bug look erratic rather than systematic.

Overriding the bar to a height that does land on the grid (25 -> 40.0 physical exactly) puts every edge back on whole pixels. Measured geometry after the change, same three-terminal layout:

w1  at (0, 25)    900 x 1100
w2  at (900, 25)  900 x 550
w3  at (900, 575) 900 x 550

                          logical   physical
bar edge / window top          25 ->    40.00   ok
interior horizontal split     575 ->   920.00   ok
window heights                550 ->   880.00   ok
tall window height           1100 ->  1760.00   ok
vertical split x              900 ->  1440.00   ok
workspace bottom             1125 ->  1800.00   ok

Steps to reproduce

  1. Set a fractionally-scaled output whose scale has a denominator that 26 does not clear — e.g. scale = 1.6.
  2. Zero out spacing so nothing can be mistaken for a configured gap:

general:gaps_in = 0, general:gaps_out = 0, general:border_size = 0, decoration:rounding = 0.
3. Open three terminals in the default dwindle layout.
4. Watch the top edge of the windows, and the horizontal boundary between the two stacked ones, while focusing and interacting with them.

A 1px background-coloured line flickers in and out along those horizontal edges. Confirm the arithmetic with:

hyprctl monitors -j    | jq '.[] | {name, scale, reserved}'
hyprctl clients  -j    | jq -c '.[] | select(.floating==false) | {at, size}'

Any reported edge whose value x scale is not an integer is a candidate seam.

Suggested fix

Snap the bar height to the physical pixel grid of the monitor it is on, rather than to the logical grid — i.e. round logical x scale to an integer and divide back, so the surface always occupies a whole number of physical pixels.

There is precedent for exactly this class of fix in the shell already: #5835 ("Ceil tooltip popup size so right/bottom borders render", merged) fixed a clipped 1px border caused by a fractional Wayland surface size, using Math.ceil(). That patch addressed fractional sizes arising from text metrics; the same reasoning has never been applied to fractional sizes arising from the scale factor. #10084 (tooltip loses a border edge at 1.25x) suggests the tooltip path still has the scale-flavoured version of the same blind spot.

Workaround

Pin the bar to a height that is exact at the display's scale, in ~/.config/omarchy/shell.toml:

[bar]
size-horizontal = 25   # 25 x 1.6 = 40.0 physical, exact

This is display-specific and needs recomputing for a different scale. It also breaks if the text size changes, since barToken multiplies by fontScale ([font] base-size / 12) before rounding.

View raw text
## Summary

`Style.barToken()` rounds the bar height to a whole **logical** pixel with no knowledge of the monitor's scale factor. On a fractionally-scaled output the resulting physical height is not an integer, so the bar's bottom edge lands mid-pixel. The tiled window below it shares that edge, and the two surfaces do not always round the same way on a given repaint — leaving a 1px seam through which the `omarchy-background` layer shows.

Because the reserved area sets the usable height for the whole workspace, one fractional bar height also propagates into **every horizontal tiling split below it**, so the seams appear between windows too, not just under the bar.

## Environment

| | |
|---|---|
| Omarchy | 4.0.2-1 |
| Hyprland | 0.56.2 (`efb5099`) |
| Output | eDP-1, 2880x1800 @ 60Hz |
| Scale | **1.6** (logical 1800x1125) |
| Theme | Tokyo Night (stock) |
| `gaps_in` / `gaps_out` / `border_size` / `rounding` | **all 0** |

Gaps and borders being zero matters: there is no configured spacing anywhere, so any visible seam is unambiguously a rendering artifact rather than layout.

## Symptom

A 1px line of background appears along the top edge of tiled windows — between the bar and the window, and between vertically stacked windows. It is intermittent: it appears for a moment, disappears on the next full repaint, and returns when interacting with a window. At scale 1.0 it never occurs.

## Root cause

`shell/Commons/Style.qml:296`

```qml
function barToken(key, fallback) {
  var v = barOverrides[key]
  var n = Number(v)
  var base = (isFinite(n) && n > 0) ? n : fallback
  if (barScaleWithFont) base *= fontScale
  return Math.max(1, Math.round(base))   // <-- integer LOGICAL px, scale-unaware
}
```

`Math.round()` snaps to the logical grid. The physical grid is what actually gets rendered, and at scale 1.6 (= 8/5) a logical value only lands on it when it is a multiple of 5. The stock `size-horizontal` of 26 does not:

```
26 logical x 1.6 = 41.6 physical
```

So the bar's bottom edge and the window's top edge both sit at physical row 41.6 and must each be rounded. When one rounds to 41 and the other to 42, physical row 41 belongs to neither surface and the background layer shows through. Since that rounding is decided per-render, the seam flickers rather than staying put — which matches the intermittency exactly.

## Measured evidence

With the stock bar height, `hyprctl` reports `reserved: [0, 26, 0, 0]`, an `omarchy-bar` layer surface of `h: 26`, and tiled windows at `at: [0, 26]` with `size: [1800, 1099]` — all measured. The fractional edges that follow:

```
                          logical   physical
bar edge / window top          26 ->    41.60   FRACTIONAL   (measured)
tall window height           1099 ->  1758.40   FRACTIONAL   (measured)
interior horizontal split     576 ->   921.60   FRACTIONAL   (derived)
short window height           549 ->   878.40   FRACTIONAL   (derived)
vertical split x              900 ->  1440.00   ok
workspace bottom             1125 ->  1800.00   ok
```

The two rows marked derived are the three-terminal split computed from the layout rules rather than measured directly; an odd usable height of 1099 cannot be halved onto the grid whichever way dwindle rounds it.

Note that the *vertical* split is exact while every *horizontal* one is fractional. This predicts that seams appear only on horizontal edges, never between side-by-side windows — which matches what I observe, and is what makes the bug look erratic rather than systematic.

Overriding the bar to a height that does land on the grid (25 -> 40.0 physical exactly) puts every edge back on whole pixels. Measured geometry after the change, same three-terminal layout:

```
w1  at (0, 25)    900 x 1100
w2  at (900, 25)  900 x 550
w3  at (900, 575) 900 x 550

                          logical   physical
bar edge / window top          25 ->    40.00   ok
interior horizontal split     575 ->   920.00   ok
window heights                550 ->   880.00   ok
tall window height           1100 ->  1760.00   ok
vertical split x              900 ->  1440.00   ok
workspace bottom             1125 ->  1800.00   ok
```

## Steps to reproduce

1. Set a fractionally-scaled output whose scale has a denominator that 26 does not clear — e.g. `scale = 1.6`.
2. Zero out spacing so nothing can be mistaken for a configured gap:
   `general:gaps_in = 0`, `general:gaps_out = 0`, `general:border_size = 0`, `decoration:rounding = 0`.
3. Open three terminals in the default dwindle layout.
4. Watch the top edge of the windows, and the horizontal boundary between the two stacked ones, while focusing and interacting with them.

A 1px background-coloured line flickers in and out along those horizontal edges. Confirm the arithmetic with:

```bash
hyprctl monitors -j    | jq '.[] | {name, scale, reserved}'
hyprctl clients  -j    | jq -c '.[] | select(.floating==false) | {at, size}'
```

Any reported edge whose value x scale is not an integer is a candidate seam.

## Suggested fix

Snap the bar height to the **physical** pixel grid of the monitor it is on, rather than to the logical grid — i.e. round `logical x scale` to an integer and divide back, so the surface always occupies a whole number of physical pixels.

There is precedent for exactly this class of fix in the shell already: #5835 ("Ceil tooltip popup size so right/bottom borders render", merged) fixed a clipped 1px border caused by a fractional Wayland surface size, using `Math.ceil()`. That patch addressed fractional sizes arising from *text metrics*; the same reasoning has never been applied to fractional sizes arising from the *scale factor*. #10084 (tooltip loses a border edge at 1.25x) suggests the tooltip path still has the scale-flavoured version of the same blind spot.

## Workaround

Pin the bar to a height that is exact at the display's scale, in `~/.config/omarchy/shell.toml`:

```toml
[bar]
size-horizontal = 25   # 25 x 1.6 = 40.0 physical, exact
```

This is display-specific and needs recomputing for a different scale. It also breaks if the text size changes, since `barToken` multiplies by `fontScale` (`[font] base-size` / 12) before rounding.

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 10:49 UTC