If you want a clean, modern look for your cursor on Omarchy (or Hyprland with Lua configuration), Bibata Modern Classic is one of the sleekest cursor themes available. It is a proper XCursor theme with a full set of pointers — not a single PNG you drop on the desktop — so GTK apps, Electron apps, and Hyprland’s own cursor can agree on the same look.

Official repository: Bibata Cursor on GitHub

This guide covers downloading the release tarball, installing it for one user or system-wide, pointing Omarchy/Hyprland at Bibata-Modern-Classic, and the mismatches that make it look like the theme did not apply. I run this on Omarchy; the same env vars work on a vanilla Hyprland Arch install.

If you are still fighting a black screen on the Omarchy ISO itself, fix that first: How to install Omarchy ISO with nomodeset. A cursor theme will not help a compositor that never started.

Why bother with a cursor theme?

Hyprland and Omarchy pick a default cursor that is fine. Bibata is a quality-of-life change: thicker hotspots that you can actually see on a 4K panel, a consistent look between GTK and Qt, and a theme that does not scream “I never left the 2004 default white pointer.”

On a tiling compositor this matters more than on GNOME. You jump between terminals, browsers, and IDEs all day. If half of them show Bibata and the other half show Adwaita, your brain notices. Setting XCURSOR_THEME and XCURSOR_SIZE in the compositor environment is how you make new processes inherit the same values. Setting them only in ~/.bashrc is why people swear the theme “randomly reverts.”

Prerequisites

  • Omarchy, or Arch with Hyprland.
  • tar and a text editor.
  • The Bibata-Modern-Classic archive from the GitHub releases page (not a random AUR snapshot unless you prefer that variant — see below).
  • A session you can log out of. Some apps pick up the theme on save; others need a restart.

Optional but useful:

pacman -Q hyprland xorg-xcursor-themes gtk-update-icon-cache 2>/dev/null || true
mkdir -p ~/.local/share/icons ~/.config/hypr

You do not need xorg-xcursor-themes to use Bibata. You need a cursor loader in the stack, which Hyprland and GTK already provide.

1. Download and extract the cursor theme

Download the latest release archive (Bibata-Modern-Classic.tar.xz) from the Bibata Cursor releases page. In your terminal, extract the archive:

# Extract the Bibata archive
tar -xvf Bibata-Modern-Classic.tar.xz

Expected output: one or more directories named like Bibata-Modern-Classic, sometimes alongside Ice and Amber variants if you grabbed a bundle. Each directory must contain an index.theme and a cursors/ folder. If you only see loose .png files, you downloaded the source art, not the compiled XCursor theme.

ls Bibata-Modern-Classic/index.theme Bibata-Modern-Classic/cursors | head

index.theme should mention Inherits / Name=Bibata-Modern-Classic. The cursors/ directory holds the actual pointer files (left_ptr, wait, sb_h_double_arrow, and so on). Hyprland looks up those names. If a name is missing, you get a fallback arrow from the previous theme — which looks like “Bibata only applied in some windows.”

Variant: install from the AUR

On Arch you can skip the tarball:

yay -S bibata-cursor-theme-bin

That drops the themes under /usr/share/icons/. The rest of this guide (Hyprland env vars) is the same. I still document the tarball because Omarchy users who avoid extra AUR packages can keep this fully user-local, same pattern as the Antigravity tarball install.

2. Install the cursor theme

Depending on whether you want the theme available only for your user account or system-wide for all users, move the extracted Bibata-* folders to the corresponding icons folder.

Option A: Single user install (local user)

# Install to local user icons folder
mv Bibata-* ~/.local/share/icons/

This is what I use. No sudo. Survives Omarchy system updates. Other accounts on the machine will not see the theme unless they install it too.

Option B: System-wide install (all users)

# Install to system icons folder
sudo mv Bibata-* /usr/share/icons/

Use this on a shared workstation. On an immutable Fedora spin this would be the wrong tool; you are on Arch/Omarchy here, so /usr/share/icons is writable.

After either option:

ls ~/.local/share/icons/Bibata-Modern-Classic/index.theme \
   /usr/share/icons/Bibata-Modern-Classic/index.theme 2>/dev/null

At least one of those paths must exist. The Name inside index.theme is the string you will put in XCURSOR_THEME. It is Bibata-Modern-Classic with hyphens, not spaces. Typos here are silent: Hyprland falls back to the previous cursor and you think the config is ignored.

Refresh the icon cache if you have the helper:

gtk-update-icon-cache -f ~/.local/share/icons/Bibata-Modern-Classic 2>/dev/null || true

3. Configure Hyprland (hyprland.lua)

To enforce Bibata-Modern-Classic as your cursor theme and set your preferred cursor size in Omarchy / Hyprland:

  1. Open your Hyprland config (Navigate to Setup -> Config -> Hyprland or edit ~/.config/hypr/hyprland.lua).
  2. Add the following Lua environment variable declarations at the bottom of hyprland.lua:
-- Set cursor variables and startup commands using Lua syntax
hl.env("XCURSOR_SIZE", "24")
hl.env("XCURSOR_THEME", "Bibata-Modern-Classic")

Why these two variables? XCURSOR_THEME is the X11/Wayland cursor theme name. XCURSOR_SIZE is the pixel size. 24 is a good default on a 1080p or 1440p panel. On a HiDPI laptop I bump it to 32 or 36 instead of relying on fractional scaling to enlarge a tiny pointer. Pick one size and stick to it; mixing 24 in Hyprland and 16 in GTK is how you get a cursor that “jumps” when you hover a GTK window.

Variant: classic hyprland.conf

Older Omarchy builds and stock Hyprland use hyprland.conf:

env = XCURSOR_SIZE,24
env = XCURSOR_THEME,Bibata-Modern-Classic

You can also set the Hyprland-native cursor (independent of XCursor) if your build supports it:

misc {
    # example; check `hyprctl getoption` on your version
}

I still set the XCURSOR_* env vars even when Hyprland has its own cursor setting, because GTK 3, Electron, and Firefox read the environment, not Hyprland’s internal option.

Variant: GTK and Qt so apps match

After the compositor env is set, tell GTK 3/4 explicitly:

mkdir -p ~/.config/gtk-3.0 ~/.config/gtk-4.0

In ~/.config/gtk-3.0/settings.ini and ~/.config/gtk-4.0/settings.ini:

[Settings]
gtk-cursor-theme-name=Bibata-Modern-Classic
gtk-cursor-theme-size=24

Qt apps honor XCURSOR_THEME if they are not forcing their own theme. If a single Qt app misbehaves, QT_QPA_PLATFORMTHEME is a separate rabbit hole — do not chase it until Hyprland and GTK already match.

4. Apply and test

Log out and back in, or reload your Hyprland environment. (My changes took place as soon as I saved the .lua file.) Your cursor will now update to Bibata-Modern-Classic at size 24.

Quick checks:

echo "$XCURSOR_THEME" "$XCURSOR_SIZE"
hyprctl reload
# move the pointer over a terminal, a browser, and the desktop wallpaper

Expected result: the same Bibata pointer everywhere, including while waiting (watch / busy cursor) and while resizing windows. If the desktop pointer changed but Firefox is still Adwaita, Firefox was started before the env var existed — close it fully (check the system tray) and reopen.

On Omarchy 4 Quattro the shell (bar, launcher, lock screen) is a Quickshell process. It inherits compositor env at start. If the bar’s pointer looks old but tiled windows look new, restart the shell from Omarchy’s update/restart menu rather than only hyprctl reload.

Troubleshooting

Theme name does not match the folder

XCURSOR_THEME must match the Name= in index.theme, which for this release is Bibata-Modern-Classic. Bibata, bibata-modern-classic, and Bibata Modern Classic are all wrong.

Cursor is huge or tiny after a scale change

You set XCURSOR_SIZE to 24 and then enabled 150% monitor scale. Some clients scale the cursor again. Either drop monitor scale and use a larger cursor size, or keep scale and use 24. Do not stack both without looking. I treat cursor size as a per-machine preference, not a copy-paste constant.

Hotspot feels “off”

That is the theme, not Hyprland. Bibata’s hotspot is slightly different from Adwaita. Give it a day. If it truly bothers you, try Bibata-Modern-Ice from the same project instead of Classic — same install path, different XCURSOR_THEME string.

Only root apps show the old cursor

Root does not read ~/.local/share/icons. Either install system-wide (Option B) or accept that sudo -E / pkexec apps may show the default pointer. I do not copy cursor themes into /root.

AUR package vs tarball conflict

If both /usr/share/icons/Bibata-Modern-Classic and ~/.local/share/icons/Bibata-Modern-Classic exist, the user copy wins for your session. If they are different versions, you will think updates “did nothing.” Pick one location and delete the other.

Wrap-up

Bibata Modern Classic on Omarchy is three honest steps: extract an XCursor theme into an icons directory, point Hyprland at XCURSOR_THEME / XCURSOR_SIZE, and restart anything that started too early. Once GTK settings match, the pointer stops changing personality every time you hover a different toolkit.

If you are comparing Omarchy as a daily driver against Fedora or CachyOS, I wrote that up separately: Omarchy 4 Quattro vs Fedora 44 and Omarchy vs CachyOS.

Best regards,

The Linux IT Guy