Noctalia-Dynamic-Icons is a way to dynamically apply color-themed icons as Noctalia template. It uses git as a smart cache to avoid expensive retinting or excessive storage use.
output.mp4
Upstream icon sets like Colloid are designed for a "one-time install." This tool makes them dynamic components that shift with your wallpaper or system accent colors.
- Arbitrary Colors: Generate icons for any hex code, not just the hardcoded presets.
- Generate Once, Cache Forever: The tool calls the icon generation script the first time a color is requested. The result is then indexed and cached on a local Git branch for all future runs with that same color.
- Atomic Swaps: Uses Git plumbing to update the entire icon set in a single operation, preventing half-finished theme states.
Icon sets have a large footprint. Storing them traditionally for a dynamic setup is unsustainable:
- Standard Footprint: A single full install occupies ~105MB.
- Traditional Storage: 5 colors would normally cost ~525MB.
- The Delta Advantage: Because variants are structurally identical, Git stores only the "diffs." 5+ variants occupy only ~4MB—a ~99% reduction in overhead compared to standard directory storage.
- Namespace Stability: Force-patches
index.themeto a consistent name (Colloid-Noctalia) so OS settings never "lose" the theme. - Instant Refresh: Signals GNOME/Nautilus via D-Bus to redraw icons immediately—no session restart required.
Designed to be a modular component of the noctalia-shell ecosystem.
~/.config/noctalia/
├── user-templates.toml # Template registry
├── templates/
│ └── icons.cfg # Variable mapping
└── mots/
├── bin/dynamic_icons.sh # Core logic
└── etc/icon-theme.conf # Rendered config
You can use the provided install.sh to set up the directory structure, or configure it manually:
- Register Template (
user-templates.toml):[templates.colloid-icons] input_path = "~/.config/noctalia/templates/icons.cfg" output_path = "~/.config/noctalia/mots/etc/colloid-noctalia.conf" post_hook = "sh ~/.config/noctalia/mots/bin/dynamic_icons.sh"
- Define Input (
templates/icons.cfg):THEME_COLOR="{{colors.primary.default.hex}}" COLOR_SUFFIX="Noctalia" VARIANT="-Dark"