Herbstluftwm configFile won't execute

Hi, I’m new to NixOS and want to use herbstluftwm with its configFile option.
It doesn’t seem to run the config script at all, but rather some default autostart script.
As an indication I’ve set the window_border_active_color to red.

In terminal I can just type
herbstclient set window_border_active_color red
and it works just fine.

But I can’t get it to work at startup. The border stays green.

{ config, pkgs, lib, ... }:

  imports = [ <nixpkgs/nixos/modules/installer/virtualbox-demo.nix> ];

# Let demo build as a trusted user.
nix.trustedUsers = [ "demo" ];

# Mount a VirtualBox shared folder.
# This is configurable in the VirtualBox menu at
# Machine / Settings / Shared Folders.
# fileSystems."/mnt" = {
#   fsType = "vboxsf";
#   device = "nameofdevicetomount";
#   options = [ "rw" ];
# };

# By default, the NixOS VirtualBox demo image includes SDDM and Plasma.
# If you prefer another desktop manager or display manager, you may want
# to disable the default.
services.xserver = {
  desktopManager.plasma5.enable = lib.mkForce false;
  enable = true;
  windowManager.herbstluftwm = {
    enable = true;
    configFile = pkgs.writeText "autostart" ''
      hc() {
          ${pkgs.herbstluftwm}/bin/herbstclient "$@"
      hc emit_hook reload
      xsetroot -solid '#5A8E3A'
      # remove all existing keybindings
      hc keyunbind --all
      # keybindings
      # if you have a super key you will be much happier with Mod set to Mod4
      Mod=Mod1    # Use alt as the main modifier
      #Mod=Mod4   # Use the super key as the main modifier
      hc keybind $Mod-Shift-q quit
      hc keybind $Mod-Shift-r reload
      hc keybind $Mod-Shift-c close
      hc keybind $Mod-Return spawn ''${TERMINAL:-xterm} # use your $TERMINAL with xterm as fallback
      # basic movement
      # focusing clients
      hc keybind $Mod-Left  focus left
      hc keybind $Mod-Down  focus down
      hc keybind $Mod-Up    focus up
      hc keybind $Mod-Right focus right
      hc keybind $Mod-h     focus left
      hc keybind $Mod-j     focus down
      hc keybind $Mod-k     focus up
      hc keybind $Mod-l     focus right
      # moving clients
      hc keybind $Mod-Shift-Left  shift left
      hc keybind $Mod-Shift-Down  shift down
      hc keybind $Mod-Shift-Up    shift up
      hc keybind $Mod-Shift-Right shift right
      hc keybind $Mod-Shift-h     shift left
      hc keybind $Mod-Shift-j     shift down
      hc keybind $Mod-Shift-k     shift up
      hc keybind $Mod-Shift-l     shift right
      # splitting frames
      # create an empty frame at the specified direction
      hc keybind $Mod-u       split   bottom  0.5
      hc keybind $Mod-o       split   right   0.5
      # let the current frame explode into subframes
      hc keybind $Mod-Control-space split explode
      # resizing frames
      hc keybind $Mod-Control-h       resize left +$resizestep
      hc keybind $Mod-Control-j       resize down +$resizestep
      hc keybind $Mod-Control-k       resize up +$resizestep
      hc keybind $Mod-Control-l       resize right +$resizestep
      hc keybind $Mod-Control-Left    resize left +$resizestep
      hc keybind $Mod-Control-Down    resize down +$resizestep
      hc keybind $Mod-Control-Up      resize up +$resizestep
      hc keybind $Mod-Control-Right   resize right +$resizestep
      # tags
      tag_names=( {1..9} )
      tag_keys=( {1..9} 0 )
      hc rename default "''${tag_names[0]}" || true
      for i in ''${!tag_names[@]} ; do
          hc add "''${tag_names[$i]}"
          if ! [ -z "$key" ] ; then
              hc keybind "$Mod-$key" use_index "$i"
              hc keybind "$Mod-Shift-$key" move_index "$i"
      # cycle through tags
      hc keybind $Mod-period use_index +1 --skip-visible
      hc keybind $Mod-comma  use_index -1 --skip-visible
      # layouting
      hc keybind $Mod-r remove
      hc keybind $Mod-s floating toggle
      hc keybind $Mod-f fullscreen toggle
      hc keybind $Mod-p pseudotile toggle
      # The following cycles through the available layouts within a frame, but skips
      # layouts, if the layout change wouldn't affect the actual window positions.
      # I.e. if there are two windows within a frame, the grid layout is skipped.
      hc keybind $Mod-space                                                           \
                  or , and . compare tags.focus.curframe_wcount = 2                   \
                           . cycle_layout +1 vertical horizontal max vertical grid    \
                     , cycle_layout +1
      # mouse
      hc mouseunbind --all
      hc mousebind $Mod-Button1 move
      hc mousebind $Mod-Button2 zoom
      hc mousebind $Mod-Button3 resize
      # focus
      hc keybind $Mod-BackSpace   cycle_monitor
      hc keybind $Mod-Tab         cycle_all +1
      hc keybind $Mod-Shift-Tab   cycle_all -1
      hc keybind $Mod-c cycle
      hc keybind $Mod-i jumpto urgent
      # theme
      hc attr theme.tiling.reset 1
      hc attr theme.floating.reset 1
      hc set frame_border_active_color red 
      hc set frame_border_normal_color yellow
      hc set frame_bg_normal_color '#565656'
      hc set frame_bg_active_color '#345F0C'
      hc set frame_border_width 1
      hc set always_show_frame 1
      hc set frame_bg_transparent 1
      hc set frame_transparent_width 5
      hc set frame_gap 4
      hc attr theme.active.color '#9fbc00'
      hc attr theme.normal.color '#454545'
      hc attr theme.urgent.color orange
      hc attr theme.inner_width 1
      hc attr theme.inner_color black
      hc attr theme.border_width 3
      hc attr theme.floating.border_width 4
      hc attr theme.floating.outer_width 1
      hc attr theme.floating.outer_color black
      hc attr theme.active.inner_color '#3E4A00'
      hc attr theme.active.outer_color '#3E4A00'
      hc attr theme.background_color '#141414'
      hc set window_gap 0
      hc set frame_padding 0
      hc set smart_window_surroundings 0
      hc set smart_frame_surroundings 1
      hc set mouse_recenter_gap 0
      hc set window_border_active_color red
      # rules
      hc unrule -F
      #hc rule class=XTerm tag=3 # move all xterms to tag 3
      hc rule focus=on # normally focus new clients
      #hc rule focus=off # normally do not focus new clients
      # give focus to most common terminals
      #hc rule class~'(.*[Rr]xvt.*|.*[Tt]erm|Konsole)' focus=on
      hc rule windowtype~'_NET_WM_WINDOW_TYPE_(DIALOG|UTILITY|SPLASH)' pseudotile=on
      hc rule windowtype='_NET_WM_WINDOW_TYPE_DIALOG' focus=on
      hc rule windowtype~'_NET_WM_WINDOW_TYPE_(NOTIFICATION|DOCK|DESKTOP)' manage=off
      hc set tree_style '╾│ ├└╼─┐'
      # unlock, just to be sure
      hc unlock
      # do multi monitor setup here, e.g.:
      # hc set_monitors 1280x1024+0+0 1280x1024+1280+0
      # or simply:
      # hc detect_monitors
      # find the panel
      [ -x "$panel" ] || panel=${pkgs.herbstluftwm}/etc/xdg/herbstluftwm/panel.sh
      for monitor in $(herbstclient list_monitors | cut -d: -f1) ; do
          # start it on each monitor
          "$panel" $monitor &
  displayManager = {
    sddm.enable = lib.mkForce false;
    auto.enable = true;
    auto.user = "demo";
    defaultSession = "none+herbstluftwm";

environment.sessionVariables.TERMINAL = [ "xterm" ];

# Set your time zone.
time.timeZone = "Europe/Berlin";
services.xserver.layout = "de";
console.keyMap = "de";
i18n.defaultLocale = "de_DE.UTF-8";
console.font = "ter-i32b";
console.packages = [ pkgs.terminus_font ];
# List packages installed in system profile. To search, run:
# \$ nix search wget
environment.systemPackages = with pkgs; [

fonts.fonts = with pkgs; [

# Enable the OpenSSH daemon.
# services.openssh.enable = true;

networking.networkmanager.enable = true;
users.users.demo.extraGroups = [ "networkmanager" ];


I also use home-manager, if there is an easier solution that way.

I’m also facing the same issue :thinking:

(edit: whoops i didn’t realize that this was one year old)