diff --git a/.gitignore b/.gitignore
index 816ea1c..aaaff05 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ drw.o
 dwm
 dwm.o
 util.o
+README.md
diff --git a/Makefile b/Makefile
index a166452..b9e4b11 100644
--- a/Makefile
+++ b/Makefile
@@ -9,9 +9,9 @@ OBJ = ${SRC:.c=.o}
 # FreeBSD users, prefix all ifdef, else and endif statements with a . for this to work (e.g. .ifdef)
 
 ifdef YAJLLIBS
-all: dwm dwm-msg
+all: dwm dwm-msg README.md
 else
-all: dwm
+all: dwm README.md
 endif
 
 .c.o:
@@ -22,6 +22,9 @@ ${OBJ}: config.h config.mk
 config.h:
 	cp config.def.h $@
 
+README.md:
+	./docs.awk config.h >$@
+
 dwm: ${OBJ}
 	${CC} -o $@ ${OBJ} ${LDFLAGS}
 
diff --git a/README b/README
deleted file mode 100644
index 95d4fd0..0000000
--- a/README
+++ /dev/null
@@ -1,48 +0,0 @@
-dwm - dynamic window manager
-============================
-dwm is an extremely fast, small, and dynamic window manager for X.
-
-
-Requirements
-------------
-In order to build dwm you need the Xlib header files.
-
-
-Installation
-------------
-Edit config.mk to match your local setup (dwm is installed into
-the /usr/local namespace by default).
-
-Afterwards enter the following command to build and install dwm (if
-necessary as root):
-
-    make clean install
-
-
-Running dwm
------------
-Add the following line to your .xinitrc to start dwm using startx:
-
-    exec dwm
-
-In order to connect dwm to a specific display, make sure that
-the DISPLAY environment variable is set correctly, e.g.:
-
-    DISPLAY=foo.bar:1 exec dwm
-
-(This will start dwm on display :1 of the host foo.bar.)
-
-In order to display status info in the bar, you can do something
-like this in your .xinitrc:
-
-    while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
-    do
-    	sleep 1
-    done &
-    exec dwm
-
-
-Configuration
--------------
-The configuration of dwm is done by creating a custom config.h
-and (re)compiling the source code.
diff --git a/config.h b/config.h
index 593ec01..be3fc40 100644
--- a/config.h
+++ b/config.h
@@ -125,7 +125,7 @@ static const char *spchat[] = { "a", TERM, TERM_FLAG_CLASS, "spchat", TERM_FLAG_
 static const char *spproc[] = { "p", TERM, TERM_FLAG_CLASS, "spproc", TERM_FLAG_EXEC, "btm", NULL };
 static const char *spdisk[] = { "d", TERM, TERM_FLAG_CLASS, "spdisk", TERM_FLAG_EXEC, "dua", "i", "/", NULL };
 static const char *spvolm[] = { "v", TERM, TERM_FLAG_CLASS, "spvolm", TERM_FLAG_EXEC, "ncpamixer", NULL };
-/*static const char *sphelp[] = { "h", TERM, TERM_FLAG_CLASS, "sphelp", TERM_FLAG_EXEC, "/bin/sh", "-c", "glow -p -s $XDG_CONFIG_HOME/glow/style.json /usr/share/dwm/dwm.md", NULL };*/
+static const char *sphelp[] = { "h", TERM, TERM_FLAG_CLASS, "sphelp", TERM_FLAG_EXEC, "/bin/sh", "-c", "glow -p -s tokyo-night /usr/share/doc/dwm-custom/README", NULL };
 static const char *spnetm[] = { "m", TERM, TERM_FLAG_CLASS, "spnetm", TERM_FLAG_EXEC, "/bin/sh", "-c", "sleep 0.01; nmtui", NULL }; // This sleep is needed to wait for DWM to size the window
 static const char *spnetu[] = { "u", TERM, TERM_FLAG_CLASS, "spnetu", TERM_FLAG_EXEC, "bandwhich", NULL };
 static const char *spwiki[] = { "w", TERM, TERM_FLAG_CLASS, "spwiki", TERM_FLAG_EXEC, "sh", "-c", "sleep 0.01; zk edit -i", NULL };
@@ -149,7 +149,7 @@ static const Rule rules[] = {
     RULE(.class = "mpv", .isfloating = 0)
     RULE(.class = "Element", .monitor = 1, .tags = 1 << 0)
     RULE(.class = "Thunderbird", .monitor = 1, .tags = 1 << 1)
-    /*RULE(.class = "sphelp", .scratchkey = 'h', .isfloating = 1, .iscentered = 1, .floatpos = "50% 50% 50% 90%")*/
+    RULE(.class = "sphelp", .scratchkey = 'h', .isfloating = 1, .iscentered = 1, .floatpos = "50% 50% 50% 90%")
     RULE(.class = "spwiki", .scratchkey = 'w', .isfloating = 1, .iscentered = 1, .floatpos = "50% 50% 50% 90%")
     RULE(.class = "sptask", .scratchkey = 's', .isfloating = 1, .iscentered = 1, .floatpos = "50% 50% 50% 90%")
     RULE(.class = "spterm", .scratchkey = 't', .isfloating = 1, .iscentered = 1, .floatpos = "50% 50% 90% 90%")
@@ -202,16 +202,16 @@ static const char *termcmd[]  = { TERM, NULL };
 
 #include <X11/XF86keysym.h>
 static const Key keys[] = {
-    /* modifier            key                 function            argument */
-    // { MODKEY,             XK_F1,              togglescratch,      {.v = sphelp} },
-    // { MODKEY | ShiftMask, XK_F1,              spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F2,              spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuhandler") },
+    /* START KEYBINDS */
+    { MODKEY,             XK_F1,               togglescratch,      {.v = sphelp} }, // Toggle help
+    // { MODKEY | ShiftMask,  XK_F1,              spawn,              {.v = (const char *[]){NULL}} },
+    // { MODKEY,              XK_F2,              spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuhandler") },
     // { MODKEY | ShiftMask,  XK_F2,              spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F3,              spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad") },
+    { MODKEY,              XK_F3,              spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad") }, // Toggle touchpad
     // { MODKEY | ShiftMask,  XK_F3,              spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F4,              spawn,              SHCMD("$HOME/.local/libexec/dwm/togcompositor") },
+    { MODKEY,              XK_F4,              spawn,              SHCMD("$HOME/.local/libexec/dwm/togcompositor") }, // Toggle compositor
     // { MODKEY | ShiftMask,  XK_F4,              spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F5,              spawn,              {.v = (const char *[]){"clipmenu", NULL}} },
+    { MODKEY,              XK_F5,              spawn,              {.v = (const char *[]){"clipmenu", NULL}} }, // Open copy/paste history
     // { MODKEY | ShiftMask,  XK_F5,              spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_F6,              spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_F6,              spawn,              {.v = (const char *[]){NULL}} },
@@ -219,16 +219,16 @@ static const Key keys[] = {
     // { MODKEY | ShiftMask,  XK_F7,              spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_F8,              spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_F8,              spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F9,              spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenumount") },
+    // { MODKEY,              XK_F9,              spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenumount") },
     // { MODKEY | ShiftMask,  XK_F9,              spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F10,             spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuumount") },
+    // { MODKEY,              XK_F10,             spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuumount") },
     // { MODKEY | ShiftMask,  XK_F10,             spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F11,             spawn,              SHCMD("$HOME/.local/libexec/dwm/displayselect") },
+    // { MODKEY,              XK_F11,             spawn,              SHCMD("$HOME/.local/libexec/dwm/displayselect") },
     // { MODKEY | ShiftMask,  XK_F11,             spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_F12,             spawn,              {.v = (const char *[]){"remaps", NULL}} },
+    { MODKEY,              XK_F12,             spawn,              {.v = (const char *[]){"remaps", NULL}} }, // Rotate keyboard layout
     // { MODKEY | ShiftMask,  XK_F12,             spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_grave,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuunicode --nocopy") },
-    { MODKEY | ShiftMask,  XK_grave,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuunicode") },
+    { MODKEY,              XK_grave,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuunicode --nocopy") }, // Insert an emoji
+    { MODKEY | ShiftMask,  XK_grave,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenuunicode") }, // Copy an emoji
     TAGKEYS(               XK_1,                                   0),
     TAGKEYS(               XK_2,                                   1),
     TAGKEYS(               XK_3,                                   2),
@@ -238,59 +238,59 @@ static const Key keys[] = {
     TAGKEYS(               XK_7,                                   6),
     TAGKEYS(               XK_8,                                   7),
     TAGKEYS(               XK_9,                                   8),
-    { MODKEY,              XK_0,               view,               {.ui = ~0} },
-    { MODKEY | ShiftMask,  XK_0,               tag,                {.ui = ~0} },
+    { MODKEY,              XK_0,               view,               {.ui = ~0} }, // View all tags
+    { MODKEY | ShiftMask,  XK_0,               tag,                {.ui = ~0} }, // Make focused window sticky
     // { MODKEY | ShiftMask,  XK_0,               spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_bracketleft,     spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_bracketleft,     spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_bracketright,    spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_bracketright,    spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_BackSpace,       spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenusys") },
+    { MODKEY,              XK_BackSpace,       spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenusys") }, // Open shutdown menu
     // { MODKEY | ShiftMask,  XK_BackSpace,       spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_Tab,             spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_Tab,             spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_apostrophe,      spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_apostrophe,      spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_comma,           focusmon,           {.i = +1} },
-    { MODKEY | ShiftMask,  XK_comma,           tagmon,             {.i = +1} },
-    { MODKEY,              XK_period,          focusmon,           {.i = -1} },
-    { MODKEY | ShiftMask,  XK_period,          tagmon,             {.i = -1} },
-    { MODKEY,              XK_p,               spawn,              {.v = (const char *[]){"playerctl", "play-pause", NULL}} },
+    { MODKEY,              XK_comma,           focusmon,           {.i = +1} }, // Focus next monitor
+    { MODKEY | ShiftMask,  XK_comma,           tagmon,             {.i = +1} }, // Move focused window to next monitor
+    { MODKEY,              XK_period,          focusmon,           {.i = -1} }, // Focus last monitor
+    { MODKEY | ShiftMask,  XK_period,          tagmon,             {.i = -1} }, // Move focused window to last monitor
+    { MODKEY,              XK_p,               spawn,              {.v = (const char *[]){"playerctl", "play-pause", NULL}} }, // Pause current player
     // { MODKEY | ShiftMask,  XK_p,               spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_y,               spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_y,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_f,               togglefullscreen,   {0} },
+    { MODKEY,              XK_f,               togglefullscreen,   {0} }, // Toggle fullscreen for focused window
     // { MODKEY | ShiftMask,  XK_f,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_g,               setlayout,          {.v = &layouts[0]} },
+    { MODKEY,              XK_g,               setlayout,          {.v = &layouts[0]} }, // Select default tile layout
     // { MODKEY | ShiftMask,  XK_g,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_c,               setlayout,          {.v = &layouts[1]} },
+    { MODKEY,              XK_c,               setlayout,          {.v = &layouts[1]} }, // Select bottom stack layout
     // { MODKEY | ShiftMask,  XK_c,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_r,               setlayout,          {.v = &layouts[2]} },
+    { MODKEY,              XK_r,               setlayout,          {.v = &layouts[2]} }, // Select grid layout
     // { MODKEY | ShiftMask,  XK_r,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_l,               pushstack,          {.i = INC(+1)} },
-    { MODKEY | ShiftMask,  XK_l,               setmfact,           {.f = +0.05} },
+    { MODKEY,              XK_l,               pushstack,          {.i = INC(+1)} }, // Move focused window down stack
+    { MODKEY | ShiftMask,  XK_l,               setmfact,           {.f = +0.05} }, // Increase size of master stack
     // { MODKEY,              XK_slash,           spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_slash,           spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_equal,           spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_equal,           spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_a,               togglescratch,      {.v = spchat} },
+    { MODKEY,              XK_a,               togglescratch,      {.v = spchat} }, // Toggle AI chat
     // { MODKEY | ShiftMask,  XK_a,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_o,               togglescratch,      {.v = spproc} },
-    { MODKEY | ShiftMask,  XK_o,               togglescratch,      {.v = spnetu} },
-    { MODKEY,              XK_e,               togglescratch,      {.v = spfile} },
-    { MODKEY | ShiftMask,  XK_e,               togglescratch,      {.v = spdisk} },
-    { MODKEY,              XK_u,               spawn,              {.v = (const char *[]){"dmenu_run", NULL}} },
+    { MODKEY,              XK_o,               togglescratch,      {.v = spproc} }, // Toggle process manager
+    { MODKEY | ShiftMask,  XK_o,               togglescratch,      {.v = spnetu} }, // Toggle network usage analyzer
+    { MODKEY,              XK_e,               togglescratch,      {.v = spfile} }, // Toggle file manager
+    { MODKEY | ShiftMask,  XK_e,               togglescratch,      {.v = spdisk} }, // Toggle disk usage analyzer
+    { MODKEY,              XK_u,               spawn,              {.v = (const char *[]){"dmenu_run", NULL}} }, // Run a program
     // { MODKEY | ShiftMask,  XK_u,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_i,               spawn,              {.v = (const char *[]){"dunstctl", "close", NULL}} },
-    { MODKEY | ShiftMask,  XK_i,               spawn,              {.v = (const char *[]){"dunstctl", "history-pop", NULL}} },
-    { MODKEY,              XK_d,               spawn,              {.v = (const char *[]){"dunstctl", "context", NULL}} },
-    { MODKEY | ShiftMask,  XK_d,               spawn,              {.v = (const char *[]){"dunstctl", "action", "0", NULL}} },
-    { MODKEY,              XK_h,               pushstack,          {.i = INC(-1)} },
-    { MODKEY | ShiftMask,  XK_h,               setmfact,           {.f = -0.05} },
-    { MODKEY,              XK_t,               spawn,              {.v = (const char *[]){BROWSER, BROWSER_FLAG_1, NULL}} },
-    { MODKEY | ShiftMask,  XK_t,               spawn,              {.v = (const char *[]){BROWSER, BROWSER_FLAG_1, BROWSER_FLAG_INCOG, NULL}} },
-    { MODKEY,              XK_n,               focusstack,         {.i = PREVSEL} },
-    { MODKEY | ShiftMask,  XK_n,               focusstack,         {.i = 0} },
+    { MODKEY,              XK_i,               spawn,              {.v = (const char *[]){"dunstctl", "close", NULL}} }, // Close last notification
+    { MODKEY | ShiftMask,  XK_i,               spawn,              {.v = (const char *[]){"dunstctl", "history-pop", NULL}} }, // Reopen last notification
+    { MODKEY,              XK_d,               spawn,              {.v = (const char *[]){"dunstctl", "context", NULL}} }, // Select notification option
+    { MODKEY | ShiftMask,  XK_d,               spawn,              {.v = (const char *[]){"dunstctl", "action", "0", NULL}} }, // Autoselect first notification option
+    { MODKEY,              XK_h,               pushstack,          {.i = INC(-1)} }, // Move focused window up stack
+    { MODKEY | ShiftMask,  XK_h,               setmfact,           {.f = -0.05} }, // Decrease size of master stack
+    { MODKEY,              XK_t,               spawn,              {.v = (const char *[]){BROWSER, BROWSER_FLAG_1, NULL}} }, // Start a browser window
+    { MODKEY | ShiftMask,  XK_t,               spawn,              {.v = (const char *[]){BROWSER, BROWSER_FLAG_1, BROWSER_FLAG_INCOG, NULL}} }, // Start an incognito browser window
+    { MODKEY,              XK_n,               focusstack,         {.i = PREVSEL} }, // Focus last focused window
+    { MODKEY | ShiftMask,  XK_n,               focusstack,         {.i = 0} }, // Focus master stack
     // { MODKEY,              XK_s,               spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_s,               spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_s,               spawn,              {.v = (const char *[]){NULL}} },
@@ -298,34 +298,34 @@ static const Key keys[] = {
     // { MODKEY | ShiftMask,  XK_minus,           spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_backslash,       spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_backslash,       spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_Return,          zoom,               {0} },
+    { MODKEY,              XK_Return,          zoom,               {0} }, // Move focused window to master stack
     // { MODKEY | ShiftMask,  XK_Return,          spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_semicolon,       spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_semicolon,       spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_q,               killclient,         {0} },
+    { MODKEY,              XK_q,               killclient,         {0} }, // Close focused window
     // { MODKEY | ShiftMask,  XK_q,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_j,               focusstack,         {.i = INC(+1) } },
+    { MODKEY,              XK_j,               focusstack,         {.i = INC(+1) } }, // Focus next window in stack
     /* { MODKEY | ShiftMask,  XK_j,               focusstack,         {.i = INC(+1) } }, */
-    { MODKEY,              XK_k,               focusstack,         {.i = INC(-1) } },
+    { MODKEY,              XK_k,               focusstack,         {.i = INC(-1) } }, // Focus last window in stack
     /* { MODKEY | ShiftMask,  XK_k,               focusstack,         {.i = INC(-1) } }, */
-    { MODKEY,              XK_x,               togglefloating,     {0} },
-    { MODKEY | ShiftMask,  XK_x,               unfloatvisible,     {0} },
-    { MODKEY,              XK_b,               togglescratch,      {.v = spnetm} },
+    { MODKEY,              XK_x,               togglefloating,     {0} }, // Toggle floating for focused window
+    { MODKEY | ShiftMask,  XK_x,               unfloatvisible,     {0} }, // Unfloat visible floating windows
+    { MODKEY,              XK_b,               togglescratch,      {.v = spnetm} }, // Toggle network manager
     // { MODKEY | ShiftMask,  XK_b,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_m,               togglescratch,      {.v = spvolm} },
-    { MODKEY | ShiftMask,  XK_m,               spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify -t") },
-    { MODKEY,              XK_w,               togglescratch,      {.v = spwiki} },
+    { MODKEY,              XK_m,               togglescratch,      {.v = spvolm} }, // Toggle volume manager
+    { MODKEY | ShiftMask,  XK_m,               spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify -t") }, // Mute volume
+    { MODKEY,              XK_w,               togglescratch,      {.v = spwiki} }, // Toggle wiki
     // { MODKEY | ShiftMask,  XK_w,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_v,               togglescratch,      {.v = spcalc} },
+    { MODKEY,              XK_v,               togglescratch,      {.v = spcalc} }, // Toggle calculator
     // { MODKEY | ShiftMask,  XK_v,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_z,               togglescratch,      {.v = sptask} },
+    { MODKEY,              XK_z,               togglescratch,      {.v = sptask} }, // Toggle task manager
     // { MODKEY | ShiftMask,  XK_z,               spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_space,           spawn,              {.v = termcmd} },
-    { MODKEY | ShiftMask,  XK_space,           togglescratch,      {.v = spterm} },
-    { MODKEY,              XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenurecord") },
-    { MODKEY | ShiftMask,  XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenurecord kill") },
-    { 0,                   XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenumaim full") },
-    { ShiftMask,           XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenumaim") },
+    { MODKEY,              XK_space,           spawn,              {.v = termcmd} }, // Open terminal
+    { MODKEY | ShiftMask,  XK_space,           togglescratch,      {.v = spterm} }, // Open scratch terminal
+    { MODKEY,              XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenurecord") }, // Open video recording menu
+    { MODKEY | ShiftMask,  XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenurecord kill") }, // Kill recording
+    { 0,                   XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenumaim full") }, // Screenshot full screen
+    { ShiftMask,           XK_Print,           spawn,              SHCMD("$HOME/.local/libexec/dwm/dmenumaim") }, // Open screenshot menu
     // { MODKEY,              XK_Scroll_Lock,     spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_Scroll_Lock,     spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_Pause,           spawn,              {.v = (const char *[]){NULL}} },
@@ -337,50 +337,50 @@ static const Key keys[] = {
     // { MODKEY,              XK_Page_Up,         spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_Page_Up,         spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_Delete,          spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY | ShiftMask,  XK_Delete,          quit,               {0} },
+    { MODKEY | ShiftMask,  XK_Delete,          quit,               {0} }, // Kill window manager
     // { MODKEY,              XK_End,             spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_End,             spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY,              XK_Page_Down,       spawn,              {.v = (const char *[]){NULL}} },
     // { MODKEY | ShiftMask,  XK_Page_Down,       spawn,              {.v = (const char *[]){NULL}} },
-    { MODKEY,              XK_Left,            spawn,              {.v = (const char *[]){"playerctl", "position", "5-", NULL}} },
-    { MODKEY | ShiftMask,  XK_Left,            spawn,              {.v = (const char *[]){"playerctl", "previous", NULL}} },
-    { MODKEY,              XK_Right,           spawn,              {.v = (const char *[]){"playerctl", "position", "5+", NULL}} },
-    { MODKEY | ShiftMask,  XK_Right,           spawn,              {.v = (const char *[]){"playerctl", "next", NULL}} },
-    { MODKEY,              XK_Up,              spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -i 5") },
-    { MODKEY | ShiftMask,  XK_Up,              spawn,              {.v = (const char *[]){"playerctl", "volume", "5+", NULL}} },
-    { MODKEY,              XK_Down,            spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -d 5") },
-    { MODKEY | ShiftMask,  XK_Down,            spawn,              {.v = (const char *[]){"playerctl", "volume", "5-", NULL}} },
+    { MODKEY,              XK_Left,            spawn,              {.v = (const char *[]){"playerctl", "position", "5-", NULL}} }, // Spool current player back 5 seconds
+    { MODKEY | ShiftMask,  XK_Left,            spawn,              {.v = (const char *[]){"playerctl", "previous", NULL}} }, // Skip to previous track in current player
+    { MODKEY,              XK_Right,           spawn,              {.v = (const char *[]){"playerctl", "position", "5+", NULL}} }, // Spool current player forward 5 seconds
+    { MODKEY | ShiftMask,  XK_Right,           spawn,              {.v = (const char *[]){"playerctl", "next", NULL}} }, // Skip to next track in current player
+    { MODKEY,              XK_Up,              spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -i 5") }, // Increase volume
+    { MODKEY | ShiftMask,  XK_Up,              spawn,              {.v = (const char *[]){"playerctl", "volume", "5+", NULL}} }, // Increase volume in player
+    { MODKEY,              XK_Down,            spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -d 5") }, // Decrease volume
+    { MODKEY | ShiftMask,  XK_Down,            spawn,              {.v = (const char *[]){"playerctl", "volume", "5-", NULL}} }, // Decrease volume in player
 
-    { 0,             XF86XK_AudioMute,         spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify -t") },
-    { 0,             XF86XK_AudioRaiseVolume,  spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -i 5") },
-    { 0,             XF86XK_AudioLowerVolume,  spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -d 5") },
-    { 0,             XF86XK_AudioPrev,         spawn,              {.v = (const char *[]){"playerctl", "previous", NULL}} },
-    { 0,             XF86XK_AudioNext,         spawn,              {.v = (const char *[]){"playerctl", "next", NULL}} },
-    { 0,             XF86XK_AudioPause,        spawn,              {.v = (const char *[]){"playerctl", "pause", NULL}} },
-    { 0,             XF86XK_AudioPlay,         spawn,              {.v = (const char *[]){"playerctl", "play-pause", NULL}} }, // Most keyboards only have a play button
-    { 0,             XF86XK_AudioStop,         spawn,              {.v = (const char *[]){"playerctl", "stop", NULL}} },
-    { 0,             XF86XK_AudioRewind,       spawn,              {.v = (const char *[]){"playerctl", "position", "5-", NULL}} },
-    { 0,             XF86XK_AudioForward,      spawn,              {.v = (const char *[]){"playerctl", "position", "5+", NULL}} },
+    { 0,             XF86XK_AudioMute,         spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify -t") }, // Mute volume
+    { 0,             XF86XK_AudioRaiseVolume,  spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -i 5") }, // Increase volume
+    { 0,             XF86XK_AudioLowerVolume,  spawn,              SHCMD("$HOME/.local/libexec/dwm/pamixer-notify --allow-boost -d 5") }, // Decrease volume
+    { 0,             XF86XK_AudioPrev,         spawn,              {.v = (const char *[]){"playerctl", "previous", NULL}} }, // Skip to previous track in current player
+    { 0,             XF86XK_AudioNext,         spawn,              {.v = (const char *[]){"playerctl", "next", NULL}} }, // Skip to next track in current player
+    { 0,             XF86XK_AudioPause,        spawn,              {.v = (const char *[]){"playerctl", "pause", NULL}} }, // Pause current player
+    { 0,             XF86XK_AudioPlay,         spawn,              {.v = (const char *[]){"playerctl", "play-pause", NULL}} }, // Toggle pause/unpause in current player
+    { 0,             XF86XK_AudioStop,         spawn,              {.v = (const char *[]){"playerctl", "stop", NULL}} }, // Stop current player
+    { 0,             XF86XK_AudioRewind,       spawn,              {.v = (const char *[]){"playerctl", "position", "5-", NULL}} }, // Spool current player back 5 seconds
+    { 0,             XF86XK_AudioForward,      spawn,              {.v = (const char *[]){"playerctl", "position", "5+", NULL}} }, // Spool current player forward 5 seconds
     // {             0, XF86XK_AudioMedia,        spawn,              {.v = (const char *[]){NULL}} },
-    { 0,             XF86XK_AudioMicMute,      spawn,              {.v = (const char *[]){"pactl", "set-source-mute", "@DEFAULT_SOURCE@", "toggle", NULL}} }, /* TODO: Test this */
-    { 0,             XF86XK_PowerOff,          spawn,              {.v = (const char *[]){"dmenusys", NULL}} },
-    { 0,             XF86XK_Calculator,        spawn,              {.v = (const char *[]){TERM, "-e", "bc", "-li", NULL}} },
-    { 0,             XF86XK_Sleep,             spawn,              {.v = (const char *[]){"loginctl", "suspend", "-i", NULL}} },
-    { 0,             XF86XK_WWW,               spawn,              {.v = (const char *[]){BROWSER, BROWSER_FLAG_1, NULL}} },
+    { 0,             XF86XK_AudioMicMute,      spawn,              SHCMD("$HOME/.local/libexec/dwm/togmic") }, // Toggle microphone mute
+    { 0,             XF86XK_PowerOff,          spawn,              {.v = (const char *[]){"dmenusys", NULL}} }, // Open shutdown menu
+    { 0,             XF86XK_Calculator,        togglescratch,      {.v = spcalc} }, // Toggle calculator
+    { 0,             XF86XK_Sleep,             spawn,              {.v = (const char *[]){"loginctl", "suspend", "-i", NULL}} }, // Sleep system
+    { 0,             XF86XK_WWW,               spawn,              {.v = (const char *[]){BROWSER, BROWSER_FLAG_1, NULL}} }, // Open browser
     // {             0, XF86XK_WLAN,              spawn,              {.v = (const char *[]){NULL}} },
-    { 0,             XF86XK_DOS,               spawn,              {.v = (const char *[]){TERM, NULL}} },
-    { 0,             XF86XK_ScreenSaver,       spawn,              {.v = (const char *[]){"xset", "s", "activate", NULL}} },
-    { 0,             XF86XK_TaskPane,          spawn,              {.v = (const char *[]){TERM, "-e", "htop", NULL}} },
+    { 0,             XF86XK_DOS,               spawn,              {.v = (const char *[]){TERM, NULL}} }, // Open terminal
+    { 0,             XF86XK_ScreenSaver,       spawn,              {.v = (const char *[]){"xset", "s", "activate", NULL}} }, // Lock session
+    { 0,             XF86XK_TaskPane,          togglescratch,      {.v = spproc} }, // Toggle process manager
     // {             0, XF86XK_Mail,              spawn,              {.v = (const char *[]){NULL}} },
-    { 0,             XF86XK_MyComputer,        spawn,              {.v = (const char *[]){TERM, "-e", "lfX", "/", NULL}} },
+    { 0,             XF86XK_MyComputer,        togglescratch,      {.v = spfile} }, // Toggle file manager
     // {             0, XF86XK_Battery,           spawn,              {.v = (const char *[]){NULL}} },
     // {             0, XF86XK_Launch1,           spawn,              {.v = (const char *[]){NULL}} },
-    { 0,             XF86XK_TouchpadToggle,    spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad") },
-    { 0,             XF86XK_TouchpadOff,       spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad -n") },
-    { 0,             XF86XK_TouchpadOn,        spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad -y") },
-    { 0,             XF86XK_MonBrightnessUp,   spawn,              SHCMD("$HOME/.local/libexec/dwm/brightness-notify +5") },
-    { 0,             XF86XK_MonBrightnessDown, spawn,              SHCMD("$HOME/.local/libexec/dwm/brightness-notify -5") },
-    /* WARN: If you have multiple backlight controllers this will fail */
+    { 0,             XF86XK_TouchpadToggle,    spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad") }, // Toggle touchpad
+    { 0,             XF86XK_TouchpadOff,       spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad -n") }, // Disable touchpad
+    { 0,             XF86XK_TouchpadOn,        spawn,              SHCMD("$HOME/.local/libexec/dwm/togtouchpad -y") }, // Enable touchpad
+    { 0,             XF86XK_MonBrightnessUp,   spawn,              SHCMD("$HOME/.local/libexec/dwm/brightness-notify +5") }, // Increase monitor brightness
+    { 0,             XF86XK_MonBrightnessDown, spawn,              SHCMD("$HOME/.local/libexec/dwm/brightness-notify -5") }, // Decrease monitor brightness
+    /* END KEYBINDS */
 };
 
 
diff --git a/docs.awk b/docs.awk
new file mode 100755
index 0000000..03c61d4
--- /dev/null
+++ b/docs.awk
@@ -0,0 +1,54 @@
+#!/bin/awk -f
+
+BEGINFILE {
+    printf "# DWM Keybinds\n"
+    printf "|Keybind|Function|\n"
+    printf "|-|-|\n"
+}
+
+/^#define MODKEY/ {
+    modkey = $3
+}
+
+/START KEYBINDS/ {
+    in_keybinds = 1
+    next
+}
+
+/END KEYBINDS/ {
+    in_keybinds = 0
+    next
+}
+
+in_keybinds {
+    if (/^[[:space:]]*$/ || /^[[:space:]]*\/(\/|\*)/ || /^[[:space:]]*TAGKEYS\(/) {
+        next
+    }
+
+    if (match($0, /\{[[:space:]]*([^,]+)/, modifier_matches)) {
+        modifier = modifier_matches[1]
+    } else {
+        modifier = "0"
+    }
+
+    gsub(/MODKEY/, modkey, modifier)
+    gsub(/\|/, "+", modifier)
+    gsub(/Mod1Mask/, "Alt", modifier)
+    gsub(/Mod4Mask/, "Super", modifier)
+    gsub(/ControlMask/, "Control", modifier)
+    gsub(/ShiftMask/, "Shift", modifier)
+
+    match($0, /[[:space:]]*XK_([^,]+)/, key_matches)
+    key = key_matches[1]
+    key = toupper(substr(key,1,1)) substr(key,2)
+
+    match($0, /,[[:space:]]*\/\/[[:space:]]*(.+)$/, comment_matches)
+    comment = comment_matches[1]
+    comment = toupper(substr(comment,1,1)) substr(comment,2)
+
+    printf "|"
+    if (modifier != "0") {
+        printf "%s + ", modifier
+    }
+    printf "%s|%s|\n", key, comment
+}