ctucx.git: website

ctucx' website

commit 3ccf37efd631625fe0cb60ca28a4a521a091c1bc
Author: Leah (ctucx) <git@ctu.cx>
Date: Fri, 4 Aug 2023 15:03:10 +0200

initial commit
13 files changed, 597 insertions(+), 0 deletions(-)
A
.gitignore
|
1
+
A
Makefile
|
41
+++++++++++++++++++++++++++++++++++++++++
A
assets/avatar.jpg
|
0
A
assets/style.css
|
134
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
contact.md
|
22
++++++++++++++++++++++
A
develop.sh
|
19
+++++++++++++++++++
A
files/gpg_pubkey.asc
|
109
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
files/ssh_pubkey.asc
|
109
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
flake.lock
|
61
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
A
flake.nix
|
38
++++++++++++++++++++++++++++++++++++++
A
index.md
|
11
+++++++++++
A
projects.md
|
26
++++++++++++++++++++++++++
A
template.html
|
26
++++++++++++++++++++++++++
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1 @@
+result
diff --git a/Makefile b/Makefile
@@ -0,0 +1,41 @@
+PREFIX ?= ./public
+tmpdir ?= /tmp
+all = $(addprefix ${PREFIX}/, $(addsuffix .html, $(basename $(wildcard *.md))))
+files = $(addprefix ${PREFIX}/, gpg_pubkey.asc ssh_pubkey.asc $(wildcard assets/*))
+
+install: ${all} ${files}
+
+show:
+	@echo ${all}
+	@echo ${static}
+
+${PREFIX}:
+	mkdir -p ${PREFIX}
+
+${PREFIX}/assets:
+	mkdir -p ${PREFIX}/assets
+
+${PREFIX}/%.html: %.md template.html ${PREFIX}
+	pandoc --standalone --template template.html $< -o $@
+
+${PREFIX}/gpg_pubkey.asc: files/gpg_pubkey.asc
+	cp files/gpg_pubkey.asc ${PREFIX}/gpg_pubkey.asc
+
+${PREFIX}/ssh_pubkey.asc: files/ssh_pubkey.asc
+	cp files/ssh_pubkey.asc ${PREFIX}/ssh_pubkey.asc
+
+${PREFIX}/assets/%: assets/% ${PREFIX}/assets
+	cp $< $@
+
+${PREFIX}/%: ${tmpdir}/% ${PREFIX}
+	cp $< $@
+
+clean:
+	rm -r ${PREFIX} ${tmpdir}
+
+start: ${all}
+	{ php -S 127.0.0.1:8123 -t ${PREFIX} & \
+		echo $$! > ${tmpdir}/php.pid; }
+
+stop:
+	kill `cat ${tmpdir}/php.pid`
diff --git a/assets/avatar.jpg b/assets/avatar.jpg  Binary files differ.
diff --git a/assets/style.css b/assets/style.css
@@ -0,0 +1,134 @@
+@media screen {
+	:root {
+		color-scheme:                   normal;
+		--body-background:              white;
+		--body-color:                   black;
+		--header-color:                 black;
+		--pre-background:               #ddd;
+		--pre-color:                    #212529;
+		--link-color:                   black;
+		--nav-active-background:        #ccc;
+		--nav-active-color:             #777;
+		--nav-color:                    #777;
+	}
+}
+
+@media screen and (prefers-color-scheme: dark) {
+	:root {
+		color-scheme:                   dark;
+		--body-background:              #222;
+		--body-color:                   #9e9e9e;
+		--header-color:                 #9e9e9e;
+		--pre-background:               #333;
+		--pre-color:                    #fff;
+		--link-color:                   #87ab63;
+		--nav-active-background:        #87ab63;
+		--nav-active-color:             #222;
+		--nav-color:                    #9e9e9e;
+	}
+}
+
+
+* {
+	font-family: monospace;
+	line-height: 1.25;
+}
+
+*, ::after, ::before {
+    box-sizing: border-box;
+}
+
+body {
+	margin: 0 auto;
+	max-width: 800px;
+	background: var(--body-background);
+	color: var(--body-color);
+}
+
+a {
+	color: var(--link-color);
+	text-decoration: none;
+}
+
+a:hover {
+	text-decoration: underline;
+}
+
+header {
+	margin: 10px;
+}
+
+header h1 {
+	color: var(--header-color);
+	font-size: 2em;
+	font-weight: bold;
+	margin-bottom: 0;
+}
+
+header p {
+	color: #777;
+	margin-top: 0;
+}
+
+nav {
+	margin-top: 2em;
+	padding: 0px 1em;
+	vertical-align: bottom;
+}
+
+nav a {
+	color: var(--nav-color);
+	text-decoration: none;
+	padding: 2px 0.75em;
+	font-size: 110%;
+}
+
+nav a.active {
+	color: var(--nav-active-color);
+	background: var(--nav-active-background);
+}
+
+nav a.right {
+	float: right;
+}
+
+main {
+	padding: 1em;
+}
+
+main {
+	padding: 2em;
+	text-align: center;
+}
+
+main ul h2 {
+	margin: .3em 0;
+}
+
+main ul {
+	display: grid;
+	grid-template-columns: auto;
+	grid-gap: 1em;
+	text-align: center;
+	list-style: none;
+	padding: 0;
+}
+
+.avatar {
+	margin-left: auto;
+	margin-right: auto;
+	border-radius: 100%;
+}
+
+@media (min-width: 600px) {
+	main ul {
+		grid-template-columns: repeat(3, minmax(0, 1fr));
+	}
+}
+
+footer {
+	margin-top: 0;
+	text-align: center;
+	font-size: 1em;
+	color: #ccc;
+}
diff --git a/contact.md b/contact.md
@@ -0,0 +1,22 @@
+---
+title: ctucx.homepage
+subtitle:
+page-contact: true
+---
+
+# Contact
+
+You can contact me via one of these platforms:
+
+- ## Fediverse
+  [@leah@ctu.cx](https://fedi.ctu.cx/@leah)
+- ## Matrix
+  [\@leah:ctu.cx](https://matrix.to/#/@leah:ctu.cx)
+- ## Email
+  [leah@ctu.cx](mailto:leah@ctu.cx)
+
+<br>
+
+If you wish to encrypt your messages using PGP, use the key with the following fingerprint 🔒:
+<br>
+[Leah Thein (A1DC EE59 A6F5 F711 804B  4E9D F271 FB37 6E7C 5880)](gpg_pubkey.asc)
diff --git a/develop.sh b/develop.sh
@@ -0,0 +1,19 @@
+#!/usr/bin/env bash
+
+cd "$(dirname "$0")"
+
+make
+make start
+trap "make stop;" EXIT
+
+inotifywait -qrm -e modify -e create -e move -e delete --format '%w%f' $PWD | grep --line-buffered -v 'public\|.swp$\|~$' | (
+	while true
+	do
+		timeout 1 cat /dev/stdin | sort -u
+	done | \
+	while read l
+	do
+		echo files changed: $l
+		make
+	done
+)
diff --git a/files/gpg_pubkey.asc b/files/gpg_pubkey.asc
@@ -0,0 +1,109 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=RgL/
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/files/ssh_pubkey.asc b/files/ssh_pubkey.asc
@@ -0,0 +1,109 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+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
+=moud
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/flake.lock b/flake.lock
@@ -0,0 +1,61 @@
+{
+  "nodes": {
+    "flake-utils": {
+      "inputs": {
+        "systems": "systems"
+      },
+      "locked": {
+        "lastModified": 1689068808,
+        "narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
+        "type": "github"
+      },
+      "original": {
+        "owner": "numtide",
+        "repo": "flake-utils",
+        "type": "github"
+      }
+    },
+    "nixpkgs": {
+      "locked": {
+        "lastModified": 1690927903,
+        "narHash": "sha256-D5gCaCROnjEKDOel//8TO/pOP87pAEtT0uT8X+0Bj/U=",
+        "owner": "NixOS",
+        "repo": "nixpkgs",
+        "rev": "bd836ac5e5a7358dea73cb74a013ca32864ccb86",
+        "type": "github"
+      },
+      "original": {
+        "owner": "NixOS",
+        "ref": "nixos-23.05",
+        "repo": "nixpkgs",
+        "type": "github"
+      }
+    },
+    "root": {
+      "inputs": {
+        "flake-utils": "flake-utils",
+        "nixpkgs": "nixpkgs"
+      }
+    },
+    "systems": {
+      "locked": {
+        "lastModified": 1681028828,
+        "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
+        "owner": "nix-systems",
+        "repo": "default",
+        "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
+        "type": "github"
+      },
+      "original": {
+        "owner": "nix-systems",
+        "repo": "default",
+        "type": "github"
+      }
+    }
+  },
+  "root": "root",
+  "version": 7
+}
diff --git a/flake.nix b/flake.nix
@@ -0,0 +1,37 @@
+{
+  description = "ctucx.website";
+
+  inputs = {
+    flake-utils.url = "github:numtide/flake-utils";
+    nixpkgs.url     = "github:NixOS/nixpkgs/nixos-23.05";
+  };
+
+  outputs = { self, nixpkgs, flake-utils }: {
+
+    overlay = final: prev: {
+
+      ctucx-website = final.stdenv.mkDerivation rec {
+        name = "ctucx-homepage";
+        src  = self;
+
+        makeFlags = [ "PREFIX=$(out)" ];
+
+        buildInputs = [ final.pandoc ];
+      };
+
+    };
+
+  } // (flake-utils.lib.eachDefaultSystem (system:
+    let
+      pkgs = import nixpkgs {
+        inherit system;
+        overlays = [ self.overlay ];
+      };
+
+    in rec {
+
+      packages.default = pkgs.ctucx-website;
+      packages.ctucx-website  = pkgs.ctucx-website;
+
+  }));
+}+
\ No newline at end of file
diff --git a/index.md b/index.md
@@ -0,0 +1,11 @@
+---
+title: ctucx.homepage
+subtitle:
+page-about: true
+---
+
+<img class="avatar" width="30%" src="assets/avatar.jpg">
+
+## Hey I'm leah
+Also known as 'ctucx' and this is my empty website.
+oopsie.
diff --git a/projects.md b/projects.md
@@ -0,0 +1,26 @@
+---
+title: ctucx.homepage
+subtitle:
+page-projects: true
+---
+
+# Projects
+
+Some projects of mine that you might _not_ know.
+
+- ## [mqtt-webui](https://git.ctu.cx/mqtt-webui)
+  A generic webui that can be used to display and control data on a websocket-exposed mqtt-broker
+- ## [webmusic-nginx](https://git.ctu.cx/webmusic-nginx)
+  Uses nginx's xslt-filter module to generate nice looking index-pages that are optimized for music
+- ## [gallery](https://git.ctu.cx/gallery)
+  A static-site generator that generates a nice looking photo-gallery
+- ## [sdm2mqtt](https://git.ctu.cx/sdm2mqtt)
+  Expose data from SDM120M meters via MQTT
+- ## [travelynx2fedi](https://git.ctu.cx/travelynx2fedi)
+  Automaticly post travelynx checkins on the fediverse
+- ## [nixfiles](https://git.ctu.cx/nixfiles)
+  Nix-configs i've written to deploy my servers/desktops
+
+<br>
+
+There are some smaller projects to look at on my [stagit-instance](https://git.ctu.cx).
diff --git a/template.html b/template.html
@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<meta charset="utf-8">
+		<title>$title$</title>
+		<meta name="viewport" content="width=device-width, initial-scale=1.0">
+		<link href="/assets/style.css" rel="stylesheet" />
+	</head>
+	<body>
+		<header>
+			<h1>$title$</h1>
+			<p>$subtitle$</p>
+		</header>
+		<nav>
+			<a href="/"$if(page-about)$ class="active" $endif$>home</a>
+			<a href="/projects.html"$if(page-projects)$ class="active" $endif$>projects</a>
+			<a href="/contact.html"$if(page-contact)$ class="active" $endif$>contact</a>
+			<a class="right" href="https://photos.ctu.cx/">photos</a>
+			<a class="right" href="https://cgit.ctu.cx/">git</a>
+		</nav>
+		<main>
+			$body$
+		</main>
+		<footer><a href="/imprint.html">Imprint</a></footer>
+	</body>
+</html>