diff --git a/machines/fuuko/configuration.nix b/machines/fuuko/configuration.nix
index 7b90137..3cf3b94 100644
--- a/machines/fuuko/configuration.nix
+++ b/machines/fuuko/configuration.nix
@@ -52,6 +52,13 @@
enableACME = true;
forceSSL = true;
};
+
+ virtualHosts."sbruder.de" = {
+ enableACME = true;
+ forceSSL = true;
+
+ root = pkgs.sbruder.contact;
+ };
};
networking.firewall.allowedTCPPorts = [ 80 443 ];
systemd.services.nginx.serviceConfig.SupplementaryGroups = lib.singleton "keys";
diff --git a/pkgs/contact-page/default.nix b/pkgs/contact-page/default.nix
new file mode 100644
index 0000000..2f0263d
--- /dev/null
+++ b/pkgs/contact-page/default.nix
@@ -0,0 +1,17 @@
+{ lib, stdenvNoCC }:
+
+stdenvNoCC.mkDerivation {
+ name = "sbruder-contact";
+
+ src = ./src;
+
+ dontBuild = true;
+ installPhase = ''
+ mkdir $out
+ cp * $out
+ '';
+
+ meta = with lib; {
+ license = licenses.mit;
+ };
+}
diff --git a/pkgs/contact-page/src/index.html b/pkgs/contact-page/src/index.html
new file mode 100644
index 0000000..f62cc4d
--- /dev/null
+++ b/pkgs/contact-page/src/index.html
@@ -0,0 +1,45 @@
+
+
+
+
+
+ Simon Bruder: Contact
+
+
+
+
+
+
+
diff --git a/pkgs/contact-page/src/main.js b/pkgs/contact-page/src/main.js
new file mode 100644
index 0000000..ff77e9c
--- /dev/null
+++ b/pkgs/contact-page/src/main.js
@@ -0,0 +1,18 @@
+(() => {
+ const givenName = document.getElementById('name').innerText.split(" ")[0].toLowerCase()
+ const domain = location.host
+
+ if (domain !== "sbruder.de") {
+ return
+ }
+
+ const mailAddress = givenName + '@' + domain
+ const mailEl = document.getElementById('email')
+ mailEl.innerText = mailAddress
+ mailEl.href = `mailto:${mailAddress}`
+
+ const matrixAddress = '@' + givenName + ':' + domain
+ const matrixEl = document.getElementById('matrix')
+ matrixEl.innerText = matrixAddress
+ matrixEl.href = `https://matrix.to/#/${matrixAddress}`
+})()
diff --git a/pkgs/contact-page/src/pubkey.asc b/pkgs/contact-page/src/pubkey.asc
new file mode 100644
index 0000000..d5aa897
--- /dev/null
+++ b/pkgs/contact-page/src/pubkey.asc
@@ -0,0 +1,52 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+R7VFGCA=
+=7eg7
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/pkgs/contact-page/src/style.css b/pkgs/contact-page/src/style.css
new file mode 100644
index 0000000..5d99114
--- /dev/null
+++ b/pkgs/contact-page/src/style.css
@@ -0,0 +1,18 @@
+body {
+ font-family: "PT Sans", "Helvetica", "Helvetica Neue", "Roboto", "Arimo", "Arial", sans-serif;
+}
+
+.container {
+ max-width: 500px;
+ margin: 0 auto 50px;
+}
+
+tr td:first-child::after {
+ content: ":";
+}
+
+a {
+ text-decoration: none;
+ color: inherit;
+ font-weight: 600;
+}
diff --git a/pkgs/default.nix b/pkgs/default.nix
index 7c5fdbf..95c15d1 100644
--- a/pkgs/default.nix
+++ b/pkgs/default.nix
@@ -11,6 +11,7 @@ in
wordclock-dimmer = prev.python3Packages.callPackage ./wordclock-dimmer { };
sbruder = prev.recurseIntoAttrs {
+ contact = callPackage ./contact-page { };
imprint = callPackage ./imprint { };
};