How to update decorations at runtime with the new Hyprland Lua config?

Hyprland version
Hyprland 0.55.1 built from branch v0.55.1 at commit a47147bc095e5b3be3eb8bd04f0ac242b968cd4d clean ([gha] Nix: update inputs).
Date: Wed May 13 22:55:46 2026
Tag: v0.55.1, commits: 7311

Libraries:
Hyprgraphics: built against 0.5.1, system has 0.5.1
Hyprutils: built against 0.13.1, system has 0.13.1
Hyprcursor: built against 0.1.13, system has 0.1.13
Hyprlang: built against 0.6.8, system has 0.6.8
Aquamarine: built against 0.11.0, system has 0.11.0

Version ABI string: a47147bc095e5b3be3eb8bd04f0ac242b968cd4d_aq_0.11_hu_0.13_hg_0.5_hc_0.1_hlg_0.6
no flags were set


Since migrating from hyprland.conf to hyprland.lua, my old runtime decoration scripts stopped working correctly.

I used to dynamically change blur passes and active opacity during runtime, for example:

  • cycling through different blur strengths
  • temporarily disabling transparency when I want to focus

Previously, this worked perfectly with commands like:

hyprctl keyword decoration:blur:passes $new_blur

After switching to the Lua config system, this no longer behaves correctly.

I am still very new to both Hyprland and Lua, so I tried implementing the logic directly inside a Lua module:

local decoration_functions = {}

function decoration_functions.cycle_blur()
    local current = hl.get_config("decoration:blur:passes")
    local next_val = (current % 4) + 1

    hl.config({
        decoration = {
            blur = {
                passes = next_val
            }
        }
    })
end

function decoration_functions.toggle_opacity()
    local current = hl.get_config("decoration:active_opacity")

    if current >= 1.0 then
        hl.config({
            decoration = {
                active_opacity = 0.8,
                fullscreen_opacity = 0.8
            }
        })
    else
        hl.config({
            decoration = {
                active_opacity = 1.0,
                fullscreen_opacity = 1.0
            }
        })
    end
end

return decoration_functions

The strange thing is:

  1. hyprctl -j getoption shows the updated values correctly
  2. opacity changes only become visible after resizing a window or switching workspaces
  3. blur changes never become visible, even though getoption reports the correct value

I also discovered that adding this to my decorations.lua partially helped:

hl.config({
    blur = {
        new_optimizations = false
    }
})

After disabling new_optimizations, blur changes sometimes become visible after resizing windows or changing workspaces, but the behavior is still buggy and inconsistent.

So my questions are:

  • Is runtime updating of decorations currently supported properly with hyprland.lua?
  • Am I using hl.config() incorrectly?
  • Is there some way to force a redraw/re-render after changing decoration values?
  • Or is this currently a limitation/bug in Hyprland?

I assume I cannot be the only person wanting dynamic runtime decoration changes.

Thanks a lot in advance!

— michi_wtr