Rice Linux Mint with i3
Build a minimal, keyboard-driven i3 desktop with blur, gaps, and Catppuccin theming.
Introduction
30 Second Summary
Your computer's desktop is something most people never think to customize. On Linux, the desktop is not a single locked-down program. It is a collection of independent pieces you can swap, restyle, and rebuild from scratch.
In this project, you will build a fully riced i3 desktop inside a VirtualBox virtual machine. The end result is a keyboard-driven workspace with blur effects, window gaps, a themed status bar, and a spotlight-style app launcher.
What You'll Build
A Linux Mint virtual machine stripped down to a minimal i3 tiling window manager with full visual ricing using Picom, Polybar, Rofi, and a Catppuccin Mocha color scheme.
By the end of this project, you'll have:
- A configured VirtualBox VM running Linux Mint with i3 as your window manager.
- A set of dotfiles (i3, Picom, Polybar, Rofi configs) that produce blur, gaps, rounded corners, and a cohesive color theme.
- The keyboard-driven workflow muscle memory to navigate, launch apps, and manage windows without touching a mouse.
- Secret Mission: A custom Rofi power menu and a themed i3lock-color lock screen.
Are there any prerequisites?
You need a Windows 10 or 11 computer with at least 8 GB of RAM and hardware virtualization (VT-x or AMD-V) enabled in your BIOS. No prior Linux experience is required.
Set Up VirtualBox and Create the VM
To rice a Linux desktop, you first need a Linux machine to work with. A virtual machine lets you run an entire operating system inside a window on your current computer.
In this step, you will install VirtualBox (the software that creates virtual machines), download the Linux Mint installer, and create a VM configured with enough resources for smooth compositing and ricing.
In this step, get ready to:
- Download and install VirtualBox and the Linux Mint ISO.
- Create a VM with the correct resource allocation.
- Mount the ISO and boot into the live environment.
Download VirtualBox and the Linux Mint ISO
You need two downloads before you can create your VM: the VirtualBox installer and the Linux Mint ISO file (the operating system image).
- Open your browser and go to the VirtualBox downloads page:
- https://www.virtualbox.org/wiki/Downloads
- Under VirtualBox 7.2.10 platform packages, click Windows hosts to download the installer.
- Once the download finishes, double-click VirtualBox-7.2.10-174163-Win.exe to launch the installer.
- Click Next through each screen, accepting the defaults.
- Click Install when prompted.
- The installer may ask to install network adapters. Click Yes to allow this.
- When the installation completes, click Finish.
VirtualBox should open automatically after installation. If it does not, press the Windows key, type VirtualBox, and press Enter to open it.
Now confirm which version of VirtualBox is running. In VirtualBox, click Help in the top menu bar, then click About VirtualBox.
macOS
You are running the correct version. Close the About dialog and continue to the next download.
Windows
You have a previous version of VirtualBox installed. Close VirtualBox, then download and install 7.2.10 from the link above. The installer will upgrade your existing installation.
After the upgrade completes, reopen VirtualBox and confirm the About dialog shows 7.2.10.
Linux
Try opening VirtualBox manually. Press the Windows key, type VirtualBox, and press Enter.
If it still does not open, right-click the installer file and select Run as administrator, then run through the installation again.
- Now download the Linux Mint ISO. Go to the Linux Mint download page:
- https://linuxmint.com/download.php
- Find the Xfce Edition and click a download mirror near your location.
- The ISO file is approximately 3 GB. Save it somewhere easy to find (like your Downloads folder).
Why the Xfce edition?
Linux Mint comes in three editions: Cinnamon, Xfce, and MATE. You are going to strip the desktop environment and replace it with i3, so you want the lightest starting point.
Xfce is the smallest of the three. It also includes LightDM as its login manager, which makes switching to an i3 session straightforward.
🙋♀️ Download taking too long?
The ISO is about 3 GB. If your connection is slow, try a different mirror from the download page. Mirrors closer to your geographic location are usually faster.
help me find a faster download mirror for the Linux Mint ISO
Create a new VM in VirtualBox
With both downloads ready, you can now create the virtual machine that will host your riced desktop.
- In VirtualBox Manager, click New in the toolbar at the top.
- In the Name field, type i3-rice.
- Set Type to Linux.
- Set Version to Ubuntu (64-bit).
- Click Next.
- Set the Memory size slider to 2560 MB.
- Click Next.
- Select Create a virtual hard disk now and click Create.
- Choose VDI (VirtualBox Disk Image) and click Next.
- Select Dynamically allocated and click Next.
- Set the disk size to 25 GB and click Create.
Your VM now appears in the left sidebar of VirtualBox Manager. Next, increase the video memory so the compositor can run smoothly.
- Select i3-rice in the sidebar, then click Settings in the toolbar.
- Click Display in the left panel.
- Set Video Memory to 128 MB.
- Check the box for Enable 3D Acceleration.
- Click OK to save the settings.
Why 3D Acceleration and 128 MB video memory?
Picom (the compositor you will install later) uses a GLX backend that requires GPU-accelerated rendering. Without 3D Acceleration enabled and sufficient video memory, the compositor would fall back to slow software rendering.
128 MB of video memory gives the VM enough headroom for blur effects, rounded corners, and window animations.
Mount the ISO and start the VM
The VM needs to boot from the Linux Mint ISO the same way a physical computer boots from a USB drive.
- With i3-rice still selected, click Settings again.
- Click Storage in the left panel.
- Under Controller: IDE, click the disk icon that says Empty.
- On the right side, click the small blue disk icon next to Optical Drive.
- Click Choose a disk file.
- Navigate to where you saved the Linux Mint ISO and select it.
- Click OK to close the Settings window.
- Click Start in the toolbar to boot the VM.
The VM window opens and Linux Mint boots into its live environment. You should see the Mint desktop with a taskbar at the bottom and a welcome window.
Seeing a black screen or error about VT-x?
This means hardware virtualization is not enabled in your computer's BIOS/UEFI. Restart your computer, enter BIOS settings (usually by pressing F2, F12, or Del during boot), and enable VT-x (Intel) or AMD-V (AMD).
help me enable hardware virtualization in my BIOS
Your VM is ready and booted into the live environment. Next up, you will install Linux Mint to the virtual hard disk and prepare the system for customization.
Install Linux Mint and Prepare the System
Your VM is booted into the Linux Mint live environment, but nothing is installed yet.
The live session runs entirely in RAM and disappears when you power off. In this step, you will install Linux Mint permanently to the virtual hard disk, update all packages, and add VirtualBox Guest Additions for better display resolution and performance.
In this step, get ready to:
- Install Linux Mint to the VM's virtual hard disk.
- Run a full system update.
- Install VirtualBox Guest Additions for improved resolution and performance.
Install Linux Mint via the graphical installer
The Linux Mint installer is a guided wizard that walks you through language, disk, and account setup. Since this is a VM with an empty virtual disk, choosing "Erase disk" is completely safe.
- On the live desktop, double-click the Install Linux Mint icon.
- Select your preferred language and click Continue.
- On the keyboard layout screen, verify the layout matches your keyboard and click Continue.
- If prompted to install multimedia codecs, tick the checkbox and click Continue.
- On the installation type screen, select Erase disk and install Linux Mint and click Install Now.
- A confirmation dialog appears asking you to write changes to disk. Click Continue to confirm.
- Select your timezone on the map and click Continue.
- Enter your name, a computer name, a username, and a password. Click Continue.
- Wait for the installation to finish. A slideshow plays while files are copied.
- When the installer shows "Installation Complete", click Restart Now.
Why is "Erase disk" safe here?
The VM's virtual hard disk is completely empty. It exists only as a file on your Windows host.
Erasing it does not touch your real Windows files or any other drive on your computer.
After the reboot, the VM boots into the freshly installed Linux Mint. Log in with the username and password you just created.
VM stuck on a black screen after reboot?
The ISO might still be mounted, causing the VM to boot back into the live session. Power off the VM, go to Settings > Storage, click the optical drive, and choose Remove Disk from Virtual Drive. Start the VM again.
Help me fix my VM black screen
Update all system packages
Before installing anything new, you need the latest package lists and security patches. This ensures the tools you install later are compatible and up to date.
- Open a terminal by pressing Ctrl+Alt+T.
- Run a full system update by entering this command:
sudo apt update && sudo apt upgrade -y
What does this command do?
sudo apt update refreshes the list of available packages from the repositories.
sudo apt upgrade -y downloads and installs all available updates. The -y flag automatically confirms the install prompt so you do not have to type "yes" manually.
- The terminal will ask for your password the first time you use sudo. Type the password you created during installation and press Enter.
- Wait for the update to complete. You should see output ending with a summary of upgraded packages.
Seeing "Unable to fetch some archives"?
This usually means the VM does not have internet access. Check that your VirtualBox network setting is set to NAT (the default). You can verify by powering off the VM, going to Settings > Network, and confirming Attached to is set to NAT.
Help me fix my VM network connection
Install VirtualBox Guest Additions
Guest Additions are drivers that let the VM communicate better with VirtualBox. They enable automatic screen resizing, shared clipboard, and smoother mouse integration.
- Install the Guest Additions packages by running this command:
sudo apt install -y virtualbox-guest-x11 virtualbox-guest-utils
What does this install?
virtualbox-guest-x11 provides the display driver that enables proper resolution and 3D acceleration.
virtualbox-guest-utils adds utilities for shared folders and clipboard integration between the VM and your Windows host.
- Once the install finishes, reboot the VM by running:
sudo reboot
- After the reboot, log in again. Your VM display should now fill the VirtualBox window and feel noticeably smoother.
Resolution still tiny after reboot?
Make sure 3D Acceleration is enabled in your VM settings (you set this in the previous step). Power off the VM, go to Settings > Display, confirm Enable 3D Acceleration is checked and Video Memory is 128 MB. Start the VM again.
Help me fix my VM display resolution
Your Linux Mint system is fully installed, updated, and running smoothly inside VirtualBox. Next up, you will strip out the Xfce desktop packages and install the i3 tiling window manager stack.
Strip Bloat and Install the i3 Stack
Your system is fully updated and Guest Additions are working. Now it is time to gut the desktop environment and replace it with something minimal and keyboard-driven.
Right now, Linux Mint is running a full Xfce desktop with panels, file managers, media players, and dozens of apps you will never touch. You will strip all of that away, then install the lightweight tools that make up a riced i3 desktop.
In this step, get ready to:
- Remove unnecessary Xfce packages to free up disk space.
- Install the i3 window manager and its ricing companions.
- Switch your login session from Xfce to i3.
Remove the Xfce bloat
A tiling window manager like i3 handles windows on its own. It does not need the panels, settings daemons, or apps that come with Xfce. Removing them keeps the system clean and avoids conflicts.
- Open a terminal with Ctrl+Alt+T.
- Remove the Xfce packages you no longer need by running this command:
sudo apt remove -y xfce4-panel xfce4-session xfce4-settings thunar xfce4-terminal xfce4-appfinder mousepad parole xfburn celluloid drawing gnome-font-viewer pix
- Clean up leftover dependencies by running:
sudo apt autoremove -y
What do these commands do?
The first command uninstalls the Xfce panel, session manager, settings daemon, file manager, terminal, and several media/utility apps that ship with Linux Mint Xfce.
The second command removes any packages that were only installed as dependencies of those removed apps. Together they free up hundreds of megabytes and prevent old Xfce components from interfering with i3.
- Watch the terminal output. You should see a list of packages being removed, followed by a confirmation that autoremove completed successfully.
Seeing a dependency error?
If apt warns that removing a package would break another dependency, do not force it. Skip the specific package causing the conflict and remove the rest. The important ones to remove are xfce4-panel and xfce4-session since those will conflict with i3.
Help me fix this dependency error
Install the i3 ricing stack
With Xfce out of the way, you need the building blocks of your new desktop. One command installs everything: the window manager, compositor, status bar, launcher, terminal, wallpaper tool, notification daemon, appearance manager, and a clean monospace font.
- Install the full i3 ricing stack by running:
sudo apt install -y i3 picom polybar rofi kitty feh dunst lxappearance fonts-jetbrains-mono
What did you just install?
- i3 is the tiling window manager that arranges your windows automatically.
- picom is a compositor that adds blur, transparency, rounded corners, and shadows.
- polybar is a status bar that shows workspaces, clock, CPU, memory, and volume.
- rofi is a spotlight-style application launcher.
- kitty is a GPU-accelerated terminal emulator with transparency support.
- feh sets your desktop wallpaper.
- dunst handles desktop notifications.
- lxappearance lets you configure GTK themes and icons.
- fonts-jetbrains-mono provides the JetBrains Mono font used across all configs.
- Watch the terminal output. You should see apt downloading and installing the packages with a final confirmation that all packages were installed successfully.
Package not found?
Make sure your system is connected to the internet inside the VM. If a specific package cannot be located, run sudo apt update first to refresh the package lists, then retry the install command.
Help me fix this package error
Log in to your first i3 session
The packages are installed, but you are still inside the Xfce session. To use i3, you need to log out and tell LightDM (the login screen manager) to start an i3 session instead.
- Log out of your current session by running:
pkill -u $USER
Why not just click Log Out?
You removed xfce4-session earlier, so the Xfce logout menu may no longer work. Running pkill -u $USER kills all processes owned by your user, which drops you back to the LightDM login screen cleanly.
- On the LightDM login screen, look for a session selector icon near the top of the screen or near the login area.
- Click the session selector and choose i3 from the list of available sessions.
- Enter your password and log in.
What happens on first login?
When i3 starts for the first time without a config file, it launches i3-config-wizard. The wizard asks you to choose a modifier key for all i3 keybindings.
You will see two options: Alt (Mod1) or Win (Mod4). Select Win (the Super/Windows key) as your modifier. This avoids conflicts with application shortcuts.
- In the i3-config-wizard window, select Win as your modifier key, then confirm to generate the config.
You should now see a mostly empty screen with a thin status bar at the bottom. This is your bare i3 session. There are no icons, no desktop, and no panels. Everything from here is keyboard-driven.
Don't see the i3 option on the login screen?
If the session selector does not show i3, the package may not have installed its session file. Press Ctrl+Alt+F2 to get a text terminal, log in, and run ls /usr/share/xsessions/ to check that an i3.desktop file exists. If it does not, reinstall i3 with sudo apt install --reinstall i3 and try again.
Help me get i3 to show in LightDM
Your minimal desktop is alive. Next up, you will write the i3 config that adds Vim-style keybindings, gaps between windows, and workspace navigation.
Configure i3 (Keybindings, Gaps, and Workspaces)
You are sitting in a bare i3 session. No panel, no dock, no app menu. Just a blank screen with a cursor.
That blank canvas is the point. In this step, you will replace the default i3 config with a custom one that gives you Vim-style keybindings, gaps between windows, Catppuccin Mocha colors, and autostart entries that launch your compositor, status bar, and wallpaper on login.
In this step, get ready to:
- Replace the default i3 config with custom keybindings, gaps, and workspace definitions.
- Add autostart entries for Picom, Polybar, Feh, and Dunst.
- Reload i3 and test your new keybindings.
Replace the default i3 config
The default i3 config uses basic keybindings and no visual customization. You will replace it entirely with a config that includes Vim-style navigation, window gaps, workspace definitions, and Catppuccin Mocha window colors.
- Open a terminal by pressing Super+Enter.
- Open the i3 config file in nano by running this command:
nano ~/.config/i3/config
- Delete all the existing content in the file. Press Alt+\ to jump to the top, then press Alt+T to cut everything from the cursor to the end of the file.
- Paste the following config into the now-empty file:
# i3 config - Catppuccin Mocha Rice
# Mod key = Super (Windows key)
set $mod Mod4
# Font
font pango:JetBrains Mono 10
# Terminal
bindsym $mod+Return exec kitty
# Kill focused window
bindsym $mod+Shift+q kill
# Rofi launcher
bindsym $mod+d exec rofi -show drun -show-icons
# Vim-style focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# Arrow key focus
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# Vim-style move windows
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# Split orientation
bindsym $mod+b split h
bindsym $mod+v split v
# Fullscreen
bindsym $mod+f fullscreen toggle
# Layout
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# Float toggle
bindsym $mod+Shift+space floating toggle
bindsym $mod+space focus mode_toggle
floating_modifier $mod
# Workspaces
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
bindsym $mod+1 workspace $ws1
bindsym $mod+2 workspace $ws2
bindsym $mod+3 workspace $ws3
bindsym $mod+4 workspace $ws4
bindsym $mod+5 workspace $ws5
bindsym $mod+Shift+1 move container to workspace $ws1
bindsym $mod+Shift+2 move container to workspace $ws2
bindsym $mod+Shift+3 move container to workspace $ws3
bindsym $mod+Shift+4 move container to workspace $ws4
bindsym $mod+Shift+5 move container to workspace $ws5
# Gaps
gaps inner 10
gaps outer 5
# Borders
default_border pixel 2
default_floating_border pixel 2
# Catppuccin Mocha window colors
# class border bground text indicator child_border
client.focused #cba6f7 #1e1e2e #cdd6f4 #cba6f7 #cba6f7
client.focused_inactive #45475a #1e1e2e #cdd6f4 #45475a #45475a
client.unfocused #313244 #1e1e2e #a6adc8 #313244 #313244
client.urgent #f38ba8 #1e1e2e #cdd6f4 #f38ba8 #f38ba8
# Reload and restart
bindsym $mod+Shift+c reload
bindsym $mod+Shift+r restart
# Resize mode
mode "resize" {
bindsym h resize shrink width 5 px or 5 ppt
bindsym j resize grow height 5 px or 5 ppt
bindsym k resize shrink height 5 px or 5 ppt
bindsym l resize grow width 5 px or 5 ppt
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
What does this config do?
This config sets up your entire keyboard-driven workflow. Here are the key sections:
- Super+h/j/k/l moves focus between windows using Vim-style directions (left, down, up, right).
- Super+Shift+h/j/k/l physically moves windows in that direction.
- gaps inner 10 and gaps outer 5 add spacing between tiled windows and between windows and screen edges.
- default_border pixel 2 removes title bars and replaces them with thin colored borders.
- The client.focused lines use Catppuccin Mocha purple (#cba6f7) to highlight the active window.
- The resize mode lets you press Super+r, then use h/j/k/l to resize the focused window, and Escape to exit resize mode.
You won't see any visual changes yet. The config needs autostart entries and a reload before anything takes effect.
Add the autostart entries
The autostart section tells i3 which programs to launch when the session starts. This is where your compositor, status bar, wallpaper, and notification daemon get kicked off automatically on every login.
- Scroll to the very bottom of the file in nano (press Alt+/ to jump to the end).
- Add a blank line after the last line, then paste the following autostart block:
# Autostart
exec_always --no-startup-id picom -b --config ~/.config/picom/picom.conf
exec_always --no-startup-id ~/.config/polybar/launch.sh
exec_always --no-startup-id feh --bg-scale ~/Pictures/wallpaper.jpg
exec --no-startup-id dunst
What do these autostart entries do?
- exec_always runs a command on every i3 reload (not just first login). This keeps Picom, Polybar, and the wallpaper fresh after a config change.
- exec (without always) runs only once at login. Dunst (notifications) only needs one instance running.
- picom -b starts the compositor in the background. It handles blur, transparency, rounded corners, and shadows.
- feh --bg-scale sets your wallpaper. You will download a wallpaper image to ~/Pictures/wallpaper.jpg in the next step.
💡 What is Picom?
A compositor is a program that sits between your window manager and the display. It draws effects like transparency, blur, shadows, and rounded corners onto your windows before they reach the screen. Without a compositor, everything is flat and opaque.
Save, reload, and test your keybindings
- Save the file by pressing Ctrl+O, then press Enter to confirm the filename.
- Exit nano by pressing Ctrl+X.
- Reload i3 to apply your new config by pressing Super+Shift+r.
Your screen should flash briefly as i3 restarts. You should see gaps between the terminal window and the screen edges, and a thin purple border around the focused window.
- Test your keybindings. Press Super+Enter to open a second Kitty terminal.
- Press Super+h and Super+l to move focus between the two windows.
- Press Super+Shift+l to swap the focused window to the right.
- Press Super+2 to switch to workspace 2, then Super+1 to return.
Screen went black or i3 crashed?
- If i3 shows a red error bar at the top, there is a syntax error in your config. Press Super+Enter to open a terminal and run nano ~/.config/i3/config to check for typos.
- Make sure every bindsym line starts with a lowercase b. A capital letter will cause a parse error.
- If the autostart entries cause issues (e.g. Picom errors), those will resolve in the next step when you create the Picom config file.
Still stuck? Help me debug my i3 config reload issue.
✔️ Awesome, I've got everything!
Great. Double check you saved the file and that gaps are visible between your windows.
ⓧ I'd like to double check the full code
Here is the complete ~/.config/i3/config file for comparison:
# i3 config - Catppuccin Mocha Rice
# Mod key = Super (Windows key)
set $mod Mod4
# Font
font pango:JetBrains Mono 10
# Terminal
bindsym $mod+Return exec kitty
# Kill focused window
bindsym $mod+Shift+q kill
# Rofi launcher
bindsym $mod+d exec rofi -show drun -show-icons
# Vim-style focus
bindsym $mod+h focus left
bindsym $mod+j focus down
bindsym $mod+k focus up
bindsym $mod+l focus right
# Arrow key focus
bindsym $mod+Left focus left
bindsym $mod+Down focus down
bindsym $mod+Up focus up
bindsym $mod+Right focus right
# Vim-style move windows
bindsym $mod+Shift+h move left
bindsym $mod+Shift+j move down
bindsym $mod+Shift+k move up
bindsym $mod+Shift+l move right
# Split orientation
bindsym $mod+b split h
bindsym $mod+v split v
# Fullscreen
bindsym $mod+f fullscreen toggle
# Layout
bindsym $mod+s layout stacking
bindsym $mod+w layout tabbed
bindsym $mod+e layout toggle split
# Float toggle
bindsym $mod+Shift+space floating toggle
bindsym $mod+space focus mode_toggle
floating_modifier $mod
# Workspaces
set $ws1 "1"
set $ws2 "2"
set $ws3 "3"
set $ws4 "4"
set $ws5 "5"
bindsym $mod+1 workspace $ws1
bindsym $mod+2 workspace $ws2
bindsym $mod+3 workspace $ws3
bindsym $mod+4 workspace $ws4
bindsym $mod+5 workspace $ws5
bindsym $mod+Shift+1 move container to workspace $ws1
bindsym $mod+Shift+2 move container to workspace $ws2
bindsym $mod+Shift+3 move container to workspace $ws3
bindsym $mod+Shift+4 move container to workspace $ws4
bindsym $mod+Shift+5 move container to workspace $ws5
# Gaps
gaps inner 10
gaps outer 5
# Borders
default_border pixel 2
default_floating_border pixel 2
# Catppuccin Mocha window colors
# class border bground text indicator child_border
client.focused #cba6f7 #1e1e2e #cdd6f4 #cba6f7 #cba6f7
client.focused_inactive #45475a #1e1e2e #cdd6f4 #45475a #45475a
client.unfocused #313244 #1e1e2e #a6adc8 #313244 #313244
client.urgent #f38ba8 #1e1e2e #cdd6f4 #f38ba8 #f38ba8
# Reload and restart
bindsym $mod+Shift+c reload
bindsym $mod+Shift+r restart
# Resize mode
mode "resize" {
bindsym h resize shrink width 5 px or 5 ppt
bindsym j resize grow height 5 px or 5 ppt
bindsym k resize shrink height 5 px or 5 ppt
bindsym l resize grow width 5 px or 5 ppt
bindsym Return mode "default"
bindsym Escape mode "default"
}
bindsym $mod+r mode "resize"
# Autostart
exec_always --no-startup-id picom -b --config ~/.config/picom/picom.conf
exec_always --no-startup-id ~/.config/polybar/launch.sh
exec_always --no-startup-id feh --bg-scale ~/Pictures/wallpaper.jpg
exec --no-startup-id dunst
Your keyboard-driven workflow is locked in. Next up, you will create the Picom, Polybar, and Rofi configs to add blur, a status bar, and a themed app launcher.
Rice It (Picom, Polybar, Rofi, and Catppuccin Theme)
In the previous step, you configured i3 with keybindings, gaps, and workspaces. You can now navigate and manage windows entirely from the keyboard.
The skeleton works, but it looks bare. In this step, you will layer on the visual polish that turns a functional tiling setup into a proper rice. Picom handles compositing (blur, shadows, rounded corners). Polybar replaces the default status bar with a themed information strip. Rofi provides a spotlight-style app launcher. All three will share the Catppuccin Mocha color palette for a cohesive look.
In this step, get ready to:
- Configure Picom for blur, rounded corners, and shadows.
- Set up Polybar with system modules and a Catppuccin color scheme.
- Theme Rofi as a centered spotlight-style launcher and set a wallpaper.
Create the Picom compositor config
Picom is a compositor that sits between your application windows and the display server. It intercepts the rendered frames and applies visual effects like transparency, blur, rounded corners, and drop shadows before painting them to the screen.
- Create the Picom config directory and open a new config file by running these commands:
mkdir -p ~/.config/picom
nano ~/.config/picom/picom.conf
- Paste the following configuration into the editor:
# Picom compositor config - Catppuccin Rice
# Backend
backend = "glx";
vsync = true;
# Rounded corners
corner-radius = 12;
rounded-corners-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'"
];
# Shadows
shadow = true;
shadow-radius = 15;
shadow-opacity = 0.5;
shadow-offset-x = -7;
shadow-offset-y = -7;
shadow-exclude = [
"window_type = 'dock'"
];
# Fading
fading = true;
fade-in-step = 0.03;
fade-out-step = 0.03;
# Transparency / Opacity
inactive-opacity = 0.92;
frame-opacity = 1.0;
inactive-opacity-override = false;
# Blur
blur-method = "dual_kawase";
blur-strength = 7;
blur-background-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'"
];
What does this config do?
The GLX backend uses your GPU for compositing, which is required for blur effects. The dual_kawase blur method creates a frosted-glass look behind transparent windows at strength 7 (range 0-20).
Rounded corners at radius 12 soften every window edge. The exclusions prevent the dock and desktop window types from getting rounded corners or blur (Polybar is a dock-type window).
Inactive windows drop to 92% opacity, creating a visual distinction between your focused and background windows.
- Save the file by pressing Ctrl+O, then Enter, then Ctrl+X to exit nano.
- Reload i3 by pressing Super+Shift+r.
- You should see your terminal windows gain rounded corners, a subtle drop shadow, and slight transparency on any unfocused windows.
Don't see rounded corners or blur?
Make sure 3D Acceleration is enabled in your VirtualBox VM settings (Settings > Display > Screen > Enable 3D Acceleration). Without it, the GLX backend cannot render these effects.
If you see error messages in the terminal about the GLX backend, reboot the VM to ensure Guest Additions loaded properly after installation.
Check for typos in your config. A missing semicolon at the end of any line will cause picom to fail silently.
Help me troubleshoot why picom effects are not visible in my VirtualBox VM.
✔️ Awesome, I've got everything!
Great. Make sure you have saved picom.conf and move on to Polybar.
ⓧ I'd like to double check the full code
# Picom compositor config - Catppuccin Rice
# Backend
backend = "glx";
vsync = true;
# Rounded corners
corner-radius = 12;
rounded-corners-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'"
];
# Shadows
shadow = true;
shadow-radius = 15;
shadow-opacity = 0.5;
shadow-offset-x = -7;
shadow-offset-y = -7;
shadow-exclude = [
"window_type = 'dock'"
];
# Fading
fading = true;
fade-in-step = 0.03;
fade-out-step = 0.03;
# Transparency / Opacity
inactive-opacity = 0.92;
frame-opacity = 1.0;
inactive-opacity-override = false;
# Blur
blur-method = "dual_kawase";
blur-strength = 7;
blur-background-exclude = [
"window_type = 'dock'",
"window_type = 'desktop'"
];
Set up Polybar with system modules
Polybar is a status bar that displays system information (workspaces, clock, CPU, memory, volume) in a compact strip at the top or bottom of your screen. Unlike i3's built-in bar, Polybar is fully themeable with custom colors, fonts, and module positioning.
- Create the Polybar config directory and open the config file by running:
mkdir -p ~/.config/polybar
nano ~/.config/polybar/config.ini
- Paste the following Polybar configuration:
; Polybar config - Catppuccin Mocha
[colors]
background = #1e1e2e
background-alt = #313244
foreground = #cdd6f4
primary = #cba6f7
secondary = #89b4fa
alert = #f38ba8
disabled = #6c7086
[bar/main]
width = 100%
height = 28pt
radius = 0
background = ${colors.background}
foreground = ${colors.foreground}
border-size = 0
padding-left = 2
padding-right = 2
module-margin = 1
font-0 = "JetBrains Mono:size=11;2"
modules-left = i3
modules-center = date
modules-right = cpu memory pulseaudio
cursor-click = pointer
cursor-scroll = ns-resize
tray-position = right
tray-padding = 4
[module/i3]
type = internal/i3
format = <label-state> <label-mode>
index-sort = true
wrapping-scroll = false
label-focused = %index%
label-focused-foreground = ${colors.background}
label-focused-background = ${colors.primary}
label-focused-padding = 2
label-unfocused = %index%
label-unfocused-padding = 2
label-urgent = %index%
label-urgent-background = ${colors.alert}
label-urgent-padding = 2
[module/date]
type = internal/date
interval = 5
date = %a %b %d
time = %H:%M
label = %date% %time%
label-foreground = ${colors.primary}
[module/cpu]
type = internal/cpu
interval = 2
label = %percentage%%
label-foreground = ${colors.secondary}
[module/memory]
type = internal/memory
interval = 3
label = %percentage_used%%
label-foreground = ${colors.secondary}
[module/pulseaudio]
type = internal/pulseaudio
format-volume = <label-volume>
label-volume = %percentage%%
label-volume-foreground = ${colors.secondary}
label-muted = muted
label-muted-foreground = ${colors.disabled}
What does this config do?
The [colors] section defines the Catppuccin Mocha palette as reusable variables. Every module and the bar itself references these variables, so changing a single hex value updates the entire bar.
The [bar/main] section defines a full-width bar at 28pt height using JetBrains Mono. Modules are positioned with workspaces on the left, the date in the center, and CPU/memory/volume on the right.
The internal/i3 module type connects directly to i3's workspace events. The focused workspace gets a purple (mauve) highlight, making it easy to see which workspace you are on.
- Save and exit nano (Ctrl+O, Enter, Ctrl+X).
- Now create the launch script that Polybar needs to start cleanly:
nano ~/.config/polybar/launch.sh
- Paste the following script:
#!/usr/bin/env bash
# Terminate already running bar instances
killall -q polybar
# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done
# Launch polybar
polybar main 2>&1 | tee -a /tmp/polybar.log & disown
echo "Polybar launched..."
Why a launch script?
When i3 reloads (Super+Shift+r), it re-runs all exec_always entries. Without this script, you would end up with duplicate Polybar instances stacking on top of each other. The script kills any existing Polybar process first, waits for it to fully exit, then launches a fresh instance.
- Save and exit nano.
- Make the launch script executable by running:
chmod +x ~/.config/polybar/launch.sh
- Reload i3 by pressing Super+Shift+r.
- You should see a dark bar appear at the top of your screen. Workspace numbers display on the left in purple when focused. The current date and time sit in the center. CPU, memory, and volume percentages appear on the right in blue.
Polybar not showing up?
Check that you made the launch script executable. Run ls -l ~/.config/polybar/launch.sh and confirm the output shows -rwxr-xr-x (the x flags).
If Polybar starts but shows no modules, check for typos in your config.ini file. The module names in modules-left, modules-center, and modules-right must exactly match the [module/name] section headers.
You can check the log for errors by running cat /tmp/polybar.log in a terminal.
Help me figure out why Polybar is not appearing in my i3 session.
✔️ Awesome, I've got everything!
Great. Double check you have saved both config.ini and launch.sh.
ⓧ I'd like to double check the full code
Here is the full config.ini:
; Polybar config - Catppuccin Mocha
[colors]
background = #1e1e2e
background-alt = #313244
foreground = #cdd6f4
primary = #cba6f7
secondary = #89b4fa
alert = #f38ba8
disabled = #6c7086
[bar/main]
width = 100%
height = 28pt
radius = 0
background = ${colors.background}
foreground = ${colors.foreground}
border-size = 0
padding-left = 2
padding-right = 2
module-margin = 1
font-0 = "JetBrains Mono:size=11;2"
modules-left = i3
modules-center = date
modules-right = cpu memory pulseaudio
cursor-click = pointer
cursor-scroll = ns-resize
tray-position = right
tray-padding = 4
[module/i3]
type = internal/i3
format = <label-state> <label-mode>
index-sort = true
wrapping-scroll = false
label-focused = %index%
label-focused-foreground = ${colors.background}
label-focused-background = ${colors.primary}
label-focused-padding = 2
label-unfocused = %index%
label-unfocused-padding = 2
label-urgent = %index%
label-urgent-background = ${colors.alert}
label-urgent-padding = 2
[module/date]
type = internal/date
interval = 5
date = %a %b %d
time = %H:%M
label = %date% %time%
label-foreground = ${colors.primary}
[module/cpu]
type = internal/cpu
interval = 2
label = %percentage%%
label-foreground = ${colors.secondary}
[module/memory]
type = internal/memory
interval = 3
label = %percentage_used%%
label-foreground = ${colors.secondary}
[module/pulseaudio]
type = internal/pulseaudio
format-volume = <label-volume>
label-volume = %percentage%%
label-volume-foreground = ${colors.secondary}
label-muted = muted
label-muted-foreground = ${colors.disabled}
And here is launch.sh:
#!/usr/bin/env bash
# Terminate already running bar instances
killall -q polybar
# Wait until the processes have been shut down
while pgrep -u $UID -x polybar >/dev/null; do sleep 1; done
# Launch polybar
polybar main 2>&1 | tee -a /tmp/polybar.log & disown
echo "Polybar launched..."
Configure Rofi and set your wallpaper
Rofi is an application launcher that replaces the traditional menu. It pops up as a floating search window where you type a few characters and hit Enter to launch any installed app.
- Create the Rofi config directory and open the config file by running:
mkdir -p ~/.config/rofi
nano ~/.config/rofi/config.rasi
- Paste the following Rofi theme configuration:
configuration {
modi: "drun,run,window";
show-icons: true;
display-drun: "Apps";
display-run: "Run";
display-window: "Windows";
}
* {
bg: #1e1e2e;
bg-alt: #313244;
fg: #cdd6f4;
accent: #cba6f7;
urgent: #f38ba8;
background-color: @bg;
text-color: @fg;
}
window {
width: 500px;
border: 2px;
border-color: @accent;
border-radius: 12px;
padding: 20px;
}
inputbar {
children: [prompt, entry];
padding: 8px;
background-color: @bg-alt;
border-radius: 8px;
}
prompt {
padding: 0 8px 0 0;
text-color: @accent;
}
entry {
placeholder: "Search...";
placeholder-color: #6c7086;
}
listbox {
padding: 8px 0 0 0;
}
element {
padding: 8px;
border-radius: 6px;
}
element selected {
background-color: @bg-alt;
text-color: @accent;
}
What does this config do?
The configuration block enables three modes: drun (desktop application search), run (raw command execution), and window (switch between open windows).
The * selector sets Catppuccin Mocha colors globally. The window is 500px wide with a purple accent border and rounded corners, giving it a floating spotlight look.
Selected items highlight in the surface color with accent text, keeping the visual language consistent with your Polybar and window borders.
- Save and exit nano.
- Now set up a wallpaper. Create the Pictures directory by running:
mkdir -p ~/Pictures
- Download a dark wallpaper to use as your desktop background. You can open Firefox from Rofi or a terminal and download any dark-themed wallpaper you like. Save it as ~/Pictures/wallpaper.jpg.
- If you want a quick option, you can grab a solid dark image using this command:
convert -size 1920x1080 xc:'#1e1e2e' ~/Pictures/wallpaper.jpg
Use any wallpaper you like
The convert command above creates a solid Catppuccin Mocha background as a simple fallback. For a better look, download a proper wallpaper from a site like Unsplash or the Catppuccin wallpapers repository. Just make sure you save the file as ~/Pictures/wallpaper.jpg so feh can find it.
- Reload i3 by pressing Super+Shift+r.
- Press Super+d to open your themed Rofi launcher. You should see a centered floating window with a purple border, a dark search bar, and a list of installed applications.
- Your wallpaper should now fill the background behind any gaps between windows.
Rofi not opening or not themed?
If pressing Super+d does nothing, check that your i3 config contains the line bindsym $mod+d exec rofi -show drun -show-icons. Then reload i3 with Super+Shift+r.
If Rofi opens but looks unstyled (white/grey default theme), verify your config file is saved at the exact path ~/.config/rofi/config.rasi. Rofi reads this path automatically.
If the wallpaper is not showing, confirm the file exists by running ls ~/Pictures/wallpaper.jpg. The feh autostart line in your i3 config expects this exact path.
Help me fix Rofi theming or wallpaper not showing in my i3 setup.
✔️ Awesome, I've got everything!
Great. Your rice is complete. Double check you have saved config.rasi and your wallpaper is in place.
ⓧ I'd like to double check the full code
configuration {
modi: "drun,run,window";
show-icons: true;
display-drun: "Apps";
display-run: "Run";
display-window: "Windows";
}
* {
bg: #1e1e2e;
bg-alt: #313244;
fg: #cdd6f4;
accent: #cba6f7;
urgent: #f38ba8;
background-color: @bg;
text-color: @fg;
}
window {
width: 500px;
border: 2px;
border-color: @accent;
border-radius: 12px;
padding: 20px;
}
inputbar {
children: [prompt, entry];
padding: 8px;
background-color: @bg-alt;
border-radius: 8px;
}
prompt {
padding: 0 8px 0 0;
text-color: @accent;
}
entry {
placeholder: "Search...";
placeholder-color: #6c7086;
}
listbox {
padding: 8px 0 0 0;
}
element {
padding: 8px;
border-radius: 6px;
}
element selected {
background-color: @bg-alt;
text-color: @accent;
}
Your rice is complete. You now have a fully themed i3 desktop with blur, shadows, rounded corners, a custom status bar, and a spotlight-style launcher. Next up, the Secret Mission challenges you to build a power menu and themed lock screen.
Secret mission
Power Menu and Lock Screen
Your rice looks incredible, but there's no elegant way to shut down, reboot, or lock your screen. Build a custom Rofi power menu with a themed i3lock-color lock screen to complete your keyboard-driven workflow.
Clean Up Your Resources
Clean Up Your Resources
This project runs entirely locally inside a VirtualBox VM, so there are no ongoing costs. Decide whether to keep your VM running, pause it to come back later, or delete it entirely.
Resources you used:
- VirtualBox VM (i3-rice) using approximately 8-10 GB of disk space on your Windows host.
Keep everything running
No action needed. Choose this if you are still actively building or want to keep experimenting with your rice.
- Leave the VM as-is. Start it anytime from VirtualBox Manager to use your riced desktop.
- The VM uses no resources when it is not running.
Pause - I'll come back to this later
Save the VM state so you can resume instantly later without a full boot.
- In your VM window, click the X button to close it.
- Select Save the machine state from the dialog that appears.
- Click OK. The VM freezes in place and frees up your system memory.
- Next time you open VirtualBox and start the VM, it resumes exactly where you left off.
Delete - I don't want to use this again
Remove all project resources and reclaim disk space.
- Shut down the VM if it is running. You can use the power menu (Super+x) and select Shutdown, or close the VM window and select Power off the machine.
- In VirtualBox Manager, right-click the i3-rice VM.
- Select Remove.
- Click Delete all files to permanently remove the virtual hard disk and all associated files.
- This reclaims approximately 8-10 GB of disk space on your Windows host.
Nice Work!
Nice Work!
You just built a fully riced Linux desktop from scratch. Starting with a stock Linux Mint VM, you stripped it down to nothing and reassembled it into a lean, keyboard-driven workspace with custom visuals that would fit right in on r/unixporn.
You've learned how to:
- Set up a VirtualBox VM running Linux Mint and replace its desktop environment with a bare i3 tiling window manager.
- Configure i3 with Vim-style keybindings, window gaps, workspaces, and Catppuccin Mocha window colors.
- Rice the full desktop with Picom compositor effects (blur, rounded corners, shadows), a Polybar status bar with system modules, and a themed Rofi app launcher.
- Secret Mission: Built a custom Rofi power menu with shutdown, reboot, logout, and lock options, and configured i3lock-color for a themed lock screen.
Ready to quiz yourself?