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

omarchy font set truncates the user's ~/.config/fontconfig/fonts.conf instead of writing a conf.d drop-in

Reported by fk1blow · filed Sep 22, 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

omarchy font set truncates the user's ~/.config/fontconfig/fonts.conf instead of writing a conf.d drop-inrevision 1 · captured 2026-09-28 21:23 UTC via poll

Summary

omarchy font set truncates ~/.config/fontconfig/fonts.conf and writes its own content over it. That file is the user's top-level fontconfig config, not Omarchy's — anything else kept in it (font substitutions, per-family aliases, rendering preferences, prgname scopes) is destroyed, with no merge, no backup and no warning.

The same happens via Super+Space → Fonts, since Menu.qml shells out to the same command.

The failure is hard to connect back to its cause: changing your terminal font silently deletes your fontconfig customizations, and nothing afterwards points at what happened.

Line references are against the packaged omarchy-font-set in 4.0.2-1.

Why

omarchy-font-set L51–53:

fontconfig_file="$HOME/.config/fontconfig/fonts.conf"
mkdir -p "$(dirname "$fontconfig_file")"
cat >"$fontconfig_file" <<XML

cat > truncates. The script never reads the existing file, so it cannot preserve anything, and unlike omarchy refresh it leaves no timestamped .bak.

The comment above that block is right that fontconfig should be the source of truth — it is the choice of file that is the problem. fonts.conf belongs to the user; a program contributing one rule should use the drop-in directory.

Repro

# add any rule of your own to your fontconfig
cat ~/.config/fontconfig/fonts.conf

# then set the font you are ALREADY using
omarchy font set "$(omarchy font current)"

cat ~/.config/fontconfig/fonts.conf   # your rule is gone
ls ~/.config/fontconfig/              # no backup

Verified on 4.0.2-1 with a <match target="font"> rgba rule. Note the font does not have to change — re-running with the currently-active font is already destructive, so this can fire on what the user reasonably believes is a no-op.

Suggested fix

Write to ~/.config/fontconfig/conf.d/50-omarchy-monospace.conf instead of owning fonts.conf. The file can still be written wholesale — it just stops being a file that belongs to someone else, so no merge logic is needed.

Omarchy already uses this convention at the system level: the package ships /usr/share/fontconfig/conf.avail/50-omarchy.conf, linked into /etc/fonts/conf.d/. This would make the user-level write consistent with that.

The load order works out correctly, which matters because the current rule needs to override the package's monospace assignment:

/etc/fonts/conf.d/50-omarchy.conf   package drop-in (assigns monospace)
/etc/fonts/conf.d/50-user.conf      sorts after "50-omarchy", and includes:
    ~/.config/fontconfig/conf.d/*       <- proposed location
    ~/.config/fontconfig/fonts.conf     <- user's own file, still loads last

So a drop-in there is applied after the package rule (it can still override it, as today) and before the user's own fonts.conf (so a user rule still wins over Omarchy's — arguably the correct precedence, and an improvement on the current behaviour where Omarchy simply deletes it).

A migration could strip the monospace block from an existing ~/.config/fontconfig/fonts.conf when that is all it contains, and leave the file alone otherwise.

If the drop-in move is unwanted, then at minimum back the file up the way omarchy refresh does rather than truncating in place.

Environment

  • omarchy 4.0.2-1
  • fontconfig 2:2.18.3-2
View raw text
### Summary

`omarchy font set` truncates `~/.config/fontconfig/fonts.conf` and writes its own content over it. That file is the user's top-level fontconfig config, not Omarchy's — anything else kept in it (font substitutions, per-family aliases, rendering preferences, `prgname` scopes) is destroyed, with no merge, no backup and no warning.

The same happens via **Super+Space → Fonts**, since `Menu.qml` shells out to the same command.

The failure is hard to connect back to its cause: changing your *terminal font* silently deletes your *fontconfig customizations*, and nothing afterwards points at what happened.

Line references are against the packaged `omarchy-font-set` in 4.0.2-1.

### Why

`omarchy-font-set` L51–53:

```bash
fontconfig_file="$HOME/.config/fontconfig/fonts.conf"
mkdir -p "$(dirname "$fontconfig_file")"
cat >"$fontconfig_file" <<XML
```

`cat >` truncates. The script never reads the existing file, so it cannot preserve anything, and unlike `omarchy refresh` it leaves no timestamped `.bak`.

The comment above that block is right that fontconfig should be the source of truth — it is the choice of *file* that is the problem. `fonts.conf` belongs to the user; a program contributing one rule should use the drop-in directory.

### Repro

```bash
# add any rule of your own to your fontconfig
cat ~/.config/fontconfig/fonts.conf

# then set the font you are ALREADY using
omarchy font set "$(omarchy font current)"

cat ~/.config/fontconfig/fonts.conf   # your rule is gone
ls ~/.config/fontconfig/              # no backup
```

Verified on 4.0.2-1 with a `<match target="font">` rgba rule. Note the font does not have to change — re-running with the currently-active font is already destructive, so this can fire on what the user reasonably believes is a no-op.

### Suggested fix

Write to `~/.config/fontconfig/conf.d/50-omarchy-monospace.conf` instead of owning `fonts.conf`. The file can still be written wholesale — it just stops being a file that belongs to someone else, so no merge logic is needed.

Omarchy already uses this convention at the system level: the package ships `/usr/share/fontconfig/conf.avail/50-omarchy.conf`, linked into `/etc/fonts/conf.d/`. This would make the user-level write consistent with that.

The load order works out correctly, which matters because the current rule needs to override the package's `monospace` assignment:

```
/etc/fonts/conf.d/50-omarchy.conf   package drop-in (assigns monospace)
/etc/fonts/conf.d/50-user.conf      sorts after "50-omarchy", and includes:
    ~/.config/fontconfig/conf.d/*       <- proposed location
    ~/.config/fontconfig/fonts.conf     <- user's own file, still loads last
```

So a drop-in there is applied *after* the package rule (it can still override it, as today) and *before* the user's own `fonts.conf` (so a user rule still wins over Omarchy's — arguably the correct precedence, and an improvement on the current behaviour where Omarchy simply deletes it).

A migration could strip the `monospace` block from an existing `~/.config/fontconfig/fonts.conf` when that is all it contains, and leave the file alone otherwise.

If the drop-in move is unwanted, then at minimum back the file up the way `omarchy refresh` does rather than truncating in place.

### Environment

- omarchy 4.0.2-1
- fontconfig 2:2.18.3-2

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 19:30 UTC