Running AI agents on Windows was a poor experience (PowerShell is not agent-friendly, and there are no great terminals available), and I also ran into some issues with WSL2. Since I prefer working on the CLI anyway, I decided to switch to Linux, and on a friend’s recommendation I went with CachyOS.
I have been on CachyOS for over a month now, and it has been a great experience — no crashes yet. These days I only keep Windows around for gaming. I have also been seeing a lot of Linux posts lately, so I decided to write this guide as a summary of my own tinkering.
The installation itself is fairly simple — the real work is the customization and configuration that comes after. If you don’t want to tinker, it’s probably not for you; but if you want a beautiful desktop and the latest software, it’s highly recommended.
CachyOS Installation
First, prepare a USB drive and the CachyOS system image. Download the desktop ISO from the CachyOS website, then write it to the USB drive to make a bootable drive. I recommend Ventoy for this — check its official site for details.
Once that’s ready, you can start the installation. I’ll demonstrate in a VM, so the screenshots may have some resolution issues.
Boot from the USB drive, adjust the language, and launch the installer.

Select the language to use.

Select the time zone.

Skip the keyboard step and move on to the bootloader selection. Limine is the default recommendation, but it requires at least 4 GB for the EFI partition, mounted at /boot. Since I was setting up a dual-boot system and didn’t allocate much space to CachyOS, I chose GRUB instead. Search for the differences and pick what fits your needs.

Now it’s time to partition. If you’re installing a dual-boot system, manual partitioning is recommended.

Select the free space you reserved and create a partition.

Create the EFI partition first. For GRUB, 1 GB is recommended, with the fat32 file system, mounted at /boot/efi, and the boot flag checked.

Next, use the remaining space for the system partition. Just set the mount point to / and leave everything else as default — adjust the size if needed. The default btrfs file system is recommended; CachyOS will set up subvolumes automatically. You can search for a swap partition tutorial if you want, but CachyOS uses zram by default, and you can also use a swap file instead of a dedicated partition, so I don’t recommend a swap partition.

Next, choose a desktop. The only ones I know of are KDE (the default), GNOME, Niri, and Hyprland. I prefer tiling window managers (Niri, Hyprland), and I heard Niri is a bit more stable than Hyprland, so I chose Niri. Pick whatever you like.

Select packages as needed (usually no changes required). I wanted Chrome, so I unchecked Firefox.

Finally, set up the account and password, then start the installation.

Configuration and Tuning
It’s been almost a month, so I’ve forgotten some of the configuration details. I’ll write down whatever comes to mind and add more later.
For configuration questions, check ArchWiki, or install an agent tool and let AI help you configure. Just don’t let the AI go wild and break your system — you can have it give you the steps and walk through them manually.
CachyOS uses fish as the default shell. You can switch to anything you like; I switched to zsh since I’m more used to it.
First, the update command:
1 | sudo pacman -Syu |
Snapshots
When you choose btrfs as the file system, CachyOS installs the btrfs assistant and snapper (for system snapshots) by default. You can open the btrfs assistant to adjust the snapshot settings. By default, snapshots are only created when installing, upgrading, or removing packages.
archlinuxcn Repo
CachyOS automatically picks suitable mirrors for your region, but the archlinuxcn repo is not enabled by default. I recommend adding it.
1 | sudo vim /etc/pacman.conf |
Add the following at the end:
1 | [archlinuxcn] |
One Server line is enough — pick whichever you like. Then install archlinuxcn-keyring and refresh the package database:
1 | sudo pacman -S archlinuxcn-keyring |
yay
I recommend installing yay (an AUR helper). Search for details if you’re not familiar with it.
1 | sudo pacman -S yay |
Note that you don’t need sudo in front of yay commands. After installing yay, I barely used pacman manually anymore.
Daily updates become:
1 | yay -Syu |
Here’s the general difference between packages with no suffix, with -bin, and with -git. I recommend the -bin versions:
- No suffix: downloads the source tarball of the official release and builds it locally
-bin: downloads the prebuilt binary of the official release — no local build needed-git: downloads the latest source from the git repository and builds it locally
Some packages without -bin still install the official prebuilt binary, such as closed-source software (e.g. linuxqq).
Network Issues
One painful issue is that AUR downloads can be slow or fail entirely, since source packages and prebuilt binaries are downloaded from GitHub. I won’t go into detail here — do your own research if needed.
CachyOS Hello
This app starts automatically on first boot and has some useful features. Click Apps/Tweaks.

I won’t go into detail on the tweaks section — you can search with AI and enable what you need.
For utilities, the first three are the ones I usually use.

Install it with:
1 | yay -S linuxqq |
Since it’s built with Electron, it has some issues on Linux. It starts under XWayland by default, and when I type too fast with the input method, characters get dropped. The fix is to run it with Wayland — configure ~/.config/qq-flags.conf and add the following:
1 | --ozone-platform=wayland |
VS Code
Install it with:
1 | yay -S visual-studio-code-bin |
On my Niri desktop, the keyring service isn’t detected automatically (other apps seem to have the same problem). Editing ~/.vscode/argv.json and manually setting password-store to gnome-libsecret fixed it.
Clipboard
Install wl-clip-persist to fix the issue where copied content becomes unavailable after you close the source application.
Install comalot-clipsync-git to fix the issue where content copied in X11 applications doesn’t sync to Wayland.
1 | yay -S wl-clip-persist comalot-clipsync-git |
Remember to set up autostart. For wl-clip-persist, I use Niri’s autostart with spawn-at-startup "wl-clip-persist" "--clipboard" "regular". For comalot-clipsync-git, use systemctl --user enable --now clipsync.
Input Method
I use fcitx5 + fcitx5-rime + rime-ice.
1 | yay -S fcitx5 fcitx5-rime fcitx5-configtool fcitx5-gtk fcitx5-qt rime-ice-git |
My ~/.local/share/fcitx5/rime/default.custom.yaml looks like this:
1 | patch: |
You also need to configure the environment variables. Edit ~/.config/environment.d/ime-env.conf and save:
1 | QT_IM_MODULES="wayland;fcitx;ibus" |
Configure ~/.config/gtk-3.0/settings.ini and ~/.config/gtk-4.0/settings.ini and save:
1 | [Settings] |
You can also run fcitx5-diagnose to troubleshoot input method issues.
To commit the raw string with shift while typing, open fcitx5-configtool, select 中州韵 (Rime), open its configuration, and set the behavior when switching input methods to “commit the raw string”.

Fonts
Here are the fonts and configuration I use — just for reference, feel free to adjust.
1 | yay -S inter-font noto-fonts-cjk noto-fonts-emoji ttf-sarasa-gothic ttf-lxgw-wenkai ttf-jetbrains-mono-nerd ttf-caladea |
Configure ~/.config/fontconfig/fonts.conf:
1 | <?xml version="1.0"?> |
Configure /etc/fonts/conf.d. Every file in it is a symlink — by default there should be 41 of them pointing into /usr/share/fontconfig/conf.default, and I added 2 more from /usr/share/fontconfig/conf.avail. The command is:
1 | sudo ln -s \ |
The complete set of symlinks looks like this:
1 | 10-hinting-slight.conf -> /usr/share/fontconfig/conf.default/10-hinting-slight.conf |
After configuring, refresh the font cache with fc-cache -fv.
Closing Thoughts
That’s about all I can think of. Other configuration — like Niri desktop theming, noctalia v5, terminals (I use ghostty), and various CLI tools — I haven’t covered, since those are all personal preference. Refer to the official docs and combine them with AI for configuration.
Finally, here’s a screenshot of my desktop:
