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: 144fdd050f6f5612a9ccbc48a7303c0a9797626a
parent: 
author: Chris Noxz <chris@noxz.tech>
date:   Thu, 19 Sep 2019 13:51:16 +0200
Initial commit for public release
A.gitignore12+
ALICENSE21+
AMakefile49+++
AREADME.md14+
Aapply-extensions.sh23++
Abuild-blog.sh143+++++++
Abuild-git.sh104+++++
Abuilder.c429++++++++++++++++++++
Aconfig.def.h32++
Aconfig.mk6+
Agit.noxz.tech/pub/logo.svg110+++++
Agit.noxz.tech/pub/style.css112+++++
Airc.noxz.tech/.buildignore0
Airc.noxz.tech/index.swps125++++++
Anoxz.tech/.title1+
Anoxz.tech/about/copying-policy/index.md19+
Anoxz.tech/about/index.md41++
noxz.tech/about/questions-&-answers/index.md | 19 + Anoxz.tech/about/tools/index.md101+++++ Anoxz.tech/articles.nobuild/.buildignore0 Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore0 Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate1+ Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md21+ Anoxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.pngBin0 Anoxz.tech/dictionary/index.md96+++++ Anoxz.tech/dotfiles/index.md71++++ Anoxz.tech/index.md62+++ Anoxz.tech/music/.buildignore0 Anoxz.tech/pub/.buildignore0 Anoxz.tech/pub/chrisnoxz.pub1+ Anoxz.tech/pub/gpg-public-key.asc30++ Anoxz.tech/pub/logo.black.svg110+++++ Anoxz.tech/pub/logo.svg110+++++ Anoxz.tech/pub/rss.svg34++ Anoxz.tech/pub/style.css223++++++++++ Anoxz.tech/pub/twtxt.svg27++ Anoxz.tech/software/cidr2ip/.buildignore0 Anoxz.tech/software/cidr2ip/index.md24++ Anoxz.tech/software/endrilo/.buildignore0 Anoxz.tech/software/index.md44++ Anoxz.tech/software/ip2cidr/.buildignore0 Anoxz.tech/software/ip2cidr/index.md22+ Anoxz.tech/software/mpvd/index.md56+++ Anoxz.tech/software/ncscpl/.buildignore0 Anoxz.tech/software/rspan/index.md27++ Anoxz.tech/software/satan-gh60/index.md38++ Anoxz.tech/software/satan-gh60/keyboard.pngBin0 Anoxz.tech/software/swps/index.md23++ Anoxz.tech/software/wikid/.buildignore0 Anoxz.tech/software/wikid/index.md30++ Anoxz.tech/software/ztatus/index.md38++ Anoxz.tech/twtxt.txt24++ Atwtxt11+ 53 files changed, 2484 insertions(+)
diff --git a/.gitignore b/.gitignore
@@ -0,0 +1,12 @@
+*.html
+!/*.html
+builder
+config.h
+web.tar
+articles.ref
+quark.map
+repo-graph
+noxz.tech/blog
+noxz.tech/pub/feed.rss
+git.noxz.tech/*
+!git.noxz.tech/pub
diff --git a/LICENSE b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+© 2018-2019 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"),
+to deal in the Software without restriction, including without limitation
+the rights to use, copy, modify, merge, publish, distribute, sublicense,
+and/or sell copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/Makefile b/Makefile
@@ -0,0 +1,49 @@
+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
+	@
+	@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 creating tar archive 'web.tar'
+	@find ./ -type f -regex \
+	".*\.\(jpg\|png\|svg\|html\|css\|asc\|pub\|rss\|xml\|swps\|txt\)" \
+	-exec tar -rf web.tar {} \;
+
+builder: config.h builder.c
+	@echo CC -o $@
+	@$(CC) $(CFLAGS) $(LDFLAGS) -o $@ builder.c
+
+publish: all
+	@echo publishing to web server...
+	@scp ./web.tar anthra.system.local:/usr/local/share/noxz.tech/web.tar
+
+config.h:
+	@echo creating $@ from config.def.h
+	@cp config.def.h $@
+
+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/pub/feed.rss
+	@rm -f noxz.tech/pub/logo.png
+	@rm -f git.noxz.tech/pub/logo.png
+	@rm -f articles.ref
+	@rm -f quark.map
+	@rm -f web.tar
+	@rm -f builder
+	@rm -f repo-graph
diff --git a/README.md b/README.md
@@ -0,0 +1,14 @@
+noxz-sites
+==========
+`noxz-sites` is a collection of a builder and various scripts creating the
+noxz.tech sites:
+
++ noxz.tech
++ git.noxz.tech
++ irc.noxz.tech
+
+License
+-------
+The code for creating this site is licensed under the `MIT License`, see
+LICENSE. Usage of the content however is regulated by the copying policy for
+the sites: https://noxz.tech/about/copying-policy/.
diff --git a/apply-extensions.sh b/apply-extensions.sh
@@ -0,0 +1,23 @@
+#!/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
+
+# 1. inject div blocks {:: ...}, {::}
+# 2. inject block parameters {: ...}
+# 3. remove comments
+find ./noxz.tech/ -name "*.html" -type f -print0 |                          \
+    xargs -0 sed -i                                                         \
+    -e 's,^\(<[^>]*>\){::\( .*\)}$,<div\2>\1,g'                             \
+    -e 's,^{::},</div>,g'                                                   \
+    -e 's,^<\([^>]*\)>{:\( .*\)}$,<\1\2>,g'                                 \
+    -e '/{% comment %}/,/{% endcomment %}/d'
diff --git a/build-blog.sh b/build-blog.sh
@@ -0,0 +1,143 @@
+#!/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')" \
+            "$(smu -b "https:$_url" $_path | sed -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
@@ -0,0 +1,104 @@
+#!/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
+    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
+
+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 10q                                                                   \
+| 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
@@ -0,0 +1,429 @@
+/* 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><a", stdout);
+        if (page && !strncmp(newdir, page, strlen(newdir)))
+            fputs(" class=\"active\"", stdout);
+        printf(" 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><a", stdout);
+    if (!page)
+        fputs(" class=\"active\"", stdout);
+    fputs(" 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("</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
@@ -0,0 +1,32 @@
+#define MAIN_TITLE  "noxz.tech"
+#define SUB_TITLE   "Chris Noxz"
+
+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/svg+xml\" href=\"/pub/logo.svg\" />\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"
+    "</div>\n";
+
+char *html_footer =
+    "<div id=\"footer\">\n"
+    "   <span class=\"right\">\n"
+    "      &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
@@ -0,0 +1,6 @@
+# paths
+REMOTE_PATH = anthra.system.local:/usr/local/share/noxz.tech/web.tar
+
+# flags
+CFLAGS = -Wall -Wextra -std=c99 -pedantic
+LDFLAGS = -static -s
diff --git a/git.noxz.tech/pub/logo.svg b/git.noxz.tech/pub/logo.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   viewBox="0 0 40 40"
+   version="1.1"
+   id="svg5995"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="logo.svg">
+  <defs
+     id="defs5989" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="169.22484"
+     inkscape:cy="86.16882"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="2560"
+     inkscape:window-height="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-257)">
+    <g
+       id="g4971"
+       transform="matrix(1.4417433,0,0,1.4417433,-185.22241,-98.665593)">
+      <g
+         id="g1447-3"
+         transform="matrix(4.5481071,0,0,4.5481071,128.69855,246.91874)">
+        <path
+           id="path1435-6"
+           style="fill:none;stroke:#000000;stroke-width:0.1;stroke-opacity:1"
+           d="M 0,0 H 6 V 6 H 0 Z M 0,2 H 6 M 0,4 H 6 M 2,0 V 6 M 4,0 v 6"
+           inkscape:connector-curvature="0" />
+      </g>
+      <rect
+         transform="rotate(-45)"
+         y="275.88495"
+         x="-79.740433"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="288.75497"
+         x="-79.733536"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="295.18683"
+         x="-86.165421"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="288.75497"
+         x="-92.597275"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9-2"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="282.31039"
+         x="-99.041801"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9-2-7"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+    </g>
+  </g>
+</svg>
diff --git a/git.noxz.tech/pub/style.css b/git.noxz.tech/pub/style.css
@@ -0,0 +1,112 @@
+body {
+	color: #000;
+	background-color: #fff;
+	font-family: monospace;
+}
+
+h1, h2, h3, h4, h5, h6 {
+	font-size: 1em;
+	margin: 0;
+}
+
+img, h1, h2 {
+	vertical-align: middle;
+}
+
+img {
+	border: 0;
+}
+
+a.d,
+a.h,
+a.i,
+a.line {
+	text-decoration: none;
+}
+
+a.line {
+    padding-right: 5px;
+	border-right: 3px solid #eee;
+}
+
+#blob a {
+	color: #777;
+}
+
+#blob a:hover {
+	color: blue;
+	text-decoration: none;
+}
+
+table thead td {
+	font-weight: bold;
+}
+
+table td {
+	padding: 0 0.4em;
+}
+
+#content table td {
+	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;
+}
+
+thead tr:hover td,
+tr.nohi:hover td {
+	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;
+}
+
+.desc {
+	color: #777;
+}
+
+hr {
+	border: 0;
+	border-top: 1px solid #777;
+	height: 1px;
+}
+
+pre {
+	font-family: monospace;
+}
+
+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;
+}
diff --git a/irc.noxz.tech/.buildignore b/irc.noxz.tech/.buildignore
diff --git a/irc.noxz.tech/index.swps b/irc.noxz.tech/index.swps
@@ -0,0 +1,125 @@
+<!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
@@ -0,0 +1 @@
+noxz.tech
diff --git a/noxz.tech/about/copying-policy/index.md b/noxz.tech/about/copying-policy/index.md
@@ -0,0 +1,19 @@
+# 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/index.md b/noxz.tech/about/index.md
@@ -0,0 +1,41 @@
+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.
+
+**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.
+
+**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!
@@ -0,0 +1,19 @@
+# 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.
diff --git a/noxz.tech/about/tools/index.md b/noxz.tech/about/tools/index.md
@@ -0,0 +1,101 @@
+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/articles.nobuild/.buildignore b/noxz.tech/articles.nobuild/.buildignore
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.buildignore
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/.createdate
@@ -0,0 +1 @@
+2018-01-14 12:12:23
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/index.md
@@ -0,0 +1,21 @@
+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
+general just fail. Modern laptops tend to be consumables. So, after some
+research I found that the Lenovo T400 should be stable, easy to fix, and also
+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.
+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).
+
+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*.
+
+{: class="center"}
+![](t400.png)
diff --git a/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png b/noxz.tech/articles.nobuild/the_lenovo_thinkpad_t400/t400.png
diff --git a/noxz.tech/dictionary/index.md b/noxz.tech/dictionary/index.md
@@ -0,0 +1,96 @@
+# Dictionary
+
+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>
+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>
+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
+basic techniques, anyone past larval stage is expected to have outgrown the
+desire to do so except for immediate, benign, practical reasons (for example,
+if it's necessary to get around some security in order to get some work done).
+
+Thus, there is far less overlap between hackerdom and crackerdom than the
+mundane reader misled by sensationalistic journalism might expect. Crackers
+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)
+{::}
+
+{:: class="definition"}
+**hacker**:
+<a id="hacker"></a>
+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 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)
+{::}
+
+{:: class="definition"}
+**hacker ethic**:
+<a id="hacker-ethic"></a>
+The hacker ethic is centered around passion, hard work, creativity and joy of
+creating software ([Himanen, 2001](#cite_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
+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
+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
+all live by, as a society)
++ Meritocracy — 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))
+
+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*.
+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)).
+
+In hacker ethic *meritocracy* is **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.
+{::}
+
+## References
+
+{: 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.
diff --git a/noxz.tech/dotfiles/index.md b/noxz.tech/dotfiles/index.md
@@ -0,0 +1,71 @@
+Dotfiles
+========
+I've written a little tool to manage my dotfiles, in a way that 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/index.md b/noxz.tech/index.md
@@ -0,0 +1,62 @@
+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@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.
+
+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).
+
+Donate and support
+------------------
++ bitcoin: 17vMF3eP69KZ4utr1kYwJEj1GeWyjwWGCQ
++ litecoin: LdzFgBMfLR8sB1x3Td7NGDstpQdiMu4WLN
+
+Public keys
+-----------
++ [GPG public key](//noxz.tech/pub/gpg-public-key.asc)
++ [SSH public key](//noxz.tech/pub/chrisnoxz.pub)
+
+{: class="center"}
+Happy hacking!
+
+{: class="center"}
+![](/pub/logo.black.svg)
diff --git a/noxz.tech/music/.buildignore b/noxz.tech/music/.buildignore
diff --git a/noxz.tech/pub/.buildignore b/noxz.tech/pub/.buildignore
diff --git a/noxz.tech/pub/chrisnoxz.pub b/noxz.tech/pub/chrisnoxz.pub
@@ -0,0 +1 @@
+ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC5SKrqrHwNEhhGyXztYoOyANqbmuYEGdcybeccWiSyS/QDJ9T4KbtfCbHTY1z7zkycWSfFvH43ghwZ/8dr5fzCyqhiT02uvBptAZCVCD/dI9p+kOVITGkRDdU55Ve/plvJWsiJBwuzcYY3f6Vt1rk/pkX0ZJPmfC9UMJZen6bCUXgY4uAIaBqWuV1SWNhFaZFg9Fz+wWipYUhU083goJL4bJct+iu8SNwbfXlNgCvTz2XcQEDzqcYZRuY8o0K00Lsaj3BcqHJl5oFcKNUm0NIss5G7pcb7RhI7TE28k42Xiy5TsKU8d816h+umiyzo5jWm7e8A6SaLHKplqXkdkX90d4cvS0b3czCn7CE9FEChGCekttppjLGNfPiPBcqUzwhP/garEex5ZyUMp9/xu0iPELkD//giQyfAK+niKKOdmZ/68mVRnarOgn4PWeFLjqkJ0KERPjH9ZhI9sLm60FCJgMuzWoeaUm/UnUHlD7wyqtPc/FOoJgXPG5nSKRMB1M7BOtZ5aIpbZSJ1cfsBhliBcqBP/me7WGthbtywQpQ1LRuLHmi7upSBv8kw4jf+sTlOHuonG0mFjC/K3IQSwP85SEpBZuqWmvPEIYPwDERlZEmyOM9+iguTLtBpUgpfpJJDFaXdr5PwM/GIiJeG7sr0f5WcMpR9cgRtKyVZkHnWyQ== Chris Noxz
diff --git a/noxz.tech/pub/gpg-public-key.asc b/noxz.tech/pub/gpg-public-key.asc
@@ -0,0 +1,30 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQENBFr1lvcBCADLqxHiXLEyIMb0/MC6UKzaVYW/6yGrypw+y9y+94r/2JiiAnEd
+XHnUlKxH+oM36390c2OtRrZJSpFSs0/VNnSSBIuIx+qcH8gVzR+OCOIUIPZV/awm
+WuS8s64MmytajNVCuHCC2l1OGIXb0mxSJ/dVjZMoi6vaBrktE5KvdGRnJ0wOX7uU
+pvXe5ML3BIgKOb8czV1KbJtjvpG1TKRJU9YdBJEDzl73La1MjPn5quSKcPxKwtyo
+eR7x5XDa72eMa6hILMM8jq9jD75ipmUKHznyyM4LnLzC60INl0gg+VecqCNv4W0l
+hUGEW5Lrklu03zS1JXQQWtrhrYvdKQxUzsrXABEBAAG0HENocmlzIE5veHogPGNo
+cmlzQG5veHoudGVjaD6JAVQEEwEIAD4CGwMFCwkIBwIGFQoJCAsCBBYCAwECHgEC
+F4AWIQTDSGz6MISnhGjUJI65wwmLnanx/wUCXUQ2EAUJBhEGGQAKCRC5wwmLnanx
+/72tB/952xxOM3PhMiHke9PmICsJgFxcNdIihQAKll0ltoQZcmPAcai9uFwZdkWa
+brvOjppfYE3ATLZm+IqUS6VNg+syzU+TzodmoYQe0CZy0bvIjkX4pGvruPk7bWSn
+FkSEp5qBl1LkdY29Q4DZBa9vCW9nDDiObKasRS5SUjDXEi/zEmSZ4P7dgEIEEdsw
+5hbivOqsA7ZEbh+a93Riv8TUkv+Zl5m7KZ8MPpIN2avvAghpzbT/0sTwfmqPFfPG
+VzCBex/4tDpufUK/4tJRfehMJY2rSdlVTUEcY5HPnJQu3IRgtIBewyXzEAIPs1O8
+iZY09cRH7GXsMGjOAGeWvqgpF3pxuQENBFr1lvcBCAC3Chz82cghGNVmal8SgRvz
+Q4lrl5Ov0aBPFdMDhS6n/PDpyA5g7GFIVY6sRmxhxKt9QrrhpFhVRUduZBDQoHvz
+20BFw+hlprpgBenL5HxXOGTvzXngXMXg1xYX+ZpC16RchT4JkXUbCet2UjOwL6Q0
+au3D5vRSYvx9s3PobGf9TSXlsKzny9AwWEQ9xJj9TI0d9h4Xr06SxZ9cea+XMDhL
+YjsMNk0eYZYVIPmp4VPIBNmMyq5MZDIgzgYSD0E+IM6q8ivo6+vnmrqreR+PxqGP
+m+ilLfaUkUA7UJLXc4NSnvMYW1NYeHYyLTe/w+l2s+oyh6UZMfNxcbztS/Y/NOVr
+ABEBAAGJATwEGAEIACYCGwwWIQTDSGz6MISnhGjUJI65wwmLnanx/wUCXUQ2fgUJ
+BhEGhwAKCRC5wwmLnanx/1oVB/9L+TfB/zcljHLz+7pTgzhWAFNvwPWmvpnvjDFy
+aZIAgPseTJpuRrWjCeoINTTAB6soNsTrNpay7PWz9ARZWn4UFYVYfmDQqkNjeB4h
+GAty0fHulju4EiVfvzsyPJ7F6PmvlgSkDS1/z+yC8hOst+Q/JfzF21xxTZ7PAG2+
+uDb7nFL2q1xq4XXpTrXKQlcETxDWICZIb4D0zkV36GDcDD9pgQztJVJNnoySctrf
+AtI78HdD2Jxqq6UpSmU5oVrOxJF51Ushl3QfwOTKtj/uSkPm36YEEF86IXGRmHhn
+IcoKoJFhyFA4iNgE4xexfPt18iXLzpOjEkMV9e11HxpX0Fuq
+=XtUw
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/noxz.tech/pub/logo.black.svg b/noxz.tech/pub/logo.black.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="32px"
+   height="32px"
+   viewBox="0 0 40 40"
+   version="1.1"
+   id="svg5995"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="logo.svg">
+  <defs
+     id="defs5989" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="169.22484"
+     inkscape:cy="86.16882"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="2560"
+     inkscape:window-height="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-257)">
+    <g
+       id="g4971"
+       transform="matrix(1.4417433,0,0,1.4417433,-185.22241,-98.665593)">
+      <g
+         id="g1447-3"
+         transform="matrix(4.5481071,0,0,4.5481071,128.69855,246.91874)">
+        <path
+           id="path1435-6"
+           style="fill:none;stroke:#000000;stroke-width:0.1;stroke-opacity:1"
+           d="M 0,0 H 6 V 6 H 0 Z M 0,2 H 6 M 0,4 H 6 M 2,0 V 6 M 4,0 v 6"
+           inkscape:connector-curvature="0" />
+      </g>
+      <rect
+         transform="rotate(-45)"
+         y="275.88495"
+         x="-79.740433"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="288.75497"
+         x="-79.733536"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="295.18683"
+         x="-86.165421"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="288.75497"
+         x="-92.597275"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9-2"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="282.31039"
+         x="-99.041801"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9-2-7"
+         style="opacity:1;fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+    </g>
+  </g>
+</svg>
diff --git a/noxz.tech/pub/logo.svg b/noxz.tech/pub/logo.svg
@@ -0,0 +1,110 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   width="25px"
+   height="25px"
+   viewBox="0 0 40 40"
+   version="1.1"
+   id="svg5995"
+   inkscape:version="0.92.3 (2405546, 2018-03-11)"
+   sodipodi:docname="logo.svg">
+  <defs
+     id="defs5989" />
+  <sodipodi:namedview
+     id="base"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageopacity="0.0"
+     inkscape:pageshadow="2"
+     inkscape:zoom="2"
+     inkscape:cx="169.22484"
+     inkscape:cy="86.16882"
+     inkscape:document-units="mm"
+     inkscape:current-layer="layer1"
+     showgrid="false"
+     inkscape:window-width="2560"
+     inkscape:window-height="1024"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1" />
+  <metadata
+     id="metadata5992">
+    <rdf:RDF>
+      <cc:Work
+         rdf:about="">
+        <dc:format>image/svg+xml</dc:format>
+        <dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+        <dc:title></dc:title>
+      </cc:Work>
+    </rdf:RDF>
+  </metadata>
+  <g
+     inkscape:label="Layer 1"
+     inkscape:groupmode="layer"
+     id="layer1"
+     transform="translate(0,-257)">
+    <g
+       id="g4971"
+       transform="matrix(1.4417433,0,0,1.4417433,-185.22241,-98.665593)">
+      <g
+         id="g1447-3"
+         transform="matrix(4.5481071,0,0,4.5481071,128.69855,246.91874)">
+        <path
+           id="path1435-6"
+           style="fill:none;stroke:#ffffff;stroke-width:0.1;stroke-opacity:1"
+           d="M 0,0 H 6 V 6 H 0 Z M 0,2 H 6 M 0,4 H 6 M 2,0 V 6 M 4,0 v 6"
+           inkscape:connector-curvature="0" />
+      </g>
+      <rect
+         transform="rotate(-45)"
+         y="275.88495"
+         x="-79.740433"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="288.75497"
+         x="-79.733536"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="295.18683"
+         x="-86.165421"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="288.75497"
+         x="-92.597275"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9-2"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+      <rect
+         transform="rotate(-45)"
+         y="282.31039"
+         x="-99.041801"
+         height="5.1449485"
+         width="5.1449485"
+         id="rect4878-2-9-2-7"
+         style="opacity:1;fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:none;stroke-width:0.20321889;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:fill markers stroke" />
+    </g>
+  </g>
+</svg>
diff --git a/noxz.tech/pub/rss.svg b/noxz.tech/pub/rss.svg
@@ -0,0 +1,34 @@
+<?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
@@ -0,0 +1,223 @@
+body {
+    background-color: #eee;
+    color           : #222;
+    font-family     : monospace, sans-serif;
+    padding         : 0;
+    margin          : 0;
+}
+
+a {
+    color           : #005386;
+    text-decoration : none;
+}
+
+a:hover {
+    text-decoration : underline;
+}
+
+#header {
+    clear           : both;
+    color           : #ffffff;
+    font-size       : 1.35em;
+    border-bottom   : solid 2px #526587;
+    background      : #333a56;
+    height          : 2.75em;
+    line-height     : 2.75em;
+    padding         : 0 1.35ex;
+}
+
+#header-logo img {
+    vertical-align  : middle;
+    margin-right    : 0.5em;
+}
+
+#header-subtitle {
+    color           : #cacaca;
+    display         : inline-block;
+    font-size       : 0.75em;
+    font-style      : italic;
+}
+
+#header-link,
+#header-link:hover,
+#header-logo:hover {
+    color           : inherit;
+    background-color: inherit;
+    text-decoration : none;
+}
+
+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;
+}
+
+p, li {
+    color           : #444;
+    line-height     : 1.5em;
+}
+
+code {
+    font-family     : monospace;
+    background-color: #efefef;
+    padding         : 0 4px;
+}
+
+pre {
+    font-family     : monospace;
+    background-color: #efefef;
+    padding         : 10px;
+    overflow        : auto;
+}
+
+pre code {
+    background-color: none;
+    padding         : 0;
+}
+
+#content {
+    clear           : both;
+    margin          : 0;
+    padding         : 0;
+    background-color: #ffffff;
+    overflow        : hidden;
+}
+
+#nav {
+    background-color: #ffffff;
+    float           : left;
+    margin          : 0 1px 0 0;
+    padding         : 1em 0;
+    border-right    : 1px dotted #ccc;
+    width           : 200px;
+}
+
+#nav ul {
+    margin          : 0;
+    padding         : 0;
+}
+
+#nav li {
+    list-style      : none;
+    padding         : 0;
+    margin          : 0;
+}
+
+#nav li ul {
+  padding-left      : 0.6em !important;
+}
+
+#nav li a {
+    display         : block;
+    margin          : 0;
+    padding         : 0.8ex 2em 0.8ex 1em;
+}
+
+#nav li a:hover {
+    background-color: #eee;
+    text-decoration : none;
+}
+
+#nav li a.active {
+    color           : #222;
+    font-weight     : bold;
+}
+
+#main {
+    margin          : 0 0 0 200px;
+    padding         : 1.5em;
+    max-width       : 50em;
+}
+
+#footer {
+    clear           : both;
+    color           : #666;
+    border-top      : 1px solid #ccc;
+    font-size       : 84%;
+    padding         : 1em;
+    margin          : 0 0 1.5em 0;
+}
+
+.left {
+    float           : left;
+    margin          : 0;
+    padding         : 0;
+}
+
+.right {
+    float           : right;
+    margin          : 0;
+    padding         : 0;
+}
+
+.definition {
+    padding-left    : 2em;
+}
+
+.definition>p:first-child {
+    text-indent     : -2em;
+}
+
+.reference {
+    padding-left    : 2em;
+    text-indent     : -2em;
+}
+
+.center {
+    text-align      : center;
+}
+
+.article h1 {
+    margin-bottom   : 0em;
+}
+
+.article .article-date {
+    font-size       : 84%;
+}
+
+a.rss,a.twtxt {
+    display         : block;
+    background      : none no-repeat 0.9em center;
+    padding         : 0.8ex 0 0.8ex 2.2em !important;
+    margin          : 0;
+}
+
+a.rss {
+    background-image: url("/pub/rss.svg");
+}
+
+a.twtxt {
+    background-image: url("/pub/twtxt.svg");
+}
+
+ul.repo-log {
+    list-style-type : none;
+    margin          : 0;
+    padding         : 0;
+}
+
+ul.repo-log li {
+    font-family     : monospace;
+    font-size       : 84%;
+}
+
+ul.repo-log li .log-date {
+    font-weight     : bold;
+    padding-right   : 10px;
+}
diff --git a/noxz.tech/pub/twtxt.svg b/noxz.tech/pub/twtxt.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" ?>
+<svg
+    enable-background="new 0 0 30 30"
+    width="12"
+    height="12"
+    version="1.1"
+    viewBox="0 0 30 30"
+    xml:space="preserve"
+    xmlns="http://www.w3.org/2000/svg"
+    xmlns:xlink="http://www.w3.org/1999/xlink">
+<g>
+<polyline
+    clip-rule="evenodd"
+    fill="#000000"
+    fill-rule="evenodd"
+    points="29.93,28.583 0,28.583 0,0 29.93,0 29.93,28.583"/>
+<polyline
+    fill="#ffffff"
+    points="4.562,7.106 25.189,7.106 25.189,10.053 4.562,10.053 4.562,7.106"/>
+<polyline
+    fill="#ffffff"
+    points="4.564,13 25.189,13 25.189,15.946 4.564,15.946 4.564,13"/>
+<polyline
+    fill="#ffffff"
+    points="4.564,18.893 16.349,18.893 16.349,21.84 4.564,21.84 4.564,18.893"/>
+</g>
+</svg>
diff --git a/noxz.tech/software/cidr2ip/.buildignore b/noxz.tech/software/cidr2ip/.buildignore
diff --git a/noxz.tech/software/cidr2ip/index.md b/noxz.tech/software/cidr2ip/index.md
@@ -0,0 +1,24 @@
+cidr2ip
+=======
+usage: **cidr2ip** <u>cidr</u>
+
+cidr2ip is a small and simple program for converting a CIDR into ip (mask).
+
+Installation
+------------
+Edit config.mk to match your local setup (cidr2ip 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 cidr2ip
+------------------------
+Print a complete CIDR to ip conversion table
+
+    for i in {1..32}; do
+        printf '\\%-5s' $i
+        cidr2ip $i
+    done
+
+get source [here](//git.noxz.tech/cidr2ip/).
diff --git a/noxz.tech/software/endrilo/.buildignore b/noxz.tech/software/endrilo/.buildignore
diff --git a/noxz.tech/software/index.md b/noxz.tech/software/index.md
@@ -0,0 +1,44 @@
+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 %}
+
+### [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/ip2cidr/.buildignore b/noxz.tech/software/ip2cidr/.buildignore
diff --git a/noxz.tech/software/ip2cidr/index.md b/noxz.tech/software/ip2cidr/index.md
@@ -0,0 +1,22 @@
+ip2cidr
+=======
+usage: **ip2cidr** <u>ip</u>
+
+ip2cidr is a small and simple program for converting an ip address (mask)
+into a CIDR, or returning an already valid CIDR.
+
+Installation
+------------
+Edit config.mk to match your local setup (ip2cidr 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 ip2cidr
+------------------------
+Allow user to enter a subnet mask as either a CIDR or as an ip address:
+
+    read -p "enter subnet mask: " output; output=$(ip2cidr "$output")
+
+get source [here](//git.noxz.tech/ip2cidr/).
diff --git a/noxz.tech/software/mpvd/index.md b/noxz.tech/software/mpvd/index.md
@@ -0,0 +1,56 @@
+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/ncscpl/.buildignore b/noxz.tech/software/ncscpl/.buildignore
diff --git a/noxz.tech/software/rspan/index.md b/noxz.tech/software/rspan/index.md
@@ -0,0 +1,27 @@
+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/satan-gh60/index.md b/noxz.tech/software/satan-gh60/index.md
@@ -0,0 +1,38 @@
+Satan GH60 (RevCHN)
+===================
+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`
+for specifics.
+
+{: class="center"}
+![](keyboard.png)
+
+Prerequisites
+-------------
+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)).
+
+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
+
+Installation
+------------
+When all is prepared the firmware with my config can be compiled and flashed
+using:
+
+    make flash
+
+get source [here](//git.noxz.tech/satan-gh60/).
diff --git a/noxz.tech/software/satan-gh60/keyboard.png b/noxz.tech/software/satan-gh60/keyboard.png
diff --git a/noxz.tech/software/swps/index.md b/noxz.tech/software/swps/index.md
@@ -0,0 +1,23 @@
+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/wikid/.buildignore b/noxz.tech/software/wikid/.buildignore
diff --git a/noxz.tech/software/wikid/index.md b/noxz.tech/software/wikid/index.md
@@ -0,0 +1,30 @@
+wikid
+=====
+usage: **wikid** [<u>-hrt</u>] [<u>-l lang</u>] <u>term</u>
+
+wikid is a quick and simple CLI-program for downloading and rendering wikipedia
+pages in your terminal. And it's not **wikid** as in *wiki daemon*, but as in
+*wicked, Strikingly good, and effective*.
+
+Requirements
+------------
+wikid uses the **curl** library to download the wiki pages, and **ncurses** for
+retrieving the terminal width for line output.
+
+Installation
+------------
+Edit config.mk to match your local setup (wikid 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 wikid
+----------------------
+Read about wikipedia, using `less`
+
+    wikid wikipedia | less
+
+Read about wikipedia in german, using `less`
+
+    wikid -lde wikipedia | less
diff --git a/noxz.tech/software/ztatus/index.md b/noxz.tech/software/ztatus/index.md
@@ -0,0 +1,38 @@
+ztatus
+======
+usage: **ztatus** \[**-d**] \[**-n** <u>text</u>]
+
+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.
+
+Measurements
+------------
+ztatus displays measurements from volume, battery, temperature, cpu usage,
+memory usage, mail, packages, and display date and time.
+
+Installation
+------------
+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):
+
+    make clean install
+
+Customization
+-------------
+ztatus can be customized by creating a custom config.h and (re)compiling the
+source code.
+
+
+Example usage of ztatus
+-----------------------
+Start the daemon
+
+    ztatus -d &
+
+Send notification
+
+    ztatus -n "hello world!"
+
+get source [here](//git.noxz.tech/ztatus/).
diff --git a/noxz.tech/twtxt.txt b/noxz.tech/twtxt.txt
@@ -0,0 +1,24 @@
+#
+# | |___      _| |___  _| |_
+# | __\ \ /\ / / __\ \/ / __|
+# | |_ \ V  V /| |_ >  <| |_
+#  \__| \_/\_/  \__/_/\_\\__|
+#
+# Twtxt is an open, distributed
+# microblogging platform that
+# uses human-readable text files,
+# common transport protocols, and
+# free software.
+#
+# Learn more about twtxt at
+# https://github.com/buckket/twtxt
+#
+# --------------------------------
+#
+#  nick : z0noxz
+#   url : https://noxz.tech/twtxt.txt
+#  lang : en
+#
+
+2019-09-17T08:56:19+02:00	First message of 'twtxt'
+2019-09-17T09:14:08+02:00	Apple, not so secure after all: https://www.youtube.com/watch?v=zvTKikwUMRg
diff --git a/twtxt b/twtxt
@@ -0,0 +1,11 @@
+#!/bin/sh
+
+scrpath="$(cd "$(dirname "$0")"; pwd)"
+
+msg="$(printf '%s\t%s\n' $(date +%Y-%m-%dT%H:%M:%S%:z) "$1")"
+
+printf "Send this message (y/N)?\n> %s\n" "$msg"
+
+read answer && [ "$answer" = "${answer#[Yy]}" ] && return
+
+echo "$msg" >> "$scrpath/noxz.tech/twtxt.txt"