The XMonad window manager is configured in Haskell.
That means that when you want to apply a new configuration you actually build
xmonad itself incorporating code from your configuration file.
It sounds more painful than it is -
when you install xmonad you get an executable called
xmonad that handles the
details of bootstrapping your custom build.
xmonad --recompile builds
and subsequent invocations of
xmonad run the executable that is produced.
When you configure xmonad you are actually writing your own version of the
Because you can write arbitrary code the possibilities for customization are
As with any software project,
you get maximum expressive power when you bring in third-party libraries.
xmonad-contrib is a popular choice -
but you can import any Haskell library that you want.
With libraries come the problem of managing library packages.
In the past I used the
cabal command to globally install library packages.
From time to time I would clear out my installed packages,
or change something while working on another Haskell project,
and then my window manager would stop working.
I wanted a better option.