Repository navigation
Customization
Customization is one of the core ideas behind ii-p3drovfx. You shouldn't need to edit QML to make your desktop yours — the graphical Settings app exposes a huge part of the shell, from colors and fonts down to how fast animations run and what shape your avatar is.
This page covers the appearance and theming systems: Material You colors, wallpaper theming, typography, rounding, motion, themed icons, transparency, presets and profiles. The big surfaces each have their own dedicated page — Bar & Dynamic Island, Sidebar Dashboard, Desktop Widgets, Wallpaper System — so here we'll focus on what makes everything change at once.
- Ctrl + Super + T — pick a wallpaper. The Material palette regenerates from it and the whole shell follows.
- Ctrl + Super + Shift + D — flip between light and dark mode.
- Open Settings (Super + I) → Colors & Themes — change the palette style (vibrant, expressive, monochrome…) or override the accent color if the generated one isn't quite it.
- Still in Settings: drag the system rounding slider and the animation speed multiplier until it feels right.
- Happy with the result? Settings → Presets → Save — now you can always come back to it (or export it to share).
Everything below is the detail behind those five steps.
Almost every preference persists to one file:
~/.config/illogical-impulse/config.json
The Settings app writes to it through the shell's Config system, so changes apply live and survive restarts. Not every option has a UI control — experimental and freshly-added features sometimes exist only in the file — so manual editing remains a legitimate power-user tool. See Configuration Reference for the full map (and for what happens if the file ever gets malformed).
ii-p3drovfx is built on Material 3 / Material You Expressive. Components don't pick their own colors; they derive them from shared Material tokens — primary, secondary, tertiary, surface, containers, error, layer surfaces. That's the trick that lets the whole shell re-theme itself in one sweep: change the palette, and the bar, sidebars, widgets, popups and Settings all follow.
The centerpiece is wallpaper-based theming (Settings → Colors & Themes), powered by Matugen. Pick a wallpaper, get a palette. You can shape the result:
- Palette style — Matugen scheme variants like tonal spot, vibrant, expressive, content, fidelity, intense, neutral, monochrome, rainbow, fruit salad, or auto
- Accent color — override the derived accent with one of your own (the color picker can grab one straight off your screen)
- Theming targets — apply the generated scheme to the shell & utilities, Qt applications, and your terminal, each toggleable. Terminal generation has its own fine-tuning knobs (harmony, foreground boost, forced dark mode).
Some palette changes surface a Restart Shell action when a full reload is needed to apply everything.
Color generation itself is pluggable: the original ii-vynx pipeline, or the fork's alternative pipeline. You can switch engines from Settings without touching any scripts, and Presets remember which engine they were saved with.
Switch manually, or let Automatic Dark Mode run on a daily schedule (start/end times). Pair it with a separate Light Mode wallpaper and the shell swaps both palette and background on schedule — your normal wallpaper becomes the dark one, and the two can be swapped from Settings at any time. There's a separate lockscreen wallpaper too, with its own Material color handling; see Wallpaper System.
- Night Light — manual or scheduled, with configurable color temperature. Manual overrides can persist never, until reboot/logout, or always — your call whether a late-night toggle should still be active tomorrow.
- Anti-Flashbang — a light filter that softens sudden bright content on a dark desktop. Your retinas will thank you.
- Keyboard backlight auto-off — switches the keyboard backlight off after a configurable idle period and restores the previous level on the next keypress. Off by default (it touches hardware state, so it waits to be asked).
Your Material palette doesn't have to stop at the screen edge. With OpenRGB integration enabled, Settings queries your OpenRGB devices, lists them in the shell, and lets you enable each one individually for color sync — with apply-on-startup, fade duration and interpolation controls. OpenRGB itself must be installed and reachable.
-
System rounding — one global corner radius slider (
0–48 px) that reshapes most of the shell at once, since components shareAppearance.roundingtokens. Setting it to0enables sharp mode, which can also zero Hyprland's window rounding to match. - Animation speed — a global multiplier from 0.25× (fast) to 2.5× (slow), applied to everything using the shared Appearance motion system. Snappy, stock Material, or leisurely — your choice.
-
App launch animation — applied to newly launched windows: either the scale zoom-in (configurable start size, speed and curve) or a slide with a direction of your choosing (
Config.options.appearance.appLaunchAnimation.style/slideDirection). Switching to slide needs an up-to-datehyprland/general.lua. - Small touches — colorful scrollbars, scroll animations, and scroll fade masks are individually toggleable.
Fonts are organized as roles, not one global family:
| Role | Default | Used for |
|---|---|---|
| Main | Google Sans Flex | Most UI: settings, sidebar, clock |
| Numbers | Google Sans Flex | Sliders, numeric displays |
| Titles | Google Sans Flex | Headings, popup titles |
| Monospace | JetBrainsMono Nerd Font | Clipboard metadata, code-ish content |
| Nerd icons | JetBrainsMono Nerd Font | Glyph icons |
| Reading | Readex Pro | Longer text (e.g. the cookie clock quote) |
| Expressive | Space Grotesk | Desktop widgets, overview numbers |
Enable custom fonts and replace any role independently. Variable fonts that support it (like Google Sans Flex) can use the full roundness variation for that extra-soft look.
An experimental favorite: ii-p3drovfx can take a base icon theme (e.g. Papirus), recolor it with your generated Material palette, and apply the result system-wide. Pick the base theme from those detected on your system, regenerate from Settings, and optionally auto-restart Quickshell when the icon theme changes. There's also an icon shape mask option (circle and other Material shapes) for a uniform adaptive-icon look.
Under Settings → Windows:
- Transparency — a master toggle, plus automatic mode that derives transparency from the active wallpaper colors, or manual background/content transparency values. Popup transparency is separate. Blur size and ignore-alpha are adjustable — and yes, heavy blur costs GPU and battery.
- Advanced blur options — Hyprland's own blur knobs without leaving Settings: blur passes, noise, contrast, brightness and vibrancy; keep blur strength when windows fade, optimize blur rendering, X-ray blur for floating windows, blur behind special workspaces; and whether application menus and input-method popups blur. Game Mode can still switch blur off temporarily.
-
Gaps — Hyprland
gaps_in/gaps_outstraight from the shell. - Borders — disable entirely, set a width, and pick which Material role the active border follows (primary, secondary, tertiary, primary container or surface) so window decorations always match the palette.
Settings → Desktop Widgets → Transparent widget backgrounds adjusts the background tint of all desktop widgets at once — palette and album-art colours included — while text and images keep their opacity, with a Widget background opacity slider next to it (Config.options.background.widgets.tintOpacityEnabled, tintOpacity). Newer widgets such as the iOS clock join the widget catalogue with their own settings page.
The Dock comes in five styles — floating, islands, hug, dynamic island and transparent (Config.options.dock.dockStyle). It has its own Settings page covering behavior (focused-monitor-only, smart auto-grouping, monitor isolation, hover-to-reveal, pinned-on-startup), content (media widget, weather, notification badges, dividers, overview/pin/trash buttons), and looks (icon tinting, inactive dimming, spacing, corner radii, and a macOS-style magnification with adjustable intensity). Window previews and app-name tooltips are mutually exclusive — pick your favorite. Dock icons can also be cropped with Material shape masks: circle, pill, diamond, pentagon, heart, cookies, clovers, bursts, flower, puffy, pixel circle, bun…
Settings → User Profile controls the identity shown in the Dashboard header and elsewhere:
- Image — your initial, an expressive Material-shape variant, or a custom image (stored in the ii config directory)
- Avatar shape — circle, cookies (9- or 12-sided), 4-leaf clover, burst, heart, bun
- Avatar color — a Material role (primary, secondary, tertiary, error), so it stays theme-proof
- Name & greeting — custom values, with your system username as fallback
The Dashboard header independently chooses what to display: profile image / distro icon / nothing, and username / uptime / custom text / nothing.
The Preset Manager (Settings → Presets) captures your visual setup — bar layout, sidebar setup, widgets, dock, appearance, everything aesthetic — plus a copy of the active wallpaper when it's a local file. Presets live in ~/.config/illogical-impulse/presets/.
- Load — layers the preset over your current configuration and re-runs the wallpaper/color pipeline with whichever color engine the preset was saved with. A preset is a complete desktop personality, not just a color theme. It never replaces your whole config: anything tied to this machine — monitor names, save folders, accounts, keys, your profile, your phone, your weather location and units — stays yours.
- Undo — puts everything back to the snapshot taken just before the last preset was applied.
-
Export — produces a shareable
.zipwith a sanitizedconfig.json(machine-specific paths handled safely) and the wallpaper when available. -
Import — accepts
.zipor bare.json, sanitized on the way in. - Delete — removes the preset and its wallpaper copy.
Before a preset is applied you are shown what it would change — any settings that can run commands, widen assistant permissions or redirect servers — so a shared preset is never a blind swap.
Great for sharing setups — or for keeping a "safe" configuration to come back to after a wild experiment.
Presets are also a store. Publishing one puts it on GitHub under the ii-p3drovfx-preset topic, where everyone else's shell can find and install it — and update it later. → Preset Store
Presets are strictly visual. Applying or exporting one never touches your durable personal data: search aliases and Google Drive backup settings live separately in ~/.local/state/quickshell/states.json, and API credentials (AI keys, Gmail and TickTick OAuth) live in the GNOME Keyring. The export sanitizer additionally strips anything that looks like a token or secret and rewrites machine-specific home paths — so a shared preset can't leak who you are or overwrite what you've set up.
Not everything belongs in config.json. The shell separates three kinds of state:
| File | Holds | Survives restart? |
|---|---|---|
Config.qml → config.json
|
Your preferences: themes, layouts, behavior | Yes |
Persistent.qml → ~/.local/state/quickshell/states.json
|
Durable user data: remembered tabs, search aliases, Google Drive settings | Yes — survives preset changes and config resets |
| GNOME Keyring | API credentials (AI keys, Gmail/TickTick OAuth) | Yes — never written to config files |
GlobalStates.qml |
Live runtime state (what's currently open) | No — by design |
The Settings app itself is modular: 30+ dedicated pages registered in a central page registry, with sub-pages for dense areas, cross-page links (Background → Window Blur, Bar → Dynamic Island…), and a search that jumps to and highlights the matching configuration card.
ii-p3drovfx doesn't expose a thousand disconnected knobs. Major components share common systems — Material colors, typography roles, rounding tokens, motion timing, config persistence, monitor awareness — so one global preference ripples consistently through the entire shell. A new palette re-themes everything. A new radius reshapes everything. And a preset swaps all of it at once.