diff --git a/krebs/3modules/per-user.nix b/krebs/3modules/per-user.nix
index 1b8d092bb..a7a07a8e6 100644
--- a/krebs/3modules/per-user.nix
+++ b/krebs/3modules/per-user.nix
@@ -1,38 +1,34 @@
-{ config, lib, pkgs, ... }:
-
 with import <stockholm/lib>;
-
-let
+{ config, pkgs, ... }: let
   cfg = config.krebs.per-user;
-
-  out = {
-    options.krebs.per-user = api;
-    config = imp;
-  };
-
-  api = mkOption {
-    type = with types; attrsOf (submodule {
+in {
+  options.krebs.per-user = mkOption {
+    type = types.attrsOf (types.submodule {
       options = {
         packages = mkOption {
-          type = listOf path;
+          type = types.listOf types.path;
           default = [];
         };
       };
     });
     default = {};
   };
-
-  imp = {
+  config = {
     environment = {
-      etc = flip mapAttrs' cfg (name: { packages, ... }: {
-        name = "per-user/${name}";
-        value.source = pkgs.symlinkJoin {
-          name = "per-user.${name}";
-          paths = packages;
-        };
-      });
+      etc =
+        mapAttrs'
+          (name: per-user: {
+            name = "per-user/${name}";
+            value.source = pkgs.buildEnv {
+              name = "per-user.${name}";
+              paths = per-user.packages;
+              pathsToLink = [
+                "/bin"
+              ];
+            };
+          })
+          (filterAttrs (_: per-user: per-user.packages != []) cfg);
       profiles = ["/etc/per-user/$LOGNAME"];
     };
   };
-
-in out
+}
diff --git a/krebs/5pkgs/simple/urlwatch/default.nix b/krebs/5pkgs/simple/urlwatch/default.nix
index adaefbc4d..ebf872568 100644
--- a/krebs/5pkgs/simple/urlwatch/default.nix
+++ b/krebs/5pkgs/simple/urlwatch/default.nix
@@ -1,14 +1,18 @@
-{ stdenv, fetchurl, python3Packages }:
+{ stdenv, fetchFromGitHub, python3Packages }:
 
-python3Packages.buildPythonPackage rec {
-  name = "urlwatch-${meta.version}";
+python3Packages.buildPythonApplication rec {
+  name = "urlwatch-${version}";
+  version = "2.7";
 
-  src = fetchurl {
-    url = "https://github.com/thp/urlwatch/archive/${meta.version}.tar.gz";
-    sha256 = "09bn31gn03swi7yr3s1ql8x07hx96gap1ka77kk44kk0lvfxn55b";
+  src = fetchFromGitHub {
+    owner  = "thp";
+    repo   = "urlwatch";
+    rev    = version;
+    sha256 = "0fx964z73yv08b1lpymmjsigf6929zx9ax5bp34rcf2c5gk11l5m";
   };
 
   propagatedBuildInputs = with python3Packages; [
+    appdirs
     keyring
     minidb
     pycodestyle
@@ -16,11 +20,10 @@ python3Packages.buildPythonPackage rec {
     requests
   ];
 
-  meta = {
+  meta = with stdenv.lib; {
     description = "A tool for monitoring webpages for updates";
     homepage = https://thp.io/2008/urlwatch/;
-    license = stdenv.lib.licenses.bsd3;
-    maintainers = [ stdenv.lib.maintainers.tv ];
-    version = "2.6";
+    license = licenses.bsd3;
+    maintainers = with maintainers; [ tv ];
   };
 }
diff --git a/tv/5pkgs/simple/xmonad-tv/default.nix b/tv/5pkgs/simple/xmonad-tv/default.nix
index f73175bb1..94554f57c 100644
--- a/tv/5pkgs/simple/xmonad-tv/default.nix
+++ b/tv/5pkgs/simple/xmonad-tv/default.nix
@@ -3,6 +3,7 @@ pkgs.writeHaskell "xmonad-tv" {
   executables.xmonad = {
     extra-depends = [
       "containers"
+      "extra"
       "unix"
       "X11"
       "xmonad"
@@ -19,11 +20,12 @@ pkgs.writeHaskell "xmonad-tv" {
 module Main where
 
 import Control.Exception
+import Control.Monad.Extra (whenJustM)
 import Graphics.X11.ExtraTypes.XF86
 import Text.Read (readEither)
 import XMonad
 import System.IO (hPutStrLn, stderr)
-import System.Environment (getArgs, withArgs, getEnv, getEnvironment)
+import System.Environment (getArgs, withArgs, getEnv, getEnvironment, lookupEnv)
 import System.Posix.Process (executeFile)
 import XMonad.Actions.DynamicWorkspaces ( addWorkspacePrompt, renameWorkspace
                                         , removeEmptyWorkspace)
@@ -84,9 +86,9 @@ mainNoArgs = do
             -- , handleEventHook   = myHandleEventHooks <+> handleTimerEvent
             --, handleEventHook   = handleTimerEvent
             , manageHook        = placeHook (smart (1,0)) <+> floatNextHook
-            , startupHook = do
-                path <- liftIO (getEnv "XMONAD_STARTUP_HOOK")
-                forkFile path [] Nothing
+            , startupHook =
+                whenJustM (liftIO (lookupEnv "XMONAD_STARTUP_HOOK"))
+                          (\path -> forkFile path [] Nothing)
             , normalBorderColor  = "#1c1c1c"
             , focusedBorderColor = "#f000b0"
             , handleEventHook = handleShutdownEvent