diff --git a/krebs/4lib/default.nix b/krebs/4lib/default.nix
index f62c033bd..49241cc82 100644
--- a/krebs/4lib/default.nix
+++ b/krebs/4lib/default.nix
@@ -3,7 +3,7 @@
 with builtins;
 with lib;
 
-let out = rec {
+let out = import <stockholm/lib> // rec {
 
   eq = x: y: x == y;
   ne = x: y: x != y;
@@ -35,7 +35,6 @@ let out = rec {
   genid = import ./genid.nix { lib = lib // out; };
   genid_signed = x: ((genid x) + 16777216) / 2;
   git = import ./git.nix { lib = lib // out; };
-  shell = import ./shell.nix { inherit lib; };
   tree = import ./tree.nix { inherit lib; };
 
   lpad = n: c: s:
diff --git a/krebs/5pkgs/builders.nix b/krebs/5pkgs/builders.nix
index da7052f38..4c087bc44 100644
--- a/krebs/5pkgs/builders.nix
+++ b/krebs/5pkgs/builders.nix
@@ -242,6 +242,8 @@ rec {
     cp src.jq "$out"
   '';
 
+  writeJSON = name: value: pkgs.writeText name (toJSON value);
+
   writeNixFromCabal =
     trace (toString [
       "The function `writeNixFromCabal` has been deprecated in favour of"
diff --git a/krebs/5pkgs/logf/default.nix b/krebs/5pkgs/logf/default.nix
new file mode 100644
index 000000000..246e4d954
--- /dev/null
+++ b/krebs/5pkgs/logf/default.nix
@@ -0,0 +1,103 @@
+{ lib, pkgs, ... }:
+
+with import <stockholm/lib>;
+
+let
+  default-host-colors = pkgs.writeJSON "logf.default-host-colors.json" {
+  };
+  default-prio-colors = pkgs.writeJSON "logf.default-prio-colors.json" {
+    "0" = 196; # emerg
+    "1" = 160; # alert
+    "2" = 124; # crit
+    "3" = 009; # err
+    "4" = 011; # warning
+    "5" = 255; # notice
+    "6" = 250; # info
+    "7" = 139; # debug
+  };
+in
+
+pkgs.writeDashBin "logf" ''
+  export LOGF_HOST_COLORS LOGF_PRIO_COLORS
+  LOGF_HOST_COLORS=$(cat "''${LOGF_HOST_COLORS-${default-host-colors}}")
+  LOGF_PRIO_COLORS=$(cat "''${LOGF_PRIO_COLORS-${default-prio-colors}}")
+  printf '%s\0' "$@" \
+    | ${pkgs.findutils}/bin/xargs -0 -P 0 -n 1 ${pkgs.writeDash "logf-remote" ''
+        target=$1 \
+        target_host=$(echo "$1" | sed 's/^.*@//;s/\..*//') \
+        exec 3>&1;
+        2>&1 1>&3 ssh "$target" -T \
+            -o PreferredAuthentications=publickey \
+            -o StrictHostKeyChecking=yes \
+            exec journalctl -af -n 0 -o json \
+          | stdbuf -oL jq -Rf ${pkgs.writeJq "logf-remote-error.jq" ''
+              {
+                PRIORITY: "4",
+                MESSAGE: .,
+                SYSLOG_IDENTIFIER: env.target_host,
+              }
+            ''}
+        sleep 10m
+        exec "$0" "$@"
+      ''} \
+    | ${pkgs.jq}/bin/jq -rf ${pkgs.writeJq "logf-filter.jq" ''
+        (env.LOGF_HOST_COLORS | fromjson) as $host_colors |
+        (env.LOGF_PRIO_COLORS | fromjson) as $prio_colors |
+
+        def when(c; f): if c then f else . end;
+
+        # anaphoric gsub
+        def agsub(re; f):
+          gsub("(?<it>\(re))"; .it | f);
+
+        # :: [int] -> sgr
+        def sgr: "\u001b[\(map(tostring) | join(";"))m";
+
+        # :: sgr
+        def rst: [] | sgr;
+
+        # :: int -> sgr
+        def fg(i): [38,5,i]|sgr;
+        # TODO def fg(r;g;b): [38,2,r,g,b]|sgr;
+        # http://cvs.schmorp.de/rxvt-unicode/src/command.C?revision=1.570&view=markup&sortby=log&sortdir=down
+
+        # (sgr; sgr) | (null; any) :: str -> str
+        def col(a; b): when(a != null; a + . + b);
+        def col(a): col(a; rst);
+
+
+        def p_time:
+          ._SOURCE_REALTIME_TIMESTAMP
+          | if . != null then . | fromjson | . / 1000000 else now end
+          | gmtime
+          | todateiso8601
+          | col(fg(237));
+
+        def p_host:
+          ._HOSTNAME
+          | if . != null then . else "-" end
+          | col($host_colors[.]|when(. != null; fg(.)));
+
+        def p_ident:
+          if .SYSLOG_IDENTIFIER != null then .SYSLOG_IDENTIFIER
+          else ._COMM end
+          | col(fg(244));
+
+        def p_message:
+          fg($prio_colors[if has("PRIORITY") then .PRIORITY else "-" end])
+            as $prio_c |
+          .MESSAGE
+          | sub("\r$"; "")
+          | agsub("\\btv@nomic\\b"; "\(.)\u0007" | col(fg(219); $prio_c))
+          #| agsub("Start queue"; "\(.)\u0007" | col(fg(42); $prio_c))
+          | col($prio_c);
+
+
+        [ p_time
+        , p_host
+        , p_ident
+        , p_message
+        ]
+        | join(" ")
+      ''}
+''
diff --git a/lib/default.nix b/lib/default.nix
new file mode 100644
index 000000000..6c607f13b
--- /dev/null
+++ b/lib/default.nix
@@ -0,0 +1,7 @@
+let
+  lib = import <nixpkgs/lib> // builtins // {
+    shell = import ./shell.nix { inherit lib; };
+  };
+in
+
+lib
diff --git a/krebs/4lib/shell.nix b/lib/shell.nix
similarity index 96%
rename from krebs/4lib/shell.nix
rename to lib/shell.nix
index 5910adacc..a8ff5dbe0 100644
--- a/krebs/4lib/shell.nix
+++ b/lib/shell.nix
@@ -1,6 +1,5 @@
 { lib, ... }:
 
-with builtins;
 with lib;
 
 rec {