Ricing means customising a Linux desktop piece by piece until it looks and works exactly the way you want: the window manager, the bar, the launcher, the terminal, the fonts and the colours. Nobody needs a rice, but building one teaches you how a Linux desktop is put together, because you have to choose and configure every layer yourself.
What a rice is made of
A desktop environment such as GNOME or KDE Plasma ships every part of the desktop together, with a settings app on top. Ricers usually go the other way: they start from a bare window manager and add the other parts one at a time. A typical rice has:
- a window manager, which decides where windows go and how big they are;
- a bar along one edge, showing workspaces, the time and whatever else you want;
- a launcher that opens apps from the keyboard;
- a terminal with a font that has icons in it;
- a colour scheme shared by all of the above;
- the dotfiles that hold every one of those settings.
Each part is a separate program with its own config file. That is why ricing takes so long, and also why you can swap one part (say, the launcher) without touching the rest.
The window manager decides the layout
Most people know floating window managers: every window opens somewhere on the screen and you drag and resize it yourself. A tiling window manager arranges windows for you, so they never overlap and no space is wasted.
dwm, from the suckless project, is a small tiling window manager for X11. Out of the box it is a black screen with a thin bar along the top:
In its default tiled layout, dwm splits the screen into a master area on the left and a stack on the right. A new window takes the master area and pushes the older ones into the stack. Here is that happening as four terminals open:
dwm has two other layouts: monocle, where every window fills the screen and you see one at a time, and floating, for the odd window you want to place by hand. Instead of workspaces it has nine tags. Each window carries one or more tags, and pressing a tag's number on the keyboard shows the windows that carry it.
Why dwm makes you recompile
dwm has no settings menu and no config file that it reads when it starts. Its settings live in config.h, a C header file that is compiled into the program. A fresh copy of the source has a config.def.h template. You copy it to config.h, open it in any text editor (Vim works well), change values such as the border width, the colours, the font or the key bindings, then build and install dwm again and restart it.
That sounds like a lot of work for a colour change, and it is. The suckless developers chose it on purpose: with nothing to parse at runtime, dwm stays tiny (the ArchWiki notes its stated aim of staying under 2,000 lines of C) and fast. Features it doesn't have, such as gaps between windows, come as patches: diff files you apply to the source. Patches written for different versions often clash with each other, so a heavily patched dwm can take some fixing before it compiles.
If you would rather edit a text file and reload, pick a window manager that works that way. i3 and bspwm do on X11. On Wayland, the newer display system many distributions now default to, Sway and Hyprland work the same way, and dwl is a dwm-like compositor. dwm itself only runs on X11.
The bar shows whatever you print to it
dwm has its bar built in. The left side shows the tags, the layout symbol ([]= for tiled) and the focused window's title. The right side shows a line of status text, and dwm takes that text from the name of the X root window, the window everything else is drawn inside.
So a status bar in dwm is just a small script that builds a line of text (the time, the battery level, the weather) and sets it as the root window's name, again and again in a loop. Tools such as slstatus do the same job as a compiled program. Keep a pause between updates: the ArchWiki warns that a loop with no sleep will push CPU use right up, and once a minute is plenty for a clock.
The launcher opens apps from the keyboard
A launcher is a pop-up search box for your apps. Rofi is a popular one: press a key binding, type a couple of letters, and it filters the list as you type; press Enter and the app opens and tiles into place. Rofi can also switch between open windows, run commands from your PATH and act as a drop-in replacement for dmenu, the plain launcher dwm's default config calls. It runs on X11 and, since 2025, officially on Wayland too.
The terminal and its font
The terminal is where you spend most of your time, so it gets the most attention. The rice in the video uses the kitty terminal, which reads every setting from one file, kitty.conf.
The font matters as much as the terminal. A Nerd Font is an ordinary programming font patched with thousands of extra glyphs: file-type icons, Git branch symbols, the Powerline arrows, distro logos. Prompt tools such as Starship, which works in bash, zsh and fish, use those glyphs to show your Git branch or your language version as icons. Without a Nerd Font set in the terminal, each icon shows as an empty box or a question mark.
One colour scheme across all of it
What makes a desktop look designed rather than assembled is one palette used everywhere. Catppuccin is a community colour scheme of soft pastels in four flavours: Latte (light) and Frappé, Macchiato and Mocha (dark). Its main draw for ricers is the number of ports: ready-made themes for hundreds of apps, kitty and Rofi among them. dwm has no official port, but the palette page lists every colour's hex code.
You still apply it app by app. kitty can switch to it from its themes kitten, Rofi loads a theme file, and for dwm you copy those hex codes into the colour section of config.h and recompile. Once every program uses the same few hex values, the bar, the window borders, the launcher and the terminal all match:
Dotfiles keep the rice in one place
Every setting above lives in a file in your home folder. They are called dotfiles because many of their names start with a dot (.zshrc, .xinitrc), which hides them from a normal file listing. Newer programs keep theirs in the hidden ~/.config folder instead, such as ~/.config/kitty/kitty.conf and ~/.config/rofi.
Keeping them in a Git repository gives you a history of every change and a backup. There are two common ways to do it:
- A dotfiles folder with links: the real files live in a folder such as
~/dotfiles, and each one is symlinked to where the program expects it. GNU Stow is a common tool for making the links. - A bare repository: Git tracks the files where they already are in your home folder, through a shell alias. The ArchWiki's dotfiles page walks through it.
Either way, a new laptop goes like this: install Git and the programs you use, clone the repository, put the links in place, then build dwm from your own config.h, and the bar, the colours and the key bindings are back.
Two things to watch for. Never commit secrets: API tokens in a shell config or your SSH keys don't belong in a repository, least of all a public one. And Git doesn't record most file permissions, so a file that needs to be private must be set that way again after cloning.
Common mistakes
- Don't copy someone's whole rice from a screenshot. Their dotfiles bring their key bindings, scripts and assumptions with them, so when something breaks you won't know where to look. Take one part at a time and read what it does.
- Don't rice the machine you need for work. A broken window manager or display setup can leave you at a black screen, so try a new rice in a separate user account or a virtual machine first.
- Check the template when dwm updates. A new version can change
config.def.h, and the build won't copy those changes into yourconfig.h. - Know when to stop. A rice is never finished: fix one gap and you'll spot a stray pixel somewhere else. That's fine as a hobby, but set it aside once the desktop does what you need.
Key takeaways
- Ricing is building a Linux desktop from separate parts and configuring each one by hand, so it all looks and works the way you want.
- The window manager decides where windows go; dwm tiles them for you and is configured by editing
config.hand recompiling. - A bar, a launcher such as Rofi, a terminal with a Nerd Font and one colour scheme like Catppuccin make up most of a rice.
- Keep every setting in dotfiles under Git, and a new machine is one clone away from the same desktop.