diff --git a/flake.lock b/flake.lock
index 59a6768..3aad045 100644
--- a/flake.lock
+++ b/flake.lock
@@ -1,5 +1,21 @@
 {
   "nodes": {
+    "blobs": {
+      "flake": false,
+      "locked": {
+        "lastModified": 1604995301,
+        "narHash": "sha256-wcLzgLec6SGJA8fx1OEN1yV/Py5b+U5iyYpksUY/yLw=",
+        "owner": "simple-nixos-mailserver",
+        "repo": "blobs",
+        "rev": "2cccdf1ca48316f2cfd1c9a0017e8de5a7156265",
+        "type": "gitlab"
+      },
+      "original": {
+        "owner": "simple-nixos-mailserver",
+        "repo": "blobs",
+        "type": "gitlab"
+      }
+    },
     "flake-compat": {
       "flake": false,
       "locked": {
@@ -126,6 +142,36 @@
         "type": "github"
       }
     },
+    "nixpkgs-21_05": {
+      "locked": {
+        "lastModified": 1625692408,
+        "narHash": "sha256-e9L3TLLDVIJpMnHtiNHJE62oOh6emRtSZ244bgYJUZs=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "c06613c25df3fe1dd26243847a3c105cf6770627",
+        "type": "github"
+      },
+      "original": {
+        "id": "nixpkgs",
+        "ref": "nixos-21.05",
+        "type": "indirect"
+      }
+    },
+    "nixpkgs-21_11": {
+      "locked": {
+        "lastModified": 1638371214,
+        "narHash": "sha256-0kE6KhgH7n0vyuX4aUoGsGIQOqjIx2fJavpCWtn73rc=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "a640d8394f34714578f3e6335fc767d0755d78f9",
+        "type": "github"
+      },
+      "original": {
+        "id": "nixpkgs",
+        "ref": "nixos-21.11",
+        "type": "indirect"
+      }
+    },
     "nixpkgs_2": {
       "locked": {
         "lastModified": 1642707142,
@@ -163,10 +209,35 @@
         "neovim-nightly-overlay": "neovim-nightly-overlay",
         "nixpkgs": "nixpkgs_2",
         "nur": "nur",
+        "simple-nixos-mailserver": "simple-nixos-mailserver",
         "sops-nix": "sops-nix",
         "unstable": "unstable"
       }
     },
+    "simple-nixos-mailserver": {
+      "inputs": {
+        "blobs": "blobs",
+        "nixpkgs": [
+          "nixpkgs"
+        ],
+        "nixpkgs-21_05": "nixpkgs-21_05",
+        "nixpkgs-21_11": "nixpkgs-21_11",
+        "utils": "utils"
+      },
+      "locked": {
+        "lastModified": 1638911354,
+        "narHash": "sha256-hNhzLOp+dApEY15vwLAQZu+sjEQbJcOXCaSfAT6lpsQ=",
+        "owner": "simple-nixos-mailserver",
+        "repo": "nixos-mailserver",
+        "rev": "6e3a7b2ea6f0d68b82027b988aa25d3423787303",
+        "type": "gitlab"
+      },
+      "original": {
+        "owner": "simple-nixos-mailserver",
+        "repo": "nixos-mailserver",
+        "type": "gitlab"
+      }
+    },
     "sops-nix": {
       "inputs": {
         "nixpkgs": [
@@ -202,6 +273,21 @@
         "repo": "nixpkgs",
         "type": "github"
       }
+    },
+    "utils": {
+      "locked": {
+        "lastModified": 1605370193,
+        "narHash": "sha256-YyMTf3URDL/otKdKgtoMChu4vfVL3vCMkRqpGifhUn0=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "5021eac20303a61fafe17224c087f5519baed54d",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
     }
   },
   "root": "root",
diff --git a/flake.nix b/flake.nix
index 8af00b1..482836e 100644
--- a/flake.nix
+++ b/flake.nix
@@ -26,6 +26,11 @@
       inputs.nixpkgs.follows = "nixpkgs";
     };
 
+    simple-nixos-mailserver = {
+      url = "gitlab:simple-nixos-mailserver/nixos-mailserver";
+      inputs.nixpkgs.follows = "nixpkgs";
+    };
+
   };
 
   outputs = { self, home-manager, nixpkgs, unstable, sops-nix, neovim-nightly-overlay, nur, ... }@inputs:
diff --git a/lib/default.nix b/lib/default.nix
index 421270c..8c0f6f6 100644
--- a/lib/default.nix
+++ b/lib/default.nix
@@ -20,6 +20,7 @@ in
       sops-nix.nixosModules.sops
       host-config
       home-manager.nixosModules.home-manager
+      simple-nixos-mailserver.nixosModule
       {
         home-manager.useUserPackages = true;
         home-manager.useGlobalPkgs = true;
diff --git a/machines/lisa/default.nix b/machines/lisa/default.nix
index b7fcf1c..2862e76 100644
--- a/machines/lisa/default.nix
+++ b/machines/lisa/default.nix
@@ -26,10 +26,18 @@
       subdomain = "ci";
     };
     zfs-mails = {
-      enable = true;
+      enable = false;
       name = "lisa";
       smart.enable = false;
     };
+    docs = {
+      enable = true;
+      nginx = {
+        enable = true;
+        subdomain = "docs";
+      };
+    };
+    mailserver.enable = true;
 
   };
 
@@ -51,10 +59,10 @@
     prefixLength = 120;
   }];
 
+  networking.nameservers = [ "8.8.8.8" ];
   networking.hostId = "fbb334ae";
   services.zfs.autoSnapshot.enable = true;
   services.zfs.autoScrub.enable = true;
 
-
   system.stateVersion = "21.11";
 }
diff --git a/modules/docs/default.nix b/modules/docs/default.nix
new file mode 100644
index 0000000..22dfbc8
--- /dev/null
+++ b/modules/docs/default.nix
@@ -0,0 +1,55 @@
+{ lib, pkgs, config, ... }:
+with lib;
+let
+  cfg = config.luj.docs;
+  port = 3013;
+in
+{
+
+  options.luj.docs = {
+
+    enable = mkEnableOption "activate hedgedoc service";
+    nginx.enable = mkEnableOption "activate nginx";
+    nginx.subdomain = mkOption {
+      type = types.str;
+    };
+
+  };
+
+  config = mkIf cfg.enable (
+    mkMerge [{
+      services.hedgedoc = {
+        enable = true;
+        configuration = {
+          port = port;
+          db = {
+            dialect = "postgres";
+            host = "/run/postgresql";
+          };
+          domain = "docs.julienmalka.me";
+          protocolUseSSL = true;
+          allowFreeURL = true;
+          allowEmailRegister = false;
+          allowAnonymous = false;
+          allowAnonymousEdits = true;
+          allowGravatar = true;
+        };
+      };
+      services.postgresql = {
+        ensureDatabases = [ "hedgedoc" ];
+        ensureUsers = [
+          {
+            name = "hedgedoc";
+            ensurePermissions."DATABASE hedgedoc" = "ALL PRIVILEGES";
+          }
+        ];
+      };
+    }
+
+      (mkIf cfg.nginx.enable (mkSubdomain cfg.nginx.subdomain port))]);
+
+
+
+
+
+}
diff --git a/modules/mailserver/default.nix b/modules/mailserver/default.nix
new file mode 100644
index 0000000..791217b
--- /dev/null
+++ b/modules/mailserver/default.nix
@@ -0,0 +1,39 @@
+{ pkgs, config, lib, inputs, ... }:
+let
+  cfg = config.luj.mailserver;
+in
+with lib;
+{
+  options.luj.mailserver = {
+    enable = mkEnableOption "Enable mailserver";
+  };
+
+  config = mkIf cfg.enable
+    {
+      mailserver = {
+        enable = true;
+        fqdn = "mail.julienmalka.me";
+        domains = [ "malka.sh" "ens.school" ];
+
+        # A list of all login accounts. To create the password hashes, use
+        # nix run nixpkgs.apacheHttpd -c htpasswd -nbB "" "super secret password" | cut -d: -f2
+        loginAccounts = {
+          "julien@malka.sh" = {
+            hashedPasswordFile = "/run/secrets/malkash-pw";
+            aliases = [ "postmaster@malka.sh" ];
+          };
+          "julien.malka@ens.school" = {
+            hashedPasswordFile = "/run/secrets/ensmailmalka-pw";
+          };
+          "camille.mondon@ens.school" = {
+            hashedPassword = "/run/secrets/ensmailmondon-pw";
+          };
+        };
+        certificateScheme = 3;
+      };
+
+      sops.secrets.malkash-pw = { };
+      sops.secrets.ensmailmalka-pw = { };
+      sops.secrets.ensmailmondon-pw = { };
+    };
+}
diff --git a/secrets/secrets.yaml b/secrets/secrets.yaml
index 039d321..6e453bf 100644
--- a/secrets/secrets.yaml
+++ b/secrets/secrets.yaml
@@ -6,6 +6,9 @@ git-gpg-private-key: ENC[AES256_GCM,data:p/tdTehpUQUrpH6xLsyoyR6MJFLWV2jyV4pyQOg
 drone: ENC[AES256_GCM,data:SGY7+NdYsqEG68oQ0bTt4SvyHQA6x5HM10x0Y1nHX4Klf36iPS6M6/gV8IUCE7JEexhWr4/gNhpjco8iBc7UQKSNC5kG/Bwc+kYDGj/tZQuhTyVQx5sOQlXPk2LBWBWg8mNfjxN83I7H7ASM4/wsD0GYx4o8OM1d9W7YC4FUrQQ678ba9Db7Racx1BEhQOfBfKirpZazMUwCjEQCQCAJt5phfuit58pJ08to3qza7vwnf/pjxZMZfrkeJaQs7lgunD1x,iv:0RGnjEoAe6DbSr5JU1cyOxnM7poR8HJeyJQQ98oA9Bk=,tag:i7Q7Br2OlOcjSNpCZutqVg==,type:str]
 bin-cache-priv-key: ENC[AES256_GCM,data:baIdNWuQXGtPAhhtxSL+LJ/inlOqLn6ooVb79Cjbkig3fRR/omgV3DNXpYJdB369sLwnQNJmyRZMv1WHKXq83iqtMS9Pbi0LhyBLtFd+bT2L/dK23hEpXSishx+7XWp9Nv3+jgHE9Aet9CA=,iv:f0itbbkyttYxjoWmaEUixDlrc/ixbuxh6qeUHHrhnBU=,tag:SVMwAobJ5vBb6PWxEKvmQA==,type:str]
 filerun: ENC[AES256_GCM,data:VbQqHoN6fgV9LPjLjrdtwjFFOHKA6LAzokz34DbPUMrprUQ9Qn9BwyQuvhwJyMiToQmwTLJHHYWE+jM+5wGbIEgGEQqm8mliHUg3+45LAP5O30ZJT+B66pybsF4KVRZ6CwfLtA5J6vh7GEatPOuDOR8SE2T3MQM9kkx9eBqgaKTCgKV0jeSPEWiT,iv:4KGUhu6V+hmf3bv0W+E7Op/nZZk1gVC6q93eNBu+8d4=,tag:ALPZNWr8blZMAJ/Qm9Cmxg==,type:str]
+malkash-pw: ENC[AES256_GCM,data:8HtZnKC+tmzzui86LgoBV+I6+h8/6IdTmvLDx/rZVAW6erK/osAb+VmKgJ9v+n0QOf2a1Xsh1cYpvK8c,iv:nXnqgR4iy2LbnkBVG4trl30/n38ZWBhDvMJS9DTZpr8=,tag:Hz/ojMrS9YVsn0VuUmZm3w==,type:str]
+ensmailmalka-pw: ENC[AES256_GCM,data:LpvnHlrviWlOW+Ytffr40iMyWlJkJyCvyj44Uh2obUsZTjdXjHpmCJB6YKYzb8VDK2W1O9CqFSTIcBBQ,iv:Z6NmG473XfRPw+aLitPTEp9j0oO6JtxE/DYq4+BMZ3A=,tag:0tSOdCPxdo3ajdt9iZzAhg==,type:str]
+ensmailmondon-pw: ENC[AES256_GCM,data:aNiYjihDYkb2vTB/+aGHcVYBQLHqEYsAQgH91ONGxBJdniRiPW203WBbn78fZa2bx51hVkQqdX6KWE0r,iv:HP4XfAlu2HXtU6fGARXJHsJIwQIP/K6o732JNTLQgOA=,tag:hxLxdbfYZP/6zeDJ7TOdYg==,type:str]
 sops:
     kms: []
     gcp_kms: []
@@ -39,8 +42,8 @@ sops:
             RHY4SzV0RlF2SEMySEF0S0VCYi9OVkEK9hFLmy8TbXwf5QFQJsYv2Fz+4xsda49W
             Q8ayRVYsKCJAhrw1qcwJ6mCbk0uHZXR2Dyp/utz7ELAmEynA6+N2aw==
             -----END AGE ENCRYPTED FILE-----
-    lastmodified: "2022-01-12T23:46:10Z"
-    mac: ENC[AES256_GCM,data:dxWhOvpe+PzWVpEdG2ebxjDptmSzBj+z5WrjutJ9w6Zz+QmwUC76vcPFR9nibZz4Y6KmhMy0e4OVX5070EOcwm+14ER20UFAo+wVF86BvJRdh4LAnF95d0TssR9vJMgdMHRDzB0x2mMiAEQuA3rq28a+JLd+GYM6fMwgAzsdDGk=,iv:Vbqbfi6b3ZNKt+TRFiA7JSW6Un0pjkpeiSHZ1HQd5Oo=,tag:fzy++cuv3DC1k7rOc4KzqA==,type:str]
+    lastmodified: "2022-01-23T17:50:05Z"
+    mac: ENC[AES256_GCM,data:nS9CZWncDWwz7f3c+w6qsTEypO39UDg/h5d+uWu724iy+piqdv0IzRmW2jakDar771O8c8Oy9fakwLSlANHpLkHeb3yjvr8wJ0oUW2THT/fiiaeAQOADyO198/C2fTD4CKvm7RJuIm2u/wXXPKLUwXA3NqvUhDFzcYhqDmAdAhY=,iv:1m4AJWAslgxsuQLmpy56W2CWKVp9QQI+7vcwL7Wr7PM=,tag:PWiLB9i3DqOi6j9nCQFH8w==,type:str]
     pgp: []
     unencrypted_suffix: _unencrypted
     version: 3.7.1