# Cursor invisible, wrong size, or a black box on Omarchy
Mouse pointer missing, tiny, huge, or drawn as a black square on Omarchy 4. Force software cursors in looknfeel.lua and set the size where Hyprland reads it.
> **Short answer:** If the pointer is invisible, glitchy, or a black box, force software cursors: add an hl.config block with cursor.no_hardware_cursors = true to ~/.config/hypr/looknfeel.lua, then run hyprctl reload. If the size is wrong, do not use ~/.config/hypr/envs.lua, which Omarchy 4 never loads. Put hl.env("XCURSOR_SIZE", "32") at the bottom of ~/.config/hypr/hyprland.lua and log out.
- Applies to Omarchy: 3.x and later
- Status: workaround
- Last verified: 2026-09-16
- Canonical: https://omarchylinux.org/fix/cursor-invisible-or-wrong-size/
_Unofficial community page. Not affiliated with 37signals or the Omacom Foundation. Omarchy is a registered trademark of 37signals LLC._

Three different problems share the same symptom bucket here: the pointer is gone, the pointer is drawn as a black square or a smear, or the pointer is the wrong size. The first two are the same class of bug on different GPU drivers. The third is a config plumbing problem specific to Omarchy 4.

## The fix

### Pointer invisible, a black box, or glitchy (Omarchy 4.0.x)

1. Open `~/.config/hypr/looknfeel.lua` and append:

```lua
-- The GPU's hardware cursor plane does not display the pointer here.
hl.config({
  cursor = {
    no_hardware_cursors = true,
  },
})
```

2. Run `hyprctl reload`.

That is the exact block Omarchy itself appends on nouveau machines in `install/user/hardware/fix-nouveau-cursor.sh`, shipped since 4.0.0. It is also the block BigNatoDemon verified on a VMware guest in issue #7918.

Do not put a `cursor { ... }` section in `hyprland.conf` on 4.x. A legacy `.conf` block is ignored once a `hyprland.lua` config exists.

Do not reach for `hyprctl keyword cursor:no_hardware_cursors true` either. On 4.x it prints `keyword can't work with non-legacy parsers. Use eval.` and changes nothing, still exiting 0. Issue #8797 records that message, and also a session on an AMD iGPU that died with SIGABRT the moment `omarchy-capture-screenshot` ran its `hyprctl eval` of this same setting. The triage on that issue traced the faulting frame to a stale keybind handle in Hyprland 0.56.2 rather than to the cursor option, but the crash was real, and editing the file and reloading avoids the question.

### Pointer invisible, a black box, or glitchy (3.8.4 and earlier)

Append to `~/.config/hypr/looknfeel.conf`:

```
cursor {
  no_hardware_cursors = true
}
```

Then `hyprctl reload`. This is the pre-Quattro form of the same setting. theswampdawg put it in `input.conf` and it fixed #4847 on an AMD RX 6700 XT dual-monitor desktop; commenters who hit the same black box right after updating to 3.4.1 fixed it the same way. Any personal `.conf` file that `hyprland.conf` sources will do.

### Pointer is the wrong size (Omarchy 4.0.x)

The default is 24. Do not create `~/.config/hypr/envs.lua`: nothing requires that module, so anything you set there is silently dropped. Issue #9902 documents this, and the triage comment on that issue reproduced it on a clean 4.0 worker: variables set in a personal `envs.lua` never reached a spawned client, while the `XCURSOR_SIZE=24` from `default/hypr/envs.lua` did.

1. Open `~/.config/hypr/hyprland.lua` and add this at the very bottom, under the "Add any other personal Hyprland configuration below" comment:

```lua
hl.env("XCURSOR_SIZE", "32")
hl.env("HYPRCURSOR_SIZE", "32")
```

2. Set the GTK side too, because Omarchy never touches it:

```bash
gsettings set org.gnome.desktop.interface cursor-size 32
```

3. Log out and back in. Environment variables reach applications when they launch, so `hyprctl reload` is not enough.

The tail of `hyprland.lua` is evaluated after `require("default.hypr.omarchy")`, so your value wins over the 24 in `default/hypr/envs.lua`. The triage on #9902 checked exactly this: an `XCURSOR_SIZE` of 99 set after the defaults replaced the 24 in a spawned client.

### Pointer is the wrong size (3.8.4 and earlier)

`~/.config/hypr/envs.conf` is not sourced by the shipped `hyprland.conf` on 3.8.4 either. Put `env = XCURSOR_SIZE,32` at the bottom of `~/.config/hypr/hyprland.conf` and log out.

### Wrong cursor theme

Omarchy installs no cursor theme package of its own and never sets `org.gnome.desktop.interface cursor-theme`. Discussion #8428 asks how to make Bibata the default and has no answer beyond another user asking the same thing. Install a theme, then apply it in both places:

```bash
gsettings set org.gnome.desktop.interface cursor-theme "Bibata-Modern-Classic"
hyprctl setcursor Bibata-Modern-Classic 24
```

To make the Hyprland half survive a relogin, `XCURSOR_THEME` is the standard variable clients read, so `hl.env("XCURSOR_THEME", "Bibata-Modern-Classic")` alongside the size lines at the bottom of `hyprland.lua` uses the same channel as the size override. Nobody on the tracker has confirmed that exact line, so check a fresh client's environment afterwards as described below. Check your theme actually provides a cursor named `default`: on discussion #10947 a reporter saw imv 5.0.1 crash with a theme that does not.

## Verify it worked

```bash
hyprctl getoption cursor:no_hardware_cursors
hyprctl configerrors
```

The first should report the value you set, the second should be empty. For the size, read the environment of a freshly launched application rather than trusting the config:

```bash
tr '\0' '\n' < /proc/$(pgrep -n ghostty)/environ | grep -i cursor
```

If the hardware cursor plane was the problem, the error spam stops. Check the session log at `/run/user/$UID/hypr/$HYPRLAND_INSTANCE_SIGNATURE/hyprland.log` for `drmCloseBufferHandle in cursor failed`, which BigNatoDemon counted over 1700 times in a few hours before applying the fix.

## Why it happens

Hyprland normally hands the pointer to a dedicated DRM cursor plane on the GPU. Several drivers accept the buffer and then fail the commit, so the plane shows nothing, a stale black buffer, or a partial smear. Confirmed on nouveau (Omarchy automates the fix there), on VMware's vmwgfx, and on AMD dual-monitor desktops in #4847 and #4934. Software cursors cost almost nothing on a desktop and simply sidestep the plane. The AMD case was expected to get a Hyprland-side fix at the time, and #4847 was closed in a bulk review in July 2026 rather than by a change in Omarchy, so a current Hyprland may not need the setting on that hardware.

The size problem is unrelated. Omarchy 4 moved Hyprland config to Lua, and the personal override files that `hyprland.lua` requires are `monitors`, `input`, `bindings`, `looknfeel` and `autostart`. There is no `envs` in that list and Omarchy has never shipped a `config/hypr/envs.lua`, so a file you create there is dead code. The session environment channel the manual points at, `~/.config/uwsm/env.d/*`, is exported before Hyprland starts, so it cannot override anything Omarchy sets with `hl.env` afterwards.

If your pointer fix vanished during the 3 to 4 upgrade, that is expected: `hypr/looknfeel.lua` is on the upgrade's always-copy list, and your old `looknfeel.conf` is deliberately left on disk unread so you can port it by hand.

## If that did not work

- The pointer comes back and then breaks again in the same session. That is #11943, still open on 4.0.3 with `no_hardware_cursors` already set, on a hybrid Intel plus NVIDIA laptop driving four outputs. `hyprctl setcursor Adwaita 24` re-renders it each time, but only until the next recurrence.
- The pointer is visible but laggy across monitors rather than missing. Give each output an explicit rule instead of a generic one, as al3rez did in #2132. Ignore the `WLR_NO_HARDWARE_CURSORS` line in that issue: that variable is ignored by current Hyprland, and the rest of that config is 3.x `.conf` syntax you would have to port.
- The pointer disappears only while you are dragging a screenshot selection. That is #8240, open: `omarchy-capture-screenshot` forces hardware cursors back on before opening the picker so the software pointer is not baked into the capture, which hides it on exactly the hardware that needs software cursors.
- Night light does not tint the pointer. Cosmetic and open as #4973.
- If you lose the pointer on a big screen rather than seeing it broken, discussion #5833 is where people compare the `hypr-dynamic-cursors` plugin. Third party plugins are not covered by Omarchy support.

## Related

- [Hybrid GPU laptop black screen](/fix/hybrid-gpu-laptop-black-screen-aq-drm-devices/)
- [NVIDIA drivers on Omarchy 4](/fix/nvidia-drivers-omarchy-4/)
- [Fractional scaling looks blurry or huge](/fix/fractional-scaling-blurry-or-huge-apps/)
- [Screenshot shortcut not working](/fix/screenshot-shortcut-not-working/)
- [Hardware notes: hybrid GPU](/hardware/hybrid-gpu/) and [multi-monitor](/hardware/multi-monitor/)
- Omarchy manual: [Keyboard, mouse and trackpad](https://omarchy.org/manual/keyboard-mouse-trackpad/)

## Sources

- [Issue #4847: Cursor on second monitor is displayed as a black box](https://github.com/omacom/omarchy/issues/4847)
- [Issue #4934: Cursor renders as a large black square on secondary monitor](https://github.com/omacom/omarchy/issues/4934)
- [Issue #7918: Invisible mouse cursor in VMware guest: vmwgfx hardware cursor plane fails to commit (needs no_hardware_cursors)](https://github.com/omacom/omarchy/issues/7918)
- [Issue #11943: Hardware cursor intermittently stops rendering on hybrid Intel/NVIDIA multi-monitor laptop (recurs despite no_hardware_cursors=true)](https://github.com/omacom/omarchy/issues/11943)
- [Issue #9902: 4.0.x: user ~/.config/hypr/envs.lua is never loaded](https://github.com/omacom/omarchy/issues/9902)
- [Issue #8240: Screenshot picker runs with hardware cursors forced on, hiding the pointer on nouveau/vmwgfx while you select](https://github.com/omacom/omarchy/issues/8240)
- [Issue #8797: omarchy-capture-screenshot kills the compositor: hyprctl eval of cursor:no_hardware_cursors faults in hl.config() (SIGABRT)](https://github.com/omacom/omarchy/issues/8797)
- [Issue #2132: Cursor lag on dual monitor setup with NVIDIA (RTX 4090) - Solution included](https://github.com/omacom/omarchy/issues/2132)
- [Issue #4973: Night light does not apply to cursor](https://github.com/omacom/omarchy/issues/4973)
- [Discussion #8428: How can I change the default mouse cursor to Bibata Modern Classic?](https://github.com/omacom/omarchy/discussions/8428)
- [Discussion #10947: Consider Oxygen White as the default cursor](https://github.com/omacom/omarchy/discussions/10947)
- [Discussion #5833: shake to find cursor](https://github.com/omacom/omarchy/discussions/5833)
- [Omarchy v4.0.0 release notes (Force software cursors on nouveau)](https://github.com/omacom/omarchy/releases/tag/v4.0.0)
- [Omarchy manual: Keyboard, mouse and trackpad](https://omarchy.org/manual/keyboard-mouse-trackpad/)
