noxz-sites

A collection of a builder and various scripts creating the noxz.tech sites
git clone https://noxz.tech/git/noxz-sites.git
Log | Files | README | LICENSE

commit: 25093bed0a318fc2a679a7644e8eb4f8e58477ac
parent: f19f35822e220a60e466a9722495a021cbb1ddf7
author: Chris Noxz <chris@noxz.tech>
date:   Fri, 9 Jul 2021 10:04:50 +0200
total remake of build scripts, and base generation on groff instead of markdown
M.gitignore12+-
MLICENSE2+-
MMakefile56+-
RREADME.mdREADMEREADME|
Dapply-extensions.sh34-
Aassemble11+
Dassemble.sh12-
Abuild723+++++++
Dbuild-blog.sh143--
Dbuild-git.sh106--
Dbuilder.c433-----
Dconfig.def.h32-
Mconfig.mk8+-
Aconfig/git_head.html15+
Aconfig/git_repos.html35+
Aconfig/main.html43+
Aconfig/sitemap_item.xml3+
Aconfig/www.conf103+
Dgenerate-sitemap.sh22-
Mgit.noxz.tech/pub/style.css121+-
Aipfs-publish43+
Dirc.noxz.tech/.assemble1-
Dirc.noxz.tech/index.swps125--
Dnoxz.tech/.title1-
Dnoxz.tech/about/copying-policy/index.md19-
Rnoxz.tech/about/copying-policy/.assemblenoxz.tech/about/copying_policy/.assemble0
Anoxz.tech/about/copying_policy/index.www33+
Dnoxz.tech/about/index.md71-
Anoxz.tech/about/index.www115++
noxz.tech/about/questions-&-answers/index.md | 19 - noxz.tech/about/questions-&-answers/.assemble | 0 noxz.tech/about/questions_&_answers/index.www | 19 + Dnoxz.tech/about/tools/index.md101- Anoxz.tech/about/tools/index.www194++ Dnoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate1- Dnoxz.tech/articles.nobuild/vi_indicator_for_loksh/.createdate1- Dnoxz.tech/articles.nobuild/vi_indicator_for_loksh/index.md19- Rnoxz.tech/dotfiles/selected-scripts/.assemblenoxz.tech/articles/.assemble0 Rnoxz.tech/sharing-is-caring/.assemblenoxz.tech/articles/askpass_implementation_for_doas/.assemble0 Rirc.noxz.tech/.buildignorenoxz.tech/articles/askpass_implementation_for_doas/.buildignore0 Anoxz.tech/articles/askpass_implementation_for_doas/index.www63+ Anoxz.tech/articles/index.www35+ Rnoxz.tech/sharing-is-caring/articles-by-others/.assemblenoxz.tech/articles/srfinder/.assemble0 Rnoxz.tech/articles.nobuild/.buildignorenoxz.tech/articles/srfinder/.buildignore0 Anoxz.tech/articles/srfinder/index.www31+ Anoxz.tech/articles/the_lenovo_thinkpad_t400/.assemble2+ Rnoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignorenoxz.tech/articles/the_lenovo_thinkpad_t400/.buildignore0 Rnoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.mdnoxz.tech/articles/the_lenovo_thinkpad_t400/index.www21+- Rnoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.pngnoxz.tech/articles/the_lenovo_thinkpad_t400/t400.pngBin Anoxz.tech/articles/vi_indicator_for_loksh/.assemble3+ Rnoxz.tech/articles.nobuild/vi_indicator_for_loksh/.buildignorenoxz.tech/articles/vi_indicator_for_loksh/.buildignore0 Anoxz.tech/articles/vi_indicator_for_loksh/index.www34+ Rnoxz.tech/articles.nobuild/vi_indicator_for_loksh/loksh-viprompt-20190502-774e6d2.patchnoxz.tech/articles/vi_indicator_for_loksh/loksh-viprompt-20190502-774e6d2.patch0 Rnoxz.tech/articles.nobuild/vi_indicator_for_loksh/usage.pngnoxz.tech/articles/vi_indicator_for_loksh/usage.pngBin Rnoxz.tech/dictionary/index.mdnoxz.tech/dictionary/index.www102+- Dnoxz.tech/dotfiles/index.md71- Anoxz.tech/dotfiles/index.www164++ Dnoxz.tech/dotfiles/selected-scripts/index.compiled.pdfBin2199 Anoxz.tech/dotfiles/selected_scripts/.assemble1+ Rnoxz.tech/dotfiles/selected-scripts/index.mdnoxz.tech/dotfiles/selected_scripts/index.www21+- Mnoxz.tech/guides/geogebra/.assemble2+- Rnoxz.tech/guides/geogebra/index.mdnoxz.tech/guides/geogebra/index.www52+- Dnoxz.tech/guides/groff/index.md163-- Anoxz.tech/guides/groff/index.www269+++ Mnoxz.tech/guides/groff/papers/making_pictures_with_gnu_pic.pdfBin184534 Dnoxz.tech/guides/groff/simple_compiler_for_vim/index.md73- Anoxz.tech/guides/groff/simple_compiler_for_vim/index.www106++ Mnoxz.tech/guides/groff/writing_a_resume_in_groff/.assemble4+- Dnoxz.tech/guides/groff/writing_a_resume_in_groff/index.md170-- Anoxz.tech/guides/groff/writing_a_resume_in_groff/index.www283+++ Rnoxz.tech/guides/index.mdnoxz.tech/guides/index.www38+- Mnoxz.tech/guides/mathematics/.assemble1+ Anoxz.tech/guides/mathematics/grohtml-10.pngBin0 Anoxz.tech/guides/mathematics/grohtml-11.pngBin0 Anoxz.tech/guides/mathematics/grohtml-12.pngBin0 Anoxz.tech/guides/mathematics/grohtml-13.pngBin0 Anoxz.tech/guides/mathematics/grohtml-14.pngBin0 Anoxz.tech/guides/mathematics/grohtml-15.pngBin0 Anoxz.tech/guides/mathematics/grohtml-16.pngBin0 Anoxz.tech/guides/mathematics/grohtml-17.pngBin0 Anoxz.tech/guides/mathematics/grohtml-18.pngBin0 Anoxz.tech/guides/mathematics/grohtml-19.pngBin0 Anoxz.tech/guides/mathematics/grohtml-20.pngBin0 Anoxz.tech/guides/mathematics/grohtml-21.pngBin0 Anoxz.tech/guides/mathematics/grohtml-22.pngBin0 Anoxz.tech/guides/mathematics/grohtml-23.pngBin0 Anoxz.tech/guides/mathematics/grohtml-24.pngBin0 Anoxz.tech/guides/mathematics/grohtml-25.pngBin0 Anoxz.tech/guides/mathematics/grohtml-26.pngBin0 Anoxz.tech/guides/mathematics/grohtml-27.pngBin0 Anoxz.tech/guides/mathematics/grohtml-28.pngBin0 Anoxz.tech/guides/mathematics/grohtml-29.pngBin0 Anoxz.tech/guides/mathematics/grohtml-3.pngBin0 Anoxz.tech/guides/mathematics/grohtml-30.pngBin0 Anoxz.tech/guides/mathematics/grohtml-31.pngBin0 Anoxz.tech/guides/mathematics/grohtml-32.pngBin0 Anoxz.tech/guides/mathematics/grohtml-33.pngBin0 Anoxz.tech/guides/mathematics/grohtml-34.pngBin0 Anoxz.tech/guides/mathematics/grohtml-35.pngBin0 Anoxz.tech/guides/mathematics/grohtml-36.pngBin0 Anoxz.tech/guides/mathematics/grohtml-37.pngBin0 Anoxz.tech/guides/mathematics/grohtml-38.pngBin0 Anoxz.tech/guides/mathematics/grohtml-39.pngBin0 Anoxz.tech/guides/mathematics/grohtml-4.pngBin0 Anoxz.tech/guides/mathematics/grohtml-40.pngBin0 Anoxz.tech/guides/mathematics/grohtml-41.pngBin0 Anoxz.tech/guides/mathematics/grohtml-42.pngBin0 Anoxz.tech/guides/mathematics/grohtml-43.pngBin0 Anoxz.tech/guides/mathematics/grohtml-5.pngBin0 Anoxz.tech/guides/mathematics/grohtml-6.pngBin0 Anoxz.tech/guides/mathematics/grohtml-7.pngBin0 Anoxz.tech/guides/mathematics/grohtml-8.pngBin0 Anoxz.tech/guides/mathematics/grohtml-9.pngBin0 Dnoxz.tech/guides/mathematics/index.md1990-------------------- Anoxz.tech/guides/mathematics/index.www834++++++++ Dnoxz.tech/index.md109-- Anoxz.tech/index.www171++ Dnoxz.tech/music/index.md41- Anoxz.tech/music/index.www81+ Mnoxz.tech/pub/.assemble3- Dnoxz.tech/pub/rss.svg34- Mnoxz.tech/pub/style.css174+- Dnoxz.tech/sharing-is-caring/articles-by-others/index.md17- Anoxz.tech/sharing_is_caring/.assemble1+ Anoxz.tech/sharing_is_caring/articles_by_others/.assemble1+ Anoxz.tech/sharing_is_caring/articles_by_others/index.www17+ Rnoxz.tech/sharing-is-caring/index.mdnoxz.tech/sharing_is_caring/index.www10+- Rnoxz.tech/software/cidr2ip/index.mdnoxz.tech/software/cidr2ip/index.www0 Dnoxz.tech/software/index.md51- Anoxz.tech/software/index.www43+ Rnoxz.tech/software/ip2cidr/index.mdnoxz.tech/software/ip2cidr/index.www0 Anoxz.tech/software/mpvd/.buildignore0 Dnoxz.tech/software/mpvd/index.md56- Anoxz.tech/software/mpvd/index.www81+ Anoxz.tech/software/rspan/.buildignore0 Dnoxz.tech/software/rspan/index.md27- Anoxz.tech/software/rspan/index.www48+ Mnoxz.tech/software/satan-gh60/.assemble2+- Anoxz.tech/software/satan-gh60/.buildignore0 Rnoxz.tech/software/satan-gh60/index.mdnoxz.tech/software/satan-gh60/index.www60+- Anoxz.tech/software/swps/.buildignore0 Dnoxz.tech/software/swps/index.md23- Anoxz.tech/software/swps/index.www46+ Anoxz.tech/software/tapas/.buildignore0 Dnoxz.tech/software/tapas/index.md51- Anoxz.tech/software/tapas/index.www91+ Rnoxz.tech/software/wikid/index.mdnoxz.tech/software/wikid/index.www0 Anoxz.tech/software/xrectdraw/.buildignore0 Rnoxz.tech/software/xrectdraw/index.mdnoxz.tech/software/xrectdraw/index.www56+- Anoxz.tech/software/ztatus/.buildignore0 Rnoxz.tech/software/ztatus/index.mdnoxz.tech/software/ztatus/index.www52+- 151 files changed, 4155 insertions(+), 4401 deletions(-)
diff --git a/.gitignore b/.gitignore
@@ -1,15 +1,7 @@
 *.html
-!/*.html
-builder
-config.h
+!config/*.html
 web.tar
-articles.ref
-quark.map
-repo-graph
-noxz.tech/blog
-noxz.tech/pub/feed.rss
 git.noxz.tech/*
 !git.noxz.tech/pub
-git.noxz.tech/pub/logo.png
-noxz.tech/pub/logo.png
+logo.png
 sitemap.xml
diff --git a/LICENSE b/LICENSE
@@ -1,6 +1,6 @@
 MIT License
 
-© 2018-2019 Chris Noxz <chris@noxz.tech>
+© 2018-2021 Chris Noxz <chris@noxz.tech>
 
 Permission is hereby granted, free of charge, to any person obtaining a
 copy of this software and associated documentation files (the "Software"),
diff --git a/Makefile b/Makefile
@@ -1,57 +1,33 @@
 include config.mk
 
-all: clean builder
-	@echo building blog structure
-	@./build-blog.sh
-	@
-	@echo rendering html files
-	@find * -type d -exec sh -ec '[ ! -f "$$0/.buildignore" ] && ./builder "$$0" >$$0/index.html 2>/dev/null' {} \;
-	@
-	@echo applying extensions
-	@./apply-extensions.sh
-	@
-	@echo creating git site
-	@./build-git.sh
+all: clean
+	@echo building sites
+	@./build
 	@
 	@echo creating icons
 	@convert -density 1200 -resize 256x256 ./noxz.tech/pub/logo.black.svg ./noxz.tech/pub/logo.png
 	@convert -density 1200 -resize 256x256 ./git.noxz.tech/pub/logo.svg ./git.noxz.tech/pub/logo.png
 	@
-	@echo generating sitemap.xml
-	@./generate-sitemap.sh noxz.tech > noxz.tech/pub/sitemap.xml
-	@./generate-sitemap.sh git.noxz.tech > git.noxz.tech/pub/sitemap.xml
-	@printf 'User-Agent: *\ndisallow:\nsitemap: https://%s/pub/sitemap.xml' noxz.tech > noxz.tech/robots.txt
-	@printf 'User-Agent: *\ndisallow:\nsitemap: https://%s/pub/sitemap.xml' git.noxz.tech > git.noxz.tech/robots.txt
-	@
-	@echo assembling tar archive 'web.tar'
-	@./assemble.sh web.tar
-
-builder: config.h builder.c
-	@echo CC -o $@
-	@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ builder.c
+	@echo assembling tar archive '${ASSEMBLE_TAR}'
+	@./assemble ${ASSEMBLE_TAR}
 
-publish: all
+publish:
 	@echo publishing to web server...
-	@scp ./web.tar anthra.system.local:/usr/local/share/noxz.tech/web.tar
+	@[ -f ${ASSEMBLE_TAR} ] && scp ${ASSEMBLE_TAR} ${PUBLISH_PATH} || echo must build first
 
-config.h:
-	@echo creating $@ from config.def.h
-	@cp config.def.h $@
+ipfs:
+	@echo publishing to IPFS...
+	@[ -f ${ASSEMBLE_TAR} ] && ./ipfs-publish ${ASSEMBLE_TAR} || echo must build first
 
 clean:
 	@echo cleaning
-	@find ./git.noxz.tech/* -type d -prune ! -name "pub" -exec sh -ec 'rm -r "$$0"' {} \;
-	@find -name '*.html' -type f -exec sh -ec 'rm "$$0"' {} \;
-	@rm -rf noxz.tech/blog
-	@rm -f noxz.tech/robots.txt
-	@rm -f noxz.tech/pub/feed.rss
+	@find ./noxz.tech/ -name '*.html' -type f -exec sh -ec 'rm "$$0"' {} \;
+	@find ./git.noxz.tech/ -name '*.html' -type f -exec sh -ec 'rm "$$0"' {} \;
 	@rm -f noxz.tech/pub/logo.png
 	@rm -f noxz.tech/pub/sitemap.xml
-	@rm -f git.noxz.tech/robots.txt
 	@rm -f git.noxz.tech/pub/logo.png
 	@rm -f git.noxz.tech/pub/sitemap.xml
-	@rm -f articles.ref
-	@rm -f quark.map
-	@rm -f web.tar
-	@rm -f builder
-	@rm -f repo-graph
+	@rm -f ${ASSEMBLE_TAR}
+
+clean-git:
+	@find ./git.noxz.tech -type d -prune ! -name "pub" -exec sh -ec 'rm -r "$$0"' {} \;
diff --git a/README.md b/README
rename README.md → README
@@ -5,7 +5,6 @@ noxz.tech sites:
 
 + noxz.tech
 + git.noxz.tech
-+ irc.noxz.tech
 
 License
 -------
diff --git a/apply-extensions.sh b/apply-extensions.sh
@@ -1,34 +0,0 @@
-#!/bin/sh
-
-if [ -f ./articles.ref ]; then
-    # replace references based on [[display_text|article_name]]
-    while read a b; do
-        find ./noxz.tech/ -name "*.html" -type f -print0 | \
-            xargs -0 sed -i -e "s,\[\[\([^|]*\)|$a\]\],<a href="$b">\1</a>,g"
-    done < ./articles.ref
-
-    # replace missing references with display text only
-    find ./noxz.tech/ -name "*.html" -type f -print0 | \
-        xargs -0 sed -i -e 's,\[\[\([^|]*\)|\([^]]*\)\]\],\1,g'
-fi
-
-# remove spacings between span generators
-find ./noxz.tech/ -name "*.html" -type f -print0 |                          \
-    xargs -0 sed -i -n                                                      \
-    -e 's/^\.*\({-[^}]*}\)/\1/g'                                            \
-    -e 'H;${x;s/\({-[^}]*}[^\n]*\)\n/\1/g;p;}'
-
-# 1. inject span blocks {- ...}, {--}
-# 1. inject div blocks {:: ...}, {::}
-# 2. inject block parameters {: ...}
-# 3. remove comments
-# 4. replace 2 en dashs with 1 em dash
-find ./noxz.tech/ -name "*.html" -type f -print0 |                          \
-    xargs -0 sed -i                                                         \
-    -e 's,{--},</span>,g'                                                   \
-    -e 's,{-\([^}]*\)},<span\1>,g'                                          \
-    -e 's,^\(<[^>]*>\){::\( .*\)}$,<div\2>\1,g'                             \
-    -e 's,^{::},</div>,g'                                                   \
-    -e 's,^<\([^>]*\)>{:\( .*\)}$,<\1\2>,g'                                 \
-    -e '/{% comment %}/,/{% endcomment %}/d'                                \
-    -e 's,\\--,–,g'
diff --git a/assemble b/assemble
@@ -0,0 +1,11 @@
+#!/bin/sh
+[ $# -eq 0 ] && return
+
+> assembly.list
+find -L ./git.noxz.tech -type f >> assembly.list
+for a in $(find ./noxz.tech -name ".assemble"); do
+	cat "$a" | while read line; do echo ${a%.*}$line | tr ' ' '\n'; done
+done >> assembly.list
+
+tar -chf "$1" -T assembly.list
+rm assembly.list
diff --git a/assemble.sh b/assemble.sh
@@ -1,12 +0,0 @@
-#!/bin/sh
-[ $# -eq 0 ] && return
-
-> assembly.list
-find ./git.noxz.tech/ -type f -not -name ".cache" >> assembly.list
-find ./noxz.tech/blog/ -type f -not -name "*.md" -and -not -name ".*" >> assembly.list
-for a in $(find ./ -name ".assemble"); do
-    sed -e "s:^:$(echo ${a%.*} | sed 's:&:\\&:g'):" $a
-done >> assembly.list
-
-tar -cf "$1" -T assembly.list
-rm assembly.list
diff --git a/build b/build
@@ -0,0 +1,723 @@
+#!/bin/sh
+
+# ---------------------------- global variables ----------------------------- #
+SITE_DOMAIN="noxz.tech"
+SITE_TITLE="noxz.tech | noxz.tech - Chris Noxz (aka. z0noxz)"
+SITE_MAIN_TITLE="noxz.tech"
+SITE_SUB_TITLE="- Chris Noxz (aka. z0noxz)"
+SITE_AUTHOR="Chris Noxz"
+SITE_ICON_PNG="//[site]/pub/logo.png"
+SITE_ICON_SVG="//[site]/pub/logo.svg"
+SITE_CSS="//[site]/pub/style.css"
+SITE_GIT_REPO_ROOT="${HOME}/mnt/src/z0noxz"
+SITE_GIT_COMMIT_PH="repo-logs"
+SITE_GIT_COMMIT_COUNT="15"
+SITE_WWW=
+SITE_HTML=
+# ------------------------------ config files ------------------------------- #
+CFG_DIR="./config"
+# ------------------- groff www macro configuration files ------------------- #
+CFG_GROFF_WWW_MACRO="${CFG_DIR}/www.conf"
+# ---------------------- main html configuration files ---------------------- #
+CFG_MAIN_HTML="${CFG_DIR}/main.html"
+# ---------------------- git html configuration files ----------------------- #
+CFG_GIT_REPOS_HTML="${CFG_DIR}/git_repos.html"
+CFG_GIT_HEAD_HTML="${CFG_DIR}/git_head.html"
+# --------------------- sitemap.xml configuration files --------------------- #
+CFG_SITEMAP_XML="${CFG_DIR}/sitemap.xml"
+CFG_SITEMAP_XML_ITEM="${CFG_DIR}/sitemap_item.xml"
+
+# helper function to html encode stdin
+html_encode() {
+	if [ ! -t 0 ]; then
+		cat -
+	elif [ -n "$1" ]; then
+		echo "$1"
+	fi                                                                      \
+	| sed                                                                   \
+		-e 's/&/\&amp;/g'                                                   \
+		-e 's/"/\&quot;/g'                                                  \
+		-e 's/</\&lt;/g'                                                    \
+		-e 's/>/\&gt;/g'
+}
+
+awk_safe() {
+	if [ ! -t 0 ]; then
+		cat -
+	elif [ -n "$1" ]; then
+		echo "$1"
+	fi                                                                      \
+	|  sed                                                                  \
+		-e 's/\\/\\\\/g'                                                    \
+		-e 's/\&/\\\\\&/g'
+
+}
+
+print_loading() {
+	>&2 printf '[%s*%s] %-.100s '                                           \
+		"$(tput setaf 12)"                                                  \
+		"$(tput sgr 0)"                                                     \
+		"${1} $(for i in `seq 1 100`; do printf '.'; done)"
+}
+
+print_done() {
+	>&2 printf '[%sdone%s]\n'                                               \
+		"$(tput setaf 10)"                                                  \
+		"$(tput sgr 0)"
+}
+
+# arg 1: site root eg. ../noxz-sites/noxz.tech
+# arg 2: current site eg. ../noxz-sites/noxz.tech/guides/groff
+render_main_menu() {
+	# variables used
+	local _root="${1}"
+	local _current="${2}"
+	local _active=""
+	local _output=""
+	local _buffer=""
+	local _home="$(printf '<li><a href="//%s/">home</a></li>' "${SITE_DOMAIN}")"
+
+	# check if both directories exist
+	[ ! -d "${_root}" ] && return
+	[ ! -d "${_current}" ] && return
+
+	# remove trailing slashes if existing
+	_root=$(dirname "${_root}/*")
+	_current=$(dirname "${_current}/*")
+
+	# make sure current directory is a subdirectory of root
+	echo "${_current}" | grep -qv "^${_root}" && return
+
+	# root menu
+	if [ "${_root}" = "${_current}" ]; then
+		_home="$(echo "$_home" | sed 's/<li/<li class="active"/')"
+		for f in ${_current}/*; do
+			[ ! -d "${f}" ] && continue                 # only process directories
+			[ -f "${f}/.buildignore" ] && continue      # skip buildignore
+
+			ff="$(echo "${f}" | sed "s?^${_root}?//${SITE_DOMAIN}?")"
+			fn="$(echo "${f##*/}" | sed 's/_/ /g')"
+			_output=$(printf '%s<li><a href="%s">%s</a></li>'               \
+				"${_output}"                                                \
+				"${ff}"                                                     \
+				"${fn}")
+		done
+	fi
+
+	# run until root directory is the current one
+	while [ "${_root}" != "${_current}" ]; do
+
+		# handle children of first current
+		if [ "${_current}" = "${2}" ]; then
+			for f in ${_current}/*; do
+				[ ! -d "${f}" ] && continue             # only process directories
+				[ -f "${f}/.buildignore" ] && continue  # skip buildignore
+				_output="$(printf '%s<li' "${_output}")"
+				ff="$(echo "${f}" | sed "s?^${_root}?//${SITE_DOMAIN}?")"
+				fn="$(echo "${f##*/}" | sed 's/_/ /g')"
+				_output=$(printf '%s><a href="%s">%s</a></li>'              \
+					"${_output}"                                            \
+					"${ff}"                                                 \
+					"${fn}")
+			done
+		fi
+
+		_active="${_current}"                           # mark current as active
+		_current="${_current%/*}"                       # mark parent as current
+
+		# handle all siblings
+		for f in ${_current}/*; do
+			[ ! -d "${f}" ] && continue                 # only process directories
+			[ -f "${f}/.buildignore" ] && continue      # skip buildignore
+
+			_buffer=$(printf '%s<li' "${_buffer}")
+			ff="$(echo "${f}" | sed "s?^${_root}?//${SITE_DOMAIN}?")"
+			fn="$(echo "${f##*/}" | sed 's/_/ /g')"
+			if [ "${f}" = "${_active}" ]; then          # treat active different
+				_buffer=$(printf '%s class="active"><a href="%s">%s</a>'    \
+					"${_buffer}"                                            \
+					"${ff}"                                                 \
+					"${fn}")
+				# dump output to buffer if existing (sub menu)
+				[ "$_output" != "" ]                                        \
+				&& _buffer=$(printf '%s<ul>%s</ul>'                         \
+					"${_buffer}"                                            \
+					"${_output}")
+				_buffer=$(printf '%s</li>' "${_buffer}")
+			else
+				_buffer=$(printf '%s><a href="%s">%s</a></li>'              \
+					"${_buffer}"                                            \
+					"${ff}"                                                 \
+					"${fn}")
+			fi
+		done
+		_output="${_buffer}"
+		_buffer=""
+	done
+	printf '<ul id="main-nav">%s%s</ul>'                                    \
+		"${_home}"                                                          \
+		"${_output}"                                                        \
+	| sed                                                                   \
+		-e 's,\(<\(ul\|li\)[^>]*>\|</ul>\),\n\1,2g'                         \
+		-e 's,\(</ul>\)\(</li>\),\1\n\2,g'                                  \
+	| awk '
+		BEGIN {
+			level=0
+		}
+
+		/<\/ul>/ {
+			level--
+		}
+
+		/^<\/li>$/ {
+			level--
+		}
+
+		{
+			for (i=0; i<level; i++)
+				printf "\t"
+			print
+		}
+
+		/<ul[^>]*>/ {
+			level++
+		}
+
+		/<li[^>]*>.*<\/a>$/ {
+			level++
+		}
+	'
+}
+
+render_main_menu_extra() {
+	printf '<li><a class="%s" href="%s">%s</a></li>\n'                      \
+		"twtxt" "twtxt.txt" "twtxt"                                         \
+	| awk                                                                   \
+	'
+		BEGIN {
+			printf "<ul id=\"extra-nav\">\n"
+		}
+
+		{
+			printf "\t%s\n", $0
+		}
+
+		END {
+			printf "</ul>\n"
+		}
+	'
+}
+
+render_main_content() {
+	awk '
+		# Grohtml (post-html.cpp) has a hard coded max length:
+		# https://git.savannah.gnu.org/cgit/groff.git/tree/src/devices/grohtml/post-html.cpp
+		# 51: #define MAX_LINE_LENGTH                   60
+		# This creates a problem when printing words longer than 60 characters -
+		# creating an extra blank line before the word. Further more grohtml
+		# actually do not print code blocks using <code> or <pre> so blank lines
+		# that are supposed to be printed are instead ignored. These following
+		# awk scripts together with some extensions of the www-macros (see.
+		# www.conf) are supposed to fix these issues.
+
+		BEGIN { # initialize variables
+			_inblock=0
+		}
+
+		/\.COS/ {
+			_inblock=1
+		}
+
+		/\.COE/ {
+			_inblock=0
+		}
+
+		{ # normal: no fixes applied
+			if (!_inblock) {
+				print
+				next
+			}
+		}
+
+		## INSIDE CODE BLOCK ##
+
+		# replace blank lines with extended BR macro
+		/^$/ {
+			print ".COMMENT-BR"
+			next
+		}
+
+		/\t/ { # replace tabs with 4 spaces
+			gsub(/\t/, "    ", $0);
+		}
+
+		{ # very ugly fix to preserve spaces (see if this can be imporoved upon)
+			# NOTE: angle brackets will be encoded by groff!
+			gsub(/\s{2}/, "<!--space--><!--space-->", $0)
+			gsub(/<!--space-->\s/, "<!--space--><!--space-->", $0)
+			print
+		}
+	' "${SITE_WWW}"                                                         \
+	| cat "${CFG_GROFF_WWW_MACRO}" -                                        \
+	| groff                                                                 \
+		-Thtml -e -mwww -k                                                  \
+		-I"${SITE_WWW%/*}/grohtml-"                                         \
+	| awk '
+		# --------------------------------------------
+		# somewhat messy fix for code block formatting
+		# --------------------------------------------
+		BEGIN { # initialize variables
+			_inblock=0
+			_break=0
+		}
+
+		/<pre><code>/ { # signal start of code block
+			_inblock=1
+		}
+
+		/<\/code><\/pre>/ { # signal end of code block
+			_inblock=0
+		}
+
+		{ # normal: no fixes applied
+			if (!_inblock) {
+				print
+				next
+			}
+		}
+
+		## INSIDE CODE BLOCK ##
+
+		/^$/ { # fix: skip blank lines in code blocks
+			next
+		}
+
+		{ # handle general code block instances
+			# replace placeholders
+			gsub(/&lt;!--space--&gt;/, " ", $0);    # groff has now encoded angle brackets
+			gsub(/<!--break-->/, "", $0);
+
+			if (!_break)
+				printf " "
+			_break=0
+		}
+
+		/<br[^>]*>/ { # signal line break
+			_break=1
+		}
+
+		{
+			gsub(/<br[^>]*>/, "\n", $0);
+			printf "%s", $0
+		}
+	'                                                                       \
+	| sed                                                                   \
+		-e 's/<p style[^>]*>/<p>/g'                                         \
+		-e 's/<dd>/<dd><p>/g'                                               \
+		-e 's/<p><!--/<!--/g' -e 's/--><\/p>/-->/g'                         \
+		-e 's/\[at\]/<span>\&#64;<\/span>/g'                                \
+		-e 's/\(src\|alt\)="[^"]*\(grohtml-[0-9]*.png\)/\1="\2/g'           \
+		-e 's/<p align="center"[^>]*>\(<img src="grohtml-[0-9]*.png\)/<p class="grohtml">\1/g' \
+		-e 's/<p align="\(left\|center\|right\)"[^>]*>/<p class="\1">/g'    \
+	| tidy -asxhtml                                                         \
+	| awk '
+		/<body>/{
+			flag=1
+			next
+		}
+
+		/<\/body>/{
+			flag=0
+		}
+
+		flag
+	'                                                                       \
+	| awk '
+		BEGIN { # initialize variables
+			_inblock=0
+		}
+
+		{ # normal: no fixes applied
+			if (NR > 1 && !_inblock) {
+				printf "<!--padding-->"
+			}
+			print
+		}
+		/<pre><code>/ { # signal start of code block
+			_inblock=1
+		}
+
+		/<\/code><\/pre>/ { # signal end of code block
+			_inblock=0
+		}
+	'
+}
+
+render_main() {
+	local _current="${2}"
+
+	[ ! -d "${_current}" ] && return
+	_current=$(dirname "${_current}/*")
+
+	[ -f "${_current}/index.www" ] && SITE_WWW="${_current}/index.www" || return
+	[ -f "${_current}/.title" ] && SITE_TITLE="$(<"${_current}/.title")"
+	SITE_HTML="${SITE_WWW%.*}.html"
+
+	print_loading "Rendering ${_current}"
+
+	awk                                                                     \
+		-v var_author="$(awk_safe "${SITE_AUTHOR}")"                        \
+		-v var_title="$(awk_safe "${SITE_TITLE}")"                          \
+		-v var_favicon="$(awk_safe "${SITE_ICON_PNG}")"                     \
+		-v var_stylesheet="$(awk_safe "${SITE_CSS}")"                       \
+		-v var_logo="$(awk_safe "${SITE_ICON_SVG}")"                        \
+		-v var_main_title="$(awk_safe "${SITE_MAIN_TITLE}")"                \
+		-v var_sub_title="$(awk_safe "${SITE_SUB_TITLE}")"                  \
+		-v var_menu="$(render_main_menu "$1" "$2" | awk_safe)"              \
+		-v var_menu_extra="$(render_main_menu_extra | awk_safe)"            \
+		-v var_content="$(render_main_content 2>/dev/null | awk_safe)"      \
+		-v var_year="$(date +%Y)"                                           \
+	'
+		/\{:menu:\}/{
+			padding=$0
+			gsub(/{:.*:}$/, "", padding)
+			gsub(/\n/, "\n" padding, var_menu)
+		}
+
+		/\{:menu_extra:\}/{
+			padding=$0
+			gsub(/{:.*:}$/, "", padding)
+			gsub(/\n/, "\n" padding, var_menu_extra)
+		}
+
+		/\{:content:\}/{
+			padding=$0
+			gsub(/{:.*:}$/, "", padding)
+			gsub(/<!--padding-->/, padding, var_content)
+		}
+
+		{
+			gsub(/\{:author:\}/, var_author)
+			gsub(/\{:title:\}/, var_title)
+			gsub(/\{:favicon:\}/, var_favicon)
+			gsub(/\{:stylesheet:\}/, var_stylesheet)
+			gsub(/\{:logo:\}/, var_logo)
+			gsub(/\{:main_title:\}/, var_main_title)
+			gsub(/\{:sub_title:\}/, var_sub_title)
+			gsub(/\{:menu:\}/, var_menu)
+			gsub(/\{:menu_extra:\}/, var_menu_extra)
+			gsub(/\{:content:\}/, var_content)
+			gsub(/\{:year:\}/, var_year)
+			print
+		}
+	' "${CFG_MAIN_HTML}" > "${SITE_HTML}"
+
+	print_done
+}
+
+render_git_repo() {
+	local _path="${SITE_GIT_REPO_ROOT}/$2"
+	local _path_head="$1/${2}/head.html.tmp"
+	local _path_log="$1/${2}/log.html.tmp"
+	local _path_readme="$1/${2}/readme.html.tmp"
+	local _path_license="$1/${2}/license.html.tmp"
+	local _name="${2%.*}"
+	local _description="$(cat "${1}/${2}"/description | html_encode)"
+
+	rsync -a --delete-before "${_path}/" "$1/${2##*/}"
+	git -C "$1/${2##*/}" --bare update-server-info
+	ln -s "refs" "$1/${2##*/}/info/refs?service=git-upload-pack"
+
+	# render common html head
+	awk                                                                     \
+		-v var_site="$(awk_safe "${1}")"                                    \
+		-v var_repo="$(awk_safe "${2}")"                                    \
+		-v var_logo="$(awk_safe "${SITE_ICON_SVG}")"                        \
+		-v var_name="$(awk_safe "${_name}")"                                \
+		-v var_description="$(awk_safe "${_description}")"                  \
+		-v var_menu="$(
+			git -C "$1/${2}" show HEAD:README >/dev/null 2>&1 ||            \
+			git -C "$1/${2}" show HEAD:LICENSE >/dev/null 2>&1 &&           \
+			printf '<a href="log.html">Log</a>'
+			git -C "$1/${2}" show HEAD:README >/dev/null 2>&1 &&            \
+			printf ' | <a href="readme.html">README</a>'
+			git -C "$1/${2}" show HEAD:LICENSE >/dev/null 2>&1 &&           \
+			printf ' | <a href="license.html">LICENSE</a>'
+		)"                                                                  \
+	'
+		{
+			gsub(/\{:site:\}/, var_site)
+			gsub(/\{:repo:\}/, var_repo)
+			gsub(/\{:logo:\}/, var_logo)
+			gsub(/\{:name:\}/, var_name)
+			gsub(/\{:description:\}/, var_description)
+			gsub(/\{:menu:\}/, var_menu)
+			print
+		}
+	' "${CFG_GIT_HEAD_HTML}" > "${_path_head}"
+
+	# render log
+	git -C "$1/${2}" log                                                    \
+		--date=format:"%Y-%m-%d %T"                                         \
+		--pretty="format:%ad%n%s%n%an%n%h"                                  \
+	| html_encode                                                           \
+	| awk '
+		BEGIN {
+			printf "\t<table id=\"log\">\n"
+			printf "\t\t<tr class=\"nohi\">"
+			printf "<td>Date</td>"
+			printf "<td>Commit message</td>"
+			printf "<td>Author</td>"
+			printf "<td>Commit</td>"
+			printf "</tr>\n"
+			printf "\t\t<tbody>\n"
+		}
+
+		{
+			entry[(NR-1) % 4] = $0
+			if (NR % 4 == 0) {
+				printf "\t\t\t<tr>"
+				for (i = 0; i < 4; i++) {
+					printf "<td>%s</td>",entry[i]
+				}
+				printf "</tr>\n"
+			}
+		}
+
+		END {
+			printf "\t\t</tbody>\n"
+			printf "\t</table>\n"
+		}
+	' > "${_path_log}"
+
+	# render readme if existing
+	git -C "$1/${2}" show HEAD:README >/dev/null 2>&1 &&                    \
+	git -C "$1/${2}" cat-file HEAD:README -p                                \
+	| html_encode                                                           \
+	| awk '
+		BEGIN {
+			print "<pre>"
+		}
+
+		{
+			print "<span>" NR "</span>" $0
+		}
+
+		END {
+			print "</pre>"
+		}
+	' > "${_path_readme}" &&                                                \
+	ln -s "readme.html" "$1/${2}/index.html"
+
+	# render license if existing
+	git -C "$1/${2}" show HEAD:LICENSE >/dev/null 2>&1 &&                   \
+	git -C "$1/${2}" cat-file HEAD:LICENSE -p                               \
+	| html_encode                                                           \
+	| awk '
+		BEGIN {
+			print "<pre>"
+		}
+
+		{
+			print "<span>" NR "</span>" $0
+		}
+
+		END {
+			print "</pre>"
+		}
+	' > "${_path_license}"
+
+	[ ! -h "$1/${2}/index.html" ] && ln -s "log.html" "$1/${2}/index.html"
+}
+
+render_git() {
+	local _repos=
+	local _forks=
+	local _buffer=
+	local _pp=
+	local _owner=
+	local _description=
+	local _index="${1}/index.html"
+
+	for repo in ${SITE_GIT_REPO_ROOT}/*; do
+		_pp="${repo##*/}"
+		_pp="${_pp%.*}"
+		print_loading "Rendering repo ${_pp}"
+		_owner="$(cat "${repo}"/owner | html_encode)"
+		_description="$(cat "${repo}"/description | html_encode)"
+		_buffer=$(
+			printf '<tr><td><a href="%s">%s</a></td><td>%s</td><td>%s</td><td>%s</td></tr>' \
+				"//${1}/${repo##*/}"                                        \
+				"${_pp}"                                                    \
+				"${_description}"                                           \
+				"${_owner}"                                                 \
+				"$(git -C "${repo}" log -1 --date=format:"%Y-%m-%d %T" --format=%ad)")
+
+		[ -f "$repo/fork" ]                                                 \
+			&& _forks="$(printf '%s%s' "${_forks}" "${_buffer}")"           \
+			|| _repos="$(printf '%s%s' "${_repos}" "${_buffer}")"
+
+		render_git_repo "${1}" "${repo##*/}"
+		print_done
+	done
+
+	awk                                                                     \
+		-v var_author="$(awk_safe "${SITE_AUTHOR}")"                        \
+		-v var_title="$(awk_safe "Repositories")"                           \
+		-v var_favicon="$(awk_safe "${SITE_ICON_PNG}")"                     \
+		-v var_stylesheet="$(awk_safe "${SITE_CSS}")"                       \
+		-v var_logo="$(awk_safe "${SITE_ICON_SVG}")"                        \
+		-v var_repos="$(awk_safe "${_repos}" | sed 's/<tr>/\n\0/2g')"       \
+		-v var_forks="$(awk_safe "${_forks}" | sed 's/<tr>/\n\0/2g')"       \
+	'
+		/\{:repos:\}/{
+			padding=$0
+			gsub(/{:.*:}$/, "", padding)
+			gsub(/\n/, "\n" padding, var_repos)
+		}
+
+		/\{:forks:\}/{
+			padding=$0
+			gsub(/{:.*:}$/, "", padding)
+			gsub(/\n/, "\n" padding, var_forks)
+		}
+
+		{
+			gsub(/\{:author:\}/, var_author)
+			gsub(/\{:title:\}/, var_title)
+			gsub(/\{:favicon:\}/, var_favicon)
+			gsub(/\{:stylesheet:\}/, var_stylesheet)
+			gsub(/\{:logo:\}/, var_logo)
+			gsub(/\{:repos:\}/, var_repos)
+			gsub(/\{:forks:\}/, var_forks)
+			print
+		}
+	' "${CFG_GIT_REPOS_HTML}" > "${_index}"
+
+	# complete html-files from html.tmp files
+	find "${1}" -mindepth 2 -type f -name "*.html.tmp" | while read file; do
+		[ ${file##*/} = "head.html.tmp" ] && continue
+		awk '1;/<body>/{exit}' "${_index}" > "${file%.*}"
+		cat "${file%/*}/head.html.tmp" >> "${file%.*}"
+		cat "${file}" >> "${file%.*}"
+		awk '/<\/body>/,0' "${_index}" >> "${file%.*}"
+	done
+
+	# remove all html.tmp files
+	find "${1}" -mindepth 2 -type f -name "*.html.tmp" -exec rm -f {} \;
+}
+
+render_git_commits() {
+	local _tmp_file="$(mktemp "${TMPDIR:-/tmp/}$(basename $0).repolog.XXXXXX")"
+
+	for repo in $SITE_GIT_REPO_ROOT/*; do
+		a=${repo##*/}
+		a="<a href=\"//git.${1}/${a}\">${a%.*}</a>"
+		git -C "${repo}" log -n "${SITE_GIT_COMMIT_COUNT}"                  \
+			--no-merges                                                     \
+			--date="format:%Y-%m-%d %H:%M:%S"                               \
+			--pretty="format:%at:%ad [$a] %s"
+		echo
+	done                                                                    \
+	| sort -r                                                               \
+	| sed "${SITE_GIT_COMMIT_COUNT}q"                                       \
+	| sed -e 's/^[^:]*://g'                                                 \
+	| awk '
+		BEGIN {
+			print "<ul class=\"repo-log\">";
+		}
+
+		{
+			printf "<li><span class=\"log-date\">%s %s</span>",$1,$2;
+			$1=$2="";
+			$0=$0;
+		}
+
+		NF=NF {
+			printf "%s</li>\n",$0
+		}
+
+		END {
+			print "<li>[<a href=\"//git.noxz.tech/\">...</a>]</li></ul>"
+		}
+	' > "${_tmp_file}"
+
+	find "${1}" -type f -name 'index.html' -exec                            \
+		sed -i {} -e "
+			/^.*<!--placeholder:${SITE_GIT_COMMIT_PH}-->.*$/ {
+				r ${_tmp_file}
+				d
+			}
+		" \;
+
+	rm -f "${_tmp_file}"
+}
+
+generate_sitemap() {
+	local _sitemap="${1}/pub/sitemap.xml"
+
+	awk                                                                     \
+		-v var_items="$(
+			find -L "${1}" -type f -name 'index.html'                       \
+			| html_encode                                                   \
+			| awk                                                           \
+				-v format_item="$(cat "${CFG_SITEMAP_XML_ITEM}")\n"         \
+			'
+				{
+					gsub(/[^\/]*$/, "")
+					printf format_item, $0
+				}
+			' | awk_safe
+		)"                                                                  \
+	'
+		{
+			gsub(/\{:items:\}/, var_items)
+			print
+		}
+	' "${CFG_SITEMAP_XML}" > "${_sitemap}"
+}
+
+main() {
+	# make sure both arguments, if existing, are directories
+	[ ! -z "$1" ] && [ ! -d "$1" ] && return
+	[ ! -z "$2" ] && [ ! -d "$2" ] && return
+
+	# main render
+	[ -z "$2" ]                                                             \
+	&& find "$1" -type d                                                    \
+		-exec test -e '{}/index.www' \;                                     \
+		-exec "$0" "$1" {} \;                                               \
+	|| render_main "$1" "$2"
+
+	# post main render
+	if [ -z "$2" ]; then
+		# render git commits into place holders
+		print_loading "Rendering git commits"
+		render_git_commits "$1"
+		print_done
+
+		# render git
+		[ "${SKIPGIT-SKIP}" = "SKIP" ] && render_git "git.${1}"
+
+		# convert absolute paths to relative, so that they work with IPFS
+		print_loading "Converting absolute paths to relative"
+		for site in "$1" "git.${1}"; do
+			find "${site}" -type f -name "*.html" | while read line; do
+				count="$(echo "$line" | tr -cd '/' | wc -c)"
+				sed -i "s,\"//\(${site}\|\[site\]\)/,\"$(
+						seq -f "../%g" -s '' 2 "$count" | sed 's/[0-9]//g'
+					),g" "$line"
+			done
+		done
+		print_done
+
+		# generate sitemaps
+		print_loading "Generating sitemaps"
+		generate_sitemap "${1}"
+		generate_sitemap "git.${1}"
+		print_done
+
+	fi
+}
+
+main "${1:-$SITE_DOMAIN}" "$2"
diff --git a/build-blog.sh b/build-blog.sh
@@ -1,143 +0,0 @@
-#!/bin/sh
-
-base="noxz.tech/blog"
-rss="noxz.tech/pub/feed.rss"
-
-rss_head="\
-<?xml version=\"1.0\" encoding=\"UTF-8\" ?>
-<rss version=\"2.0\"
-  xmlns:content=\"http://purl.org/rss/1.0/modules/content/\"
-  xmlns:dc=\"http://purl.org/dc/elements/1.1/\"
-  >
-<channel>
-  <title>Chris Noxz Blog</title>
-  <description>Chris Noxz Blog</description>
-  <link>http://noxz.tech/blog/</link>
-  <lastBuildDate>%s</lastBuildDate>
-  <pubDate>%s</pubDate>
-  <ttl>1800</ttl>
-"
-rss_item="
-  <item>
-    <title>%s</title>
-    <link>%s</link>
-    <pubDate>%s</pubDate>
-    <dc:creator>Chris Noxz</dc:creator>
-    <description>%s</description>
-    <content:encoded><![CDATA[%s]]></content:encoded>
-    <guid isPermaLink=\"false\">%s</guid>
-  </item>
-"
-rss_end="
-</channel>
-</rss>"
-
-article_head="\
-# %s
-<span class=\"%s\">posted on <strong>%s</strong> by <strong>%s</strong></span>
-
-"
-
-get_month() {
-    case "$((${1}))" in
-        1) printf   "january" ;;
-        2) printf   "february" ;;
-        3) printf   "march" ;;
-        4) printf   "april" ;;
-        5) printf   "may" ;;
-        6) printf   "june" ;;
-        7) printf   "july" ;;
-        8) printf   "august" ;;
-        9) printf   "september" ;;
-        10) printf  "october" ;;
-        11) printf  "november" ;;
-        12) printf  "december" ;;
-    esac
-}
-
-for dir in noxz.tech/articles.nobuild/*; do
-    if [ -f "$dir/.createdate" ] && [ -f "$dir/index.md" ]; then
-        # variables
-        article_name="${dir##*/}"   
-        create_date="$(cat "$dir/.createdate")"
-        year="${create_date%%-*}"
-        month="${create_date%-*}"
-        month="${month##*-}"
-        month_str="$(get_month "$(echo $month | sed 's/^0*//')")"
-        article_dir="$base/$year/$month_str/$article_name"
-        article_sort="-$(date -d "$create_date" +"%s")"
-        year_sort="-$(date -d "$year-01-01 00:00" +"%s")"
-        month_sort="-$(date -d "$year-$month-01 00:00" +"%s")"
-        content="$(cat "$dir/index.md")"
-
-        # create article markdowns with head
-        mkdir -p "$article_dir"
-        printf "$article_head" \
-            "$(echo "$article_name" | tr "[A-Z]" "[a-z]" | sed -e 's/_/ /g' -e 's/\( \|^\)\(.\)/\1\u\2/g')" \
-            "article-date" \
-            "${create_date%% *}" \
-            "Chris Noxz" \
-            >> "$article_dir/index.md"
-        cp "$article_dir/index.md" "$article_dir/preview.md"
-
-        # article reference file
-        printf "%s\t%s\t%s\t%s\n" \
-            "$(date -d "$create_date" +"%s")" \
-            "$dir/index.md" \
-            "$article_name" \
-            "//$article_dir/" \
-            >> "./articles.ref"
-
-        # quark mapping file
-        printf "? /articles/%s/ /blog/%s/\n" \
-            "$article_name" \
-            "$year/$month_str/$article_name" \
-            >> "./quark.map"
-
-        # append to index and preview
-        printf "%s" "$content" | \
-            tee -a "$article_dir/index.md" | \
-            sed -e '/^$/,$d' >> "$article_dir/preview.md"
-
-        # create build indicators and sorting files
-        [ ! -f "$base/.buildarticles" ] \
-            && touch "$base/.buildarticles"
-        [ ! -f "$base/$year/.buildarticles" ] \
-            && touch "$base/$year/.buildarticles" \
-            && echo "$year_sort" > "$base/$year/.sort"
-        [ ! -f "$base/$year/$month_str/.buildarticles" ] \
-            && touch "$base/$year/$month_str/.buildarticles" \
-            && echo "$month_sort" > "$base/$year/$month_str/.sort"
-        [ ! -f "$article_dir/.buildarticles" ] \
-            && touch "$article_dir/.buildarticles" \
-            && echo "$article_sort" > "$article_dir/.sort"
-
-        # copy any existing attachments
-        find "$dir" -type f ! -regex ".*\.\(md\|buildignore\|createdate\)" \
-            -exec cp '{}' "$article_dir/" \;
-
-        printf "[\033[1;32m+\033[m] article created: %s\n" "$article_dir"
-    fi
-done
-
-# sort references by date (first column)
-sort -r -k 1,1 -o "./articles.ref" "./articles.ref"
-
-# render rss file
-if [ ! -f "$rss" ]; then
-    printf "$rss_head" "$(date -R)" "$(date -R)" >> "$rss"
-    while read _date _path _title _url; do
-        printf "$rss_item" \
-            "$(echo $_title | sed 's/_/ /g')" \
-            "https:$_url" \
-            "$(date -R -d "@$_date")" \
-            "$(cat $_path | sed -e '/^$/,$d' -e 's,\\--,–,g')" \
-            "$(smu -b "https:$_url" $_path | sed -e 's/{: .*}//g' -e 's,\\--,–,g')" \
-            "$(echo $_url | md5sum | cut -d ' ' -f 1 | sed -e 's,^\(.\{8\}\)\(.\{4\}\)\(.\{4\}\)\(.\{4\}\)\(.\{12\}\)$,\1-\2-\3-\4-\5,g')" \
-            >> "$rss"
-    done < "./articles.ref"
-    printf "$rss_end" >> "$rss"
-fi
-
-# remove the 2 first columns as they are not needed anymore
-sed -i 's/^\([^\t][^\t]*\t\)\{2\}//g' "./articles.ref"
diff --git a/build-git.sh b/build-git.sh
@@ -1,106 +0,0 @@
-#!/bin/sh
-
-[ ! -d "$(realpath ~/mnt/src/z0noxz)" ] && exit 1;
-
-reposdir="$(realpath ~/mnt/src/z0noxz)"
-basedir="$(realpath ./)"
-basedir_git="$(realpath ./git.noxz.tech)"
-basedir_root="$(realpath ./noxz.tech)"
-
-REPOS=$(for d in "${reposdir}/"*/; do [ ! -f $d/fork ] && [ ! -f $d/disc ] && echo $d; done)
-FORKS=$(for d in "${reposdir}/"*/; do [ -f $d/fork ] && echo $d; done)
-#DISCO=$(for d in "${reposdir}/"*/; do [ -f $d/disc ] && echo $d; done)
-
-REPOS=$(stagit-index $REPOS)
-REPOS=$(echo "$REPOS" | sed -e 's/<tr><td><b>/<tr class="nohi"><td><b>/')
-HEADR=$(echo "$REPOS" | grep -o '^.*</thead><tbody>' | sed -e 's|</thead.*$||')
-#DISCO=$(stagit-index $DISCO)
-
-if [ "$FORKS" != "" ]
-then
-    FORKS=$(stagit-index $FORKS)
-    FORKS=$(echo "$FORKS" | sed -n '/<table id="index">/,$p' | sed 1,2d)
-    REPOS=$(echo "$REPOS" | awk -vN=2 '1;/<\/table>/&&--N<=0{exit}' | sed '$ d')
-    REPOS="$REPOS<tr class=\"nohi\"><td colspan=\"4\">&nbsp;</td></tr>$HEADR$FORKS"
-fi
-
-echo "$REPOS" > "${basedir_git}/index.html"
-#stagit-index $REPOS > "${basedir_git}/index.html"
-
-for dir in "${reposdir}/"*/; do
-    r=$(basename "${dir}")
-    d=$(basename "${dir}" ".git")
-
-    mkdir -p "${basedir_git}/${d}"
-    cd "${basedir_git}/${d}"
-    stagit -c ".cache" "${reposdir}/${r}"
-
-    # rename hidden (dotfiles) so they can be accessed using quark
-    for dotfile in $(grep -o 'href="file/[^"]*.html"' files.html \
-        | grep '/\.' | sed -e 's|^href="||' -e 's|"$||')
-    do
-        new_name="$(echo $dotfile | sed -e 's|/\.|/_.|g')"
-        new_dir="$(dirname $new_name)"
-        [ ! -d "$new_dir" ] && mkdir -p "$new_dir"
-        mv "$dotfile" "$new_name"
-        sed -i -e "s|href=\"$dotfile\"|href=\"$new_name\"|g" files.html
-        sed -i -e "s|href=\"../$dotfile\"|href=\"../$new_name\"|g" commit/*.html
-    done
-
-    # remove empty directories after rename
-    find ./file -type d -empty -delete
-
-    cp log.html index.html
-
-    printf "[\033[1;32m+\033[m] git repo created: %s\n" "${d}"
-done
-
-find "${basedir_git}/." -name "*.html" -type f -print0 | \
-    xargs -0 sed -i \
-    -e 's,="[^a-zA-Z0-9]*style.css",="/pub/style.css",g' \
-    -e 's,="[^a-zA-Z0-9]*logo.png",="/pub/logo.svg",g' \
-    -e 's,="[^a-zA-Z0-9]*favicon.png",="/pub/logo.png",g'
-
-#> $basedir/repo-graph
-#printf '<h2>Commits in the last year</h2>\n' > $basedir/repo-graph
-#repo-graph -s $reposdir/* >> $basedir/repo-graph
-
-printf '<h2>Latest commits</h2>\n' > $basedir/repo-graph
-log=""
-for x in $reposdir/*
-do
-    x="$(realpath $x)"
-    a="${x##*/}"
-    a="${a%%.*}"
-    a="<a href=\"https://noxz.tech/git/$a/log.html\">$a</a>"
-    cmd=$(printf 'cd "%s" && git log %s %s %s %s'                           \
-        "$x"                                                                \
-        '--no-merges'                                                       \
-        '--date="format:%Y-%m-%d %H:%M:%S"'                                 \
-        "--pretty=\"format:%at:%ad [$a] %s"\"                               \
-        '--since="13 months"'                                               \
-    )
-    log=$(printf '%s\n%s' "$log" "$(eval "$cmd")")
-done
-
-echo "$log"                                                                 \
-| sort -r                                                                   \
-| sed 15q                                                                   \
-| sed -e 's/^[^:]*://g'                                                     \
-| awk '
-    BEGIN {
-        print "<ul class=\"repo-log\">";
-    } {
-        printf "<li><span class=\"log-date\">%s %s</span>",$1,$2;
-        $1=$2="";
-        $0=$0;
-    } NF=NF {
-        printf "%s</li>\n",$0
-    } END {
-        print "<li>[<a href=\"https://noxz.tech/git/\">...</a>]</li></ul>"
-    }
-' >> $basedir/repo-graph
-
-sed -i $basedir_root/index.html                                             \
-    -e "/^.*!!placeholder:repo-graph!!.*$/r $basedir/repo-graph"            \
-    -e "/^.*!!placeholder:repo-graph!!.*$/d"
diff --git a/builder.c b/builder.c
@@ -1,433 +0,0 @@
-/* builder.c
- * Based on ideas from the suckless.org site builder
- */
-
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-
-#include <dirent.h>
-#include <linux/limits.h>
-#include <stdarg.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <time.h>
-#include <unistd.h>
-
-#include "config.h"
-
-#define LEN(x) (sizeof(x) / sizeof *(x))
-#define CONVERTER   "smu"
-#define TITLE_MAX   1024
-#define TITLE_DEF   "noxz.tech"
-#define DIR_MAX     1024
-#define URL_MAX     2048
-
-enum file_type {
-    F_DIR,
-    F_REG
-};
-
-typedef struct {
-    char *path;
-    int sort;
-} Article;
-
-static char basedir[PATH_MAX];
-static Article **articles = NULL;
-static int article_count = 0;
-
-void die(char *msg, ...)
-{
-    va_list a;
-
-    va_start(a, msg);
-    vfprintf(stderr, msg, a);
-    va_end(a);
-    fputc('\n', stderr);
-    exit(1);
-}
-
-int get_sort(int *sort, char const *path)
-{
-    FILE *fp = NULL;
-    int r = 0;
-
-    if (!(fp = fopen(path, "r")))
-        return -1;
-
-    r = fscanf(fp, "%d", sort);
-    fclose(fp);
-
-    return r;
-}
-
-int oneline(char *value, size_t len, char const *path)
-{
-    char *r = 0;
-    FILE *fp = NULL;
-
-    if (!(fp = fopen(path, "r")))
-        return perror(path), -1;
-
-    r = fgets(value, len, fp);
-    *(value + strlen(value) - 1) = '\0';
-    fclose(fp);
-
-    return !!r;
-}
-
-int spawn_wait(char **argv)
-{
-    int status;
-    switch (fork()) {
-    case 0:
-        execvp(argv[0], argv);
-        exit(126);
-    case -1:
-        return -1;
-    }
-    if (wait(&status) == -1)
-        return -1;
-    return WIFEXITED(status) ? 0 : -1;
-}
-
-void print_head(char *domain, char *page)
-{
-    char title[TITLE_MAX];
-    (void)domain;
-    (void)page;
-
-    if (oneline(title, sizeof title, ".title") <= 0)
-        printf(html_head, TITLE_DEF, MAIN_TITLE, SUB_TITLE);
-    else
-        printf(html_head, title, MAIN_TITLE, SUB_TITLE);
-}
-
-void print_header(char *domain, char *page)
-{
-    (void)domain;
-    (void)page;
-
-    printf(html_header, MAIN_TITLE, SUB_TITLE);
-}
-
-void print_name(char *name)
-{
-    char *from = "_-",
-         *to = "  ",
-         *s;
-
-    for (;*name; ++name) {
-        if ((s = strchr(from, *name)) != NULL)
-            putchar(to[s - from]);
-        else
-            putchar(*name);
-    }
-}
-
-int check_stat(char *f, int type)
-{
-    struct stat s;
-    if (stat(f, &s) == -1) {
-        return 0;
-    }
-    switch (type) {
-    case F_DIR:
-        return S_ISDIR(s.st_mode);
-    case F_REG:
-        return S_ISREG(s.st_mode);
-    default:
-        return 0;
-    }
-}
-
-int qsort_articles(const void *a, const void *b)
-{
-    return ((*(Article **)a)->sort - (*(Article **)b)->sort);
-}
-
-int qsort_strcmp(const void *a, const void *b)
-{
-    char a_sort_path[PATH_MAX],
-         b_sort_path[PATH_MAX];
-    int a_sort,
-        b_sort;
-
-    snprintf(a_sort_path, PATH_MAX + 8, "%s/%s/.sort", basedir, *(char **)a);
-    snprintf(b_sort_path, PATH_MAX + 8, "%s/%s/.sort", basedir, *(char **)b);
-
-    if (get_sort(&a_sort, a_sort_path) == 1 && get_sort(&b_sort, b_sort_path) == 1) {
-        return (a_sort - b_sort);
-    }
-
-    return strcmp(*(char **)a, *(char **)b);
-}
-
-void subdir(char *newdir, size_t len, char *base, char *add)
-{
-    *newdir = '\0';
-    if (base) {
-        strncat(newdir, base, len - 1); newdir[len - 1] = '\0';
-        strncat(newdir, "/", len - 1); newdir[len - 1] = '\0';
-    }
-    strncat(newdir, add, len - 1); newdir[len - 1] = '\0';
-}
-
-int build_ignore(char *domain, char *page)
-{
-    char ignore[PATH_MAX];
-    (void)domain;
-
-    snprintf(ignore, PATH_MAX, "%s/.buildignore", page);
-
-    if (access(ignore, F_OK) != -1)
-        return 0;
-    return 1;
-}
-
-void nav(char *domain, char *page, char *this)
-{
-    DIR *dp;
-    struct dirent *ent;
-    char *d_list[DIR_MAX];
-    char **d;
-    size_t d_len = 0;
-    char newdir[PATH_MAX];
-
-    if ((dp = opendir(this ? this : ".")) == NULL)
-        die("opendir %s", this ? this : ".");
-
-    while (d_len < LEN(d_list) && (ent = readdir(dp)))
-        d_list[d_len++] = ent->d_name;
-    d_list[d_len] = NULL;
-
-    snprintf(basedir, PATH_MAX, "%s", this ? this : "");
-    qsort(d_list, d_len, sizeof *d_list, &qsort_strcmp);
-
-    for (d = d_list; *d != NULL; ++d) {
-        if (**d == '.')
-            continue;
-        subdir(newdir, sizeof newdir, this, *d);
-        if (!check_stat(newdir, F_DIR))
-            continue;
-        if (build_ignore(domain, newdir) == 0)
-            continue;
-
-        fputs("\t<li", stdout);
-        if (page && !strncmp(newdir, page, strlen(newdir)))
-            fputs(" class=\"active\"", stdout);
-        fputs(">", stdout);
-        printf("<a href=\"//%s/%s/\">", domain, newdir);
-        //if (page && !strncmp(newdir, page, strlen(newdir)))
-        //    fputs("&raquo; ", stdout);
-        //else
-        //    fputs("&rsaquo; ", stdout);
-        print_name(*d);
-        fputs("</a>", stdout);
-
-        if (page && !strncmp(newdir, page, strlen(newdir))) {
-            puts("\t<ul>");
-            nav(domain, page, newdir);
-            puts("\t</ul>");
-        }
-        puts("</li>");
-    }
-    closedir(dp);
-}
-
-void print_nav(char *domain, char *page)
-{
-    (void)domain;
-    (void)page;
-
-    fputs("<div id=\"nav\">\n\t<ul>\n\t<li", stdout);
-    if (!page)
-        fputs(" class=\"active\"", stdout);
-    fputs(">", stdout);
-    fputs("<a href=\"/\">home</a></li>", stdout);
-    nav(domain, page, NULL);
-    fputs("\t</ul>", stdout);
-    fputs("\t<a class=\"rss\" href=\"/pub/feed.rss\" target=\"_blank\">"
-        "subscribe</a>", stdout);
-    fputs("\t<a class=\"twtxt\" href=\"/twtxt.txt\" target=\"_blank\">"
-        "twtxt</a>", stdout);
-    fputs("\t<a class=\"brave\" href=\"https://brave.com/nox659\" target=\"_blank\">"
-        "brave referral</a>", stdout);
-    fputs("</div>", stdout);
-}
-
-void append_article(char *path)
-{
-    Article *a;
-    char sort_path[PATH_MAX];
-    int sort;
-
-    if (articles == NULL)
-        articles = (Article **)malloc(0);
-
-    snprintf(sort_path, PATH_MAX + 8, "%s/.sort", path);
-    get_sort(&sort, sort_path);
-
-    a = (Article *)malloc(sizeof(Article));
-    a->path = (char *)malloc(strlen(path) + 1);
-    a->sort = sort;
-    strcpy(a->path, path);
-
-    articles = (Article **)realloc(articles, (article_count + 1) * sizeof(Article *));
-    articles[article_count++] = a;
-}
-
-void free_articles(void)
-{
-    int i;
-
-    for (i = 0; i < article_count; i++) {
-        free(articles[i]->path);
-        free(articles[i]);
-    }
-    free(articles);
-}
-
-void load_articles(char *this)
-{
-    DIR *dp;
-    struct dirent *ent;
-    char *d_list[DIR_MAX];
-    char **d;
-    size_t d_len = 0;
-    char newdir[PATH_MAX];
-    char index[PATH_MAX];
-
-    subdir(index, sizeof index, this, "index.md");
-    if (check_stat(index, F_REG)) {
-        append_article(this);
-        return;
-    }
-
-    if ((dp = opendir(this ? this : ".")) == NULL)
-        die("opendir %s", this ? this : ".");
-
-    while (d_len < LEN(d_list) && (ent = readdir(dp)))
-        d_list[d_len++] = ent->d_name;
-    d_list[d_len] = NULL;
-
-    for (d = d_list; *d != NULL; ++d) {
-        if (**d == '.')
-            continue;
-        subdir(newdir, sizeof newdir, this, *d);
-        if (!check_stat(newdir, F_DIR))
-            continue;
-        load_articles(newdir);
-    }
-    closedir(dp);
-}
-
-void generate_index(char *domain, char *page, char *index, char *base_url)
-{
-    char *argv[5] = { NULL };
-    int i = 0;
-
-    argv[i++] = CONVERTER;
-    if (base_url != NULL) {
-        argv[i++] = "-b";
-        argv[i++] = base_url;
-    }
-    argv[i++] = index;
-
-    fflush(stdout);
-
-    if (base_url != NULL && spawn_wait(argv) == -1)
-        die("failed: %s -b %s %s/%s/%s", CONVERTER, base_url, domain, page, index);
-    else if (base_url == NULL && spawn_wait(argv) == -1)
-        die("failed: %s %s/%s/%s", CONVERTER, domain, page, index);
-}
-
-void print_content(char *domain, char *page)
-{
-    char buildarticles[PATH_MAX];
-    char index[PATH_MAX];
-    char base_url[URL_MAX];
-    int is_base = strcmp(page ? page : "", "blog") == 0;
-    int is_page = -1;
-    int i, l;
-
-    subdir(index, sizeof index, page, "index.md");
-    subdir(buildarticles, sizeof buildarticles, page, ".buildarticles");
-    fputs("<div id=\"main\">\n", stdout);
-
-    if (check_stat(buildarticles, F_REG)) {
-        load_articles(page);
-        qsort(articles, article_count, sizeof *articles, &qsort_articles);
-        l = 20;
-        for (i = 0; i < article_count; i++) {
-
-            /* limit number or articles being printed */
-            if (i == l)
-                continue;
-
-            is_page = strcmp(page, articles[i]->path) == 0;
-            snprintf(base_url, URL_MAX, "/%s/", articles[i]->path);
-
-            fputs("<div class=\"article\">\n", stdout);
-            if ((is_base || is_page) && i < 2)
-                subdir(index, sizeof index, articles[i]->path, "index.md");
-            else
-                subdir(index, sizeof index, articles[i]->path, "preview.md");
-
-            generate_index(domain, page, index, base_url);
-
-            if (!(is_base || is_page) || i >= 2)
-                fprintf(stdout, "\n<p><a href=\"%s\">continue reading...</a></p>\n", base_url);
-            fputs("</div>\n", stdout);
-        }
-
-        free_articles();
-    } else if (check_stat(index, F_REG)) {
-        generate_index(domain, page, index, NULL);
-    }
-    fputs("</div>\n", stdout);
-}
-
-void print_footer(char *domain, char *page)
-{
-    time_t timer;
-    struct tm* tm_info;
-    char year[5];
-
-    (void)domain;
-    (void)page;
-
-    time(&timer);
-    tm_info = localtime(&timer);
-    strftime(year, 5, "%Y", tm_info);
-    printf(html_footer, year);
-}
-
-int main(int argc, char *argv[])
-{
-    char *domain = NULL,
-         *page = NULL;
-
-    if (argc != 2)
-        die("usage: %s %s", argv[0], "directory");
-    if ((page = strchr(argv[1], '/')))
-        *page++ = '\0';
-    domain = argv[1];
-    if (chdir(domain) == -1)
-        return perror(domain), 1;
-
-    puts("<!doctype html>\n");
-    puts("<html>\n");
-    print_head(domain, page);
-    puts("<body>\n");
-    print_header(domain, page);
-    puts("<div id=\"content\">\n");
-    print_nav(domain, page);
-    print_content(domain, page);
-    puts("</div>\n");
-    print_footer(domain, page);
-    puts("</body>\n");
-    puts("</html>\n");
-}
diff --git a/config.def.h b/config.def.h
@@ -1,32 +0,0 @@
-#define MAIN_TITLE  "noxz.tech"
-#define SUB_TITLE   "- Chris Noxz (aka. z0noxz)"
-
-char *html_head =
-	"<head>\n"
-	"   <meta charset=\"utf-8\">\n"
-	"   <meta name=\"author\" content=\"Chris Noxz\">\n"
-	"   <meta http-equiv=\"Cache-Control\" content=\"no-cache, no-store, must-revalidate\"/>\n"
-	"   <meta http-equiv=\"Pragma\" content=\"no-cache\"/>\n"
-	"   <meta http-equiv=\"Expires\" content=\"0\"/>\n"
-	"   <title>%s | %s %s</title>\n"
-	"   <link rel=\"icon\" type=\"image/png\" href=\"/pub/logo.png\" />\n"
-	"   <link rel=\"stylesheet\" type=\"text/css\" href=\"//noxz.tech/pub/style.css\">\n"
-	"   <link rel=\"alternate\" type=\"application/rss+xml\" title=\"Subscribe\" href=\"//noxz.tech/pub/feed.rss\">\n"
-	"</head>\n";
-
-char *html_header =
-	"<div id=\"header\">\n"
-	"   <a id=\"header-logo\"href=\"//noxz.tech/\"><img src=\"//noxz.tech/pub/logo.svg\"/></a>\n"
-	"   <a id=\"header-link\" href=\"//noxz.tech/\">%s</a>\n"
-	"   <span id=\"header-subtitle\">%s</span>\n"
-	"   <a id=\"header-source\" href=\"//git.noxz.tech\">source</a>"
-	"</div>\n";
-
-char *html_footer =
-	"<div id=\"footer\">\n"
-	"   <span class=\"right\">\n"
-	"      Copyright &copy; 2006-%s Chris Noxz"
-	"      | <a href=\"//noxz.tech/about/copying-policy\">copying policy</a>\n"
-	"      | <a href=\"//git.noxz.tech\">source</a>\n"
-	"   </span>\n"
-	"</div>\n";
diff --git a/config.mk b/config.mk
@@ -1,6 +1,2 @@
-# paths
-REMOTE_PATH = anthra.system.local:/usr/local/share/noxz.tech/web.tar
-
-# flags
-CFLAGS = -Wall -Wextra -std=c99 -pedantic
-LDFLAGS = -static -s
+ASSEMBLE_TAR = ./web.tar
+PUBLISH_PATH = anthra.system.local:/usr/local/share/noxz.tech/web.tar
diff --git a/config/git_head.html b/config/git_head.html
@@ -0,0 +1,15 @@
+	<table>
+		<tr>
+			<td><a href="//{:site:}/"><img src="{:logo:}" alt="" width="32" height="32" /></a></td>
+			<td><h1>{:name:}</h1><span class="desc">{:description:}</span></td>
+		</tr>
+		<tr>
+			<td></td>
+			<td>git clone <a href="https://{:site:}/{:repo:}">https://{:site:}/{:repo:}</a></td>
+		</tr>
+		<tr>
+			<td></td>
+			<td>{:menu:}</td>
+		</tr>
+	</table>
+	<hr />
diff --git a/config/git_repos.html b/config/git_repos.html
@@ -0,0 +1,35 @@
+<!doctype html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<meta name="author" content="{:author:}">
+	<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
+	<meta http-equiv="Pragma" content="no-cache"/>
+	<meta http-equiv="Expires" content="0"/>
+	<title>{:title:}</title>
+	<link rel="icon" type="image/png" href="{:favicon:}"/>
+	<link rel="stylesheet" type="text/css" href="{:stylesheet:}">
+</head>
+<body>
+	<table>
+		<tr>
+			<td><img src="{:logo:}" alt="" width="32" height="32" /></td>
+			<td><span class="desc">Repositories</span></td>
+		</tr>
+	</table>
+	<hr />
+	<div id="content">
+		<table id="index">
+			<tr class="nohi"><td>Name</td><td>Description</td><td>Owner</td><td>Last commit</td></tr>
+			<tbody>
+				{:repos:}
+			</tbody>
+			<tr class="nohi"><td colspan="4">&nbsp;</td></tr>
+			<tr class="nohi"><td>Name</td><td>Description</td><td>Owner</td><td>Last commit</td></tr>
+			<tbody>
+				{:forks:}
+			</tbody>
+		</table>
+	</div>
+</body>
+</html>
diff --git a/config/main.html b/config/main.html
@@ -0,0 +1,43 @@
+<!doctype html>
+<html lang="en">
+<head>
+	<meta charset="utf-8">
+	<meta name="author" content="{:author:}">
+	<meta http-equiv="Cache-Control" content="no-cache, no-store, must-revalidate"/>
+	<meta http-equiv="Pragma" content="no-cache"/>
+	<meta http-equiv="Expires" content="0"/>
+	<title>{:title:}</title>
+	<link rel="icon" type="image/png" href="{:favicon:}"/>
+	<link rel="stylesheet" type="text/css" href="{:stylesheet:}">
+</head>
+<body>
+	<div id="header">
+		<a id="header-logo" href="//noxz.tech/"><img src="{:logo:}" alt="logo"/></a>
+		<a id="header-link" href="//noxz.tech/">{:main_title:}</a>
+		<span id="header-subtitle">{:sub_title:}</span>
+		<a id="header-source" href="//git.noxz.tech">source</a>
+	</div>
+	<hr class="hidden-ruler"/>
+	<div id="content">
+		<table>
+			<tr>
+				<td id="nav" valign="top" style="width:200px;">
+					{:menu:}
+					{:menu_extra:}
+				</td>
+				<td id="main" valign="top">
+					{:content:}
+				</td>
+			</tr>
+		</table>
+	</div>
+	<hr class="hidden-ruler"/>
+	<div id="footer">
+		<span class="right">
+			Copyright &copy; 2006-{:year:} Chris Noxz
+			| <a href="//noxz.tech/about/copying-policy">copying policy</a>
+			| <a href="//git.noxz.tech">source</a>
+		</span>
+	</div>
+</body>
+</html>
diff --git a/config/sitemap_item.xml b/config/sitemap_item.xml
@@ -0,0 +1,3 @@
+	<url>
+		<loc>https://%s</loc>
+	</url>
diff --git a/config/www.conf b/config/www.conf
@@ -0,0 +1,103 @@
+.de B
+.   nop \\$3\f[B]\\$1\f[]\\$2
+..
+.de I
+.   nop \\$3\f[I]\\$1\f[]\\$2
+..
+.de U
+.   HTML \\$3<u>\\$1</u>\\$2
+..
+.de BI
+.   nop \\$3\f[BI]\\$1\f[]\\$2
+..
+.de LIURL
+.   ie \\n[www-html] \{\
+.       HTML <dt><a href="\\$1">\\$2</a></dt>
+.       www-emit-ltag dd
+.   \}
+..
+.de UIMG
+.   ie \\n[www-html] \{\
+.       HTML <a href="\\$1"><img src="\\$2" alt="\\$3" /></a>
+.       www-emit-ltag dd
+.   \}
+..
+.de TAG-REF
+.   ie \\n[www-html] \{\
+.       HTML (<a href="#\\$1">\\$2</a>)\\$3
+.   \}
+..
+.de REF
+.   ie \\n[www-html] \{\
+.       HTML <p class="reference"><a name="\\$1"></a>
+.       nop \\$2
+.       HTML </p>
+.   \}
+..
+.de COMMENT
+.   ie \\n[www-html] \{\
+.       HTML <!--\\$1-->
+.   \}
+..
+.de COMMENT-BR
+.   ie \\n[www-html] \{\
+.       HTML <!--break-->
+.   \}
+..
+.de ICD
+.   ie \\n[www-html] \{\
+.       HTML <code>\\$1</code>\\$2
+.   \}
+..
+.de CS
+.   ie \\n[www-html] \{\
+.       HTML <p class="center">\\$1
+.   \}
+..
+.de CE
+.   ie \\n[www-html] \{\
+.       HTML </p>
+.   \}
+..
+.de COS
+.   ie \\n[www-html] \{\
+.       HTML-NS <pre><code>
+.   \}
+..
+.de COE
+.   ie \\n[www-html] \{\
+.       HTML </code></pre>
+.   \}
+..
+.\" --------------------------------------------------------------------------
+.\" DIVS classname
+.\"
+.\"   Start tag for div
+.\"
+.de DIVS
+.   ie \\n[www-html] \{\
+.       HTML <div class="\\$1">
+.   \}
+..
+.de DIVE
+.   ie \\n[www-html] \{\
+.       HTML </div>
+.   \}
+..
+.de SPAN
+.   ie \\n[www-html] \{\
+.       HTML <span class="\\$1">\\$2</span>\\$3
+.   \}
+..
+.defcolor hicolor rgb .90f .40f .69f
+.EQ
+define iff '\[u21D4]'
+define implies '~\[u21D2]~'
+define hi 'special Hi'
+gsize 14
+.EN
+.de Hi
+.ds 0s \m[hicolor]\\*(0s\m[]
+..
+.NHR
+.HX -1
diff --git a/generate-sitemap.sh b/generate-sitemap.sh
@@ -1,22 +0,0 @@
-#!/bin/sh
-
-[ -z $1 ] && return
-
-echo '<?xml version="1.0" encoding="UTF-8"?>'
-echo '<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
-
-find ./$1/ \
-	-name '*.html' \
-| grep -v '/git.noxz.tech/.*/file/.*\.html' \
-| grep -v '/git.noxz.tech/.*/commit/.*\.html' \
-| sed \
-	-e "s,./$1/,https://$1/,g" \
-	-e "s,/*.html$,/,g" \
-	-e "s,&,&amp;,g" \
-| sort \
-| xargs \
-	-n1 \
-	-I{} \
-	printf '\t<url>\n\t\t<loc>%s</loc>\n\t</url>\n' {}
-
-echo '</urlset>'
diff --git a/git.noxz.tech/pub/style.css b/git.noxz.tech/pub/style.css
@@ -1,113 +1,94 @@
 body {
-	color: #000;
-	background-color: #fff;
-	font-family: monospace;
+	color                           : #000;
+	background-color                : #fff;
+	font-family                     : monospace;
 }
 
 h1, h2, h3, h4, h5, h6 {
-	font-size: 1em;
-	margin: 0;
+	font-size                       : 1em;
+	margin                          : 0;
 }
 
 img, h1, h2 {
-	vertical-align: middle;
+	vertical-align                  : middle;
 }
 
 img {
-	border: 0;
+	border                          : 0;
 }
 
-a.d,
-a.h,
-a.i,
-a.line {
-	text-decoration: none;
+a {
+	color                           : #005386;
+	text-decoration                 : none;
 }
 
-a.line {
-    padding-right: 5px;
-	border-right: 3px solid #eee;
+a:hover {
+	text-decoration                 : underline;
 }
 
-#blob a {
-	color: #777;
+table tr.nohi td {
+	font-weight                     : bold;
 }
 
-#blob a:hover {
-	color: blue;
-	text-decoration: none;
-}
-
-table thead td {
-	font-weight: bold;
+table td {
+	padding                         : 0 0.4em;
 }
 
-table td {
-	padding: 0 0.4em;
+#index,
+#log,
+#index td:nth-child(2),
+#log td:nth-child(2) {
+	width                           : 100%;
 }
 
-#content table td {
-	vertical-align: top;
-	white-space: nowrap;
+#index td,
+#log td {
+	padding                         : 0.2em 0.4em;
+	vertical-align                  : top;
+	white-space                     : nowrap;
 }
 
-#branches tr:hover td,
-#tags tr:hover td,
 #index tr:hover td,
-#log tr:hover td,
-#files tr:hover td {
-	background-color: #eee;
+#log tr:hover td {
+	background-color                : #f3f1f9;
 }
 
 thead tr:hover td,
 tr.nohi:hover td {
-	background-color: transparent !important;
+	background-color                : transparent !important;
 }
 
 #index tr td:nth-child(2),
-#tags tr td:nth-child(3),
-#branches tr td:nth-child(3),
 #log tr td:nth-child(2) {
-	white-space: normal;
-}
-
-td.num {
-	text-align: right;
+	white-space                     : normal;
 }
 
 .desc {
-	color: #777;
+	color                           : #777;
 }
 
 hr {
-	border: 0;
-	border-top: 1px solid #777;
-	height: 1px;
+	border                          : 0;
+	border-top                      : 1px solid #777;
+	height                          : 1px;
 }
 
 pre {
-	font-family: monospace;
-	tab-size: 4;
-}
-
-pre a.h {
-	color: #00a;
-}
-
-.A,
-span.i,
-pre a.i {
-	color: #070;
-}
-
-.D,
-span.d,
-pre a.d {
-	color: #e00;
-}
-
-pre a.h:hover,
-pre a.i:hover,
-pre a.d:hover {
-	text-decoration: none;
+	font-family                     : monospace;
+	tab-size                        : 4;
+}
+
+pre span {
+	display                         : inline-block;
+	text-align                      : right;
+	width                           : 32px;
+	color                           : #777;
+	padding-right                   : 5px;
+	margin-right                    : 5px;
+	border-right                    : 3px solid #eee;
+
+	-webkit-user-select             : none;
+	-moz-user-select                : none;
+	-ms-user-select                 : none;
+	user-select                     : none;
 }
diff --git a/ipfs-publish b/ipfs-publish
@@ -0,0 +1,43 @@
+#!/bin/sh
+
+# extract site
+tmpdir="$(mktemp -d /tmp/.noxz.tech.sites.XXXXXX)"
+tar -xf "${1}" -C "$tmpdir" \
+&& echo "noxz.tech extracted to '$tmpdir'"
+
+if [ $? -eq 0 ]; then
+	# publish to IPFS
+	ipfshash="$(ipfs add -Qr "$tmpdir/noxz.tech")" \
+	&& echo "new hash is '$ipfshash'"
+
+	if [ $? -eq 0 ]; then
+		# add to MFS
+		ipfs files rm -r /noxz.tech
+		ipfs files cp /ipfs/$ipfshash /noxz.tech
+
+		# pin hash to pinata
+		curl                                                                \
+		-H "Content-Type: application/json"                                 \
+		-H "pinata_api_key: $(pass ipfs/pinata.cloud/api/key)"              \
+		-H "pinata_secret_api_key: $(pass ipfs/pinata.cloud/api/secret)"    \
+		-X POST                                                             \
+		-d "{
+			\"pinataMetadata\": {
+				\"name\": \"noxz.tech\"
+			},
+			\"hashToPin\": \"$ipfshash\"
+		}" https://api.pinata.cloud/pinning/pinByHash
+
+		# publish new DNS record
+		pass ipfs/updateZoneRecord/script | sh -s "$ipfshash"
+	fi
+fi
+
+# remove site extraction
+rm -rf "$tmpdir"
+
+# publish to IPNS
+if [ ! -z $ipfshash ]; then
+	echo "publishing to IPNS..."
+	ipfs name publish --key=noxz.tech "$ipfshash"
+fi
diff --git a/irc.noxz.tech/.assemble b/irc.noxz.tech/.assemble
@@ -1 +0,0 @@
-index.swps
diff --git a/irc.noxz.tech/index.swps b/irc.noxz.tech/index.swps
@@ -1,125 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="utf-8"/>
-    <meta name="author" content="Chris Noxz"/>
-    <meta http-equiv="Cache-Control"
-        content="no-cache, no-store, must-revalidate"/>
-    <meta http-equiv="Pragma" content="no-cache"/>
-    <meta http-equiv="Expires" content="0"/>
-    <title>irc.noxz.tech | noxz.tech Chris Noxz</title>
-    <link rel="icon" type="image/png" href="//noxz.tech/pub/logo.png"/>
-    <style type="text/css">
-    body {
-        background-color        : #666;
-        color                   : #222;
-        font-family             : monospace, sans-serif;
-        padding                 : 0;
-        margin                  : 0;
-    }
-
-    h1 {
-        border-bottom           : 1px solid #cacaca;
-        margin                  : 1em 1ex 1em 0;
-        padding                 : 0 0 0.75em 0;
-        font-size               : 1.4em;
-    }
-
-    h2 {
-        margin                  : 1em 1ex 0.5ex 0;
-        font-size               : 1.3em;
-    }
-
-    h3 {
-        margin                  : 1em 1ex 0.5ex 0;
-        font-size               : 1.0em;
-    }
-
-    h4 {
-        margin                  : 1em 1ex 0.5ex 0;
-        font-size               : 0.9em;
-    }
-
-    a {
-        color                   : #005386;
-        text-decoration         : none;
-    }
-
-    a:hover {
-        text-decoration         : underline;
-    }
-
-    p, li {
-        color                   : #444;
-        line-height             : 1.5em;
-    }
-
-    .paper {
-        background-color        : #fff;
-        position                : relative;
-        padding                 : 3em;
-        width                   : 50em;
-        margin                  : 6em auto;
-    }
-
-    .paper,
-    .paper::before,
-    .paper::after {
-        box-shadow              : 2px 1px 1px rgba(0,0,0,0.15);
-    }
-
-    .paper::before,
-    .paper::after {
-        content                 : "";
-        position                : absolute;
-        width                   : 100%;
-        height                  : 100%;
-        background-color        : #eee;
-    }
-
-    .paper::before {
-        left                    : 7px;
-        top                     : 5px;
-        z-index                 : -1;
-    }
-
-    .paper::after {
-        left                    : 12px;
-        top                     : 10px;
-        z-index                 : -2;
-    }
-    </style>
-</head>
-<body>
-    <div class="paper">
-        <h1>irc.noxz.tech</h1>
-        <p>The IRC server allows for connection over tor, and all client
-        hostnames are cloaked for your privacy. Connections are also only
-        allowed using TLS/SSL on port 6697:
-        <a href="ircs://irc.noxz.tech:6697">ircs://irc.noxz.tech:6697</a><p>
-
-        <h2>About</h2>
-        <p>This server is mostly used for communication with me (Chris Noxz) or
-        for project specific communications. I've created this service mostly
-        for fun, and the fact that I couldn't find any reason not to. So feel
-        free to start using it, after reading the guidelines below.</p>
-        <h2>Server Guidelines</h2>
-        <p>Following are a couple of guidelines that should be easy to follow
-        </p>
-        <ul>
-        <li>No spamming</li>
-        <li>No nick faking/impersonation</li>
-        <li>No advertising</li>
-        <li>No exploit attempts, or other types of cracking</li>
-        <li>No illegal content, such as child pornography</li>
-        <li>Satirical content and jokes (even offensive) are of course allowed
-        </li>
-        </ul>
-        <p align="center"><br/>Happy hacking!<br/></p>
-        <pre align="center"><!--
-        --><br/>   x   <!--
-        --><br/>     x <!--
-        --><br/> x x x </pre>
-    </div>
-</body>
-</html>
diff --git a/noxz.tech/.title b/noxz.tech/.title
@@ -1 +0,0 @@
-noxz.tech
diff --git a/noxz.tech/about/copying-policy/index.md b/noxz.tech/about/copying-policy/index.md
@@ -1,19 +0,0 @@
-# Copying policy
-This copying policy is only meant for content on this site, and this site only,
-and not for any external content or source code referenced from it. All source
-code carry their own licences for usage.
-
-+ You may mirror and link to any portion of this site, at your wish.
-+ You may *not* create or redistribute static copies, in any format, without my
-written consent. The only reason for this is that my thoughts and reasoning
-might change with time, and I don't want old, outdated, or tampered words of
-mine floating around. For various reasons people tend to quote or misquote
-others out of context, and it's in that case always better to reference the
-original source.
-
-## The logo, Game of Life Glider
-If you are familiar with the glider or the game of life, you recognize this
-symbol. I've created my own variant of it, with diamonds instead of dots. The
-glider is *not* copyrighted or trademarked, but it's only meant to be used by
-hackers, and people associating themselves with the hacker culture. You can
-read more about it [here](http://www.catb.org/hacker-emblem/).
diff --git a/noxz.tech/about/copying-policy/.assemble b/noxz.tech/about/copying_policy/.assemble
rename noxz.tech/about/copying-policy/.assemble → noxz.tech/about/copying_policy/.assemble
diff --git a/noxz.tech/about/copying_policy/index.www b/noxz.tech/about/copying_policy/index.www
@@ -0,0 +1,33 @@
+.HnS 0
+Copying policy
+.HnE
+
+This copying policy is only meant for content on this site, and this site only,
+and not for any external content or source code referenced from it. All source
+code carry their own licences for usage.
+
+.ULS
+.LI
+You may mirror and link to any portion of this site, at your wish.
+.LI
+You may
+.I not
+create or redistribute static copies, in any format, without my written consent.
+The only reason for this is that my thoughts and reasoning might change with
+time, and I don't want old, outdated, or tampered words of mine floating around.
+For various reasons people tend to quote or misquote others out of context, and
+it's in that case always better to reference the original source.
+.ULE
+
+.HnS 1
+The logo, Game of Life Glider
+.HnE
+
+If you are familiar with the glider or the game of life, you recognize this
+symbol. I've created my own variant of it, with diamonds instead of dots. The
+glider is
+.I not
+copyrighted or trademarked, but it's only meant to be used by hackers, and
+people associating themselves with the hacker culture. You can read more about
+it
+.URL "http://www.catb.org/hacker-emblem/" "here" .
diff --git a/noxz.tech/about/index.md b/noxz.tech/about/index.md
@@ -1,71 +0,0 @@
-About me
-========
-
-Political view?
----------------
-I don't ideologically lean in any specific "direction". However, my views in
-general mainly correlate with liberalism and anarchism. Simply put, live and
-let live, don't assume authority over other people, and treat others as you
-would like to be treated yourself.
-
-Social media?
--------------
-If you try to find me on so called "social media", you won't. It's nothing more
-than a collection of mega marketing platforms tricking people into giving up
-their time and privacy for marketing goals. Here is a [good
-read](https://www.nateliason.com/blog/delete-facebook) about the issue.
-
-Programming languages I currently use, or have used
----------------------------------------------------
-To avoid creating a long list I will name the languages I feel worth naming,
-and leave out languages like *brainfuck*, markup languages and other
-non-programming languages. I've worked as a so called *development engineer*,
-so I've come in contact with a lot of different languages during that time.
-
-**C**, the language of Unix, is the main language I use, which is by far my
-favorite. It's fast, precise and, given a good hacker, can look absolutely
-beautiful. C was one of the first languages I learned using.
-
-+ [References](https://en.cppreference.com/w/c)
-+ Compilers
-  + [gcc](https://gcc.gnu.org/) - the GNU compiler collection
-  + [lcc](http://www.cs.princeton.edu/software/lcc/) - a retargetable compiler 
-  for ANSI C
-  + [sdcc](http://sdcc.sourceforge.net/) - small device C compiler
-  + [tcc](https://bellard.org/tcc/) - tiny C compiler
-
-**Haskell**, an advanced, purely functional programming language. It's amazing
-for purely mathematical functions and of course works for most other things
-too. Its so called lazy evaluation makes it easy to work with large to
-infinite data sets.
-
-+ [References](https://www.haskell.org/documentation/)
-+ Compilers
-  + [GHC](https://www.haskell.org/ghc/) - Glasgow Haskell Compiler, less 
-  commonly known as The Glorious Glasgow Haskell Compilation System. GHC is the 
-  de facto standard compiler if you want fast code.
-  + [UHC](http://www.cs.uu.nl/wiki/UHC) - Utrecht Haskell Compiler, a Haskell 
-  implementation from Utrecht University. UHC supports almost all Haskell 98 
-  and Haskell 2010 features plus many experimental extensions.
-  + [LHC](https://github.com/Lemmih/lhc) - The LLVM LHC Haskell Optimization 
-  System, a newly reborn project to build a working Haskell 2010 compiler out 
-  of reusable blocks.
-
-**Python** is another language I like to use, not for it's ^hyper optimized
-performance^, but for it's fast way of prototyping ideas. Python is almost
-never the language I use for a finished result.
-
-+ [References](https://docs.python.org/3/reference/index.html)
-
-**JavaScript** is NOT a language I use, anymore. I used to use it quite a lot
-for a while, writing so called web applications. They often worked very well at
-first, but due to web applications nature they grew too much and too fast, and
-web browsers can never find any common way of implementing JavaScript.
-JavaScript is also a nightmare to debug due to its "forgiving nature" and
-willingness to ignore errors instead of failing hard when it should. JavaScript
-just accepts anything you throw at it, and not in a good way. Global variables
-makes your life a living hell, where you never know what will and have affected
-them. Avoid it!
-
-+ [Why does javascript 
-suck?](https://whydoesitsuck.com/why-does-javascript-suck/)
diff --git a/noxz.tech/about/index.www b/noxz.tech/about/index.www
@@ -0,0 +1,115 @@
+.HnS 0
+About me
+.HnE
+
+.HnS 1
+Political view?
+.HnE
+
+I don't ideologically lean in any specific "direction". However, my views in
+general mainly correlate with liberalism and anarchism. Simply put, live and
+let live, don't assume authority over other people, and treat others as you
+would like to be treated yourself.
+
+.HnS 1
+Social media?
+.HnE
+
+If you try to find me on so called "social media", you won't. It's nothing more
+than a collection of mega marketing platforms tricking people into giving up
+their time and privacy for marketing goals. Here is a
+.URL https://www.nateliason.com/blog/delete-facebook "good read"
+about the issue.
+
+.HnS 1
+Programming languages I currently use, or have used
+.HnE
+
+To avoid creating a long list I will name the languages I feel worth naming,
+and leave out languages like
+.I brainfuck ,
+markup languages and other non-programming languages. I've worked as a so called
+.I "development engineer" ,
+so I've come in contact with a lot of different languages during that time.
+
+.DLS
+.LI "The C programming language"
+or the language of Unix is the main language I use and which is by far my
+favorite. It's fast, precise and, given a good hacker, can look absolutely
+beautiful. C was one of the first languages I learned using.
+
+.ULS
+.LI
+.URL "https://en.cppreference.com/w/c" "References"
+.LI
+Compilers
+.ULS
+.LI
+.URL "https://gcc.gnu.org/" "gcc"
+\(en the GNU compiler collection
+.LI
+.URL "http://www.cs.princeton.edu/software/lcc/" "lcc"
+\(en a retargetable compiler for ANSI C
+.LI
+.URL "http://sdcc.sourceforge.net/" "sdcc"
+\(en small device C compiler
+.LI
+.URL "https://bellard.org/tcc/" "tcc"
+\(en tiny C compiler
+.ULE
+.ULE
+
+.LI Haskell
+an advanced, purely functional programming language. It's amazing
+for purely mathematical functions and of course works for most other things
+too. Its so called lazy evaluation makes it easy to work with large to
+infinite data sets.
+
+.ULS
+.LI
+.URL "https://www.haskell.org/documentation/" "References"
+.LI
+Compilers
+.ULS
+.LI
+.URL "https://www.haskell.org/ghc/" "GHC"
+\(en Glasgow Haskell Compiler, less commonly known as The Glorious Glasgow
+Haskell Compilation System. GHC is the de facto standard compiler if you want
+fast code.
+.LI
+.URL "http://www.cs.uu.nl/wiki/UHC" "UHC"
+\(en Utrecht Haskell Compiler, a Haskell implementation from Utrecht University.
+UHC supports almost all Haskell 98 and Haskell 2010 features plus many
+experimental extensions.
+.LI
+.URL "https://github.com/Lemmih/lhc" "LHC"
+\(en The LLVM LHC Haskell Optimization System, a newly reborn project to build a
+working Haskell 2010 compiler out of reusable blocks.
+.ULE
+.ULE
+
+.LI Python
+is another language I like to use, not for it's ^hyper optimized
+performance^, but for it's fast way of prototyping ideas. Python is almost
+never the language I use for a finished result.
+
+.ULS
+.LI
+.URL "https://docs.python.org/3/reference/index.html" "References"
+.ULE
+
+.LI JavaScript
+is NOT a language I use, anymore. I used to use it quite a lot for a while,
+writing so called web applications. They often worked very well at first, but
+due to web applications nature they grew too much and too fast, and web browsers
+can never find any common way of implementing JavaScript. JavaScript is also a
+nightmare to debug due to its "forgiving nature" and willingness to ignore
+errors instead of failing hard when it should. JavaScriptjust accepts anything
+you throw at it, and not in a good way. Global variables makes your life a
+living hell, where you never know what will and have affected them. Avoid it!
+
+.ULS
+.LI
+.URL "https://whydoesitsuck.com/why-does-javascript-suck/" "Why does javascript suck?"
+.ULE
+.DLE
@@ -1,19 +0,0 @@
-# Questions & answers
-
-{% comment %}
-## [[Building a keyboard|dummy\_article\_3]]
-Building a keyboard isn't all that difficult, and with online resources anyone
-can do it. Read about how I built mine.
-{% endcomment %}
-
-## libreboot, and blank background?
-I never found any writings about this topic online, even though the answer is
-quite straight forward. So yes, you can have a blank background, and remove the
-picture from the image file. The
-[documentation](https://libreboot.org/docs/grub/index.html#changing-the-background-image-in-grub)
-on libreboot.org only describes changing the current background, but it's both
-simple and possible to remove it completely.
-
-## [[What computer do I use?|the\_lenovo\_thinkpad\_t400]]
-I currently use a Lenovo Thinkpad T400, running libreboot instead of stock 
-BIOS.
@@ -0,0 +1,19 @@
+.HnS 0
+Questions & answers
+.HnE
+
+.HnS 1
+libreboot, and blank background?
+.HnE
+
+I never found any writings about this topic online, even though the answer is
+quite straight forward. So yes, you can have a blank background, and remove the
+picture from the image file. The
+.URL "https://libreboot.org/docs/grub/index.html#changing-the-background-image-in-grub" documentation
+on libreboot.org only describes changing the current background, but it's both
+simple and possible to remove it completely.
+
+.HnS 1
+.URL "//[site]/articles/the_lenovo_thinkpad_t400" "What computer do I use?"
+.HnE
+I currently use a Lenovo Thinkpad T400, running libreboot instead of stock BIOS.
diff --git a/noxz.tech/about/tools/index.md b/noxz.tech/about/tools/index.md
@@ -1,101 +0,0 @@
-Programs and tools I use
-========================
-Following is a pseudo complete list of all programs and tools I use on a
-regular basis. The list is for anyone who is either curious or wanting to try
-any of the programs and tools I use. The list may change with time.
-
-Most tools I use are either [suckless](https://suckless.org), minimal or TUI
-based. I like using tools that use "vim like" keys and commands, and preferably
-are only key based.
-
-The list
---------
-### Operating System
-I currently use [Void Linux](https://voidlinux.org) as my main operating
-system, due to it's simplicity and minimalistic nature. Another important
-reason is the rejection of SystemD(estroyer), with
-[runit](http://smarden.org/runit/) instead as both init and service manager.
-Void Linux isn't a fork from any other Linux distribution and is instead
-created from scratch together with its package manager
-[xbps](https://voidlinux.org/usage/xbps/).
-
-### Shell
-For an interactive shell I use [loksh](https://github.com/dimkr/loksh), a Linux
-port of OpenBSD's ksh (KornShell). For all non-interactive POSIX shell scripts
-I use [dash](https://git.kernel.org/pub/scm/utils/dash/dash.git/).
-
-### Display manager
-When my computers boot I have a simple login using agetty. After login I'm
-prompted with a modified version of [cdm](https://github.com/evertiro/cdm), the
-console display manager.
-
-### Window Manager
-When I'm in need of more than just a vterm I use
-[dwm](https://dwm.suckless.org), the dynamaic window manager, as my WM. Dwm is
-a so called tiling window manager, with the goal of using all available screen
-area for productivity. However it's not magic, the rest is of course up to you.
-
-Together with [dwm](https://dwm.suckless.org) I use
-[ztatus](//noxz.tech/software/ztatus) for notifications and status updates.
-
-### Terminal Emulator
-I use [st](https://st.suckless.org), the simple terminal, as my terminal
-emulator. It consists of around 3K LOC, supports 256 colors (and true colors),
-UTF-8, and more.
-
-### Fonts
-The fonts I mainly use are [hack](https://sourcefoundry.org/hack/) and
-[M+](http://mplus-fonts.osdn.jp/about-en.html)
-
-### Text editor and IDE
-My main text editor is [vim](https://www.vim.org/), with as few plugins as
-possible. The plugins I use I have written myself to be as minimal as possible.
-Together with [vim](https://www.vim.org/) I use
-[gdb](https://www.gnu.org/software/gdb/) for debugging and testing code.
-
-### File manager
-When default core programs aren't enough I use [vifm](https://vifm.info). Most
-of the time core programs are enough though.
-
-### Web browsers
-My web browsing tools are more diverse than other categories. For simple
-fetching I use either [wget](https://www.gnu.org/software/wget/) or
-[curl](https://curl.haxx.se/), but for more casual browsing I use either
-[w3m](http://w3m.sourceforge.net/), [surf](https://suckless.org/surf/) or
-[vimb](https://fanglingsu.github.io/vimb/) depending on the need for graphical
-rendering. However surf is the browser I use most times.
-
-### Communication
-For emailing I use [neomutt](https://neomutt.org/), together with
-[offlineimap](https://www.offlineimap.org/) and
-[msmtp](https://marlam.de/msmtp/). Another tool for communication is
-[irssi](https://irssi.org/) running on a remote raspberry pi.
-
-### Audio and video
-I use [mpv](https://mpv.io/images/mpv-screenshot-34cd36ae.jpg) together with
-[youtube-dl](https://youtube-dl.org/) for both viewing and listening on videos
-and music. For listening to tracks and mixes on SoundCloud I use ncscpl.
-
-### RSS and subscriptions
-I don't have any so called social media accounts, but I like watching videos on
-youtube for both education and pleasure. My solution and alternative to
-subscriptions through Google is using the RSS reader
-[newsboat](https://newsboat.org/) with RSS feeds from youtube channels.
-
-### Image and document rendering
-My image viewer is the versatile program
-[sxiv](https://github.com/muennich/sxiv), and for reading PDFs I use
-[zathura](https://pwmt.org/projects/zathura/).
-
-### Other programs worth mentioning
-+ **[farbfeld](https://tools.suckless.org/farbfeld/)**: Lossless image format,
-  together with useful tools for converting to and from farbfeld (.ff). I store
-  many of my images in farbfeld, compressed with gzip (.ff.gz).
-+ **[dmenu](https://tools.suckless.org/dmenu/)**: Super useful dynamic menu,
-  that I use for a lot of things.
-+ **[imagemagick](https://www.imagemagick.org/)**: Image manipulator, that I
-  use for various image manipulation tasks.
-+ **[tmux](https://github.com/tmux/tmux/wiki)**: Terminal multiplexer, that I
-  mainly use for persistent ssh sessions on remote machines.
-+ **[swall](https://www.uninformativ.de/git/swall/file/README.html)**: A simple
-  Xrandr-aware program to set your wallpaper.
diff --git a/noxz.tech/about/tools/index.www b/noxz.tech/about/tools/index.www
@@ -0,0 +1,194 @@
+.HnS 0
+Programs and tools I use
+.HnE
+
+Following is a pseudo complete list of all programs and tools I use on a
+regular basis. The list is for anyone who is either curious or wanting to try
+any of the programs and tools I use. The list may change with time.
+
+Most tools I use are either
+.URL https://suckless.org suckless ,
+minimal or TUI based. I like using tools that use "vim like" keys and commands,
+and preferably are only key based.
+
+.HnS 1
+The list
+.HnE
+
+.HnS 2
+Operating System
+.HnE
+
+I currently use
+.URL https://voidlinux.org "Void Linux"
+as my main operating
+system, due to it's simplicity and minimalistic nature. Another important
+reason is the rejection of SystemD(estroyer), with
+.URL http://smarden.org/runit/ runit
+instead as both init and service manager.
+Void Linux isn't a fork from any other Linux distribution and is instead
+created from scratch together with its package manager
+.URL https://voidlinux.org/usage/xbps/ xbps .
+
+.HnS 2
+Shell
+.HnE
+
+For an interactive shell I use
+.URL https://github.com/dimkr/loksh loksh ,
+a Linux
+port of OpenBSD's ksh (KornShell). For all non-interactive POSIX shell scripts
+I use
+.URL https://git.kernel.org/pub/scm/utils/dash/dash.git/ dash .
+
+.HnS 2
+Display manager
+.HnE
+
+When my computers boot I have a simple login using agetty. After login I'm
+prompted with a modified version of
+.URL https://github.com/evertiro/cdm cdm ,
+the console display manager.
+
+.HnS 2
+Window Manager
+.HnE
+
+When I'm in need of more than just a vterm I use
+.URL https://dwm.suckless.org dwm ,
+the dynamaic window manager, as my WM. Dwm is
+a so called tiling window manager, with the goal of using all available screen
+area for productivity. However it's not magic, the rest is of course up to you.
+
+Together with
+.URL https://dwm.suckless.org dwm
+I use
+.URL //noxz.tech/software/ztatus ztatus
+for notifications and status updates.
+
+.HnS 2
+Terminal Emulator
+.HnE
+
+I use
+.URL https://st.suckless.org st ,
+the simple terminal, as my terminal
+emulator. It consists of around 3K LOC, supports 256 colors (and true colors),
+UTF-8, and more.
+
+.HnS 2
+Fonts
+.HnE
+
+The fonts I mainly use are
+.URL https://sourcefoundry.org/hack/ hack
+and
+.URL http://mplus-fonts.osdn.jp/about-en.html M+
+
+.HnS 2
+Text editor and IDE
+.HnE
+
+My main text editor is
+.URL https://www.vim.org/ vim ,
+with as few plugins as
+possible. The plugins I use I have written myself to be as minimal as possible.
+Together with
+.URL https://www.vim.org/ vim
+I use
+.URL https://www.gnu.org/software/gdb/ gdb
+for debugging and testing code.
+
+.HnS 2
+File manager
+.HnE
+
+When default core programs aren't enough I use
+.URL https://vifm.info vifm .
+Most
+of the time core programs are enough though.
+
+.HnS 2
+Web browsers
+.HnE
+
+My web browsing tools are more diverse than other categories. For simple
+fetching I use either
+.URL https://www.gnu.org/software/wget/ wget
+or
+.URL https://curl.haxx.se/ curl ,
+but for more casual browsing I use either
+.URL http://w3m.sourceforge.net/ w3m ,
+.URL https://suckless.org/surf/ surf
+or
+.URL https://fanglingsu.github.io/vimb/ vimb
+depending on the need for graphical
+rendering. However surf is the browser I use most times.
+
+.HnS 2
+Communication
+.HnE
+
+For emailing I use
+.URL https://neomutt.org/ neomutt ,
+together with
+.URL https://www.offlineimap.org/ offlineimap
+and
+.URL https://marlam.de/msmtp/ msmtp .
+Another tool for communication is
+.URL https://irssi.org/ irssi
+running on a remote raspberry pi.
+
+.HnS 2
+Audio and video
+.HnE
+
+I use
+.URL https://mpv.io/images/mpv-screenshot-34cd36ae.jpg mpv
+together with
+.URL https://youtube-dl.org/ youtube-dl
+for both viewing and listening on videos
+and music. For listening to tracks and mixes on SoundCloud I use ncscpl.
+
+.HnS 2
+RSS and subscriptions
+.HnE
+
+I don't have any so called social media accounts, but I like watching videos on
+youtube for both education and pleasure. My solution and alternative to
+subscriptions through Google is using the RSS reader
+.URL https://newsboat.org/ newsboat
+with RSS feeds from youtube channels.
+
+.HnS 2
+Image and document rendering
+.HnE
+
+My image viewer is the versatile program
+.URL https://github.com/muennich/sxiv sxiv ,
+and for reading PDFs I use
+.URL https://pwmt.org/projects/zathura/ zathura .
+
+.HnS 2
+Other programs worth mentioning
+.HnE
+
+.DLS
+.LIURL https://tools.suckless.org/farbfeld/ farbfeld:
+Lossless image format, together with useful tools for converting to and from
+farbfeld (.ff). I store many of my images in farbfeld, compressed with gzip
+(.ff.gz).
+
+.LIURL https://tools.suckless.org/dmenu/ dmenu:
+Super useful dynamic menu, that I use for a lot of things.
+
+.LIURL https://www.imagemagick.org/ imagemagick:
+Image manipulator, that I use for various image manipulation tasks.
+
+.LIURL https://github.com/tmux/tmux/wiki tmux:
+Terminal multiplexer, that I mainly use for persistent ssh sessions on remote
+machines.
+
+.LIURL https://www.uninformativ.de/git/swall/file/README.html swall:
+A simple Xrandr-aware program to set your wallpaper.
+.DLE
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate
@@ -1 +0,0 @@
-2018-01-14 12:12:23
diff --git a/noxz.tech/articles.nobuild/vi_indicator_for_loksh/.createdate b/noxz.tech/articles.nobuild/vi_indicator_for_loksh/.createdate
@@ -1 +0,0 @@
-2019-10-09 14:29:32
diff --git a/noxz.tech/articles.nobuild/vi_indicator_for_loksh/index.md b/noxz.tech/articles.nobuild/vi_indicator_for_loksh/index.md
@@ -1,19 +0,0 @@
-When I switched from bash to (lo)ksh I did so because of bash being too bloated
-and prone to become slow under certain circumstances. However, there was a
-feature that I missed from bash \\-- the ability to indicate vi modes (normal,
-input & replace).
-
-I couldn't find anyone already having implemented this feature in ksh, so I
-thought that I could do it myself. I made the implementation quite simple and
-straight forward. When using vi-mode and at the same time having the string
-*'[xxx]'* somewhere in the *PS1* environment variable, the selected mode will
-be indicated between the first *'['* and *']'*. What's between the brackets
-will act as placeholder, which requires the indicators to be of the same size.
-
-{: class="center"}
-![](usage.png)
-
-I have my own fork of (lo)ksh in my repositories together with the
-[commit](https://noxz.tech/git/loksh-noxz/commit/5ce539cb503ec38cd7f198c00a27744d12da75b4.html).
-Feel free to use it. I also have a patch available
-[here](loksh-viprompt-20190502-774e6d2.patch).
diff --git a/noxz.tech/dotfiles/selected-scripts/.assemble b/noxz.tech/articles/.assemble
rename noxz.tech/dotfiles/selected-scripts/.assemble → noxz.tech/articles/.assemble
diff --git a/noxz.tech/sharing-is-caring/.assemble b/noxz.tech/articles/askpass_implementation_for_doas/.assemble
rename noxz.tech/sharing-is-caring/.assemble → noxz.tech/articles/askpass_implementation_for_doas/.assemble
diff --git a/irc.noxz.tech/.buildignore b/noxz.tech/articles/askpass_implementation_for_doas/.buildignore
rename irc.noxz.tech/.buildignore → noxz.tech/articles/askpass_implementation_for_doas/.buildignore
diff --git a/noxz.tech/articles/askpass_implementation_for_doas/index.www b/noxz.tech/articles/askpass_implementation_for_doas/index.www
@@ -0,0 +1,63 @@
+.HnS 0
+Askpass implementation for doas
+.HnE
+
+posted on
+.B "2021-01-20"
+by
+.B "Chris Noxz"
+
+As I was trying to move away from using
+.ICD sudo
+to instead be using
+.ICD doas ,
+mostly due to recent security concerns, I had yet to find any solution for the
+missing ASKPASS functionality. So instead of creating a fork of
+.ICD doas
+that I would have to maintain, I instead found a quite obvious solution using
+.ICD expect
+and
+.ICD tcl .
+I wrote this short script which in its current state have a pseudo dependency of
+.ICD dmenu .
+
+.CDS
+.COS
+#!/usr/bin/expect --
+
+# askpass implementation for doas
+# example usage: DOAS_ASKPASS="dmenu -P -p password:" doas_askpass echo working
+
+# don't mind the man behind the curtain
+log_user 0
+
+# no command, then nothing to do
+if { $argc == 0 } { exit 0 }
+
+# treat all arguments as command input
+set cmd [lrange $argv 0 end];
+
+# read askpass from env or fallback to dmanu_pass ()
+if {[info exists ::env(DOAS_ASKPASS)]} {
+    set askpass "$::env(DOAS_ASKPASS)"
+} else {
+    set askpass "dmenu_pass password:"
+}
+
+# read password from user
+set pwd [exec {*}$askpass]
+
+# spawn doas operation
+spawn doas {*}$cmd
+
+# send password and execute command
+expect "doas*password:" {
+    send -- "$pwd\\r"
+    expect \\r
+    log_user 1
+    expect eof
+}
+.COE
+.CDE
+
+Of course, feel free to use it if you have similar needs.
diff --git a/noxz.tech/articles/index.www b/noxz.tech/articles/index.www
@@ -0,0 +1,35 @@
+.HnS 0
+Articles
+.HnE
+
+.DIVS articles
+.ULS
+.LI
+.URL "askpass_implementation_for_doas" "Askpass implementation for doas"
+posted on
+.B "2021-01-20"
+by
+.B "Chris Noxz"
+
+.LI
+.URL "srfinder" "Srfinder"
+posted on
+.B "2020-09-04"
+by
+.B "Chris Noxz"
+
+.LI
+.URL "vi_indicator_for_loksh" "Vi indicator for loksh"
+posted on
+.B "2019-10-09"
+by
+.B "Chris Noxz"
+
+.LI
+.URL "the_lenovo_thinkpad_t400" "The Lenovo Thinkpad T400"
+posted on
+.B "2018-01-14"
+by
+.B "Chris Noxz"
+.ULE
+.DIVE
diff --git a/noxz.tech/sharing-is-caring/articles-by-others/.assemble b/noxz.tech/articles/srfinder/.assemble
rename noxz.tech/sharing-is-caring/articles-by-others/.assemble → noxz.tech/articles/srfinder/.assemble
diff --git a/noxz.tech/articles.nobuild/.buildignore b/noxz.tech/articles/srfinder/.buildignore
rename noxz.tech/articles.nobuild/.buildignore → noxz.tech/articles/srfinder/.buildignore
diff --git a/noxz.tech/articles/srfinder/index.www b/noxz.tech/articles/srfinder/index.www
@@ -0,0 +1,31 @@
+.HnS 0
+Srfinder
+.HnE
+
+posted on
+.B "2020-09-04"
+by
+.B "Chris Noxz"
+
+During some laboratory work I was given the task to measure distance over time 
+using a tool called PASCO Capstone. Unfortunately this tool is neither free 
+software nor available for Linux. The only logical response to this was to 
+create one such tool.
+
+I didn't think this would be particularly hard to do as I already knew of two 
+measuring devices able to read distance based on sound reflection, the HY-SRF05 
+and the HC-SR04. These devices use ultra sonic bursts to measure the time it 
+takes to echo against a surface. Using the speed of sound to calculate the 
+distance, based on the time it took to echo, is then an easy task to do.
+
+The tool I wrote is meant to be used on a raspberry pi and is at this time of
+writing written in python. In the future I might rewrite it using c instead as 
+the performance might be better. It's just a matter of priority as it won't 
+take that long.
+
+The tool is a simple CLI that just prints the time and distance based on a 
+preferred measuring frequency. The data written to STDOUT can then be stored in 
+a CSV-file and later analyzed using other tools.
+
+The source code can be found
+.URL :https://noxz.tech/git/srfinder.git" "here" .
diff --git a/noxz.tech/articles/the_lenovo_thinkpad_t400/.assemble b/noxz.tech/articles/the_lenovo_thinkpad_t400/.assemble
@@ -0,0 +1,2 @@
+index.html
+t400.png
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore b/noxz.tech/articles/the_lenovo_thinkpad_t400/.buildignore
rename noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore → noxz.tech/articles/the_lenovo_thinkpad_t400/.buildignore
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md b/noxz.tech/articles/the_lenovo_thinkpad_t400/index.www
rename noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md → noxz.tech/articles/the_lenovo_thinkpad_t400/index.www
@@ -1,3 +1,12 @@
+.HnS 0
+The Lenovo Thinkpad T400
+.HnE
+
+posted on
+.B "2018-01-14"
+by
+.B "Chris Noxz"
+
 After being tired of being tied to my stationary workstation I finally got
 myself into buying a laptop. I didn't want a new fancy laptop I would have to
 replace in 2 years, due to it being filled with gunk, overheating or in
@@ -7,15 +16,15 @@ possible to libreboot (something that I've been interested in doing).
 
 I found a rather cheap one with some minor scratches on the top cover and a
 broken hard drive with a price of around $100. I replaced the keyboard, bought
-a new SSD, 8 GB of RAM, a new wireless NIC \\-- and it was as good as new.
+a new SSD, 8 GB of RAM, a new wireless NIC \(en and it was as good as new.
 After flashing the BIOS (which meant I had to disassemble everything to access
-the SPI pins) it gave me a cold boot time of about 10 seconds or less (I
-haven't timed it).
+the SPI pins) it gave me a cold boot time of about 10 seconds or less (I haven't
+timed it).
 
 This will be my main computer from now on, as it easily replaces my stationary
 workstation with a docking station I found at a flee market. I will probably
 buy another one just to be sure I have spare parts in case the motherboard
-breaks *fubar*.
+breaks
+.I fubar .
 
-{: class="center"}
-![](t400.png)
+.PIMG t400.png
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png b/noxz.tech/articles/the_lenovo_thinkpad_t400/t400.png
rename noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png → noxz.tech/articles/the_lenovo_thinkpad_t400/t400.png
diff --git a/noxz.tech/articles/vi_indicator_for_loksh/.assemble b/noxz.tech/articles/vi_indicator_for_loksh/.assemble
@@ -0,0 +1,3 @@
+index.html
+loksh-viprompt-20190502-774e6d2.patch
+usage.png
diff --git a/noxz.tech/articles.nobuild/vi_indicator_for_loksh/.buildignore b/noxz.tech/articles/vi_indicator_for_loksh/.buildignore
rename noxz.tech/articles.nobuild/vi_indicator_for_loksh/.buildignore → noxz.tech/articles/vi_indicator_for_loksh/.buildignore
diff --git a/noxz.tech/articles/vi_indicator_for_loksh/index.www b/noxz.tech/articles/vi_indicator_for_loksh/index.www
@@ -0,0 +1,34 @@
+.HnS 0
+Vi indicator for loksh
+.HnE
+
+posted on
+.B "2019-10-09"
+by
+.B "Chris Noxz"
+
+When I switched from bash to (lo)ksh I did so because of bash being too bloated
+and prone to become slow under certain circumstances. However, there was a
+feature that I missed from bash \(en the ability to indicate vi modes (normal,
+input & replace).
+
+I couldn't find anyone already having implemented this feature in ksh, so I
+thought that I could do it myself. I made the implementation quite simple and
+straight forward. When using vi-mode and at the same time having the string
+.I '[xxx]'
+somewhere in the 
+.I PS1
+environment variable, the selected mode will be indicated between the first
+.I '['
+and
+.I ']' .
+What's between the brackets will act as placeholder, which requires the
+indicators to be of the same size.
+
+.PIMG usage.png
+
+I have my own
+.URL //git.noxz.tech/loksh-noxz.git fork
+of (lo)ksh in my repositories together with the commit.
+Feel free to use it. I also have a patch available
+.URL loksh-viprompt-20190502-774e6d2.patch here .
diff --git a/noxz.tech/articles.nobuild/vi_indicator_for_loksh/loksh-viprompt-20190502-774e6d2.patch b/noxz.tech/articles/vi_indicator_for_loksh/loksh-viprompt-20190502-774e6d2.patch
rename noxz.tech/articles.nobuild/vi_indicator_for_loksh/loksh-viprompt-20190502-774e6d2.patch → noxz.tech/articles/vi_indicator_for_loksh/loksh-viprompt-20190502-774e6d2.patch
diff --git a/noxz.tech/articles.nobuild/vi_indicator_for_loksh/usage.png b/noxz.tech/articles/vi_indicator_for_loksh/usage.png
rename noxz.tech/articles.nobuild/vi_indicator_for_loksh/usage.png → noxz.tech/articles/vi_indicator_for_loksh/usage.png
diff --git a/noxz.tech/dictionary/index.md b/noxz.tech/dictionary/index.www
rename noxz.tech/dictionary/index.md → noxz.tech/dictionary/index.www
@@ -1,20 +1,20 @@
-# Dictionary
+.HnS 0
+Dictionary
+.HnE
 
 A collection of words and phrases, and their meaning when I used them. The
 purpose of this list is partly to minimize misunderstandings of me and partly
 to clarify misconceptions in general.
 
-{:: class="definition"}
-**brainfuck**:
-<a id="brainfuck"></a>
+.DLS
+.LI "brainfuck:"
+.TAG "brainfuck"
 A peculiar esoteric programming language consisting of only eight commands, in
 extreme minimalism. It's not sexual penetration of ones brain, although looking
 at the code might feel like it.
-{::}
 
-{:: class="definition"}
-**cracker**:
-<a id="cracker"></a>
+.LI "cracker:"
+.TAG "cracker"
 One who breaks security on a system. Coined ca. 1985 by hackers in defense
 against journalistic misuse of hacker (q.v., sense 8). While it is expected
 that any real hacker will have done some playful cracking and knows many of the
@@ -28,69 +28,81 @@ tend to gather in small, tight-knit, very secretive groups that have little
 overlap with the huge, open poly-culture this lexicon describes; though
 crackers often like to describe themselves as hackers, most true hackers
 consider them a separate and lower form of life. See
-[jargon file](http://www.catb.org/jargon/html/C/cracker.html)
-{::}
+.URL http://www.catb.org/jargon/html/C/cracker.html "jargon file"
 
-{:: class="definition"}
-**hacker**:
-<a id="hacker"></a>
+.LI "hacker:"
+.TAG "hacker"
 A person who enjoys exploring the details of programmable systems and how to
 stretch their capabilities, as opposed to most users, who prefer to learn only
-the minimum necessary. [RFC1392](https://www.rfc-editor.org/rfc/rfc1392.txt),
+the minimum necessary.
+.URL https://www.rfc-editor.org/rfc/rfc1392.txt RFC1392 ,
 the Internet Users' Glossary, usefully amplifies this as: A person who delights
 in having an intimate understanding of the internal workings of a system,
 computers and computer networks in particular. See
-[jargon file](http://www.catb.org/jargon/html/H/hacker.html)
-{::}
+.URL http://www.catb.org/jargon/html/H/hacker.html "jargon file"
 
-{:: class="definition"}
-**hacker ethic**:
-<a id="hacker-ethic"></a>
+.LI "hacker ethic:"
+.TAG "hacker_ethic"
 The hacker ethic is centered around passion, hard work, creativity and joy of
-creating software ([Himanen, 2001](#cite_himanen_2001)). Levy describes the
+creating software
+.TAG-REF cite_himanen_2001 "Himanen, 2001" .
+Levy describes the
 following core principles to the hacker ethic:
-+ Sharing — improvement of yours and others public creations.
-+ Openness — all information should be free.
-+ Decentralization — mistrust authority & promote decentralization. Hackers
+.ULS
+.LI
+Sharing \(en improvement of yours and others public creations.
+.LI
+Openness \(en all information should be free.
+.LI
+Decentralization \(en mistrust authority & promote decentralization. Hackers
 are encouraged to think critically and to challenge the status quo. Promoting
 decentralization dilutes the concentration of power and redistributes the power
 among the many.
-+ Access to computers, and anything which might teach you something about the
+.LI
+Access to computers, and anything which might teach you something about the
 way the world works, should be unlimited and total. Always yield to the
 Hands-On Imperative!
-+ World Improvement (foremost, upholding democracy and the fundamental laws we
+.LI
+World Improvement (foremost, upholding democracy and the fundamental laws we
 all live by, as a society)
-+ Meritocracy — hackers should be judged by their hacking, not bogus criteria
+.LI
+Meritocracy \(en hackers should be judged by their hacking, not bogus criteria
 such as degrees, age, race, or position
-+ You can create art and beauty on a computer.
-+ Computers can change your life for the better.
-([Levy, 2010](#cite_levy_2010))
+.LI
+You can create art and beauty on a computer.
+.LI
+Computers can change your life for the better
+.TAG-REF cite_levy_2010 "Levy, 2010" .
+.ULE
 
 The hacker ethic and its wider context can be associated with liberalism and
 anarchism.
-{::}
 
-{:: class="definition"}
-**meritocracy**:
-<a id="meritocracy"></a>
-*A system in which advancement is based on individual ability or achievement*.
+.LI "meritocracy:"
+.TAG "meritocracy"
+.I "A system in which advancement is based on individual ability or achievement" .
 Inherent to the hacker ethic is a meritocratic system where superficiality is
 disregarded in esteem of skill, and "hackers should be judged by their hacking,
 not bogus criteria such as degrees, age, race, or position"
-([Levy, 2010](#cite_levy_2010)).
+.TAG-REF cite_levy_2010 "Levy, 2010" .
 
-In hacker ethic *meritocracy* is **not** meant as a form of social system in
+In hacker ethic
+.I meritocracy
+is
+.I not
+meant as a form of social system in
 which power goes to those with superior intellects, or the belief that rulers
 should be chosen for their superior abilities and not because of their wealth
 or birth.
-{::}
+.DLE
 
-## References
+.HnS 1
+References
+.HnE
 
-{: class="reference"}
-<a id="cite_himanen_2001"></a>Himanen, Pekka (2001). *The Hacker Ethic and the
-Spirit of the Information Age*. Floris Books. ISBN: 978-0-375-50566-9.
-
-{: class="reference"}
-<a id="cite_levy_2010"></a>Levy, Steven (2010). *Hackers \\-- Heroes of the
-computer revolution*. O’Reilly Media. ISBN: 978-1-449-38839-3.
+.REF "cite_himanen_2001" "Himanen, Pekka (2001). \
+\f[I]The Hacker Ethic and the Spirit of the Information Age\f[]. \
+Floris Books. ISBN: 978-0-375-50566-9."
+.REF "cite_levy_2010" "Levy, Steven (2010). \
+\f[I]Hackers \(en Heroes of the computer revolution\f[]. \
+O'Reilly Media. ISBN: 978-1-449-38839-3."
diff --git a/noxz.tech/dotfiles/index.md b/noxz.tech/dotfiles/index.md
@@ -1,71 +0,0 @@
-Dotfiles (outdated, see source for now)
-=======================================
-I've written a little tool to manage my dotfiles, in a way that it symlinks
-everything to where it should be. As I use patched versions of `st` and `dwm`
-some parts of my dotfiles doesn't make sense if you don't use my versions of
-`st` and `dwm`, but they are not prerequisites.
-
-Containers
-----------
-I store my dotfiles in containers for each category of dotfiles, and each
-container can be seen as their own representation of `$HOME`. There is for
-example one container called *vim* containing everything that has to do with
-vim and so on.
-
-Components
-----------
-+ **link**: installer and uninstaller for the *dotfiles*.
-+ **bin**: scripts and programs that will be included in `$PATH`.
-+ **bin/.bin/alias**: scripts that will be sourced as functions instead of
-using aliases, as I find it simpler to maintain each 'alias' as it's own file.
-+ **.exclude**: dotfiles that are global to the root and that won't get
-symlinked into `$HOME`.
-+ **ksh**: KornShell is quite central to my dotfiles and contains functions
-that require *bin* and *bin/.bin/alias* to be installed. **.kshrc** is called
-when KornShell starts and then sources every *.sh* in **.kshrc.d**.
-
-### other containers
-+ cdm
-+ git
-+ input
-+ mbsync
-+ mpv
-+ msmtp
-+ mutt
-+ newsboat
-+ ssh
-+ surf
-+ sxhkd
-+ sxiv
-+ themes
-+ tmux
-+ vifm
-+ vim
-+ vimb
-+ x
-
-
-
-Prerequisites
--------------
-I haven't actively integrated any dependency checks in any dotfile so if you
-use my dotfiles keep in mind that it might break stuff, and you might need to
-install extra software to make it work. If you find any such issues feel free
-to report them to me, and I might fix them.
-
-Oh, and I use ksh (loksh). That is kind of a prerequisite...
-
-Installation
-------------
-Installation is pretty simple. Just clone and install:
-
-    git clone git://git.noxz.tech/dotfiles
-    cd dotfiles
-    # optionally: mv dotfiles .dotfiles && cd .dotfiles
-    ./link install all
-
-Except for installing *all* you can tell `link` to install just the container
-for vim `./link install vim` and so on. To remove a container simply `./link
-remove vim`, or show status using `./link status vim`
-
-get source [here](//git.noxz.tech/dotfiles/).
diff --git a/noxz.tech/dotfiles/index.www b/noxz.tech/dotfiles/index.www
@@ -0,0 +1,164 @@
+.HnS 0
+Dotfiles (outdated, see source for now)
+.HnE
+
+I've written a little tool to manage my dotfiles, in a way that it symlinks
+everything to where it should be. As I use patched versions of
+.ICD st
+and
+.ICD dwm
+some parts of my dotfiles doesn't make sense if you don't use my versions of
+.ICD st
+and
+.ICD dwm ,
+but they are not prerequisites.
+
+.HnS 1
+Containers
+.HnE
+
+I store my dotfiles in containers for each category of dotfiles, and each
+container can be seen as their own representation of
+.ICD $HOME .
+There is for example one container called
+.I vim
+containing everything that has to do with vim and so on.
+
+.HnS 1
+Components
+.HnE
+
+.DLS
+.LI link:
+installer and uninstaller for the
+.I dotfiles .
+
+.LI bin:
+scripts and programs that will be included in
+.ICD $PATH .
+
+.LI bin/.bin/alias:
+scripts that will be sourced as functions instead of
+using aliases, as I find it simpler to maintain each 'alias' as it's own file.
+
+.LI .exclude: dotfiles that are global to the root and that won't get
+symlinked into 
+.ICD $HOME .
+
+.LI ksh:
+KornShell is quite central to my dotfiles and contains functions
+that require
+.ICD bin
+and
+.ICD bin/.bin/alias
+to be installed.
+.ICD .kshrc
+is called
+when KornShell starts and then sources every
+.ICD .sh
+in
+.ICD .kshrc.d .
+.DLE
+
+.HnS 2
+other containers
+.HnE
+
+.ULS
+.LI
+cdm
+
+.LI
+git
+
+.LI
+input
+
+.LI
+mbsync
+
+.LI
+mpv
+
+.LI
+msmtp
+
+.LI
+mutt
+
+.LI
+newsboat
+
+.LI
+ssh
+
+.LI
+surf
+
+.LI
+sxhkd
+
+.LI
+sxiv
+
+.LI
+themes
+
+.LI
+tmux
+
+.LI
+vifm
+
+.LI
+vim
+
+.LI
+vimb
+
+.LI
+x
+.ULE
+
+
+
+.HnS 1
+Prerequisites
+.HnE
+
+I haven't actively integrated any dependency checks in any dotfile so if you
+use my dotfiles keep in mind that it might break stuff, and you might need to
+install extra software to make it work. If you find any such issues feel free
+to report them to me, and I might fix them.
+
+Oh, and I use ksh (loksh). That is kind of a prerequisite...
+
+.HnS 1
+Installation
+.HnE
+
+Installation is pretty simple. Just clone and install:
+
+.CDS
+.COS
+git clone git://git.noxz.tech/dotfiles
+cd dotfiles
+# optionally: mv dotfiles .dotfiles && cd .dotfiles
+./link install all
+.COE
+.CDE
+
+Except for installing
+.I all
+you can tell
+.ICD link
+to install just the container
+for vim
+.ICD "./link install vim"
+and so on. To remove a container simply
+.ICD "./link remove vim" ,
+or show status using
+.ICD "./link status vim" .
+
+get source
+.URL "//git.noxz.tech/dotfiles.git" "here" .
diff --git a/noxz.tech/dotfiles/selected-scripts/index.compiled.pdf b/noxz.tech/dotfiles/selected-scripts/index.compiled.pdf
diff --git a/noxz.tech/dotfiles/selected_scripts/.assemble b/noxz.tech/dotfiles/selected_scripts/.assemble
@@ -0,0 +1 @@
+index.html
diff --git a/noxz.tech/dotfiles/selected-scripts/index.md b/noxz.tech/dotfiles/selected_scripts/index.www
rename noxz.tech/dotfiles/selected-scripts/index.md → noxz.tech/dotfiles/selected_scripts/index.www
@@ -1,14 +1,15 @@
+.HnS 0
 Selected scripts
-================
+.HnE
+
 This page contains scripts from my dotfiles that I feel deserve extra mention.
 
-mpvc
-----
-Mpvc is partly a controller script and partly a socket daemon for mpv. By 
-symlinking mpvc to mpvd the script acts as the socket daemon. Mpvc featers 
-playback and audio controls as well as playlist functionalities using both 
-dmenu and fzf. For the directory playlist feature to work exiftool is required.  
-This feature makes it possible to load a directory into a temporary playlist 
+.DLS
+.LI mpvc
+is partly a controller script and partly a socket daemon for mpv. By
+symlinking mpvc to mpvd the script acts as the socket daemon. Mpvc featers
+playback and audio controls as well as playlist functionalities using both
+dmenu and fzf. For the directory playlist feature to work exiftool is required.
+This feature makes it possible to load a directory into a temporary playlist
 where exiftool extracts track data from individual files.
-
-get source [here](//git.noxz.tech/dotfiles/file/bin/_.local/bin/mpvc.html).
+.DLE
diff --git a/noxz.tech/guides/geogebra/.assemble b/noxz.tech/guides/geogebra/.assemble
@@ -1,2 +1,2 @@
-geogebra.png
 index.html
+geogebra.png
diff --git a/noxz.tech/guides/geogebra/index.md b/noxz.tech/guides/geogebra/index.www
rename noxz.tech/guides/geogebra/index.md → noxz.tech/guides/geogebra/index.www
@@ -1,39 +1,55 @@
+.HnS 0
 GeoGebra
-========
+.HnE
 
 I personally use a portable version of GeoGebra as I'm not that fond of
 installing a full Java environment on my machine, and the portable version of
 GeoGebra comes with a portable version of JRE as well. So keep that in mind
 when reading these guides.
 
-{: class="center"}
-![](geogebra.png)
+.PIMG geogebra.png
 
+.HnS 1
 Missing GUI
------------
+.HnE
 
 As it turns out Java has a problem with rendering the GUI correctly on
-non-reparenting window managers, such as *DWM* -- the one I use. The solution
-to the problem is easy though. If JDK is patched to check for the environment
-variable **\_JAVA\_AWT\_WM\_NONREPARENTING**, you can set this to equal *1*. I've
-created a startup script for GeoGebra like so:
-
-    _JAVA_AWT_WM_NONREPARENTING=1 ./geogebra-portable
+non-reparenting window managers, such as
+.I DWM
+\(en the one I use. The solution to the problem is easy though. If JDK is
+patched to check for the environment variable
+.B _JAVA_AWT_WM_NONREPARENTING ,
+you can set this to equal
+.I 1 .
+I've created a startup script for GeoGebra like so:
+
+.CDS
+.COS
+_JAVA_AWT_WM_NONREPARENTING=1 ./geogebra-portable
+.COE
+.CDE
 
 This workaround is of course not only applicable to GeoGebra, but to all
 Java applications with similar problems.
 
+.HnS 1
 Using GTK theming in GeoGebra
------------------------------
+.HnE
 
 If you want to have the same look and feel in GeoGebra, as the rest of your GTK
 applications, this can be easily achieved by setting Java options through the
-environment variable **\_JAVA\_OPTIONS**, like so:
-
-    _JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
-    -Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
-    -Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
-    
-    (one line)
+environment variable
+.B _JAVA_OPTIONS ,
+like so:
+
+.CDS
+.COS
+_JAVA_OPTIONS='-Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
+-Dswing.defaultlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel
+-Dswing.crossplatformlaf=com.sun.java.swing.plaf.gtk.GTKLookAndFeel'
+
+(one line)
+.COE
+.CDE
 
 Again, this is of course applicable to all GUI applications in Java.
diff --git a/noxz.tech/guides/groff/index.md b/noxz.tech/guides/groff/index.md
@@ -1,163 +0,0 @@
-groff (GNU troff)
-=================
-As these guides are created for *groff*, I cannot guarantee that they are
-applicable to *troff*. If you use *troff* and can confirm them to work for it
-\\-- please let me know.
-
-Apart from *groff*, these guides may include other programs used together with
-*groff*, such as *eqn*, *tbl*, and so on. I will try to make this clear in the
-description of each guide.
-
-Collection of papers on troff and its companions
-------------------------------------------------
-Following is a collection based on
-[troff.org/papers](https://www.troff.org/papers.html). However, I found that
-much of the links referenced from that site are dead. I have instead downloaded
-and compiled pdfs from archive.org. Much of the material available was written
-at Bell Labs. The CSTR documents below refer to 'Computer Science Technical
-Reports', a Bell Labs internal numbering system used in the past.
-
-### troff
-+ [A TROFF Tutorial
-](papers/a_troff_tutorial.pdf).
-[Brian W. Kernighan](https://www.troff.org/whoswho.html#bwk), Unix Version 7
-manual, 1978.
-+ [Nroff/Troff User's Manual
-](papers/nroff_troff_users_manual.pdf).
-CSTR #54, J. F. Ossanna, Bell Labs, 1976. Revised by [Brian W. Kernighan
-](https://www.troff.org/whoswho.html#bwk), 1992.
-+ [A Typesetter-Independent TROFF
-](papers/a_typesetter-independent_troff.pdf).
-CSTR #97, [Brian W. Kernighan](https://www.troff.org/whoswho.html#bwk), Bell
-Labs, 1981, revised March 1982.
-
-### macro packages
-+ [Writing Papers with NROFF using -me
-](papers/writing_papers_with_nroff_using_me.pdf).
-Eric P. Allman, University of California Berkeley, 1986.
-+ [-me Reference Manual
-](papers/me_reference_manual.pdf).
-Eric P. Allman, University of California Berkeley, 1986.
-+ [Using The -ms Macros with Troff and Nroff
-](papers/using_the_ms_macros_with_troff_and_nroff.pdf).
-Michael E. Lesk, 1978.
-
-### eqn
-+ [Typesetting Mathematics, User's Guide (Second Edition)
-](papers/typesetting_mathematics_users_guide__second_edition.pdf).
-[Brian W. Kernighan](https://www.troff.org/whoswho.html#bwk) and Lorinda
-Cherry, 1978.
-+ [A System for Typesetting Mathematics
-](papers/a_system_for_typesetting_mathematics.pdf).
-[Brian W. Kernighan](https://www.troff.org/whoswho.html#bwk) and Lorinda L.
-Cherry, CACM, 1975.
-+ [A Guide to Typesetting Mathematics using GNU eqn
-](papers/a_guide_to_typesetting_mathematics_using_gnu_eqn.pdf). Ted Harding,
-2011.
-
-### pic
-+ [PIC -- A Graphics Language for Typesetting (Revised User Manual)
-](papers/pic_--_a_graphics_language_for_typesetting__116.pdf). CSTR #116,
-[Brian W. Kernighan](https://www.troff.org/whoswho.html#bwk), Bell Labs,
-December 1984.
-+ [GRAP -- A Language for Typesetting Graphs (Tutorial and User Manual)
-](papers/grap_--_a_language_for_typesetting_graphs__114.pdf). CSTR #114, Jon L.
-Bentley and [Brian W. Kernighan](https://www.troff.org/whoswho.html#bwk)", Bell
-Labs, August 1984.
-+ [CHEM -- A Program for Typesetting Chemical Structure Diagrams
-](papers/chem_--_a_language_for_typesetting_chemical_structure_diagram__122.pdf).
-CSTR #122, J. L. Bentley, L. W. Jelinski, and [B. W. Kernighan
-](https://www.troff.org/whoswho.html#bwk), Computers and Chemistry,
-Bell Labs, April 1986.
-+ [A System for Algorithm Animation (Tutorial and User Manual)
-](papers/a_system_for_algorithm_animation__132.pdf). CSTR #132, J.  L.  Bentley
-and [B. W. Kernighan](https://www.troff.org/whoswho.html#bwk), Bell Labs,
-January 1987.  Instrument your programs with graphics.
-+ [DFORMAT -- A Program for Typesetting Data Formats
-](papers/dformat_--_a_program_for_typesetting_data_formats__142.pdf).
-CSTR #142, Jon
-L.  Bentley, Bell Labs, April 1988.
-+ [Making Pictures With GNU PIC
-](papers/making_pictures_with_gnu_pic.pdf). Eric S. Raymond, 1995.
-+ [Drawing with dpic
-](papers/drawing-with-dpic.pdf). J. D. Aplevich, 2019.
-
-### refer
-+ [Some Applications of Inverted Indexes on the UNIX System
-](papers/some_applications_of_inverted_indexes_on_the_unix_system.pdf).
-Michael. E.  Lesk.
-
-### tbl
-+ [Tbl -- A Program to Format Tables
-](papers/tbl_--_a_program_to_format_tables.pdf). M. E. Lesk, 1977.
-+ [Tbl -- A Program to Format Tables
-](papers/tbl_--_a_program_to_format_tables__76.pdf). L. L. Cherry, M. E. Lesk,
-1976.
-
-### indexing
-+ [Maintaining Cross References in Manuscripts
-](papers/maintaining_cross_references_in_manuscripts__127.pdf). CSTR #127, A.
-V. Aho
-and R. Sethi, Bell Labs, September 1986.
-+ [Tools for Printing Indexes
-](papers/tools_for_printing_indexes__128.pdf). CSTR #128, J. L. Bentley and
-[B. W.  Kernighan](https://www.troff.org/whoswho.html#bwk), Bell Labs, October
-1986.
-
-Crossing out expressions in *eqn*
----------------------------------
-In the *man* page of *eqn* you can read about defining a macro for canceling an
-expression. This macro draws a line over the expression, as an indication it's
-canceled. When using paper and pen I usually use a cross instead, so this is
-how you do the same in *eqn*
-
-    \# define cancel_cross macro for expressions
-    .defcolor cancelcolor rgb 0.0f 0.0f 0.0f
-    .EQ }
-    define cancel_cross 'special Cax'
-    .EN
-    .de Cax
-    .  ds 0s \
-    \Z'\\*(0s'\
-    \Z'\D't 0.75p''\
-    \m[cancelcolor]\
-    \v'\\n(0du'\
-    \D'l \\n(0wu -\\n(0hu-\\n(0du'\
-    \h'-\\n(0wu'\
-    \D'l \\n(0wu \\n(0hu+\\n(0du'\
-    \v'-\\n(0hu-\\n(0du'\
-    \Z'\D't 0.5p''\
-    \m[default]\
-    \v'\\n(0hu'
-    ..
-
-Then use it for example like this: `{ 4 times 1 } over { 4 times 5 }
-= { cancel_cross 4 times 1 } over { cancel_cross 4 times 5 }`.
-
-You can of course name your macro `cancel` instead of `cancel_cross`. The
-`cancelcolor` is also optional, and in the case above redundant.
-
-Simplify expressions in *eqn*
------------------------------
-When writing *eqn* expressions in *groff* it's easier to distinguish what is
-*groff* and what is *eqn* using distinct delimiters for *eqn*. This is simply
-accomplished this way:
-
-    .EQ
-    delim ##
-    .EN
-
-Then use it like this:
-
-    [...]
-    .LP
-    Calculate the sum of #-4# and #-7#
-    .sp 1
-    .RS
-    # (-4) + (-7) #
-    
-    # = -4 - 7 #
-    
-    # = -11
-    .RE
-    [...]
diff --git a/noxz.tech/guides/groff/index.www b/noxz.tech/guides/groff/index.www
@@ -0,0 +1,269 @@
+.HnS 0
+groff (GNU troff)
+.HnE
+
+As these guides are created for
+.I groff ,
+I cannot guarantee that they are applicable to
+.I troff .
+If you use
+.I troff
+and can confirm them to work for it \(en please let me know.
+
+Apart from
+.I groff ,
+these guides may include other programs used together with
+.I groff ,
+such as
+.I eqn ,
+.I tbl ,
+and so on. I will try to make this clear in the description of each guide.
+
+.HnS 1
+Collection of papers on troff and its companions
+.HnE
+
+Following is a collection based on
+.URL "https://www.troff.org/papers.html" "troff.org/papers" .
+However, I found that much of the links referenced from that site are dead. I
+have instead downloaded and compiled pdfs from archive.org. Much of the material
+available was written at Bell Labs. The CSTR documents below refer to 'Computer
+Science Technical Reports', a Bell Labs internal numbering system used in the
+past.
+
+.HnS 2
+troff
+.HnE
+
+.ULS
+.LI
+.URL "papers/a_troff_tutorial.pdf" "A TROFF Tutorial" .
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan" ,
+Unix Version 7 manual, 1978.
+
+.LI
+.URL "papers/nroff_troff_users_manual.pdf" "Nroff/Troff User's Manual" .
+CSTR #54, J. F. Ossanna, Bell Labs, 1976. Revised by 
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan" ,
+1992.
+
+.LI
+.URL "papers/a_typesetter-independent_troff.pdf" "A Typesetter-Independent TROFF" .
+CSTR #97,
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan" ,
+Bell Labs, 1981, revised March 1982.
+.ULE
+
+.HnS 2
+macro packages
+.HnE
+
+.ULS
+.LI
+.URL "papers/writing_papers_with_nroff_using_me.pdf" "Writing Papers with NROFF using \[u2011]me" .
+Eric P. Allman, University of California Berkeley, 1986.
+
+.LI
+.URL "papers/me_reference_manual.pdf" "\[u2011]me Reference Manual" .
+Eric P. Allman, University of California Berkeley, 1986.
+
+.LI
+.URL "papers/using_the_ms_macros_with_troff_and_nroff.pdf" "Using The \[u2011]ms Macros with Troff and Nroff" .
+Michael E. Lesk, 1978.
+.ULE
+
+.HnS 2
+eqn
+.HnE
+
+.ULS
+.LI
+.URL "papers/typesetting_mathematics_users_guide__second_edition.pdf" "Typesetting Mathematics, User’s Guide (Second Edition)" .
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan"
+and Lorinda Cherry, 1978.
+
+.LI
+.URL "papers/a_system_for_typesetting_mathematics.pdf" "A System for Typesetting Mathematics" .
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan"
+and Lorinda L. Cherry, CACM, 1975.
+
+.LI
+.URL "papers/a_guide_to_typesetting_mathematics_using_gnu_eqn.pdf" "A Guide to Typesetting Mathematics using GNU eqn" .
+Ted Harding, 2011.
+.ULE
+
+.HnS 2
+pic
+.HnE
+
+.ULS
+.LI
+.URL "papers/pic_--_a_graphics_language_for_typesetting__116.pdf" "PIC \(en A Graphics Language for Typesetting (Revised User Manual)" .
+CSTR #116,
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan" ,
+Bell Labs, December 1984.
+
+.LI
+.URL "papers/grap_--_a_language_for_typesetting_graphs__114.pdf" "GRAP \(en A Language for Typesetting Graphs (Tutorial and User Manual)" .
+CSTR #114, Jon L. Bentley and 
+.URL "https://www.troff.org/whoswho.html#bwk" "Brian W. Kernighan" ", Bell
+Labs, August 1984.
+
+.LI
+.URL "papers/chem_--_a_language_for_typesetting_chemical_structure_diagram__122.pdf" "CHEM \(en A Program for Typesetting Chemical Structure Diagrams" .
+CSTR #122, J. L. Bentley, L. W. Jelinski, and 
+.URL "https://www.troff.org/whoswho.html#bwk" "B. W. Kernighan" ,
+Computers and Chemistry, Bell Labs, April 1986.
+
+.LI
+.URL "papers/a_system_for_algorithm_animation__132.pdf" "A System for Algorithm Animation (Tutorial and User Manual)" .
+CSTR #132, J.  L.  Bentley and 
+.URL "https://www.troff.org/whoswho.html#bwk" "B. W. Kernighan" , Bell Labs,
+January 1987.  Instrument your programs with graphics.
+
+.LI
+.URL "papers/dformat_--_a_program_for_typesetting_data_formats__142.pdf" "DFORMAT \(en A Program for Typesetting Data Formats" .
+CSTR #142, Jon L.  Bentley, Bell Labs, April 1988.
+
+.LI
+.URL "papers/making_pictures_with_gnu_pic.pdf" "Making Pictures With GNU PIC" .
+Eric S. Raymond, 1995.
+
+.LI
+.URL "papers/drawing-with-dpic.pdf" "Drawing with dpic" .
+J. D. Aplevich, 2019.
+.ULE
+
+.HnS 2
+refer
+.HnE
+
+.ULS
+.LI
+.URL "papers/some_applications_of_inverted_indexes_on_the_unix_system.pdf" "Some Applications of Inverted Indexes on the UNIX System" .
+Michael. E.  Lesk.
+.ULE
+
+.HnS 2
+tbl
+.HnE
+
+.ULS
+.LI
+.URL "papers/tbl_--_a_program_to_format_tables.pdf" "Tbl \(en A Program to Format Tables" .
+M. E. Lesk, 1977.
+
+.LI
+.URL "papers/tbl_--_a_program_to_format_tables__76.pdf" "Tbl \(en A Program to Format Tables" .
+L. L. Cherry, M. E. Lesk, 1976.
+.ULE
+
+.HnS 2
+indexing
+.HnE
+
+.ULS
+.LI
+.URL "papers/maintaining_cross_references_in_manuscripts__127.pdf" "Maintaining Cross References in Manuscripts" .
+CSTR #127, A. V. Aho and R. Sethi, Bell Labs, September 1986.
+
+.LI
+.URL "papers/tools_for_printing_indexes__128.pdf" "Tools for Printing Indexes" .
+CSTR #128, J. L. Bentley and
+.URL "https://www.troff.org/whoswho.html#bwk" "B. W.  Kernighan" ,
+Bell Labs, October 1986.
+.ULE
+
+.HnS 1
+Crossing out expressions in
+.I eqn
+.HnE
+
+In the
+.I man
+page of
+.I eqn
+you can read about defining a macro for canceling an expression. This macro
+draws a line over the expression, as an indication it's canceled. When using
+paper and pen I usually use a cross instead, so this is how you do the same in
+.I eqn.
+
+.CDS
+.COS
+\&.\\" define cancel_cross macro for expressions
+\&.defcolor cancelcolor rgb 0.0f 0.0f 0.0f
+\&.EQ }
+define cancel_cross 'special Cax'
+\&.EN
+\&.de Cax
+\&.  ds 0s \\
+\\Z'\\\\*(0s'\\
+\\Z'\\D't 0.75p''\\
+\\m[cancelcolor]\\
+\\v'\\\\n(0du'\\
+\\D'l \\\\n(0wu -\\\\n(0hu-\\\\n(0du'\\
+\\h'-\\\\n(0wu'\\
+\\D'l \\\\n(0wu \\\\n(0hu+\\\\n(0du'\\
+\\v'-\\\\n(0hu-\\\\n(0du'\\
+\\Z'\\D't 0.5p''\\
+\\m[default]\\
+\\v'\\\\n(0hu'
+\&..
+.COE
+.CDE
+
+Then use it for example like this:
+.ICD "{ 4 times 1 } over { 4 times 5 } = { cancel_cross 4 times 1 } over { cancel_cross 4 times 5 }" .
+
+You can of course name your macro
+.ICD cancel
+instead of 
+.ICD cancel_cross .
+The
+.ICD cancelcolor
+is also optional, and in the case above redundant.
+
+.HnS 1
+Simplify expressions in
+.I eqn
+.HnE
+
+When writing
+.I eqn
+expressions in
+.I groff
+it's easier to distinguish what is
+.I groff
+and what is
+.I eqn
+using distinct delimiters for
+.I eqn .
+This is simply
+accomplished this way:
+
+.CDS
+.COS
+\&.EQ
+delim ##
+\&.EN
+.COE
+.CDE
+
+Then use it like this:
+
+.CDS
+.COS
+[...]
+\&.LP
+Calculate the sum of #-4# and #-7#
+\&.sp 1
+\&.RS
+# (-4) + (-7) #
+
+# = -4 - 7 #
+
+# = -11
+\&.RE
+[...]
+.COE
+.CDE
diff --git a/noxz.tech/guides/groff/papers/making_pictures_with_gnu_pic.pdf b/noxz.tech/guides/groff/papers/making_pictures_with_gnu_pic.pdf
diff --git a/noxz.tech/guides/groff/simple_compiler_for_vim/index.md b/noxz.tech/guides/groff/simple_compiler_for_vim/index.md
@@ -1,73 +0,0 @@
-Simple compiler for vim
-=======================
-When writing documents in vim it's nice to have a quick way of compiling them
-into desired formats. In my case I compile my groff files into pdfs, while at
-the same time having a preview in zathura. Zathura automatically detects
-changes in pdfs and reloads accordingly, which is nice.
-
-The compiler code
------------------
-Below I will describe the code in short.
-
-    #!/bin/sh
-    
-    _FILE=$(readlink -f "$1")
-    _DIR=$(dirname "$_FILE")
-    _BASE="${_FILE%.*}"
-    _PRFX="---COMPILE:"
-    _ARGS="$(grep -oP -- "$_PRFX.*$" "$_FILE" |  sed -s "s|$_PRFX||")"
-    
-    cd "$_DIR" || return
-    
-    case "$_FILE" in
-    *\.ms)  preconv "$_FILE"                                                \
-            | refer                                                         \
-            | tbl -Tpdf                                                     \
-            | eqn -Tpdf                                                     \
-            | pic -Tpdf                                                     \
-            | groff -k -ms $_ARGS -dpaper=a4 -P-pa4 -P-e -Tpdf              \
-            | gs                                                            \
-                -q                                                          \
-                -dNOPAUSE                                                   \
-                -dBATCH                                                     \
-                -dPDFSETTINGS=/prepress                                     \
-                -sDEVICE=pdfwrite                                           \
-                -dPrinted=false                                             \
-                -sOutputFile="$_BASE.pdf" -
-            ;;
-    esac
-
-The script above is called *compile* and is intended to be used for multiple
-file types. In this version I have only implemented support for *.ms* files.
-First the filename is read from the first argument to the script. From the
-filename I determine the directory path and the "base name" without the
-filename's extension. In the file I search for the pattern *---COMPILE:* as it
-may contain additional arguments for the compiler (used above as *$_ARGS*).
-
-The script then changes the directory to the file's directory and executes a
-chain of programs. First *preconv* is executed to handle unicode characters.
-Then *refer* handles references, *eqn* handles mathematical expressions, *pic*
-handles pictures, groff compiles everything into an *a4* pdf using the *ms*
-macro set and finally Ghostscript runs post processing and embeds used fonts
-into the pdf (while preserving hyperlinks).
-
-Everything is then being outputted to the same "base name", but as a pdf file.
-
-Usage in vim
-------------
-In vim I have the following key binding set to compile the document upon
-request.
-
-    map <leader>c :w! \| silent !compile <c-r>%<CR><Esc>:redraw!<CR>
-
-Not much to say here. The document is being saved, compiled and then vim is
-being redrawn (to avoid glitches).
-
-Workflow
---------
-My usual workflow for writing documents in vim, using the above compiler,
-consists of me first starting a terminal (with tmux). I then open a new tab,
-start vim and setup everything for a base document in groff. After that I run
-the compiler to create an empty pdf. In the first tab I execute zathura to view
-the pdf. As I use dwm (a tiling window manager), I have vim on one side of the
-screen and zathura on the other. Simple and functional!
diff --git a/noxz.tech/guides/groff/simple_compiler_for_vim/index.www b/noxz.tech/guides/groff/simple_compiler_for_vim/index.www
@@ -0,0 +1,106 @@
+.HnS 0
+Simple compiler for vim
+.HnE
+
+When writing documents in vim it's nice to have a quick way of compiling them
+into desired formats. In my case I compile my groff files into pdfs, while at
+the same time having a preview in zathura. Zathura automatically detects
+changes in pdfs and reloads accordingly, which is nice.
+
+.HnS 1
+The compiler code
+.HnE
+
+Below I will describe the code in short.
+
+.CDS
+.COS
+#!/bin/sh
+
+_FILE=$(readlink -f "$1")
+_DIR=$(dirname "$_FILE")
+_BASE="${_FILE%.*}"
+_PRFX="---COMPILE:"
+_ARGS="$(grep -oP -- "$_PRFX.*$" "$_FILE" |  sed -s "s|$_PRFX||")"
+
+cd "$_DIR" || return
+
+case "$_FILE" in
+*\\.ms)  preconv "$_FILE"                                            \\
+    | refer                                                         \\
+    | tbl -Tpdf                                                     \\
+    | eqn -Tpdf                                                     \\
+    | pic -Tpdf                                                     \\
+    | groff -k -ms $_ARGS -dpaper=a4 -P-pa4 -P-e -Tpdf              \\
+    | gs                                                            \\
+        -q                                                          \\
+        -dNOPAUSE                                                   \\
+        -dBATCH                                                     \\
+        -dPDFSETTINGS=/prepress                                     \\
+        -sDEVICE=pdfwrite                                           \\
+        -dPrinted=false                                             \\
+        -sOutputFile="$_BASE.pdf" -
+    ;;
+esac
+.COE
+.CDE
+
+The script above is called
+.I compile
+and is intended to be used for multiple
+file types. In this version I have only implemented support for
+.I .ms
+files.
+First the filename is read from the first argument to the script. From the
+filename I determine the directory path and the "base name" without the
+filename's extension. In the file I search for the pattern
+.I ---COMPILE:
+as it
+may contain additional arguments for the compiler (used above as
+.I $_ARGS ).
+
+The script then changes the directory to the file's directory and executes a
+chain of programs. First
+.I preconv
+is executed to handle unicode characters.
+Then
+.I refer
+handles references,
+.I eqn
+handles mathematical expressions,
+.I pic
+handles pictures, groff compiles everything into an
+.I a4
+pdf using the
+.I ms
+macro set and finally Ghostscript runs post processing and embeds used fonts
+into the pdf (while preserving hyperlinks).
+
+Everything is then being outputted to the same "base name", but as a pdf file.
+
+.HnS 1
+Usage in vim
+.HnE
+
+In vim I have the following key binding set to compile the document upon
+request.
+
+.CDS
+.COS
+map <leader>c :w! \| silent !compile <c-r>%<CR><Esc>:redraw!<CR>
+.COE
+.CDE
+
+Not much to say here. The document is being saved, compiled and then vim is
+being redrawn (to avoid glitches).
+
+.HnS 1
+Workflow
+.HnE
+
+My usual workflow for writing documents in vim, using the above compiler,
+consists of me first starting a terminal (with tmux). I then open a new tab,
+start vim and setup everything for a base document in groff. After that I run
+the compiler to create an empty pdf. In the first tab I execute zathura to view
+the pdf. As I use dwm (a tiling window manager), I have vim on one side of the
+screen and zathura on the other. Simple and functional!
diff --git a/noxz.tech/guides/groff/writing_a_resume_in_groff/.assemble b/noxz.tech/guides/groff/writing_a_resume_in_groff/.assemble
@@ -1,3 +1,3 @@
-template.ms
-example.png
 index.html
+example.png
+template.ms
diff --git a/noxz.tech/guides/groff/writing_a_resume_in_groff/index.md b/noxz.tech/guides/groff/writing_a_resume_in_groff/index.md
@@ -1,170 +0,0 @@
-Writing a resume in groff
-=========================
-Writing a curriculum in groff can seem difficult, but rest assured it can 
-easily be accomplished and in this guide I will show how a simple resume can be 
-created. In this guide I will use the macro set *ms*, so remember to compile 
-the document using *-ms*. This guide will also use the *tbl* program to create 
-tables, so remember to first compile the document in *tbl*.
-
-{: class="center"}
-![](example.png)
-
-Settings
---------
-To begin with let's add some settings in the head of the document.
-
-    .fam T
-    .nr PS 10p
-    .nr VS 15p
-    .ds CH
-
-In the section above we have specified the font family *T* (times), a point 
-size of *10p*, a line spacing of *15p* and also disabled the page numbering (by 
-letting the center of the header be blank).
-
-Coloring
---------
-Next let's define some of the coloring that we are going to use later.
-
-    .defcolor headingcolor rgb 0.5f 0.5f 0.5f
-    .defcolor linecolor rgb 0.6f 0.6f 0.6f
-
-Above the *headingcolor* will be used for a horizontal ruler under each 
-heading. The *linecolor* will be used for a vertical line in each section (more 
-on that later).
-
-Macros
-------
-To avoid a lot of typing for each heading we will create a macro instead.
-
-    .de heading
-    .   nf
-    .   ps 14
-    .   B "\\$1"
-    \h'0n'\v'-1.2n'\
-    \m[headingcolor]\
-    \l'\\n(.lu\(ul'\
-    \m[default]
-    .   ps 10
-    .   sp -.2
-    .   fi
-    ..
-
-In the macro *heading* above we start by telling groff not to fill output 
-lines. We set the point size to *14*, print the input parameter in bold and the 
-continue by drawing. When drawing we first move horizontally to the position 
-*0n*, move vertically up *1.2n* and change the pen color to the previously 
-defined *headingcolor*. After that we just draw an underline *\\(ul* from where 
-we are to the most right of the documents writing area. Finally we change the 
-color back to *default*, revert the point size back to *10*, decrease the 
-vertical spacing by *0.2* and tell groff to once again fill output lines.
-
-Header
-------
-Every resume needs a detailed header with name and contact information.
-
-     .ce 2
-     .ps 18
-     .B "John F. Smith"
-     .ps 10
-     john.fictional.smith@mail.com
-     .TS
-     tab(;) nospaces;
-     l rx.
-     Main Road 66;
-     Awesometown, 66788;T{
-     .I "+12 42 99 666"
-     T}
-     Wonderland;T{
-     .I "https://my-little-page.com"
-     T}
-     .TE
-
-In the example above we tell groff to center the following two lines where we 
-print the name *John F. Smith* (with the point size of *18*), and his email 
-address (with the point size of *10*). Then we create a table using *.TS* 
-(table start) ending with .TE (table ending). We define the tab separation, 
-that will separate each cell, as *';'* and tell *tbl* to ignore spaces. The 
-format of the table is *'l rx.'* which means that the first cell is left 
-aligned, the second cell is right aligned and extended (to fill the writing 
-area) and the dot tells *tbl* to end the format there.
-
-The content are then specified with each row on one line (with some caveats) 
-and cells separated using *';'*. As we tell groff to use italics *.I* on the 
-phone number and the URL, we must tell *tbl* to treat the content as text 
-blocks using *'T{'* and *'T}'*. The symbol *'T{'* must be after the *';'* and 
-*'T}'* must be on its own line.
-
-A short summary
----------------
-We will of course need a short summary in our resume. You can of course write 
-what ever you want here, and not necessarily *lorem ipsum dolor sit amet...*
-
-    .heading "Summary"
-    .LP
-    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
-    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim 
-    veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
-    commodo consequat. Duis aute irure dolor in reprehenderit in voluptate 
-    velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat 
-    cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id 
-    est laborum.
-
-In the example above we have taken advantage of our macro named *heading* to 
-format the heading *Summary*. As a placeholder for our paragraph *.LP* we have 
-just added the standard *Lorem Ipsum passage*, used since the 1500s.
-
-Sections
---------
-At last we create some sections for our various topics in the resume. These can 
-of course vary depending on the person or position in mind. I will just create 
-some examples.
-
-    .heading "Professional Experience"
-    .TS
-    tab(;) nospaces;
-    rW15|lx.
-    \m[default]2019 - today\m[linecolor];T{
-    .B "Development Engineer at Creative Pros"
-    \(en Awesometown, Wonderland
-    .br
-    Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium 
-    doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore 
-    veritatis et quasi architecto beatae vitae dicta sunt explicabo.
-    .sp .5
-    T}
-    \m[default]2010 - 2019\m[linecolor];T{
-    .B "Professional Expert at Dreamworx"
-    \(en Somefareaway, Neverland
-    .br
-    Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed 
-    quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
-    .sp .5
-    T}
-    .TE
-    \m[default]
-
-In the example above we are once again using the macro *heading* to create a 
-new heading for our experiences. The content is rendered inside a table, but 
-this time the table formatting is a bit different. In this case *'rW15|lx.'* 
-means that the first cell is right aligned with a fixed width of *15* (you 
-might have to change this to work for your resume). The two cells will be 
-divided by a line, specified using the *'|'*, and the second cell will be left 
-aligned and extended (to fill the writing area).
-
-Here we use the previously defined color *linecolor* for printing the 
-separation line. First we make sure the default color is selected, define the 
-first cell (here containing a date) and the set the new color *linecolor*. For 
-our content we once again use a text block to enable us to use formatting and 
-longer texts.
-
-In our text block we first define the position, employer and location separated 
-with an *en* line. We break the line using *.br* and add some descriptive text 
-for the position. Finally we add some vertical spacing with the value *0.5*. 
-After the table is ended we make sure the default color is set.
-
-Conclusion
-----------
-Together with all information above we can now create a final document to 
-compile into our resume. I've created a template [here](template.ms) based on 
-this guide. Feel free to use it and change it in what ever way you want.
diff --git a/noxz.tech/guides/groff/writing_a_resume_in_groff/index.www b/noxz.tech/guides/groff/writing_a_resume_in_groff/index.www
@@ -0,0 +1,283 @@
+.HnS 0
+Writing a resume in groff
+.HnE
+
+Writing a curriculum in groff can seem difficult, but rest assured it can
+easily be accomplished and in this guide I will show how a simple resume can be
+created. In this guide I will use the macro set 
+.I ms ,
+so remember to compile the document using
+.I \[u2011]ms .
+This guide will also use the
+.I tbl
+program to create tables, so remember to first compile the document in
+.I tbl .
+
+.PIMG example.png
+
+.HnS 1
+Settings
+.HnE
+
+To begin with let's add some settings in the head of the document.
+
+.CDS
+.COS
+\&.fam T
+\&.nr PS 10p
+\&.nr VS 15p
+\&.ds CH
+.COE
+.CDE
+
+In the section above we have specified the font family
+.ICD T
+(times), a point size of
+.ICD 10p ,
+a line spacing of
+.ICD 15p
+and also disabled the page numbering (by letting the center of the header be
+blank).
+
+.HnS 1
+Coloring
+.HnE
+
+Next let's define some of the coloring that we are going to use later.
+
+.CDS
+.COS
+\&.defcolor headingcolor rgb 0.5f 0.5f 0.5f
+\&.defcolor linecolor rgb 0.6f 0.6f 0.6f
+.COE
+.CDE
+
+Above the
+.I headingcolor
+will be used for a horizontal ruler under each heading. The
+.I linecolor
+will be used for a vertical line in each section (more on that later).
+
+.HnS 1
+Macros
+.HnE
+
+To avoid a lot of typing for each heading we will create a macro instead.
+
+.CDS
+.COS
+\&.de heading
+\&.   nf
+\&.   ps 14
+\&.   B "\\\\$1"
+\\h'0n'\\v'-1.2n'\\
+\\m[headingcolor]\\
+\\l'\\\\n(.lu\\(ul'\\
+\\m[default]
+\&.   ps 10
+\&.   sp -.2
+\&.   fi
+\&..
+.COE
+.CDE
+
+In the macro
+.ICD heading
+above we start by telling groff not to fill output lines. We set the point size
+to
+.ICD 14 ,
+print the input parameter in bold and the continue by drawing. When drawing we
+first move horizontally to the position
+.ICD 0n ,
+move vertically up
+.ICD 1.2n
+and change the pen color to the previously defined
+.ICD headingcolor .
+After that we just draw an underline
+.ICD \[u005C](ul
+from where we are to the most right of the documents writing area. Finally we
+change the color back to
+.ICD default ,
+revert the point size back to
+.ICD 10 ,
+decrease the vertical spacing by
+.ICD 0.2
+and tell groff to once again fill output lines.
+
+.HnS 1
+Header
+.HnE
+
+Every resume needs a detailed header with name and contact information.
+
+.CDS
+.COS
+\&.ce 2
+\&.ps 18
+\&.B "John F. Smith"
+\&.ps 10
+john.fictional.smith@mail.com
+\&.TS
+tab(;) nospaces;
+l rx.
+Main Road 66;
+Awesometown, 66788;T{
+\&.I "+12 42 99 666"
+T}
+Wonderland;T{
+\&.I "https://my-little-page.com"
+T}
+\&.TE
+.COE
+.CDE
+
+In the example above we tell groff to center the following two lines where we 
+print the name
+.ICD "John F. Smith"
+(with the point size of
+.ICD 18 ),
+and his email address (with the point size of
+.ICD 10 ).
+Then we create a table using
+.ICD .TS
+(table start) ending with
+.ICD .TE
+(table ending). We define the tab separation, that will separate each cell, as
+.ICD ;
+and tell
+.ICD tbl
+to ignore spaces. The format of the table is
+.ICD "l rx."
+which means that the first cell is left aligned, the second cell is right
+aligned and extended (to fill the writing area) and the dot tells
+.ICD tbl
+to end the format there.
+
+The content are then specified with each row on one line (with some caveats) 
+and cells separated using
+.ICD ; .
+As we tell groff to use italics
+.ICD .I
+on the phone number and the URL, we must tell
+.ICD tbl
+to treat the content as text blocks using 
+.ICD T{
+and
+.ICD T} .
+The symbol
+.ICD T{
+must be after the 
+.ICD ;
+and
+.ICD T}
+must be on its own line.
+
+.HnS 1
+A short summary
+.HnE
+
+We will of course need a short summary in our resume. You can of course write 
+what ever you want here, and not necessarily
+.I "lorem ipsum dolor sit amet..."
+
+.CDS
+.COS
+\&.heading "Summary"
+\&.LP
+Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod 
+tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim 
+veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea 
+commodo consequat. Duis aute irure dolor in reprehenderit in voluptate 
+velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat 
+cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id 
+est laborum.
+.COE
+.CDE
+
+In the example above we have taken advantage of our macro named
+.ICD heading
+to format the heading
+.ICD Summary .
+As a placeholder for our paragraph
+.ICD .LP
+we have just added the standard
+.I "Lorem Ipsum passage" ,
+used since the 1500s.
+
+.HnS 1
+Sections
+.HnE
+
+At last we create some sections for our various topics in the resume. These can 
+of course vary depending on the person or position in mind. I will just create 
+some examples.
+
+.CDS
+.COS
+\&.heading "Professional Experience"
+\&.TS
+tab(;) nospaces;
+rW15|lx.
+\\m[default]2019 - today\\m[linecolor];T{
+\&.B "Development Engineer at Creative Pros"
+\\(en Awesometown, Wonderland
+\&.br
+Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium 
+doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore 
+veritatis et quasi architecto beatae vitae dicta sunt explicabo.
+\&.sp .5
+T}
+\\m[default]2010 - 2019\\m[linecolor];T{
+\&.B "Professional Expert at Dreamworx"
+\\(en Somefareaway, Neverland
+\&.br
+Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed 
+quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt.
+\&.sp .5
+T}
+\&.TE
+\\m[default]
+.COE
+.CDE
+
+In the example above we are once again using the macro
+.ICD heading
+to create a new heading for our experiences. The content is rendered inside a
+table, but this time the table formatting is a bit different. In this case
+.ICD rW15|lx.
+means that the first cell is right aligned with a fixed width of
+.ICD 15
+(you might have to change this to work for your resume). The two cells will be 
+divided by a line, specified using the
+.ICD | ,
+and the second cell will be left aligned and extended (to fill the writing
+area).
+
+Here we use the previously defined color
+.ICD linecolor
+for printing the separation line. First we make sure the default color is
+selected, define the first cell (here containing a date) and the set the new
+color
+.ICD linecolor .
+For our content we once again use a text block to enable us to use formatting
+and longer texts.
+
+In our text block we first define the position, employer and location separated 
+with an
+.I "en"
+dash. We break the line using
+.ICD .br
+and add some descriptive text for the position. Finally we add some vertical
+spacing with the value
+.ICD 0.5 .
+After the table is ended we make sure the default color is set.
+
+.HnS 1
+Conclusion
+.HnE
+
+Together with all information above we can now create a final document to 
+compile into our resume. I've created a template
+.URL template.ms here
+based on this guide. Feel free to use it and change it in what ever way you
+want.
diff --git a/noxz.tech/guides/index.md b/noxz.tech/guides/index.www
rename noxz.tech/guides/index.md → noxz.tech/guides/index.www
@@ -1,28 +1,36 @@
+.HnS 0
 Guides
-======
-The following is a collection of guides, hacks, HOWTOs, tips and tricks \\-- I
-have acquired over the years \\-- for various programs and concepts. I will
-fill this list over a period of time, so it's far from complete \\-- and
+.HnE
+
+The following is a collection of guides, hacks, HOWTOs, tips and tricks \(en I
+have acquired over the years \(en for various programs and concepts. I will
+fill this list over a period of time, so it's far from complete \(en and
 probably never will be.
 
+.HnS 1
 Concepts
---------
-{:: class="definition"}
-**[Mathematics](/guides/mathematics)** as for many hackers, is an interesting
+.HnE
+
+.DLS
+.LIURL mathematics "Mathematics"
+as for many hackers, is an interesting
 and fascinating topic. It's literally a language to explain everything.
-{::}
+.DLE
 
+.HnS 1
 Programs
---------
-{:: class="definition"}
-**[geogebra](/guides/geogebra)** is an interactive geometry, algebra,
+.HnE
+
+.DLS
+.URL
+.LIURL geogebra "Geogebra"
+is an interactive geometry, algebra,
 statistics and calculus application, intended for learning and teaching
 mathematics and science from primary school to university level.
-{::}
 
-{:: class="definition"}
-**[groff](/guides/groff)** (also called GNU troff) is a typesetting system
+.LIURL groff "Groff"
+(also called GNU troff) is a typesetting system
 that creates formatted output when given plain text mixed with formatting
 commands. Output may be PostScript or PDF, html, or ASCII/UTF8 for display at
 the terminal.
-{::}
+.DLE
diff --git a/noxz.tech/guides/mathematics/.assemble b/noxz.tech/guides/mathematics/.assemble
@@ -1 +1,2 @@
 index.html
+grohtml-*.png
diff --git a/noxz.tech/guides/mathematics/grohtml-10.png b/noxz.tech/guides/mathematics/grohtml-10.png
diff --git a/noxz.tech/guides/mathematics/grohtml-11.png b/noxz.tech/guides/mathematics/grohtml-11.png
diff --git a/noxz.tech/guides/mathematics/grohtml-12.png b/noxz.tech/guides/mathematics/grohtml-12.png
diff --git a/noxz.tech/guides/mathematics/grohtml-13.png b/noxz.tech/guides/mathematics/grohtml-13.png
diff --git a/noxz.tech/guides/mathematics/grohtml-14.png b/noxz.tech/guides/mathematics/grohtml-14.png
diff --git a/noxz.tech/guides/mathematics/grohtml-15.png b/noxz.tech/guides/mathematics/grohtml-15.png
diff --git a/noxz.tech/guides/mathematics/grohtml-16.png b/noxz.tech/guides/mathematics/grohtml-16.png
diff --git a/noxz.tech/guides/mathematics/grohtml-17.png b/noxz.tech/guides/mathematics/grohtml-17.png
diff --git a/noxz.tech/guides/mathematics/grohtml-18.png b/noxz.tech/guides/mathematics/grohtml-18.png
diff --git a/noxz.tech/guides/mathematics/grohtml-19.png b/noxz.tech/guides/mathematics/grohtml-19.png
diff --git a/noxz.tech/guides/mathematics/grohtml-20.png b/noxz.tech/guides/mathematics/grohtml-20.png
diff --git a/noxz.tech/guides/mathematics/grohtml-21.png b/noxz.tech/guides/mathematics/grohtml-21.png
diff --git a/noxz.tech/guides/mathematics/grohtml-22.png b/noxz.tech/guides/mathematics/grohtml-22.png
diff --git a/noxz.tech/guides/mathematics/grohtml-23.png b/noxz.tech/guides/mathematics/grohtml-23.png
diff --git a/noxz.tech/guides/mathematics/grohtml-24.png b/noxz.tech/guides/mathematics/grohtml-24.png
diff --git a/noxz.tech/guides/mathematics/grohtml-25.png b/noxz.tech/guides/mathematics/grohtml-25.png
diff --git a/noxz.tech/guides/mathematics/grohtml-26.png b/noxz.tech/guides/mathematics/grohtml-26.png
diff --git a/noxz.tech/guides/mathematics/grohtml-27.png b/noxz.tech/guides/mathematics/grohtml-27.png
diff --git a/noxz.tech/guides/mathematics/grohtml-28.png b/noxz.tech/guides/mathematics/grohtml-28.png
diff --git a/noxz.tech/guides/mathematics/grohtml-29.png b/noxz.tech/guides/mathematics/grohtml-29.png
diff --git a/noxz.tech/guides/mathematics/grohtml-3.png b/noxz.tech/guides/mathematics/grohtml-3.png
diff --git a/noxz.tech/guides/mathematics/grohtml-30.png b/noxz.tech/guides/mathematics/grohtml-30.png
diff --git a/noxz.tech/guides/mathematics/grohtml-31.png b/noxz.tech/guides/mathematics/grohtml-31.png
diff --git a/noxz.tech/guides/mathematics/grohtml-32.png b/noxz.tech/guides/mathematics/grohtml-32.png
diff --git a/noxz.tech/guides/mathematics/grohtml-33.png b/noxz.tech/guides/mathematics/grohtml-33.png
diff --git a/noxz.tech/guides/mathematics/grohtml-34.png b/noxz.tech/guides/mathematics/grohtml-34.png
diff --git a/noxz.tech/guides/mathematics/grohtml-35.png b/noxz.tech/guides/mathematics/grohtml-35.png
diff --git a/noxz.tech/guides/mathematics/grohtml-36.png b/noxz.tech/guides/mathematics/grohtml-36.png
diff --git a/noxz.tech/guides/mathematics/grohtml-37.png b/noxz.tech/guides/mathematics/grohtml-37.png
diff --git a/noxz.tech/guides/mathematics/grohtml-38.png b/noxz.tech/guides/mathematics/grohtml-38.png
diff --git a/noxz.tech/guides/mathematics/grohtml-39.png b/noxz.tech/guides/mathematics/grohtml-39.png
diff --git a/noxz.tech/guides/mathematics/grohtml-4.png b/noxz.tech/guides/mathematics/grohtml-4.png
diff --git a/noxz.tech/guides/mathematics/grohtml-40.png b/noxz.tech/guides/mathematics/grohtml-40.png
diff --git a/noxz.tech/guides/mathematics/grohtml-41.png b/noxz.tech/guides/mathematics/grohtml-41.png
diff --git a/noxz.tech/guides/mathematics/grohtml-42.png b/noxz.tech/guides/mathematics/grohtml-42.png
diff --git a/noxz.tech/guides/mathematics/grohtml-43.png b/noxz.tech/guides/mathematics/grohtml-43.png
diff --git a/noxz.tech/guides/mathematics/grohtml-5.png b/noxz.tech/guides/mathematics/grohtml-5.png
diff --git a/noxz.tech/guides/mathematics/grohtml-6.png b/noxz.tech/guides/mathematics/grohtml-6.png
diff --git a/noxz.tech/guides/mathematics/grohtml-7.png b/noxz.tech/guides/mathematics/grohtml-7.png
diff --git a/noxz.tech/guides/mathematics/grohtml-8.png b/noxz.tech/guides/mathematics/grohtml-8.png
diff --git a/noxz.tech/guides/mathematics/grohtml-9.png b/noxz.tech/guides/mathematics/grohtml-9.png
diff --git a/noxz.tech/guides/mathematics/index.md b/noxz.tech/guides/mathematics/index.md
@@ -1,1990 +0,0 @@
-Mathematics
-===========
-Under this topic I will not just show tricks, as the notion of tricks in
-mathematics is probably the most damning to the spread of mathematical
-knowledge. I will instead explain how these, so called, tricks work using
-logic and reason. So this topic is not for the savvy hackers or mathematicians
-out there.
-
-{:: class="toc"}
-{- class="toc-title"}Contents{--}
-+ 1 [Divisibility theorems](#math-div-theorems)
-  + 1.1 [Divisibility by 1](#math-div-theorems-1)
-  + 1.2 [Divisibility by 2](#math-div-theorems-2)
-  + 1.3 [Divisibility by 3](#math-div-theorems-3)
-  + 1.4 [Divisibility by 4](#math-div-theorems-4)
-  + 1.5 [Divisibility by 5](#math-div-theorems-5)
-  + 1.6 [Divisibility by 6](#math-div-theorems-6)
-  + 1.7 [Divisibility by 7](#math-div-theorems-7)
-  + 1.8 [Divisibility by 8](#math-div-theorems-8)
-  + 1.9 [Divisibility by 9](#math-div-theorems-9)
-  + 1.10 [Divisibility by 10](#math-div-theorems-10)
-  + 1.11 [Divisibility by 11](#math-div-theorems-11)
-+ 2 [Fractions](#math-fractions)
-  + 2.1 [The fraction flip when dividing](#math-fractions-flip)
-{::}
-
-{- id="math-div-theorems"}Divisibility theorems{--}
----------------------------------------------------
-When it comes to divisibility there exists some neat theorems to test a certain
-number's different divisibilities, or factors. Following are those theorems and
-their proof. Some of the proofs are more trivial than others, such as the proof
-for divisibility by 1, 2, 5 and 10. From here on out it's assumed that every
-number, when working with divisibility, is an integer.
-
-What is the smallest number that is divisible by 1 through 10? The answer is
-{- class="spoiler"}2520{--}. You can try the different divisibility theorems
- below on it.
-
-### {- id="math-div-theorems-1"}Divisibility by 1{--}
-This theorem is quite easy to remember. Every integer is divisible by 1.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}1{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}a{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="operator"}&isin;{--}
-....{- class="variable"}&#x2124;{--}
-..{--}
-{--}
-
-### {- id="math-div-theorems-2"}Divisibility by 2{--}
-It's common knowledge that every even number (numbers ending with an even
-number) is divisible by 2. This is because even numbers are multiples of 2. In
-short, if a number ends with either 0, 2, 4, 6 or 8 it is divisible by 2.
-
-Say we have a four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. If {- class="math"}{- class="variable"}d{--}{--} is divisible by 2 we can
- represent it as an even number
-{- class="math"}
-..{- class="expression"}
-....{-}2{--}
-....{- class="variable"}n{--}
-..{--}
-{--}, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{-}2{--}
-....{- class="variable"}n{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}2{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}500{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}50{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}5{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}n{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the number is divisible by 2 if, and only if, the last
-digit is divisible by 2. And so the theorem is proven.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}2{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}2{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-### {- id="math-div-theorems-3"}Divisibility by 3{--}
-The theorem goes that if the sum of all digits in a number is divisible by 3,
-the whole number is divisible by 3, i.e.
- {- class="math"}
-..{- class="expression"}
-....{-}3{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}3{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}. Why is this proposition true?
-
-Let's use the four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Now let's break out one a, b and c from the first 3 terms, and factor out
- 3 like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}999{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}99{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}9{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}3{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}333{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}33{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}3{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the first term is divisible by 3, and the second term is
-divisible by 3 if, and only if, the sum
- {- class="math"}
-..{- class="expression"}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--} is divisible by 3. And so the theorem is proven.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}3{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}3{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We have shown that the procedure above will hold for all cases. The procedure
-is also recursive. If the sum is to hard to test divisibility for, the
-procedure can be repeated, until a smaller sum is reveald. This is rarely
-necessary as the divisibility of the sum often is easy to determined.
-
-### {- id="math-div-theorems-4"}Divisibility by 4{--}
-The theorem goes that if the last two digits of a number is divisible by 4, the
-whole number is divisible by 4, i.e.
- {- class="math"}
-..{- class="expression"}
-....{-}4{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}4{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}cd{--}
-..{--}
-{--}. Why is this proposition true?
-
-Let's use the four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Now let's factor out 4 from the first two terms, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}4{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}250{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}25{--}
-......{- class="variable"}b{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}10{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the first term is divisible by 4, so the whole number is
-divisible by 4 if, and only if, the second term is divisible by 4. And so the
-theorem is proven.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}4{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}4{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}cd{--}
-....{--}
-..{--}
-{--}
-
-### {- id="math-div-theorems-5"}Divisibility by 5{--}
-The theorem goes that if the last digits of a number is divisible by 5, the
-whole number is divisible by 4, i.e.
- {- class="math"}
-..{- class="expression"}
-....{-}5{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}5{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Why is this proposition true?
-
-Let's use the four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Now let's factor out 5 from the first three terms, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}5{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}500{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}50{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}5{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the first term is divisible by 5, so the whole number is
-divisible by 5 if, and only if, the second term is divisible by 5. And so the
-theorem is proven. As the only one digit numbers that are divisible by 5 are 0
-and 5, another way of putting it is -- if last digit is 0 or 5, the number is
-divisible by 5.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}5{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}5{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}d{--}
-....{--}
-..{--}
-{--}
-
-### {- id="math-div-theorems-6"}Divisibility by 6{--}
-This theorem is a combination of the theorem for [*divisibility by
-2*](#math-div-theorems-2) and [*divisibility by 3*](#math-div-theorems-3).
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}6{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}3{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-..{- class="operator"}&and;{--}
-..{- class="expression"}
-....{-}2{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-**Note**: Be careful when combining theroems like this. Don't be fooled and try
-to combine divisibility theorems for 2 and 4 to get the theorem for 8, as
-numbers divisible by 4 always are divisible by 2. The number 4 is for instance
-both divisible by 2 and 4, but **not** by 8. Make sure the theorems you combine
-doesn't share a factor, like 4 and 2 sharing the factor 2. It's of course
-possible to use theoerems 4 and 2 together, but it's not certain in all cases
-that the two theorems prove divisibility by 8.
-
-### {- id="math-div-theorems-7"}Divisibility by 7{--}
-Probably one of the most useful theorems is the theorem of *divisibility by 7*,
-as it is recursive (just like the theorems of *divisibility by 3 & 9*). The
-theorem states that if the difference between the last digit multiplied by 2
-and the remaining digits in a number is divisible by 7, the whole number is
-divisible by 7. I'll show the procedure with an example below:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}7{--}
-....{- class="operator"}&#x2223;{--}
-....{-}3423{--}
-....{- class="operator"}&#63;{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}342{--}
-....{- class="operator"}-{--}
-....{-}3{--}
-....{- class="operator"}&times;{--}
-....{-}2{--}
-....{- class="operator"}={--}
-....{-}336{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}33{--}
-....{- class="operator"}-{--}
-....{-}6{--}
-....{- class="operator"}&times;{--}
-....{-}2{--}
-....{- class="operator"}={--}
-....{-}21{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}7{--}
-....{- class="operator"}&#x2223;{--}
-....{-}21{--}
-..{--}
-..{- class="operator"}&rArr;{--}
-..{- class="expression"}
-....{-}7{--}
-....{- class="operator"}&#x2223;{--}
-....{-}3423{--}
-..{--}
-{--}
-
-Neat! So how and why does it work? For simplicity's sake we use a two digit
-number
-{- class="math"}
-..{- class="expression"}
-....{- class="variable"}ab{--}
-..{--}
-{--}, represented as
- {- class="math"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-{--}. The theorem says that if (***A***)
- {- class="math"}
-..{-}7{--}
-..{- class="operator"}&#x2223;{--}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}2{--}
-....{- class="variable"}b{--}
-..{--}
-{--} then (***B***)
- {- class="math"}
-..{-}7{--}
-..{- class="operator"}&#x2223;{--}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-{--}. Let's prove it!
-
-In order to prove the theorem, we must prove both ***A*** and ***B***. So let's
-start with ***A***. If we have
-{- class="math"}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}2{--}
-....{- class="variable"}b{--}
-..{--}
-{--}, and it's divisible by 7, we know that 7 must be a factor of the
-expression. We can now create an equation:
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}2{--}
-....{- class="variable"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}7{--}
-....{- class="variable"}k{--}
-..{--}
-{--}
-
-Multiply the whole equation with 10, and add one extra
-{- class="math"}
-..{- class="expression"}
-....{- class="variable"}b{--}
-..{--}
-{--}:
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="hi"}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{- class="hi"}20{--}
-....{- class="variable"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{- class="hi"}70{--}
-....{- class="variable"}k{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}20{--}
-....{- class="variable"}b{--}
-....{- class="operator hi"}+{--}
-....{- class="variable hi"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}70{--}
-....{- class="variable"}k{--}
-....{- class="operator hi"}+{--}
-....{- class="variable hi"}b{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{- class="hi"}19{--}
-....{- class="variable hi"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}70{--}
-....{- class="variable"}k{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-{--}
-
-Now add {- class="math"}
-..{- class="expression"}
-....{-}20{--}
-....{- class="variable"}b{--}
-..{--}
-{--} to each side of the equation, and try to factor out 7:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}19{--}
-....{- class="variable"}b{--}
-....{- class="operator hi"}+{--}
-....{- class="hi"}20{--}
-....{- class="variable hi"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}70{--}
-....{- class="variable"}k{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-....{- class="operator hi"}+{--}
-....{- class="hi"}20{--}
-....{- class="variable hi"}b{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator hi"}+{--}
-....{- class="variable hi"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}70{--}
-....{- class="variable"}k{--}
-....{- class="operator hi"}+{--}
-....{- class="hi"}21{--}
-....{- class="variable hi"}b{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression hi"}
-....{-}7{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}10{--}
-......{- class="variable"}k{--}
-......{- class="operator"}+{--}
-......{-}3{--}
-......{- class="variable"}b{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the right side of the equation is divisible by 7, and our
-left side says
-{- class="math"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-{--}. Neat, we now know that the two digit number
- {- class="math"}
-..{- class="expression"}
-....{- class="variable"}ab{--}
-..{--}
-{--} is divisible by 7. Now we must show that ***B*** implies ***A***. That is
- if
- {- class="math"}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}2{--}
-....{- class="variable"}b{--}
-..{--} is divisible by 7, then
- {- class="math"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-{--} is divisible by 7. Let's prove ***B***.
-
-Just as for ***A***, we know that 7 must be a factor of the expression. We can
-now create another equation:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}7{--}
-....{- class="variable"}k{--}
-..{--}
-{--}
-
-Subtract
-{- class="math"}
-..{- class="expression"}
-....{-}21{--}
-....{- class="variable"}b{--}
-..{--}
-{--} from the whole equation, and factorize:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-....{- class="operator hi"}-{--}
-....{- class="hi"}21{--}
-....{- class="variable hi"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}7{--}
-....{- class="variable"}k{--}
-....{- class="operator hi"}-{--}
-....{- class="hi"}21{--}
-....{- class="variable hi"}b{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="variable"}a{--}
-....{- class="operator hi"}-{--}
-....{- class="hi"}20{--}
-....{- class="variable hi"}b{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression"}
-....{-}7{--}
-....{- class="variable"}k{--}
-....{- class="operator"}-{--}
-....{-}21{--}
-....{- class="variable"}b{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression hi"}
-....{-}10{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}-{--}
-......{-}2{--}
-......{- class="variable"}b{--}
-......{-}){--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="expression hi"}
-....{-}7{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}k{--}
-......{- class="operator"}-{--}
-......{-}3{--}
-......{- class="variable"}b{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the right side of the equation is divisible by 7, and on
-our left side 10 is not divisible by 7 so the expression inside the
-parenthesis must be. But isn't that expression
-{- class="math"}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{-}2{--}
-....{- class="variable"}b{--}
-..{--}
-{--}. Neat, we now have the proof for the theorem and can conclude that
- indeed:
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}7{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="expression"}
-......{- class="variable"}ab{--}
-....{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}7{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="expression"}
-......{- class="variable"}a{--}
-......{- class="operator"}-{--}
-......{-}2{--}
-......{- class="variable"}b{--}
-....{--}
-..{--}
-{--}
-
-We have shown that the procedure above will hold for all cases.
-
-### {- id="math-div-theorems-8"}Divisibility by 8{--}
-The theorem is quite similar to the theorem for *divisibility by 4*. The
-theorem goes that if the last three digits of a number is divisible by 8, the
-whole number is divisible by 8, i.e.
- {- class="math"}
-..{- class="expression"}
-....{-}8{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}8{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}bcd{--}
-..{--}
-{--}. Why is this proposition true?
-
-Let's use the four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Now let's factor out 8 from the first three terms, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}8{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}125{--}
-......{- class="variable"}a{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}100{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}10{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the first term is divisible by 8, so the whole number is
-divisible by 8 if, and only if, the second term is divisible by 8. And so the
-theorem is proven.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}8{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}8{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}bcd{--}
-....{--}
-..{--}
-{--}
-
-### {- id="math-div-theorems-9"}Divisibility by 9{--}
-Much like the theorem for *divisibility by 3*, the theorem goes that if the sum
-of all digits in a number is divisible by 9, the whole number is divisible by
-9, i.e.
- {- class="math"}
-..{- class="expression"}
-....{-}9{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}9{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}. Why is this proposition true?
-
-Let's use the four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Now let's break out one a, b and c from the first 9 terms, and factor out
- 9 like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}999{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}99{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}9{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}9{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}111{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}11{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the first term is divisible by 9, and the second term is
-divisible by 9 if, and only if, the sum
- {- class="math"}
-..{- class="expression"}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--} is divisible by 9. And so the theorem is proven.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}9{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}9{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{- class="operator"}+{--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We have shown that the procedure above will hold for all cases. The procedure
-is also recursive. If the sum is to hard to test divisibility for, the
-procedure can be repeated, until a smaller sum is reveald. This is rarely
-necessary as the divisibility of the sum often is easy to determined.
-
-### {- id="math-div-theorems-10"}Divisibility by 10{--}
-The theorem goes that if the last digits of a number is divisible by 10, the
-whole number is divisible by 10, i.e.
- {- class="math"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}10{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Why is this proposition true?
-
-Let's use the four digit number
-{- class="math"}{- class="variable"}abcd{--}{--}, where
- {- class="math"}{- class="variable"}a{--}{--} represents the number of
- thousands,
- {- class="math"}{- class="variable"}b{--}{--} the number of hundreds,
- {- class="math"}{- class="variable"}c{--}{--} the number of tens and
- {- class="math"}{- class="variable"}d{--}{--} the number of ones. This number
- can be represented as
-{- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. Now let's factor out 10 from the first three terms, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{-}100{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}10{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="variable"}d{--}
-......{-}){--}
-....{--}
-..{--}
-{--}
-
-We can now see that the first term is divisible by 10, so the whole number is
-divisible by 10 if, and only if, the second term is divisible by 10. And so the
-theorem is proven. As the only one digit number that is divisible by 10 is 0,
-another way of putting it is -- if last digit is 0, the number is
-divisible by 10.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}10{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}10{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}d{--}
-....{--}
-..{--}
-{--}
-
-### {- id="math-div-theorems-11"}Divisibility by 11{--}
-The theorem goes that a number is divisible by 11 if, and only if, the
-alternate sum of its digits is divisible by 11, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{-}190905{--}
-....{- class="operator"}&#63;{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1{--}
-....{- class="operator"}-{--}
-....{-}9{--}
-....{- class="operator"}+{--}
-....{-}0{--}
-....{- class="operator"}-{--}
-....{-}9{--}
-....{- class="operator"}+{--}
-....{-}0{--}
-....{- class="operator"}-{--}
-....{-}5{--}
-....{- class="operator"}={--}
-....{-}-22{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{-}-22{--}
-..{--}
-..{- class="operator"}&rArr;{--}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{-}190905{--}
-..{--}
-{--}
-
-Neat! So how and why does it work? For simplicity's sake we use a four digit
-number
-{- class="math"}
-..{- class="expression"}
-....{- class="variable"}abcd{--}
-..{--}
-{--}, represented as
- {- class="math"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}. This expression can also be represented in another way by manipulating
-the terms. We give and take in an alternating fashion, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1000{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{-}100{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{-}10{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="variable hi"}a{--}
-....{- class="fenced parenthesis hi"}
-......{-}({--}
-......{-}1000{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="variable hi"}b{--}
-....{- class="fenced parenthesis hi"}
-......{-}({--}
-......{-}100{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="variable hi"}c{--}
-....{- class="fenced parenthesis hi"}
-......{-}({--}
-......{-}10{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="variable"}a{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="hi"}1001{--}
-......{- class="operator hi"}-{--}
-......{- class="hi"}1{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="hi"}99{--}
-......{- class="operator hi"}+{--}
-......{- class="hi"}1{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="variable"}c{--}
-....{- class="fenced parenthesis"}
-......{-}({--}
-......{- class="hi"}11{--}
-......{- class="operator hi"}-{--}
-......{- class="hi"}1{--}
-......{-}){--}
-....{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="hi"}1001{--}
-....{- class="variable hi"}a{--}
-....{- class="operator hi"}-{--}
-....{- class="variable hi"}a{--}
-....{- class="operator"}+{--}
-....{- class="hi"}99{--}
-....{- class="variable hi"}b{--}
-....{- class="operator hi"}+{--}
-....{- class="variable hi"}b{--}
-....{- class="operator"}+{--}
-....{- class="hi"}11{--}
-....{- class="variable hi"}c{--}
-....{- class="operator hi"}-{--}
-....{- class="variable hi"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="expression"}
-....{-}1001{--}
-....{- class="variable"}a{--}
-....{- class="operator hi"}+{--}
-....{- class="hi"}99{--}
-....{- class="variable hi"}b{--}
-....{- class="operator hi"}+{--}
-....{- class="hi"}11{--}
-....{- class="variable hi"}c{--}
-....{- class="operator hi"}-{--}
-....{- class="variable hi"}a{--}
-....{- class="operator hi"}+{--}
-....{- class="variable hi"}b{--}
-....{- class="operator hi"}-{--}
-....{- class="variable hi"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-Now we factorize the expression, like so:
-
-{- class="math block"}
-..{- class="expression"}
-....{- class="hi"}11{--}
-....{- class="fenced parenthesis hi"}
-......{-}({--}
-......{-}91{--}
-......{- class="variable"}a{--}
-......{- class="operator"}+{--}
-......{-}9{--}
-......{- class="variable"}b{--}
-......{- class="operator"}+{--}
-......{-}1{--}
-......{- class="variable"}c{--}
-......{-}){--}
-....{--}
-....{- class="operator"}-{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-....{- class="operator"}-{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-We can see that the first term in the expression is divisible by 11. This means
-that if, and only if, the sum of the other terms is divisible by 11 the whole
-expression is divisible by 11, and so the theorem is proven.
-
-{- class="math block theorem"}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="operator"}-{--}
-....{- class="variable"}a{--}
-....{- class="operator"}+{--}
-....{- class="variable"}b{--}
-....{- class="operator"}-{--}
-....{- class="variable"}c{--}
-....{- class="operator"}+{--}
-....{- class="variable"}d{--}
-..{--}
-..{- class="break"}{--}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}abcd{--}
-..{--}
-..{- class="operator"}&hArr;{--}
-..{- class="expression"}
-....{-}11{--}
-....{- class="operator"}&#x2223;{--}
-....{- class="variable"}a{--}
-....{- class="operator"}-{--}
-....{- class="variable"}b{--}
-....{- class="operator"}+{--}
-....{- class="variable"}c{--}
-....{- class="operator"}-{--}
-....{- class="variable"}d{--}
-..{--}
-{--}
-
-We have shown that the procedure above will hold for all cases, as the number
-can be extended with infinite digits and still follow the same pattern.
-
-{- id="math-fractions"}Fractions{--}
-------------------------------------
-
-### {- id="math-fractions-flip"}The fraction flip when dividing{--}
-Many of you have probably been taught the trick of flipping the right fraction
-in a division to instead use simpler multiplication. This is how it works:
-
-We start of with the division of
-{- class="math"}
-..{- class="fraction"}
-....{-}3{--}
-....{-}2{--}
-..{--}
-{--}
- by
-{- class="math"}
-..{- class="fraction"}
-....{-}4{--}
-....{-}5{--}
-..{--}
-{--}. From there we can reconstruct the two fractions as the dividend over
- the divisor with a horizontal line, for simplicity's sake, like so:
-
-{- class="math block"}
-..{- class="fraction"}
-....{-}3{--}
-....{-}2{--}
-..{--}
-..{- class="operator"}&divide;{--}
-..{- class="fraction"}
-....{-}4{--}
-....{-}5{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}3{--}
-........{-}2{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction"}
-........{-}4{--}
-........{-}5{--}
-......{--}
-....{--}
-..{--}
-{--}
-
-After that the "trick" can begin. First we multiply both the dividend and the
-divisor with the inverse of the divisor. As long as we treat the dividend and
-the divisor the same way, this is fine. Be aware of PEMDAS though! If any of
-the dividend or the divisor would have been an addition or subtraction you
-would have to multiply both terms by *x*, either by *x(a + b)* or *xa + xb*.
-
-{- class="math block"}
-..{- class="fraction"}
-....{-}3{--}
-....{-}2{--}
-..{--}
-..{- class="operator"}&divide;{--}
-..{- class="fraction"}
-....{-}4{--}
-....{-}5{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}3{--}
-........{-}2{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction"}
-........{-}4{--}
-........{-}5{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}3{--}
-........{-}2{--}
-......{--}
-......{- class="operator hi"}&times;{--}
-......{- class="fraction hi"}
-........{-}5{--}
-........{-}4{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction"}
-........{-}4{--}
-........{-}5{--}
-......{--}
-......{- class="operator hi"}&times;{--}
-......{- class="fraction hi"}
-........{-}5{--}
-........{-}4{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}3{--}
-........{-}2{--}
-......{--}
-......{- class="operator"}&times;{--}
-......{- class="fraction"}
-........{-}5{--}
-........{-}4{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction hi"}
-........{-}4{- class="operator"}&times;{--}5{--}
-........{-}5{- class="operator"}&times;{--}4{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}3{--}
-........{-}2{--}
-......{--}
-......{- class="operator"}&times;{--}
-......{- class="fraction"}
-........{-}5{--}
-........{-}4{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction hi"}
-........{-}20{--}
-........{-}20{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}3{--}
-........{-}2{--}
-......{--}
-......{- class="operator"}&times;{--}
-......{- class="fraction"}
-........{-}5{--}
-........{-}4{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction hi"}
-........{-}1{--}
-........{- class="hidden"}&nbsp;{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}3{--}
-....{-}2{--}
-..{--}
-..{- class="operator"}&times;{--}
-..{- class="fraction"}
-....{-}5{--}
-....{-}4{--}
-..{--}
-{--}
-
-As you can see the right fraction has now "flipped", and not by magic, but with
-logic and reason. As division by 1 is equal to the dividend, we can then solve
-the expression, like so:
-
-{- class="math block"}
-..{- class="fraction"}
-....{-}3{--}
-....{-}2{--}
-..{--}
-..{- class="operator"}&times;{--}
-..{- class="fraction"}
-....{-}5{--}
-....{-}4{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}3{- class="operator"}&times;{--}5{--}
-....{-}2{- class="operator"}&times;{--}4{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}15{--}
-....{-}8{--}
-..{--}
-{--}
-
-As the final cherry on top, we can prove the procedure by dividing 1 by 2 as we
-know this should result in one half.
-
-{- class="math block"}
-..{-}1{--}
-..{- class="operator"}&divide;{--}
-..{-}2{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}1{--}
-....{-}1{--}
-..{--}
-..{- class="operator"}&divide;{--}
-..{- class="fraction"}
-....{-}2{--}
-....{-}1{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}1{--}
-........{-}1{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction"}
-........{-}2{--}
-........{-}1{--}
-......{--}
-....{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="fraction"}
-....{-}1{--}
-....{-}1{--}
-..{--}
-..{- class="operator"}&divide;{--}
-..{- class="fraction"}
-....{-}2{--}
-....{-}1{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}1{--}
-........{-}1{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction"}
-........{-}2{--}
-........{-}1{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}1{--}
-........{-}1{--}
-......{--}
-......{- class="operator hi"}&times;{--}
-......{- class="fraction hi"}
-........{-}1{--}
-........{-}2{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction"}
-........{-}2{--}
-........{-}1{--}
-......{--}
-......{- class="operator hi"}&times;{--}
-......{- class="fraction hi"}
-........{-}1{--}
-........{-}2{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}1{--}
-........{-}1{--}
-......{--}
-......{- class="operator"}&times;{--}
-......{- class="fraction"}
-........{-}1{--}
-........{-}2{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction hi"}
-........{-}2{- class="operator"}&times;{--}1{--}
-........{-}1{- class="operator"}&times;{--}2{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}1{--}
-........{-}1{--}
-......{--}
-......{- class="operator"}&times;{--}
-......{- class="fraction"}
-........{-}1{--}
-........{-}2{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction hi"}
-........{-}2{--}
-........{-}2{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}
-......{- class="fraction"}
-........{-}1{--}
-........{-}1{--}
-......{--}
-......{- class="operator"}&times;{--}
-......{- class="fraction"}
-........{-}1{--}
-........{-}2{--}
-......{--}
-....{--}
-....{-}
-......{- class="fraction hi"}
-........{-}1{--}
-........{- class="hidden"}&nbsp;{--}
-......{--}
-....{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}1{--}
-....{-}1{--}
-..{--}
-..{- class="operator"}&times;{--}
-..{- class="fraction"}
-....{-}1{--}
-....{-}2{--}
-..{--}
-{--}
-
-{- class="math block"}
-..{- class="fraction"}
-....{-}1{--}
-....{-}1{--}
-..{--}
-..{- class="operator"}&times;{--}
-..{- class="fraction"}
-....{-}1{--}
-....{-}2{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}1{- class="operator"}&times;{--}1{--}
-....{-}1{- class="operator"}&times;{--}2{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{-}1{--}
-....{-}2{--}
-..{--}
-{--}
-
-Q.E.D.
-
-{- class="math block theorem"}
-..{- class="fraction"}
-....{- class="variable"}a{--}
-....{- class="variable"}b{--}
-..{--}
-..{- class="operator"}&divide;{--}
-..{- class="fraction"}
-....{- class="variable"}c{--}
-....{- class="variable"}d{--}
-..{--}
-..{- class="operator"}={--}
-..{- class="fraction"}
-....{- class="variable"}a{--}
-....{- class="variable"}b{--}
-..{--}
-..{- class="operator"}&times;{--}
-..{- class="fraction"}
-....{- class="variable"}d{--}
-....{- class="variable"}c{--}
-..{--}
-{--}
diff --git a/noxz.tech/guides/mathematics/index.www b/noxz.tech/guides/mathematics/index.www
@@ -0,0 +1,834 @@
+.\".fam C
+.\"
+.HnS 0
+Mathematics
+.HnE
+
+Under this topic I will not just show tricks, as the notion of tricks in
+mathematics is probably the most damning to the spread of mathematical
+knowledge. I will instead explain how these, so called, tricks work using
+logic and reason. So this topic is not for the savvy hackers or mathematicians
+out there.
+
+.DIVS toc
+.SPAN toc-title Contents
+.ULS
+.LI
+1
+.URL #math-div-theorems "Divisibility theorems"
+.ULS
+.LI
+1.1
+.URL #math-div-theorems-1 "Divisibility by 1"
+.LI
+1.2
+.URL #math-div-theorems-2 "Divisibility by 2"
+.LI
+1.3
+.URL #math-div-theorems-3 "Divisibility by 3"
+.LI
+1.4
+.URL #math-div-theorems-4 "Divisibility by 4"
+.LI
+1.5
+.URL #math-div-theorems-5 "Divisibility by 5"
+.LI
+1.6
+.URL #math-div-theorems-6 "Divisibility by 6"
+.LI
+1.7
+.URL #math-div-theorems-7 "Divisibility by 7"
+.LI
+1.8
+.URL #math-div-theorems-8 "Divisibility by 8"
+.LI
+1.9
+.URL #math-div-theorems-9 "Divisibility by 9"
+.LI
+1.10
+.URL #math-div-theorems-10 "Divisibility by 10"
+.LI
+1.11
+.URL #math-div-theorems-11 "Divisibility by 11"
+.ULE
+.LI
+2
+.URL #math-fractions "Fractions"
+.ULS
+.LI
+2.1
+.URL #math-fractions-flip "The fraction flip when dividing"
+.ULE
+.ULH
+.DIVE
+
+.HnS 1
+.TAG "math-div-theorems"
+Divisibility theorems
+.HnE
+
+When it comes to divisibility there exists some neat theorems to test a certain
+number's different divisibilities, or factors. Following are those theorems and
+their proof. Some of the proofs are more trivial than others, such as the proof
+for divisibility by 1, 2, 5 and 10. From here on out it's assumed that every
+number, when working with divisibility, is an integer.
+
+What is the smallest number that is divisible by 1 through 10? The answer is
+.SPAN spoiler 2520 .
+You can try the different divisibility theorems below on it.
+
+.HnS 2
+.TAG "math-div-theorems-1"
+Divisibility by 1
+.HnE
+
+This theorem is quite easy to remember. Every integer is divisible by 1.
+
+.DIVS theorem
+.EQ
+1 ~|~ a ~iff~ a ~\[mo]~ Z\h'-.83m'Z
+.EN
+.DIVE
+
+.HnS 2
+.TAG "math-div-theorems-2"
+Divisibility by 2
+.HnE
+It's common knowledge that every even number (numbers ending with an even
+number) is divisible by 2. This is because even numbers are multiples of 2. In
+short, if a number ends with either 0, 2, 4, 6 or 8 it is divisible by 2.
+
+Say we have a four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+If
+.I d
+is divisible by 2 we can represent it as an even number
+.I n , 2
+like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ 2n }
+above
+{ lineup 2 left ( 500a ~+~ 50b ~+~ 5c ~+~ n right ) }
+}
+.EN
+
+We can now see that the number is divisible by 2 if, and only if, the last
+digit is divisible by 2. And so the theorem is proven.
+
+.DIVS theorem
+.EQ
+2 ~|~ abcd ~iff~ 2 ~|~ d
+.EN
+.DIVE
+
+.HnS 2
+.TAG "math-div-theorems-3"
+Divisibility by 3
+.HnE
+The theorem goes that if the sum of all digits in a number is divisible by 3,
+the whole number is divisible by 3, i.e.
+
+.EQ
+3 ~|~ abcd ~iff~ 3 ~|~ left ( a ~+~ b ~+~ c ~+~ d right )
+.EN
+
+Why is this proposition true?
+
+Let's use the four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. this number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+Now let's break out one
+.I a ,
+.I b
+and
+.I c
+from the first 3 terms, and factor out 3 like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ lineup left ( 999a ~+~ 99b ~+~ 9c right ) ~+~ left ( a ~+~ b ~+~ c ~+~ d right ) }
+above
+{ lineup 3 left ( 333a ~+~ 33b ~+~ 3c right ) ~+~ left ( a ~+~ b ~+~ c ~+~ d right ) }
+}
+.EN
+
+We can now see that the first term is divisible by 3, and the second term is
+divisible by 3 if, and only if, the sum of
+.I a
++
+.I b
++
+.I c
++
+.I d
+is divisible by 3. And so the theorem is proven.
+
+.DIVS theorem
+.EQ
+3 ~|~ abcd ~iff~ 3 ~|~ left ( a ~+~ b ~+~ c ~+~ d right )
+.EN
+.DIVE
+
+We have shown that the procedure above will hold for all cases. The procedure
+is also recursive. If the sum is to hard to test divisibility for, the
+procedure can be repeated, until a smaller sum is reveald. This is rarely
+necessary as the divisibility of the sum often is easy to determined.
+
+.HnS 2
+.TAG "math-div-theorems-4"
+Divisibility by 4
+.HnE
+The theorem goes that if the last two digits of a number is divisible by 4, the
+whole number is divisible by 4, i.e.
+
+.EQ
+4 ~|~ abcd ~iff~ 4 ~|~ cd
+.EN
+
+Why is this proposition true?
+
+Let's use the four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+Now let's factor out 4 from the first two terms, like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ lineup 4 left ( 250a ~+~ 25b ) ~+~ left ( 10c ~+~ d right ) }
+}
+.EN
+
+We can now see that the first term is divisible by 4, so the whole number is
+divisible by 4 if, and only if, the second term is divisible by 4. And so the
+theorem is proven.
+
+.DIVS theorem
+.EQ
+4 ~|~ abcd ~iff~ 4 ~|~ cd
+.EN
+.DIVE
+
+.HnS 2
+.TAG "math-div-theorems-5"
+Divisibility by 5
+.HnE
+The theorem goes that if the last digits of a number is divisible by 5, the
+whole number is divisible by 5, i.e.
+
+.EQ
+5 ~|~ abcd ~iff~ 5 ~|~ d
+.EN
+
+Why is this proposition true?
+
+Let's use the four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+Now let's factor out 5 from the first three terms, like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ lineup 5 left ( 500a ~+~ 50b ~+~ 5c right ) ~+~ d }
+}
+.EN
+
+We can now see that the first term is divisible by 5, so the whole number is
+divisible by 5 if, and only if, the second term is divisible by 5. And so the
+theorem is proven. As the only one digit numbers that are divisible by 5 are 0
+and 5, another way of putting it is \(en if last digit is 0 or 5, the number is
+divisible by 5.
+
+.DIVS theorem
+.EQ
+5 ~|~ abcd ~iff~ 5 ~|~ d
+.EN
+.DIVE
+
+.HnS 2
+.TAG "math-div-theorems-6"
+Divisibility by 6
+.HnE
+This theorem is a combination of the theorem for
+.URL #math-div-theorems-2 "divisibility by 2"
+and
+.URL #math-div-theorems-3 "divisibility by 3" .
+
+.DIVS theorem
+.EQ
+6 ~|~ abcd ~iff~ 3 ~|~ left ( a ~+~ b ~+~ c ~+~ d right ) ~\[AN]~ 2~|~d
+.EN
+.DIVE
+
+.B Note :
+Be careful when combining theroems like this. Don't be fooled and try
+to combine divisibility theorems for 2 and 4 to get the theorem for 8, as
+numbers divisible by 4 always are divisible by 2. The number 4 is for instance
+both divisible by 2 and 4, but
+.I not
+by 8. Make sure the theorems you combine
+doesn't share a factor, like 4 and 2 sharing the factor 2. It's of course
+possible to use theoerems 4 and 2 together, but it's not certain in all cases
+that the two theorems prove divisibility by 8.
+
+.HnS 2
+.TAG "math-div-theorems-7"
+Divisibility by 7
+.HnE
+Probably one of the most useful theorems is the theorem of
+.I "divisibility by 7" ,
+as it is recursive (just like the theorems of
+.I "divisibility by 3 & 9" ).
+The theorem states that if the difference between the last digit multiplied by 2
+and the remaining digits in a number is divisible by 7, the whole number is
+divisible by 7. I'll show the procedure with an example below:
+
+.EQ
+lpile {
+{ 7 ~|~ 3423 ~? }
+above
+{ 342 ~-~ 3 ~times~ 2 ~=~ 336 }
+above
+{ 33 ~-~ 6 ~times~ 2 ~=~ 21 }
+above
+{ 7 ~|~ 21 ~implies~ 7 ~|~ 3423 }
+}
+.EN
+
+Neat! So how and why does it work? For simplicity's sake we use a two digit
+number
+.I ab ,
+represented as
+.I a "" 10
++
+.I b .
+The theorem says that if
+.B A ) (
+7 |
+.I a
+-
+.I b "" 2
+then
+.B B ) (
+7 |
+.I a "" 10
++
+.I b .
+Let's prove it!
+
+In order to prove the theorem, we must prove both
+.B A
+and
+.B B .
+So let's start with
+.I A .
+If we have
+.I a
+-
+.I b , 2
+and it's divisible by 7, we know that 7 must be a factor of the
+expression. We can now create an equation:
+
+.EQ
+{ a ~-~ 2b ~=~ 7k }
+.EN
+
+Multiply the whole equation with 10, and add one extra
+.I b :
+
+.EQ
+lpile {
+{ hi{10}a ~-~ hi{20}b ~=~ hi{70}k }
+above
+{ 10a ~-~ 20b hi{~+~ b} ~=~ 70k hi{~+~ b} }
+above
+{ 10a ~-~ hi{19b} ~=~ 70k ~+~ b }
+}
+.EN
+
+Now add
+.I b "" 20
+to each side of the equation, and try to factor out 7:
+
+.EQ
+lpile {
+{ 10a ~-~ 19b hi{~+~ 20b} ~=~ 70k ~+~ b hi{~+~ 20b} }
+above
+{ 10a hi{~+~ b} ~=~ 70k hi{~+~ 21b} }
+above
+{ 10a ~+~ b ~=~ hi{7 left ( 10k ~+~ 3b right )} }
+}
+.EN
+
+We can now see that the right side of the equation is divisible by 7, and our
+left side says
+.I a "" 10
++
+.I b .
+Neat, we now know that the two digit number
+.I ab
+is divisible by 7. Now we must show that
+.B B implies
+.B A .
+That is if
+.I a
+-
+.I b "" 2
+is divisible by 7, then
+.I a "" 10
++
+.I b
+is divisible by 7. Let's prove
+.B B .
+
+Just as for
+.B A ,
+we know that 7 must be a factor of the expression. We can
+now create another equation:
+
+.EQ
+{ 10a ~+~ b ~=~ 7k }
+.EN
+
+Subtract
+.I b "" 21
+from the whole equation, and factorize:
+
+.EQ
+lpile {
+{ 10a ~+~ b hi{~-~ 21b} ~=~ 7k hi{~-~ 21b} }
+above
+{ 10a hi{~-~ 20b} ~=~ 7k ~-~ 21b }
+above
+{ hi{10 left ( a ~-~ 2b right ) } ~=~ hi{7 left ( k ~-~ 3b right ) } }
+}
+.EN
+
+We can now see that the right side of the equation is divisible by 7, and on
+our left side 10 is not divisible by 7 so the expression inside the
+parenthesis must be. But isn't that expression
+.I a
+-
+.I b . 2
+Neat, we now have the proof for the theorem and can conclude that indeed:
+
+.DIVS theorem
+.EQ
+7 ~|~ ab ~iff~ 7 ~|~ a ~-~ 2b
+.EN
+.DIVE
+
+We have shown that the procedure above will hold for all cases.
+
+.HnS 2
+.TAG "math-div-theorems-8"
+Divisibility by 8
+.HnE
+The theorem is quite similar to the theorem for
+.URL #math-div-theorems-4 "divisibility by 4" .
+The theorem goes that if the last three digits of a number is divisible by 8,
+the
+whole number is divisible by 8, i.e.
+
+.EQ
+8 ~|~ abcd ~iff~ 8 ~|~ bcd
+.EN
+
+Why is this proposition true?
+
+Let's use the four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+Now let's factor out 8 from the first term, like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ lineup 8 left ( 125a right ) ~+~ left ( 100b ~+~ 10c ~+~ d right ) }
+}
+.EN
+
+We can now see that the first term is divisible by 8, so the whole number is
+divisible by 8 if, and only if, the second term is divisible by 8. And so the
+theorem is proven.
+
+.DIVS theorem
+.EQ
+8 ~|~ abcd ~iff~ 8 ~|~ bcd
+.EN
+.DIVE
+
+.HnS 2
+.TAG "math-div-theorems-9"
+Divisibility by 9
+.HnE
+Much like the theorem for
+.URL #math-div-theorems-3 "divisibility by 3" ,
+the theorem goes that if the sum of all digits in a number is divisible by 9,
+the whole number is divisible by 9, i.e.
+
+.EQ
+9 ~|~ abcd ~iff~ 9 ~|~ left ( a ~+~ b ~+~ c ~+~ d right )
+.EN
+
+Why is this proposition true?
+
+Let's use the four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+Now let's break out one a, b and c from the first 3 terms, and factor out 9
+like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ lineup left ( 999a ~+~ 99b ~+~ 9c right ) ~+~ left ( a ~+~ b ~+~ c ~+~ d right ) }
+above
+{ lineup 9 left ( 111a ~+~ 11b ~+~ 1c right ) ~+~ left ( a ~+~ b ~+~ c ~+~ d right ) }
+}
+.EN
+
+We can now see that the first term is divisible by 9, and the second term is
+divisible by 9 if, and only if, the sum of
+.I a
++
+.I b
++
+.I c
++
+.I d
+is divisible by 9. And so the theorem is proven.
+
+.DIVS theorem
+.EQ
+9 ~|~ abcd ~iff~ 9 ~|~ left ( a ~+~ b ~+~ c ~+~ d right )
+.EN
+.DIVE
+
+We have shown that the procedure above will hold for all cases. The procedure
+is also recursive. If the sum is to hard to test divisibility for, the
+procedure can be repeated, until a smaller sum is reveald. This is rarely
+necessary as the divisibility of the sum often is easy to determined.
+
+.HnS 2
+.TAG "math-div-theorems-10"
+Divisibility by 10
+.HnE
+The theorem goes that if the last digits of a number is divisible by 10, the
+whole number is divisible by 10, i.e.
+
+.EQ
+10 ~|~ abcd ~iff~ 10 ~|~ d
+.EN
+
+Why is this proposition true?
+
+Let's use the four digit number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+Now let's factor out 10 from the first three terms, like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ lineup 10 left ( 100a ~+~ 10b ~+~ c right ) ~+~ d }
+}
+.EN
+
+We can now see that the first term is divisible by 10, so the whole number is
+divisible by 10 if, and only if, the second term is divisible by 10. And so the
+theorem is proven. As the only one digit number that is divisible by 10 is 0,
+another way of putting it is \(en if last digit is 0, the number is
+divisible by 10.
+
+.DIVS theorem
+.EQ
+10 ~|~ abcd ~iff~ 10 ~|~ d
+.EN
+.DIVE
+
+.HnS 2
+.TAG "math-div-theorems-11"
+Divisibility by 11
+.HnE
+The theorem goes that a number is divisible by 11 if, and only if, the
+alternate sum of its digits is divisible by 11, like so:
+
+.EQ
+lpile {
+{ 11 ~|~ 190905 ~? }
+above
+{ 1 ~-~ 9 ~+~ 0 ~-~ 9 ~+~ 0 ~-~ 5 ~=~ -22 }
+above
+{ 11 ~|~ -22 ~implies~ 11 ~|~ 190905 }
+}
+.EN
+
+Neat! So how and why does it work? For simplicity's sake we use a four digit
+number
+.I abcd ,
+where
+.I a
+represents the number of thousands,
+.I b
+the number of hundreds,
+.I c
+the number of tens and
+.I d
+the number of ones. This number can be represented as
+.I a "" 1000
++
+.I b "" 100
++
+.I c "" 10
++
+.I d .
+This expression can also be represented in another way by manipulating
+the terms. We give and take in an alternating fashion, like so:
+
+.EQ
+lpile {
+{ 1000a ~+~ 100b ~+~ 10c ~+~ d }
+above
+{ hi{ a left ( 1000 right ) } ~+~
+  hi{ b left ( 100 right ) } ~+~
+  hi{ c left ( 10 right ) } ~+~ d }
+above
+{ a left ( hi{ 1001 ~-~ 1 } right ) ~+~
+  b left ( hi{ 99 ~+~ 1 } right ) ~+~
+  c left ( hi{ 11 ~-~ 1 } right ) ~+~ d }
+above
+{ hi{ 1001a ~-~ a } ~+~
+  hi{ 99b ~+~ b } ~+~
+  hi{ 11c ~-~ c} ~+~ d }
+above
+{ 1001a hi{ ~+~ 99b ~+~ 11c ~-~ a ~+~ b} ~-~ c ~+~ d }
+}
+.EN
+
+Now we factorize the expression, like so:
+
+.EQ
+hi{ 11 left ( 91a ~+~ 9b ~+~ c right ) } ~-~ a ~+~ b ~-~ c ~+~ d
+.EN
+
+We can see that the first term in the expression is divisible by 11. This means
+that if, and only if, the sum of the other terms is divisible by 11 the whole
+expression is divisible by 11, and so the theorem is proven.
+
+.DIVS theorem
+.EQ
+lpile {
+{ 11 ~|~ abcd ~iff~ 11 ~|~ -a ~+~ b ~-~ c ~+~ d }
+above
+{ 11 ~|~ abcd ~iff~ 11 ~|~ a ~-~ b ~+~ c ~-~ d }
+}
+.EN
+.DIVE
+
+We have shown that the procedure above will hold for all cases, as the number
+can be extended with infinite digits and still follow the same pattern.
+
+.HnS 1
+.TAG "math-fractions"
+Fractions
+.HnE
+
+.HnS 2
+.TAG "math-fractions-flip"
+The fraction flip when dividing
+.HnE
+Many of you have probably been taught the trick of flipping the right fraction
+in a division to instead use simpler multiplication. This is how it works:
+
+We start of with the division:
+
+.EQ
+{ 3 over 2 } / { 4 over 5 }
+.EN
+
+From there we can reconstruct the two fractions as the dividend over
+the divisor with a horizontal line, for simplicity's sake, like so:
+
+.EQ
+{ 3 over 2 } / { 4 over 5 }
+~=~ {{ 3 over 2 } over { 4 over 5 }}
+.EN
+
+After that the "trick" can begin. First we multiply both the dividend and the
+divisor with the inverse of the divisor. As long as we treat the dividend and
+the divisor the same way, this is fine. Be aware of PEMDAS though! If any of
+the dividend or the divisor would have been an addition or subtraction you
+would have to multiply both terms by
+.I x ,
+either by
+.I "x(a + b)"
+or
+.I "xa + xb" .
+
+.EQ
+{ 3 over 2 } / { 4 over 5 }
+~=~ {{ 3 over 2 } over { 4 over 5 }}
+~=~ {{{ 3 over 2 } hi {~times~ 5 over 4 }} over {{ 4 over 5 } hi {~times~ 5 over 4 }}}
+~=~ {{{ 3 over 2 } ~times~ { 5 over 4 }} over hi{{ 4 ~times~ 5 } over { 5 ~times~ 4 }}}
+~=~ {{{ 3 over 2 } ~times~ { 5 over 4 }} over hi{20 over 20}}
+~=~ {{{ 3 over 2 } ~times~ { 5 over 4 }} over hi{1}}
+~=~ { 3 over 2 } ~times~ { 5 over 4 }
+.EN
+
+As you can see the right fraction has now "flipped", and not by magic, but with
+logic and reason. As division by 1 is equal to the dividend, we can then solve
+the expression, like so:
+
+.EQ
+{ 3 over 2 } ~times~ { 5 over 4 }
+~=~ {{ 3 ~times~ 5 } over { 2 ~times~ 4 }}
+~=~ { 15 over 18 }
+.EN
+
+As the final cherry on top, we can prove the procedure by dividing 1 by 2 as we
+know this should result in one half.
+
+.EQ
+{ 1 / 2 }
+~=~ { 1 over 1 } / { 2 over 1 }
+~=~ { 1 over 1 } over { 2 over 1 }
+.EN
+
+.EQ
+{ 1 over 1 } / { 2 over 1 }
+~=~ { 1 over 1 } over { 2 over 1 }
+~=~ {{{ 1 over 1 } hi {~times~ 1 over 2 }} over {{ 2 over 1 } hi {~times~ 1 over 2 }}}
+~=~ {{{ 1 over 1 } ~times~ { 1 over 2 }} over hi{{ 2 ~times~ 1 } over { 1 ~times~ 2 }}}
+~=~ {{{ 1 over 1 } ~times~ { 1 over 2 }} over hi{2 over 2}}
+~=~ {{{ 1 over 1 } ~times~ { 1 over 2 }} over hi{1}}
+~=~ { 1 over 1 } ~times~ { 1 over 2 }
+.EN
+
+.EQ
+{ 1 over 1 } ~times~ { 1 over 2 }
+~=~ {{ 1 ~times~ 1 } over { 1 ~times~ 2 }}
+~=~ { 1 over 2 }
+.EN
+
+.DIVS theorem
+.EQ
+a over b / c over d ~=~ a over b ~times~ d over c
+.EN
+.DIVE
diff --git a/noxz.tech/index.md b/noxz.tech/index.md
@@ -1,109 +0,0 @@
-Chris Noxz (aka. z0noxz)
-========================
-Welcome to my personal page, which have taken some years to create. Not due to
-its massive amount of content and extensive design, but rather a lack of
-priority. To keep my internet footprint low, you won't find any fancy
-JavaScript or flashy design here. Instead, you will only find readable content
-with a clean and simple design.
-
-!!placeholder:repo-graph!!
-
-About this site
----------------
-This site is rendered from markdown to static HTML files, so there are no need
-for any preprocessors running on my servers, causing any delay for neither me
-nor you. If you want to use the content on this site please read this
-[copying policy](//noxz.tech/about/copying-policy/) first. This site should be
-readable in any web browser, and there are *no need* for any JavaScript engines
-or third party plugins. If you experience any problem viewing this site, it's
-probably due to your browser not being compliant with W3C standards, and you
-should switch it to another browser. If you find any legitimate errors in the
-content or how it is being rendered please let me know.
-
-If you feel triggered by any of my content please don't hesitate to direct your
-complaints to /dev/null. This should be a safe space for everyone :). On a more
-serious note, if you have any legitimate critique to my blog posts, send me an
-email and I might make a correction \\-- if I deem it necessary. I currently
-don't have a feature for making comments on my posts, so this should work for
-now.
-
-About me
---------
-I'm a [hacker](//noxz.tech/dictionary/#hacker), living in... Well, does it
-matter? If you want to get in touch with me I'm usually at some IRC or
-available through email at chris<span>&#64;</span>noxz.tech. You can read all 
-about my projects
-and [software](//noxz.tech/software/) I've both created and 
-[use](//noxz.tech/about/tools/). Why not have a look at my
-[blog](//noxz.tech/blog/).
-
-All source code for software I've created should be available
-[here](//git.noxz.tech/). If you cannot find the source code, please let me
-know as it should be available.
-
-Contacting me
--------------
-You can contact me in various ways described on this page. However, if you 
-contact me through Micro$ofts online outlook mail I cannot reply. Micro$oft 
-have for some reason determined to block all my domains from sending emails to 
-their "users". I also discourage you from using their services, due to their 
-shady practices, and to instead sign up for protonmail.com (if you cannot host 
-your own email server).
-
-Encrypted messaging?
---------------------
-You can get my [GPG public key](//noxz.tech/pub/gpg-public-key.asc), for
-sending me messages. Please use it, if you can, and if you have trouble using
-it have a look [here](http://codesorcery.net/old/mutt/mutt-gnupg-howto).
-
-I also have a protonmail that you can use to contact me. Use the other public
-keys specified down below for protonmail.
-+ protonmail: chris.noxz<span>&#64;</span>protonmail.com
-+ [public key](//noxz.tech/pub/chris-noxz-protonmail-pub.asc)
-
-+ protonmail: chris.noxz<span>&#64;</span>pm.me
-+ [public key](//noxz.tech/pub/chris-noxz-pm-pub.asc)
-
-You can also reach me through
-[bitmessage](https://bitmessage.org/wiki/Main_Page). I personally recommend
-using the [notbit](https://github.com/bpeel/notbit) client. However, have in
-mind that messages through bitmessage only stays in the blockchain for 48
-hours. So in worst case, it might be that I miss your message.
-+ bitmessage: BM-87YtAK2iKpi8gptcvZV3P9n7XYpXuqiZVr6
-
-Donate and support
-------------------
-+ bitcoin: 17vMF3eP69KZ4utr1kYwJEj1GeWyjwWGCQ
-+ bitcoincash: qp74hpwd3en4xl95f4jv3vuuspnap7ztmvc7cu9zuu
-+ litecoin: LdzFgBMfLR8sB1x3Td7NGDstpQdiMu4WLN
-
-Public keys
------------
-+ [GPG public key](//noxz.tech/pub/gpg-public-key.asc)
-+ [SSH public key](//noxz.tech/pub/chrisnoxz.pub)
-+ [chris.noxz<span>&#64;</span>protonmail.com
-](//noxz.tech/pub/chris-noxz-protonmail-pub.asc)
-+ [chris.noxz<span>&#64;</span>pm.me](//noxz.tech/pub/chris-noxz-pm-pub.asc)
-
-
-    # Add my public ssh key to your machine, if you want me to access it
-    mkdir -p ~/.ssh;\
-    curl https://noxz.tech/pub/chrisnoxz.pub >> ~/.ssh/authorized_keys
-
-
-GEEK CODE, why not...
----------------------
-
-
-    -----BEGIN GEEK CODE BLOCK-----
-    Version: 3.1
-    GCS/M d s a C++ LU++++ P+ L+++ E--- W++ N- o-- K- w-- O- M-- V- PS+++ PE
-    Y++ PGP+ t 5 X- R !tv b- DI- D++ G e+++ h--- r+++ y+++
-    ------END GEEK CODE BLOCK------
-
-
-{: class="center"}
-Happy hacking!
-
-{: class="center"}
-![](/pub/logo.black.svg)
diff --git a/noxz.tech/index.www b/noxz.tech/index.www
@@ -0,0 +1,171 @@
+.HnS 0
+Chris Noxz (aka. z0noxz)
+.HnE
+
+Welcome to my personal page, which have taken some years to create. Not due to
+its massive amount of content and extensive design, but rather a lack of
+priority. To keep my internet footprint low, you won't find any fancy
+JavaScript or flashy design here. Instead, you will only find readable content
+with a clean and simple design.
+
+.HnS 1
+Latest commits
+.HnE
+
+.COMMENT "placeholder:repo-logs"
+
+.HnS 1
+About this site
+.HnE
+
+This site is rendered from markdown to static HTML files, so there are no need
+for any preprocessors running on my servers, causing any delay for neither me
+nor you. If you want to use the content on this site please read this
+.URL //noxz.tech/about/copying-policy/ "copying policy"
+first. This site should be
+readable in any web browser, and there are *no need* for any JavaScript engines
+or third party plugins. If you experience any problem viewing this site, it's
+probably due to your browser not being compliant with W3C standards, and you
+should switch it to another browser. If you find any legitimate errors in the
+content or how it is being rendered please let me know.
+
+If you feel triggered by any of my content please don't hesitate to direct your
+complaints to /dev/null. This should be a safe space for everyone :). On a more
+serious note, if you have any legitimate critique to my blog posts, send me an
+email and I might make a correction \(en if I deem it necessary. I currently
+don't have a feature for making comments on my posts, so this should work for
+now.
+
+Since July 2020 this site is hosted on
+.URL https://ipfs.io/ IPFS ,
+and can be reached in multiple ways.
+.ULS
+.LI
+Using IPNS:
+.URL https://ipfs.io/ipns/QmRXV39P4HnBi8h3hNA892nVLTN1bAKYEPWTTV1tTyQpA9/ QmRXV39P4HnBi8h3hNA892nVLTN1bAKYEPWTTV1tTyQpA9
+(this method is however slow)
+.LI
+Using dnslink:
+.URL https://ipfs.io/ipns/ipfs.noxz.tech/ ipfs.io/ipns/ipfs.noxz.tech
+or
+.URL https://ipfs.noxz.tech/ ipfs.noxz.tech
+.ULE
+
+If you are running an IPFS daemon, please pin the latest hash if you are able 
+to.
+
+To get the latest hash either the IPNS can be used or the TXT record 
+_dnslink.ipfs.noxz.tech. ipfs.noxz.tech is access through the gateway 
+cloudflare-ipfs.com.
+
+.HnS 1
+About me
+.HnE
+
+I'm a
+.URL //noxz.tech/dictionary/#hacker hacker ,
+living in... Well, does it matter? If you want to get in touch with me I'm usually at some IRC or
+available through email at chris[at]noxz.tech. You can read all 
+about my projects and
+.URL //noxz.tech/software/ software
+I've both created and 
+.URL //noxz.tech/about/tools/ use .
+
+All source code for software I've created and published should be available
+.URL //git.noxz.tech/ here .
+If you cannot find the source code, please let me know as it should be available.
+
+.HnS 1
+Contacting me
+.HnE
+
+You can contact me in various ways described on this page. However, if you 
+contact me through Micro$ofts online outlook mail I cannot reply. Micro$oft 
+have for some reason determined to block all my domains from sending emails to 
+their "users". I also discourage you from using their services, due to their 
+shady practices, and to instead sign up for protonmail.com (if you cannot host 
+your own email server).
+
+.HnS 1
+Encrypted messaging?
+.HnE
+
+You can get my
+.URL //noxz.tech/pub/gpg-public-key.asc "GPG public key" ,
+for sending me messages. Please use it, if you can, and if you have trouble using
+it have a look
+.URL http://codesorcery.net/old/mutt/mutt-gnupg-howto here .
+
+I also have a protonmail that you can use to contact me. Use the other public
+keys specified down below for protonmail.
+.ULS
+.LI
+protonmail: chris.noxz[at]protonmail.com
+.LI
+.URL //noxz.tech/pub/chris-noxz-protonmail-pub.asc "public key"
+.ULE
+
+.ULS
+.LI
+protonmail: chris.noxz[at]pm.me
+.LI
+.URL //noxz.tech/pub/chris-noxz-pm-pub.asc "public key"
+.ULE
+
+.HnS 1
+Donate and support
+.HnE
+
+.ULS
+.LI
+bitcoin: 1HN1M1eEAwDm67xnnYRE2Xq6NH2PWQAKEV
+.LI
+bitcoincash: qp74hpwd3en4xl95f4jv3vuuspnap7ztmvc7cu9zuu
+.LI
+litecoin: LdzFgBMfLR8sB1x3Td7NGDstpQdiMu4WLN
+.ULE
+
+.HnS 1
+Public keys
+.HnE
+
+.ULS
+.LI
+.URL //noxz.tech/pub/gpg-public-key.asc "GPG public key"
+.LI
+.URL //noxz.tech/pub/chrisnoxz.pub "SSH public key"
+.LI
+.URL //noxz.tech/pub/chris-noxz-protonmail-pub.asc "chris.noxz[at]protonmail.com"
+.LI
+.URL //noxz.tech/pub/chris-noxz-pm-pub.asc "chris.noxz[at]pm.me"
+.ULE
+
+.CDS
+.COS
+# Add my public ssh key to your machine, if you want me to access it
+mkdir -p ~/.ssh;\\
+curl https://noxz.tech/pub/chrisnoxz.pub >> ~/.ssh/authorized_keys
+.COE
+.CDE
+
+.HnS 1
+GEEK CODE, why not...
+.HnE
+
+.CDS
+.COS
+-----BEGIN GEEK CODE BLOCK-----
+Version: 3.1
+GCS/M d s a C++ LU++++ P+ L+++ E--- W++ N- o-- K- w-- O- M-- V- PS+++ PE
+Y++ PGP+ t 5 X- R !tv b- DI- D++ G e+++ h--- r+++ y+++
+------END GEEK CODE BLOCK------
+.COE
+.CDE
+
+.CS
+Happy hacking!
+.CE
+
+.CS
+.IMG //noxz.tech/pub/logo.black.svg 32 32
+.CE
diff --git a/noxz.tech/music/index.md b/noxz.tech/music/index.md
@@ -1,41 +0,0 @@
-Music by Chris Noxz
-===================
-All published musical work under this page are considered to be published under 
-the CC license BY-SA if not stated otherwise.
-
-<a rel="license" href="http://creativecommons.org/licenses/by-sa/4.0/"><img 
-alt="Creative Commons License" style="border-width:0" 
-src="https://i.creativecommons.org/l/by-sa/4.0/88x31.png" /></a>
-
-Many of my tracks were lost in a disk crash years ago. This is some of what 
-I've managed to restore partly from CDs and partly from the disk. 
-Unfortunately, most tracks were only found in a compressed format.
-
-Tracks
-------
-+ [Dry Rivers](dl/z0noxz_-_dry_rivers.ogg) [00:06:18] - 2008
-+ [End](dl/z0noxz_-_end.ogg) [00:08:36] - 2007
-+ [Optimistic Agony](dl/z0noxz_-_optimistic_agony.ogg) [00:01:42] - 2007
-+ [Reflections](dl/z0noxz_-_reflections.ogg) [00:05:12] - 2006
-+ [Sound Test](dl/z0noxz_-_sound_test.ogg) [00:01:56] - 2006
-+ [Dusty Nights](dl/z0noxz_-_dusty_nights.ogg) [00:05:02] - 2005
-
-Demos
------
-+ [Marbles](dl/z0noxz_-_marbles.demo.ogg) [00:00:54] - 2007
-+ [Find Me](dl/z0noxz_-_find_me.demo.ogg) [00:00:41] - 2007
-+ [Flow](dl/z0noxz_-_flow.demo.ogg) [00:01:12] - 2006
-+ [Choose Your Love](dl/z0noxz_-_choose_your_love.demo.ogg) [00:00:57] - 2006
-
-Mirrors and other locations
----------------------------
-+ [archive.org](https://archive.org/details/z0noxz_-_re-release-2018/)
-
-Donate and support
-------------------
-If you like my music and want to support, feel free to donate using any of the 
-following methods:
-
-+ bitcoin: 17vMF3eP69KZ4utr1kYwJEj1GeWyjwWGCQ
-+ bitcoincash: qp74hpwd3en4xl95f4jv3vuuspnap7ztmvc7cu9zuu
-+ litecoin: LdzFgBMfLR8sB1x3Td7NGDstpQdiMu4WLN
diff --git a/noxz.tech/music/index.www b/noxz.tech/music/index.www
@@ -0,0 +1,81 @@
+.HnS 0
+Music by Chris Noxz
+.HnE
+
+All published musical work under this page are considered to be published under 
+the CC license BY-SA if not stated otherwise.
+
+.UIMG http://creativecommons.org/licenses/by-sa/4.0/ https://i.creativecommons.org/l/by-sa/4.0/88x31.png "Creative Commons License"
+
+Many of my tracks were lost in a disk crash years ago. This is some of what
+I've managed to restore partly from CDs and partly from the disk. Unfortunately,
+most tracks were only found in a compressed format.
+
+.HnS 1
+Tracks
+.HnE
+
+.ULS
+.LI
+.URL "dl/z0noxz_-_dry_rivers.ogg" "Dry Rivers"
+[00:06:18] - 2008
+.LI
+.URL "dl/z0noxz_-_end.ogg" "End"
+[00:08:36] - 2007
+.LI
+.URL "dl/z0noxz_-_optimistic_agony.ogg" "Optimistic Agony"
+[00:01:42] - 2007
+.LI
+.URL "dl/z0noxz_-_reflections.ogg" "Reflections"
+[00:05:12] - 2006
+.LI
+.URL "dl/z0noxz_-_sound_test.ogg" "Sound Test"
+[00:01:56] - 2006
+.LI
+.URL "dl/z0noxz_-_dusty_nights.ogg" "Dusty Nights"
+[00:05:02] - 2005
+.ULE
+
+.HnS 1
+Demos
+.HnE
+
+.ULS
+.LI
+.URL "dl/z0noxz_-_marbles.demo.ogg" "Marbles"
+[00:00:54] - 2007
+.LI
+.URL "dl/z0noxz_-_find_me.demo.ogg" "Find Me"
+[00:00:41] - 2007
+.LI
+.URL "dl/z0noxz_-_flow.demo.ogg" "Flow"
+[00:01:12] - 2006
+.LI
+.URL "dl/z0noxz_-_choose_your_love.demo.ogg" "Choose Your Love"
+[00:00:57] - 2006
+.ULE
+
+.HnS 1
+Mirrors and other locations
+.HnE
+
+.ULS
+.LI
+.URL "https://archive.org/details/z0noxz_-_re-release-2018" "archive.org"
+.ULE
+
+.HnS 1
+Donate and support
+.HnE
+
+If you like my music and want to support, feel free to donate using any of the
+following methods:
+
+.ULS
+.LI
+bitcoin: 1HN1M1eEAwDm67xnnYRE2Xq6NH2PWQAKEV
+.LI
+bitcoincash: qp74hpwd3en4xl95f4jv3vuuspnap7ztmvc7cu9zuu
+.LI
+litecoin: LdzFgBMfLR8sB1x3Td7NGDstpQdiMu4WLN
+.ULE
diff --git a/noxz.tech/pub/.assemble b/noxz.tech/pub/.assemble
@@ -1,13 +1,10 @@
 logo.black.svg
 logo.svg
-rss.svg
 twtxt.svg
-brave.svg
 logo.png
 style.css
 chrisnoxz.pub
 chris-noxz-pm-pub.asc
 chris-noxz-protonmail-pub.asc
 gpg-public-key.asc
-feed.rss
 sitemap.xml
diff --git a/noxz.tech/pub/rss.svg b/noxz.tech/pub/rss.svg
@@ -1,34 +0,0 @@
-<?xml version="1.0" ?>
-<svg
-    height="12px"
-    width="12px"
-    id="Layer_1"
-    style="enable-background:new 0 0 12 12;"
-    version="1.1"
-    viewBox="0 0 512 512"
-    xml:space="preserve"
-    xmlns="http://www.w3.org/2000/svg"
-    xmlns:cc="http://creativecommons.org/ns#"
-    xmlns:dc="http://purl.org/dc/elements/1.1/"
-    xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
-    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
-    xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
-    xmlns:svg="http://www.w3.org/2000/svg">
-    <defs id="defs19"/>
-    <g id="g3021"/>
-    <g id="Layer_1_1_"/>
-    <g id="Layer_1_1_-7" transform="translate(-819.672,-61.929991)"/>
-    <g id="g2989">
-        <rect
-            height="512"
-            id="rect2989"
-            rx="70"
-            ry="70"
-            style="fill:#ea7819;fill-opacity:1;stroke:none"
-            transform="scale(-1,-1)"
-            width="512"
-            x="-512"
-            y="-512"/>
-        <path d="m 81.05643,267.04958 c 43.7041,0 84.78879,17.07214 115.66407,48.12395 30.93179,31.05179 47.96156,72.41184 47.96156,116.44072 h 67.34951 c 0,-127.8857 -103.61898,-231.92124 -230.97514,-231.92124 v 67.35657 z M 81.1624,147.65054 c 155.7603,0 282.48808,127.4197 282.48808,284.04844 H 431 C 431,237.92528 274.05354,80.30102 81.1624,80.30102 v 67.34952 z m 93.13421,236.99769 c 0,25.75647 -20.89183,46.6483 -46.6483,46.6483 C 101.89184,431.29653 81,410.41176 81,384.64823 c 0,-25.7706 20.88477,-46.64831 46.64124,-46.64831 25.75649,0 46.65537,20.87771 46.65537,46.64831 z" id="path3844" style="fill:#ffffff"/>
-    </g>
-</svg>
diff --git a/noxz.tech/pub/style.css b/noxz.tech/pub/style.css
@@ -17,6 +17,10 @@ a:hover {
 	text-decoration : underline;
 }
 
+hr.hidden-ruler {
+	display         : none;
+}
+
 #header {
 	clear           : both;
 	color           : #ffffff;
@@ -85,6 +89,7 @@ p, li {
 
 code {
 	font-family     : monospace;
+	line-height     : 2em;
 	background-color: #efefef;
 	padding         : 0.3em;
 }
@@ -92,13 +97,14 @@ code {
 pre {
 	font-family     : monospace;
 	font-size       : 1em;
-	/*line-height     : 2em;*/
+	line-height     : 1.6em;
 	background-color: #efefef;
 	padding         : 1em;
 	overflow        : auto;
 }
 
 pre code {
+	line-height     : 1.6em;
 	background-color: none;
 	padding         : 0;
 }
@@ -113,7 +119,7 @@ pre code {
 
 #nav {
 	background-color: #ffffff;
-	float           : left;
+/*	float           : left;*/
 	margin          : 0 1px 0 0;
 	padding         : 1em 0;
 	line-height     : 1.5em;
@@ -132,21 +138,18 @@ pre code {
 	margin          : 0;
 }
 
-#nav li>a:before {
+#nav>ul:first-child li>a:before {
 	content         : "\203A";
 	display         : inline-block;
 	margin-left     : -1em;
 	width           : 1em;
 }
 
-#nav li.active>a:before {
+#nav>ul:first-child li.active>a:before {
 	content         : "\00BB";
 }
 
-#nav li ul {
-  padding-left      : 0.6em !important;
-}
-
+/* keep link hover over full width, base level */
 #nav li a {
 	display         : block;
 	margin          : 0;
@@ -154,6 +157,21 @@ pre code {
 	line-height     : 3ex;
 }
 
+/* keep link hover over full width, first level */
+#nav li ul>li a {
+  padding-left      : 2.6em !important;
+}
+
+/* keep link hover over full width, second level */
+#nav li ul ul>li a {
+  padding-left      : 3.2em !important;
+}
+
+/* keep link hover over full width, third level */
+#nav li ul ul ul>li a {
+  padding-left      : 3.8em !important;
+}
+
 #nav li a:hover {
 	background-color: #eee;
 	text-decoration : none;
@@ -179,13 +197,13 @@ pre code {
 	margin          : 0 0 1.5em 0;
 }
 
-.left {
+span.left {
 	float           : left;
 	margin          : 0;
 	padding         : 0;
 }
 
-.right {
+span.right {
 	float           : right;
 	margin          : 0;
 	padding         : 0;
@@ -204,10 +222,18 @@ pre code {
 	text-indent     : -2em;
 }
 
-.center {
+p.left {
+	text-align      : left;
+}
+
+p.center {
 	text-align      : center;
 }
 
+p.right {
+	text-align      : right;
+}
+
 .spoiler {
 	color           : #000;
 	background      : #000;
@@ -219,23 +245,19 @@ pre code {
 	background      : inherit;
 }
 
-.article {
-	margin-top      : 3em;
-}
-
-.article:first-child {
-	margin-top      : 0;
-}
-
-.article h1 {
-	margin-bottom   : 0;
+.articles ul {
+	width           : 50em;
+	margin          : 0;
+	padding         : 0;
 }
 
-.article .article-date {
-	font-size       : 84%;
+.articles li {
+	list-style      : none;
+	padding         : 0;
+	margin          : 0;
 }
 
-a.rss,a.twtxt,a.brave {
+a.rss,a.twtxt {
 	display         : block;
 	background      : none no-repeat 0.9em center;
 	padding         : 0.8ex 0 0.8ex 2.2em !important;
@@ -243,15 +265,11 @@ a.rss,a.twtxt,a.brave {
 }
 
 a.rss {
-	background-image: url("/pub/rss.svg");
+	background-image: url("./rss.svg");
 }
 
 a.twtxt {
-	background-image: url("/pub/twtxt.svg");
-}
-
-a.brave {
-	background-image: url("/pub/brave.svg");
+	background-image: url("./twtxt.svg");
 }
 
 ul.repo-log {
@@ -302,96 +320,36 @@ ul.repo-log li .log-date {
 }
 
 
-/* math extensions (alternative to MathML) */
-.math {
-}
-
-.math.block {
-	display         : inline-block;
+.grohtml img {
 	margin-left     : 2em;
+	padding         : 1em 1.5em;
+	border          : 1px solid #ccc;
 }
 
-.math .break:before {
-	content         : '\A';
-	white-space     : pre-line;
-}
-
-.math.theorem {
+.theorem img {
 	padding         : 1em 1.5em;
 	border          : 1px double #000;
 	outline         : 2px solid #000;
 	outline-offset  : -4px;
 }
 
-.math .hi,
-.math .hi * {
-	border-color    : #e667af !important;
-	color           : #e667af !important;
-}
-
-.math .hidden {
-	visibility      : hidden;
-}
-
-.math .variable {
-	font-style      : italic;
+dl, dt, dd {
 	padding         : 0;
+	margin          : 0;
 }
-
-.math .expression {
-	padding         : 0;
-}
-
-.math .operator {
-	font-family     : "Latin Modern Math", "STIX Two Math", "XITS Math",
-	                  "STIX Math", "Libertinus Math", "TeX Gyre Termes Math",
-	                  "TeX Gyre Bonum Math", "TeX Gyre Schola",
-	                  "DejaVu Math TeX Gyre", "TeX Gyre Pagella Math",
-	                  "Asana Math", "Cambria Math", "Lucida Bright Math",
-	                  "Minion Math", STIXGeneral, STIXSizeOneSym, Symbol,
-	                  "Times New Roman", serif;
-	padding         : 0 0.35em;
-}
-
-/*
-.math.block .operator,
-.math.block .expression,
-.math.block .expression>*,
-.math.block .variable {
-	vertical-align  : middle;
-}
-*/
-
-.math .fenced {
-	padding         : 0 0.4em;
-	margin          : 0 0.2em;
-}
-
-.math .fenced :first-child,
-.math .fenced :last-child {
-	display         : none;
-}
-
-.math .fenced.parenthesis {
-	border-radius   : 0.3em;
-	border          : 0.1em solid #444;
-	border-top      : none;
-	border-bottom   : none;
+dt {
+	float           : left;
+	font-weight     : bolder;
+	padding-right   : 1ch;
+	border          : 0px dashed red;
+	text-align      : right;
 }
-
-.math .fraction,
-.math .fraction>span:first-child,
-.math .fraction>span:last-child {
-	padding         : 0 0.1em;
-	vertical-align  : middle;
+dd {
+	margin-bottom   : 1em;
 }
-
-.math .fraction {
-	display         : inline-block;
-	text-align      : center;
+dl {
+	padding-left    : 2em;
 }
-
-.math .fraction>span:last-child {
-	display         : block;
-	border-top      : 0.1em solid #444;
+dl>dt {
+	text-indent     : -2em;
 }
diff --git a/noxz.tech/sharing-is-caring/articles-by-others/index.md b/noxz.tech/sharing-is-caring/articles-by-others/index.md
@@ -1,17 +0,0 @@
-Articles of others
-==================
-Following is a collection of articles I find worthy of sharing. Either due to 
-them following my line of thought or due to them being thought provocative.
-
-**[Privacy is a Fundamental Human Right
-](https://www.bullyesq.com/blog/privacy-is-a-fundamental-right)**
-<br />
-Article by Bully about how and why privacy is a fundamental human right and how 
-it relates to cryptocurrencies.
-
-**[Why Schools Should Exclusively Use Free Software
-](https://www.gnu.org/education/edu-schools.en.html)**
-<br />
-Article by Richard Stallman about educational activities, including schools of 
-all levels from kindergarten to university, and how they have a moral duty to 
-teach only free software.
diff --git a/noxz.tech/sharing_is_caring/.assemble b/noxz.tech/sharing_is_caring/.assemble
@@ -0,0 +1 @@
+index.html
diff --git a/noxz.tech/sharing_is_caring/articles_by_others/.assemble b/noxz.tech/sharing_is_caring/articles_by_others/.assemble
@@ -0,0 +1 @@
+index.html
diff --git a/noxz.tech/sharing_is_caring/articles_by_others/index.www b/noxz.tech/sharing_is_caring/articles_by_others/index.www
@@ -0,0 +1,17 @@
+.HnS 0
+Articles of others
+.HnE
+
+Following is a collection of articles I find worthy of sharing. Either due to 
+them following my line of thought or due to them being thought provocative.
+
+.DLS
+.LIURL "https://www.bullyesq.com/blog/privacy-is-a-fundamental-right" "Privacy is a Fundamental Human Right"
+\(en by Bully about how and why privacy is a fundamental human right and how 
+it relates to cryptocurrencies.
+
+.LIURL "https://www.gnu.org/education/edu-schools.en.html" "Why Schools Should Exclusively Use Free Software"
+\(en by Richard Stallman about educational activities, including schools of 
+all levels from kindergarten to university, and how they have a moral duty to 
+teach only free software.
+.DLE
diff --git a/noxz.tech/sharing-is-caring/index.md b/noxz.tech/sharing_is_caring/index.www
rename noxz.tech/sharing-is-caring/index.md → noxz.tech/sharing_is_caring/index.www
@@ -1,6 +1,10 @@
+.HnS 0
 Sharing is caring
-=================
-Under this section I will share other peoples work that I find worthy of 
+.HnE
+
+Under this section I will share other peoples work that I find worthy of
 sharing, due to various reasons.
 
-## [Articles by others](./articles-by-others/)
+.HnS 1
+.URL "articles_by_others" "Articles by others"
+.HnE
diff --git a/noxz.tech/software/cidr2ip/index.md b/noxz.tech/software/cidr2ip/index.www
rename noxz.tech/software/cidr2ip/index.md → noxz.tech/software/cidr2ip/index.www
diff --git a/noxz.tech/software/index.md b/noxz.tech/software/index.md
@@ -1,51 +0,0 @@
-Software
-========
-Read about programs I've written below. All source code is available
-[here](//git.noxz.tech/), and also linked to from each software page
-respectively.
-
-{% comment %}
-### [cidr2ip](./cidr2ip/)
-``cidr2ip`` is a small and simple program for converting a CIDR into ip
-(mask).
-{% endcomment %}
-
-{% comment %}
-### [ip2cidr](./ip2cidr/)
-``ip2cidr`` is a small and simple program for converting an ip address (mask)
-into a CIDR, or returning an already valid CIDR if provided.
-{% endcomment %}
-
-### [rspan](./rspan/)
-``rspan`` executes a given command after a randomized time span.
-
-### [swps](./swps/)
-``swps``, Static Web Page Server, serves a given file on a specified port.
-
-{% comment %}
-### [wikid](./wikid/)
-``wikid`` is a quick and simple CLI-program for downloading and rendering
-wikipedia pages in your terminal.
-{% endcomment %}
-
-### [tapas](./tapas/)
-``tapas`` is a small program used for compiling refer output into the APA
-reference format.
-
-### [xrectdraw](./xrectdraw/)
-``xrectdraw`` draws geometry of a rectangular screen region for X11.
-
-### [ztatus](./ztatus/)
-``ztatus`` creates a status bar for [dwm](https://dwm.suckless.org), and also
-acts as a simple notification daemon.
-
-Tools and scripts
------------------
-
-### [mpvd](./mpvd/)
-``mpvd`` is a simple script for daemonization of mpv togther with a controller, 
-``mpvc``.
-
-### [satan-gh60](./satan-gh60/)
-A small tool for compiling and flashing my mechanical keyboard based on the
-Geekhack 60 board.
diff --git a/noxz.tech/software/index.www b/noxz.tech/software/index.www
@@ -0,0 +1,43 @@
+.HnS 0
+Software
+.HnE
+
+Read about programs I've written below. All source code is available
+.URL "//git.noxz.tech/" "here" ,
+and also linked to from each software page respectively.
+
+.DLS
+.LIURL rspan rspan
+executes a given command after a randomized time span.
+
+.LIURL swps swps
+sort for
+.I "Static Web Page Server"
+serves a given file on a specified port.
+
+.LIURL tapas tapas
+is a small program used for compiling refer output into the APA reference
+format.
+
+.LIURL xrectdraw xrectdraw
+draws geometry of a rectangular screen region for X11.
+
+.LIURL ztatus ztatus
+creates a status bar for
+.URL https://dwm.suckless.org dwm ,
+and also acts as a simple notification daemon.
+.DLE
+
+.HnS 1
+Tools and scripts
+.HnE
+
+.DLS
+.LIURL mpvd mpvd
+is a simple script for daemonization of mpv togther with a controller,
+.ICD mpvc .
+
+.LIURL satan-gh60 satan-gh60
+A small tool for compiling and flashing my mechanical keyboard based on the
+Geekhack 60 board.
+.DLE
diff --git a/noxz.tech/software/ip2cidr/index.md b/noxz.tech/software/ip2cidr/index.www
rename noxz.tech/software/ip2cidr/index.md → noxz.tech/software/ip2cidr/index.www
diff --git a/noxz.tech/software/mpvd/.buildignore b/noxz.tech/software/mpvd/.buildignore
diff --git a/noxz.tech/software/mpvd/index.md b/noxz.tech/software/mpvd/index.md
@@ -1,56 +0,0 @@
-mpvd
-====
-usage: **mpvd**<br />
-or  **mpvc** <u>action</u> [<u>arguments...</u>]
-
-mpvd is a simple script for daemonization of mpv togther with a controller, 
-mpvc. It works by creating a fifo that mpv then uses for command input.
-
-Installation
-------------
-Edit config.mk to match your local setup (mpvd is installed into the /usr/local 
-namespace by default), then simply enter the following command to install (if 
-necessary as root):
-
-    make install
-
-
-Example usage of mpvd
----------------------
-Start the daemon
-
-    mpvd &
-
-Send commands
-
-    # append file to playlist
-    mpvc append mixtape.ogg
-
-    # load file to playlist (overwrites current playlist)
-    mpvc load better-mixtape.ogg
-
-    # goto next track
-    mpvc next
-
-    # goto previous track
-    mpvc prev
-
-    # seek 23 seconds backwards
-    mpvc seek -23
-
-    # toggle play/pause
-    mpvc toggle
-
-    # lower sound 10 units (or append an 'a' for lowering alsa sound 5%)
-    mpvc lower; mpvc alower
-
-    # raise sound 10 units (or append an 'a' for raising alsa sound 5%)
-    mpvc raise; mpvc araise
-
-    # toggle mute (or append an 'a' for toggeling alsa mute)
-    mpvc mute; mpvc amute
-
-    # set youtube-dl format
-    mpvc ytdl-format best
-
-get source [here](//git.noxz.tech/mpvd/).
diff --git a/noxz.tech/software/mpvd/index.www b/noxz.tech/software/mpvd/index.www
@@ -0,0 +1,81 @@
+.HnS 0
+mpvd
+.HnE
+
+usage:
+.B mpvd
+.HTML <br/>
+or
+.B mpvc
+.U action
+.U arguments... ] [
+
+mpvd is a simple script for daemonization of mpv togther with a controller,
+mpvc. It works by creating a fifo that mpv then uses for command input.
+
+.HnS 1
+Installation
+.HnE
+
+Edit config.mk to match your local setup (mpvd is installed into the
+.I /usr/local
+namespace by default), then simply enter the following command to install (if 
+necessary as root):
+
+.CDS
+.COS
+make install
+.COE
+.CDE
+
+
+.HnS 1
+Example usage of mpvd
+.HnE
+
+Start the daemon
+
+.CDS
+.COS
+mpvd &
+.COE
+.CDE
+
+Send commands
+
+.CDS
+.COS
+# append file to playlist
+mpvc append mixtape.ogg
+
+# load file to playlist (overwrites current playlist)
+mpvc load better-mixtape.ogg
+
+# goto next track
+mpvc next
+
+# goto previous track
+mpvc prev
+
+# seek 23 seconds backwards
+mpvc seek -23
+
+# toggle play/pause
+mpvc toggle
+
+# lower sound 10 units (or append an 'a' for lowering alsa sound 5%)
+mpvc lower; mpvc alower
+
+# raise sound 10 units (or append an 'a' for raising alsa sound 5%)
+mpvc raise; mpvc araise
+
+# toggle mute (or append an 'a' for toggeling alsa mute)
+mpvc mute; mpvc amute
+
+# set youtube-dl format
+mpvc ytdl-format best
+.COE
+.CDE
+
+get source
+.URL //git.noxz.tech/mpvd.git here .
diff --git a/noxz.tech/software/rspan/.buildignore b/noxz.tech/software/rspan/.buildignore
diff --git a/noxz.tech/software/rspan/index.md b/noxz.tech/software/rspan/index.md
@@ -1,27 +0,0 @@
-rspan
-=====
-usage: **rspan** <u>interval</u> <u>file</u> \[<u>arguments</u> <u>...</u>]
-
-rspan is a randomized time span creator, a program that upon execution creates
-a random timeout based on given interval. When the timeout ends, the given file
-will get executed with potentially given arguments.
-
-Installation
-------------
-Edit config.mk to match your local setup (rspan is installed into the
-*/usr/local* namespace by default), then simply enter the following command to
-install (if necessary as root):
-
-    make clean install
-
-Example usage of rspan
-----------------------
-One common usage area of rspan is together with the crontab
-
-    # surprise Gorac some time in the morning
-    30 6 * * * su -c 'rspan 120 surprise' gorac
-
-    # turn Steves lights off some time in the evening
-    0 18 * * * su -c 'rspan 180 lights --off' steve
-
-get source [here](//git.noxz.tech/rspan/).
diff --git a/noxz.tech/software/rspan/index.www b/noxz.tech/software/rspan/index.www
@@ -0,0 +1,48 @@
+.HnS 0
+rspan
+.HnE
+
+usage:
+.B rspan
+.U interval
+.U file
+.U arguments "" [
+.U ... ]
+
+rspan is a randomized time span creator, a program that upon execution creates
+a random timeout based on given interval. When the timeout ends, the given file
+will get executed with potentially given arguments.
+
+.HnS 1
+Installation
+.HnE
+
+Edit config.mk to match your local setup (rspan is installed into the
+.I /usr/local
+namespace by default), then simply enter the following command to install (if
+necessary as root):
+
+.CDS
+.COS
+make clean install
+.COE
+.CDE
+
+.HnS 1
+Example usage of rspan
+.HnE
+
+One typical usage area of rspan is together with the crontab
+
+.CDS
+.COS
+# surprise Gorac some time in the morning
+30 6 * * * su -c 'rspan 120 surprise' gorac
+
+# turn Steves lights off some time in the evening
+0 18 * * * su -c 'rspan 180 lights --off' steve
+.COE
+.CDE
+
+get source
+.URL //git.noxz.tech/rspan.git here .
diff --git a/noxz.tech/software/satan-gh60/.assemble b/noxz.tech/software/satan-gh60/.assemble
@@ -1,2 +1,2 @@
-keyboard.png
 index.html
+keyboard.png
diff --git a/noxz.tech/software/satan-gh60/.buildignore b/noxz.tech/software/satan-gh60/.buildignore
diff --git a/noxz.tech/software/satan-gh60/index.md b/noxz.tech/software/satan-gh60/index.www
rename noxz.tech/software/satan-gh60/index.md → noxz.tech/software/satan-gh60/index.www
@@ -1,38 +1,60 @@
+.HnS 0
 Satan GH60 (RevCHN)
-===================
+.HnE
+
 This tool is used for creating my configuration for a Satan GH60 RevCHN
 mechanical keyboard. There are three parts to this tool, the configuration
 (including keymap.c, config.h & rules.mk), the compilation and the flashing to
 the AVR microcontroller.
 
 My keyboard consists of a 4 layer configuration, the base layer, function layer
-with some XF86 keys, arrow keys layer and a pseudo mouse layer. See `keymap.c`
+with some XF86 keys, arrow keys layer and a pseudo mouse layer. See
+.ICD keymap.c
 for specifics.
 
-{: class="center"}
-![](keyboard.png)
+.PIMG keyboard.png
 
+.HnS 1
 Prerequisites
--------------
+.HnE
+
 Before being able to compile the source code the QMK firmware is needed, which
-can be cloned using `git clone https://github.com/qmk/qmk_firmware`. The
-`avr-gcc` compiler is also needed together with some other prerequisites (read
-more on [qmk.fm](https://qmk.fm)).
+can be cloned using
+.ICD "git clone https://github.com/qmk/qmk_firmware" .
+The
+.ICD avr-gcc
+compiler is also needed together with some other prerequisites (read more on
+.URL https://qmk.fm qmk.fm ).
 
 Before being able to flash the microcontroller the TKG toolkit is needed and
-configured. Clone using `git clone https://github.com/kairyu/tkg-toolkit`. `cd`
-into tkg-toolkit and run `./setup.sh`. For a Satan GH60, you'll choose:
-
-    2. GH60 RevCHN
-    Y (continue)
-    1. Default
-    1. atmel_dfu
-
+configured. Clone using
+.ICD "git clone https://github.com/kairyu/tkg-toolkit" .
+.ICD cd
+into tkg-toolkit and run
+.ICD ./setup.sh .
+For a Satan GH60, you'll choose:
+
+.CDS
+.COS
+2. GH60 RevCHN
+Y (continue)
+1. Default
+1. atmel_dfu
+.COE
+.CDE
+
+.HnS 1
 Installation
-------------
+.HnE
+
 When all is prepared the firmware with my config can be compiled and flashed
 using:
 
-    make flash
+.CDS
+.COS
+make flash
+.COE
+.CDE
 
-get source [here](//git.noxz.tech/satan-gh60/).
+get source
+.URL //git.noxz.tech/satan-gh60.git here .
diff --git a/noxz.tech/software/swps/.buildignore b/noxz.tech/software/swps/.buildignore
diff --git a/noxz.tech/software/swps/index.md b/noxz.tech/software/swps/index.md
@@ -1,23 +0,0 @@
-swps
-====
-usage: **swps** <u>port</u> <u>file</u> \[<u>-h</u>]
-
-The purpose of **swps** is to serve a single static <u>file</u> as a web
-server. Besides serving a file in the root, **swps** also handles 301, 403 and
-404.
-
-Installation
-------------
-Edit config.mk to match your local setup (swps is installed into the
-*/usr/local* namespace by default), then simply enter the following command to
-install (if necessary as root):
-
-    make clean install
-
-Example usage of swps
----------------------
-
-    # serve index.html on port 8080
-    swps 8080 index.html
-
-get source [here](//git.noxz.tech/swps/).
diff --git a/noxz.tech/software/swps/index.www b/noxz.tech/software/swps/index.www
@@ -0,0 +1,46 @@
+.HnS 0
+swps
+.HnE
+
+usage:
+.B swps
+.U port
+.U file
+.U -h ] [
+
+The purpose of
+.ICD swps
+is to serve a single static
+.U file
+as a web server. Besides serving a file in the root,
+.ICD swps
+also handles 301, 403 and 404.
+
+.HnS 1
+Installation
+.HnE
+
+Edit config.mk to match your local setup (swps is installed into the
+.I /usr/local
+namespace by default), then simply enter the following command to install (if
+necessary as root):
+
+.CDS
+.COS
+make clean install
+.COE
+.CDE
+
+.HnS 1
+Example usage of swps
+.HnE
+
+.CDS
+.COS
+# serve index.html on port 8080
+swps 8080 index.html
+.COE
+.CDE
+
+get source
+.URL //git.noxz.tech/swps.git here .
diff --git a/noxz.tech/software/tapas/.buildignore b/noxz.tech/software/tapas/.buildignore
diff --git a/noxz.tech/software/tapas/index.md b/noxz.tech/software/tapas/index.md
@@ -1,51 +0,0 @@
-tapas
-=====
-The name stands for **t**o **APA**, and the *s* is for added deliciousness.
-It's a small program used for compiling refer output into the APA reference
-format for groff or alike.
-
-The program reads refer output from *stdin* and prints the compiled result to
-*stdout*.
-
-**Note** that tapas doesn't currently fully implement APA. I wrote this program
-because I needed to reference articles using APA instead of MLA, and in time I
-intend to fully implement APA.
-
-Installation
-------------
-Edit config.mk to match your local setup (tapas is installed into the
-/usr/local namespace by default), then simply enter the following command to
-install (if necessary as root):
-
-    make clean install
-
-Customization
--------------
-tapas can be customized by creating a custom config.h and (re)compiling the
-source code.
-
-Usage
------
-Tapas is intended to run in a pipe chain directly after refer, like so:
-
-    ... | refer | tapas | ... | troff
-
-I've added some customization using ds-strings for tapas. These are the
-following:
-
-+ ``.ds APA_IN ...``<br/>
-  Used for specifying the word for "In" when referring to articles in books.
-+ ``.ds APA_AN ...``<br/>
-  Used for specifying the word or symbol for "and/&" when concatenating
-  authors.
-+ ``.ds APA_MS ...``<br/>
-  Used for specifying the macro set output e.g. 'ms'. This is not currently
-  fully developed, and only has support for 'ms'.
-+ ``.ds APA_HE ...``<br/>
-  Used for specifying the heading text e.g. 'References'.
-
-License
--------
-The program is licensed under the MIT license.
-
-get source [here](//git.noxz.tech/tapas/).
diff --git a/noxz.tech/software/tapas/index.www b/noxz.tech/software/tapas/index.www
@@ -0,0 +1,91 @@
+.HnS 0
+tapas
+.HnE
+
+The name stands for
+.B t o
+.B APA ,
+and the
+.B s
+is for added deliciousness.
+It's a small program used for compiling refer output into the APA reference
+format for groff or alike.
+
+The program reads refer output from
+.ICD stdin
+and prints the compiled result to
+.ICD stdout .
+
+.B Note
+that tapas doesn't currently fully implement APA. I wrote this program because I
+needed to reference articles using APA instead of MLA, and in time I intend to
+fully implement APA.
+
+.HnS 1
+Installation
+.HnE
+
+Edit config.mk to match your local setup (tapas is installed into the
+.I /usr/local
+namespace by default), then simply enter the following command to install (if
+necessary as root):
+
+.CDS
+.COS
+make clean install
+.COE
+.CDE
+
+.HnS 1
+Customization
+.HnE
+
+tapas can be customized by creating a custom config.h and (re)compiling the
+source code.
+
+.HnS 1
+Usage
+.HnE
+
+Tapas is intended to run in a pipe chain directly after refer, like so:
+
+.CDS
+.COS
+\&... | refer | tapas | ... | troff
+.COE
+.CDE
+
+I've added some customization using ds-strings for tapas. These are the
+following:
+
+.ULS
+.LI
+.ICD ".ds APA_IN ..."
+.HTML <br/>
+Used for specifying the word for "In" when referring to articles in books.
+
+.LI
+.ICD ".ds APA_AN ..."
+.HTML <br/>
+Used for specifying the word or symbol for "and/&" when concatenating authors.
+
+.LI
+.ICD ".ds APA_MS ..."
+.HTML <br/>
+Used for specifying the macro set output e.g. 'ms'. This is not currently fully
+developed, and only has support for 'ms'.
+
+.LI
+.ICD ".ds APA_HE ..."
+.HTML <br/>
+Used for specifying the heading text e.g. 'References'.
+.ULE
+
+.HnS 1
+License
+.HnE
+
+The program is licensed under the MIT license.
+
+get source
+.URL //git.noxz.tech/tapas.git here .
diff --git a/noxz.tech/software/wikid/index.md b/noxz.tech/software/wikid/index.www
rename noxz.tech/software/wikid/index.md → noxz.tech/software/wikid/index.www
diff --git a/noxz.tech/software/xrectdraw/.buildignore b/noxz.tech/software/xrectdraw/.buildignore
diff --git a/noxz.tech/software/xrectdraw/index.md b/noxz.tech/software/xrectdraw/index.www
rename noxz.tech/software/xrectdraw/index.md → noxz.tech/software/xrectdraw/index.www
@@ -1,7 +1,15 @@
+.HnS 0
 xrectdraw
-=========
-usage: **xrectdraw** <u>x</u> <u>y</u> <u>width</u> <u>height</u>
-<u>#RRGGBB</u> \[<u>t:r:b:l</u>]
+.HnE
+
+usage:
+.B xrectdraw
+.U x
+.U y
+.U width
+.U height
+.U #RRGGBB
+.U t:r:b:l ] [
 
 A small program used to draw rectangles on X11. The idea came when I needed
 something to indicate screen recordings for a small script using ffmpeg. I used
@@ -12,32 +20,52 @@ xrectdraw actually draws four windows making up the borders of the rectangle.
 This means no compositor is needed, the root window isn't hogged and the region
 is not overlaid.
 
+.HnS 1
 Installation
-------------
+.HnE
+
 Edit config.mk to match your local setup (xrectdraw is installed into the
-/usr/local namespace by default), then simply enter the following command to
-install (if necessary as root):
+.I /usr/local
+namespace by default), then simply enter the following command to install (if
+necessary as root):
 
-    make clean install
+.CDS
+.COS
+make clean install
+.COE
+.CDE
 
+.HnS 1
 Customization
--------------
+.HnE
+
 xrectdraw can be customized by creating a custom config.h and (re)compiling the
 source code.
 
+.HnS 1
 Usage
------
-Together with the source code is a script called *screenrec.sh* which is a fine
-example of how xrectdraw can be used. The program is used like this:
+.HnE
 
-    xrectdraw 10 20 100 200 \#ff0000 3:2:3:2
+Together with the source code is a script called
+.ICD screenrec.sh
+which is a fine example of how xrectdraw can be used. The program is used like
+this:
+
+.CDS
+.COS
+xrectdraw 10 20 100 200 \\#ff0000 3:2:3:2
+.COE
+.CDE
 
 The example above draws a rectangle, 100px wide, 200px heigh at the position
 (x:10px, y:20px). The borders are red, the top and bottom are 3px wide and the
 right and left are 2pc wide.
 
+.HnS 1
 License
--------
+.HnE
+
 The project is licensed under the MIT license.
 
-get source [here](//git.noxz.tech/xrectdraw/).
+get source
+.URL //git.noxz.tech/xrectdraw.git here .
diff --git a/noxz.tech/software/ztatus/.buildignore b/noxz.tech/software/ztatus/.buildignore
diff --git a/noxz.tech/software/ztatus/index.md b/noxz.tech/software/ztatus/index.www
rename noxz.tech/software/ztatus/index.md → noxz.tech/software/ztatus/index.www
@@ -1,38 +1,66 @@
+.HnS 0
 ztatus
-======
-usage: **ztatus** \[**-d**] \[**-n** <u>text</u>]
+.HnE
+
+usage:
+.B ztatus
+.B \[u2011]d ] [
+.B \[u2011]n "" [
+.U text ]
 
 ztatus creates a status bar for dwm, and other window managers using the root
 WM_NAME as input for displaying a status bar. Except for creating a status bar,
 ztatus also acts as a simple notification daemon.
 
+.HnS 1
 Measurements
-------------
+.HnE
+
 ztatus displays measurements from volume, battery, temperature, cpu usage,
 memory usage, mail, packages, and display date and time.
 
+.HnS 1
 Installation
-------------
+.HnE
+
 Edit config.mk to match your local setup (ztatus is installed into the
-/usr/local namespace by default), then simply enter the following command to
-install (if necessary as root):
+.I /usr/local
+namespace by default), then simply enter the following command to install (if
+necessary as root):
 
-    make clean install
+.CDS
+.COS
+ make clean install
+.COE
+.CDE
 
+.HnS 1
 Customization
--------------
+.HnE
+
 ztatus can be customized by creating a custom config.h and (re)compiling the
 source code.
 
 
+.HnS 1
 Example usage of ztatus
------------------------
+.HnE
+
 Start the daemon
 
-    ztatus -d &
+.CDS
+.COS
+ztatus -d &
+.COE
+.CDE
 
 Send notification
 
-    ztatus -n "hello world!"
+.CDS
+.COS
+ztatus -n "hello world!"
+.COE
+.CDE
 
-get source [here](//git.noxz.tech/ztatus/).
+get source
+.URL //git.noxz.tech/ztatus.git here .