tonybtw

https://git.tonybtw.com/tonybtw.git git://git.tonybtw.com/tonybtw.git

replaced hugo with a pandoc and makefile build

Commit
b5981af93662275dcde0a22447a13db4da175999
Parent
f5eaa1a
Author
tonybanters <tonyoutoften@gmail.com>
Date
2026-08-07 07:11:44

Diff

diff --git a/.direnv/flake-profile b/.direnv/flake-profile
deleted file mode 120000
index 0c05709..0000000
--- a/.direnv/flake-profile
+++ /dev/null
@@ -1 +0,0 @@
-flake-profile-1-link
\ No newline at end of file
diff --git a/.direnv/flake-profile-1-link b/.direnv/flake-profile-1-link
deleted file mode 120000
index 6347840..0000000
--- a/.direnv/flake-profile-1-link
+++ /dev/null
@@ -1 +0,0 @@
-/nix/store/n4m7phq5srzwy6xv7dgji9z9k1xfl6q9-nix-shell-env
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index 476ddcf..a22e8be 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,24 +1,15 @@
-# Ignore Hugo's generated public folder
+# Build output
 /public/
+# nix build symlink
+/result
 
-# Ignore backup or temp files
+# Backup / temp
 *~
 *.swp
 *.swo
 .DS_Store
 Thumbs.db
-
-# Ignore Hugo cache
-/resources/_gen/
-hugo_stats.json
-
-# Ignore logs or local env files
-.env
 *.log
 
-# Ignore OS crap
-ehthumbs.db
-Icon?
-.Trashes
-.Spotlight-V100
-
+# direnv local cache
+/.direnv/
diff --git a/.hugo_build.lock b/.hugo_build.lock
deleted file mode 100644
index e69de29..0000000
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..3be1095
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,35 @@
+MD   := $(shell find content -name '*.md')
+HTML := $(patsubst content/%.md,public/%.html,$(MD))
+TPL  := template.html
+PANDOC := pandoc -f markdown+lists_without_preceding_blankline-implicit_figures \
+  --template=$(TPL) --toc --toc-depth=3 -s --wrap=preserve
+
+all: site
+
+public/%.html: content/%.md $(TPL)
+	@mkdir -p $(@D)
+	@sec=$$(echo "$*" | cut -d/ -f1); \
+	 buf=$$(basename $$(dirname "$*")); \
+	 dt=$$(sed -n 's/^date: *//p' "$<" | head -1 | tr -d '"'); \
+	 fdt=$$(date -d "$$dt" +"%B %-d, %Y" 2>/dev/null || echo "$$dt"); \
+	 au=$$(sed -n 's/^author: *//p' "$<" | head -1 | tr -d '"[]'); \
+	 vid=$$(sed -n 's/^video: *//p' "$<" | head -1 | tr -d '"'); vid=$${vid##*v=}; vid=$${vid##*/embed/}; \
+	 if [ "$$sec" = community ] && [ -n "$$au" ]; then ml="by $$au · $$fdt"; else ml="$$fdt"; fi; \
+	 yt=""; [ -n "$$vid" ] && yt="-M ytid=$$vid"; \
+	 $(PANDOC) -M section="$$sec" -M buffer="$$buf.org" -M showtitle=true -M metaline="$$ml" $$yt "$<" -o "$@"
+
+site: $(HTML) gen assets
+
+gen: $(TPL) gen.sh $(MD)
+	@bash gen.sh
+
+assets:
+	@mkdir -p public && cp -R assets/. public/
+
+serve: site
+	@cd public && python3 -m http.server 1313
+
+clean:
+	rm -rf public
+
+.PHONY: all site gen assets serve clean
diff --git a/archetypes/default.md b/archetypes/default.md
deleted file mode 100644
index 25b6752..0000000
--- a/archetypes/default.md
+++ /dev/null
@@ -1,5 +0,0 @@
-+++
-date = '{{ .Date }}'
-draft = true
-title = '{{ replace .File.ContentBaseName "-" " " | title }}'
-+++
diff --git a/static/.well-known/matrix/client b/assets/.well-known/matrix/client
similarity index 100%
rename from static/.well-known/matrix/client
rename to assets/.well-known/matrix/client
diff --git a/static/.well-known/matrix/server b/assets/.well-known/matrix/server
similarity index 100%
rename from static/.well-known/matrix/server
rename to assets/.well-known/matrix/server
diff --git a/static/css/site.css b/assets/css/site.css
similarity index 54%
rename from static/css/site.css
rename to assets/css/site.css
index c758424..609f9bd 100644
--- a/static/css/site.css
+++ b/assets/css/site.css
@@ -1,7 +1,46 @@
-/*
- * Globals
- */
+@font-face {
+  font-family: 'Iosevka Web';
+  src: url('/fonts/iosevka-Regular.woff2') format('woff2');
+  font-weight: 400; font-style: normal; font-display: swap;
+}
+@font-face {
+  font-family: 'Iosevka Web';
+  src: url('/fonts/iosevka-Bold.woff2') format('woff2');
+  font-weight: 700; font-style: normal; font-display: swap;
+}
+@font-face {
+  font-family: 'Iosevka Web';
+  src: url('/fonts/iosevka-Italic.woff2') format('woff2');
+  font-weight: 400; font-style: italic; font-display: swap;
+}
+
 :root {
+  --bg: #1a1b26;
+  --bg-secondary: #1f2335;
+  --bg-tertiary: #292e42;
+  --fg: #c0caf5;
+  --fg-muted: #a9b1d6;
+  --fg-subtle: #565f89;
+  --border: #292e42;
+  --link: #7aa2f7;
+  --link-hover: #7dcfff;
+  --green: #9ece6a;
+  --red: #f7768e;
+  --yellow: #e0af68;
+  --orange: #ff9e64;
+  --purple: #bb9af7;
+  --cyan: #7dcfff;
+  --ml-base: #1f2335;
+  --ml-mid: #3b4261;
+  --ml-accent: #7aa2f7;
+  --ml-accent-fg: #1a1b26;
+  --blk: #292e42;
+  --blu: #7aa2f7;
+  --grn: #9ece6a;
+  --ylw: #e0af68;
+  --mag: #bb9af7;
+  --cyn: #7dcfff;
+  --brblk: #565f89;
   --tokyonight-bg: #1a1b26;
   --tokyonight-fg: #c0caf5;
   --tokyonight-blue: #7aa2f7;
@@ -9,34 +48,9 @@
   --tokyonight-red: #f7768e;
   --tokyonight-yellow: #e0af68;
   --tokyonight-comment: #565f89;
-  --cyan:  #565f89;
-  --bg:    #1a1b26; /* colors[0] */
-  --fg:    #a9b1d6; /* colors[1] */
-  --blk:   #32344a; /* colors[2] */
-  --red:   #f7768e; /* colors[3] */
-  --grn:   #9ece6a; /* colors[4] */
-  --ylw:   #e0af68; /* colors[5] */
-  --blu:   #7aa2f7; /* colors[6] */
-  --mag:   #ad8ee6; /* colors[7] */
-  --cyn:   #0db9d7; /* colors[8] */
-  --brblk: #444b6a; /* colors[9] */
-}
-
-@font-face {
-  font-family: "JetBrainsMono Nerd Font";
-  src: url('/fonts/JetBrainsMonoNerdFont-Regular.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
-}
-
-@font-face {
-  font-family: "Jost";
-  src: url('/fonts/Jost-500-Medium.ttf') format('truetype');
-  font-weight: normal;
-  font-style: normal;
 }
 
-
+/* ===== reskinned original site.css (sizing preserved) ===== */
 ::root {
   box-sizing: border-box;
 }
@@ -170,8 +184,8 @@ html {
 body {
   background-color: var(--tokyonight-bg);
   color: var(--tokyonight-fg);
-  /* font-family: 'JetBrainsMono Nerd Font'; */
-  font-family: 'Jost', sans-serif;
+  /* font-family: 'Iosevka Web', ui-monospace, monospace; */
+  font-family: 'Iosevka Web', ui-monospace, monospace;
   margin: 0;
   line-height: 1.5;
 }
@@ -186,11 +200,11 @@ b {
 }
 
 blockquote {
-  background-color: #232635;
+  background-color: #1f2335;
   font-style: italic;
   border: 1px solid;
   border-radius: 4px;
-  border-image: linear-gradient(45deg, #f78c6c, rgb(250,224,66)) 1;
+  border-image: linear-gradient(45deg, #ff9e64, #e0af68) 1;
   padding: 1.4rem 1.4rem 0.4rem 1.4rem;
 }
 
@@ -203,7 +217,7 @@ dt {
 }
 
 dd {
-  border-left: 3px solid #89aaeb;
+  border-left: 3px solid #7aa2f7;
   margin: 10px 40px;
   padding-left: 10px;
 }
@@ -216,7 +230,7 @@ dd {
 }
 
 .subnav {
-  background-color: #232635;
+  background-color: #1f2335;
   display: flex;
   flex-wrap: wrap;
   justify-content: center;
@@ -225,8 +239,8 @@ dd {
   font-weight: bold;
   padding-top: 0.75rem;
   padding-bottom: 0.75rem;
-  border-top: 0.05rem solid #c3e88d;
-  border-bottom: 0.05rem solid #c3e88d;
+  border-top: 0.05rem solid #9ece6a;
+  border-bottom: 0.05rem solid #9ece6a;
 }
 
 .subnav a {  /* margin-top: 2rem; */
@@ -252,13 +266,13 @@ h6 {
 h1 {
   color: var(--tokyonight-blue);
   font-size: 1.3rem;
-  font-family: 'Jost', sans-serif;
+  font-family: 'Iosevka Web', ui-monospace, monospace;
 }
 
 h2 {
   color: var(--cyn);
   line-height: 1.2;
-  font-family: 'Jost', sans-serif;
+  font-family: 'Iosevka Web', ui-monospace, monospace;
 }
 
 h3 {
@@ -268,7 +282,7 @@ h3 {
 
 h4 {
   line-height: 1.0;
-  color: #c3e88d;
+  color: #9ece6a;
 }
 
 a {
@@ -278,11 +292,11 @@ a {
 a:hover,
 a:focus {
   text-decoration: underline;
-  color: #82aaff;
+  color: #7aa2f7;
 }
 
 .anchor {
-  color: #292d3e;
+  color: #292e42;
   float: left;
   padding-right: 4px;
   margin-left: -23px;
@@ -299,13 +313,13 @@ h4:hover .anchor {
 }
 
 kbd {
-  font-family: "JetBrainsMono Nerd Font";
+  font-family: 'Iosevka Web', ui-monospace, monospace;
   font-weight: 200;
 }
 
 pre {
   border: 1px solid var(--tokyonight-blue);
-  background-color: #232635;
+  background-color: #1f2335;
   padding: 1em;
   overflow-x: scroll;
   max-width: 100%;
@@ -321,7 +335,7 @@ code {
 
 pre, code {
   /* font-size: 0.75em; */
-  font-family: "JetBrainsMono Nerd Font";
+  font-family: 'Iosevka Web', ui-monospace, monospace;
 }
 
 strong {
@@ -349,17 +363,17 @@ strong {
   font-size: 1.1rem;
   margin: 0.4rem 0.8rem 0.4rem 0rem;
   font-weight: bold;
-  color: #cdddeb;
+  color: #c0caf5;
 }
 .nav-link:hover,
 .nav-link:focus {
-  color: #fff;
+  color: #c0caf5;
   background-color: transparent;
 }
 
 /* Active state gets a caret at the bottom */
 .nav-link.active {
-  color: #fff;
+  color: #c0caf5;
   font-weight: bolder;
 }
 
@@ -387,7 +401,7 @@ strong {
   background-size: cover;
   background-position: center;
   color: #1a1b26;
-  border-bottom: 1px solid #292d3e;
+  border-bottom: 1px solid #292e42;
 
 
   min-height: 160px;
@@ -395,7 +409,7 @@ strong {
 }
 
 .site-masthead {
-  font-family: sans-serif;
+  font-family: 'Iosevka Web', ui-monospace, monospace;
   font-weight: bold;
   margin-bottom: 0; 
   background-color: rgba(28, 31, 38, 0.5);
@@ -408,11 +422,11 @@ strong {
   margin-bottom: 0rem;
   font-size: 2rem;
   font-weight: bold;
-  color: #82aaff;
+  color: #7aa2f7;
 }
 .site-description {
   font-size: 1.5rem;
-  color: #999;
+  color: #565f89;
 }
 
 @media (max-width: 40em) {
@@ -434,14 +448,14 @@ strong {
 }
 
 .site-post-meta {
-  color: #AAA;
+  color: #a9b1d6;
 }
 
 .site-post-tags {
   margin-top: 3rem;
   margin-bottom: 1.25rem;
   font-size: 1.1rem;
-  color: #999;
+  color: #565f89;
 }
 
 /*
@@ -451,10 +465,10 @@ strong {
 .site-footer {
   padding: 1.3rem 0;
   margin-top: 1rem;
-  color: #cdddeb;
+  color: #c0caf5;
   font-size: 0.8rem;
-  background-color: #232635;
-  border-top: 0.05rem solid #c3e88d;
+  background-color: #1f2335;
+  border-top: 0.05rem solid #9ece6a;
 }
 
 .site-footer p:last-child {
@@ -489,7 +503,7 @@ strong {
 }
 
 hr {
-  border-bottom: 0.05rem solid #c3e88d;
+  border-bottom: 0.05rem solid #9ece6a;
 }
 
 .video::after {
@@ -512,9 +526,9 @@ hr {
   padding: 1rem;
   margin-top: 1rem;
   margin-bottom: 1rem;
-  border: 1px solid #f78c6c;
+  border: 1px solid #ff9e64;
   border-radius: 4px;
-  background-color: #232635;
+  background-color: #1f2335;
 }
 
 .cta p {
@@ -526,25 +540,25 @@ hr {
   padding: 1rem;
   margin-top: 1rem;
   margin-bottom: 1rem;
-  border: 1px solid #c792ea;
+  border: 1px solid #bb9af7;
   border-radius: 4px;
-  background-color: #232635;
+  background-color: #1f2335;
 }
 
 .list-form {
   font-size: 0.8rem;
   padding: 1rem;
   margin-bottom: 1rem;
-  border: 1px solid #c3e88d;
+  border: 1px solid #9ece6a;
   border-radius: 4px;
-  background-color: #232635;
+  background-color: #1f2335;
 }
 
 .list-form-title {
   font-weight: 600;
   font-size: 1.1rem;
   margin-bottom: 0.5rem;
-  color: #c3e88d;
+  color: #9ece6a;
 }
 
 .list-form-label {
@@ -557,10 +571,10 @@ hr {
   padding: 7px 7px;
   margin: 8px 0;
   box-sizing: border-box;
-  border: 1px solid #c3e88d;
+  border: 1px solid #9ece6a;
   border-radius: 4px;
-  background-color: #232635;
-  color: #eeffff;
+  background-color: #1f2335;
+  color: #c0caf5;
 }
 
 .list-form input[type="submit"] {
@@ -568,10 +582,10 @@ hr {
   padding: 10px 10px;
   margin: 8px 0;
   box-sizing: border-box;
-  border: 1px solid #89aaeb;
+  border: 1px solid #7aa2f7;
   border-radius: 4px;
-  background-color: #89aaeb;
-  color: #232635;
+  background-color: #7aa2f7;
+  color: #1f2335;
 }
 
 .newsletter-text {
@@ -580,20 +594,20 @@ hr {
 .register-button {
   width: 60%;
   padding: 10px 10px;
-  border: 1px solid #89aaeb;
+  border: 1px solid #7aa2f7;
   border-radius: 4px;
-  background-color: #89aaeb;
-  color: #232635;
+  background-color: #7aa2f7;
+  color: #1f2335;
 }
 
 a:hover.register-button,
 a:focus.register-button {
-  color: #232635;
+  color: #1f2335;
 }
 
 aside.content-panel {
   margin-top: 0.75rem;
-  background-color: #232635;
+  background-color: #1f2335;
   border: 1px solid #565f89;
   border-radius: 6px;
   padding: 1rem;
@@ -614,7 +628,7 @@ aside.content-panel {
 #tableOfContentContainer nav ul li > ul {
   margin-left: 1rem;
   padding-left: 0.5rem;
-  border-left: 1px solid #444b6a;
+  border-left: 1px solid #565f89;
 }
 
 #tableOfContentContainer nav li {
@@ -806,7 +820,7 @@ table {
 }
 
 th, td {
-  border: 1px solid #444;
+  border: 1px solid #565f89;
   padding: 0.5rem 0.75rem;
   text-align: left;
 }
@@ -817,7 +831,7 @@ th {
 }
 
 td {
-  background-color: #24283b; /* Slightly lighter bg */
+  background-color: #1f2335; /* Slightly lighter bg */
   color: #a9b1d6;
 }
 
@@ -849,3 +863,218 @@ td {
     color: #7aa2f7;
   }
 }
+
+/* ---- vim modeline (from forums.tonybtw.com) ---- */
+body { padding-bottom: 2.5rem; }
+
+footer.modeline {
+  position: fixed; left: 0; right: 0; bottom: 0; z-index: 50;
+  background: var(--bg); border-top: 1px solid var(--border);
+  font-size: 0.85rem; line-height: 1.9; overflow: hidden;
+}
+.ml-row { display: flex; align-items: stretch; white-space: nowrap; }
+.ml-a, .ml-b, .ml-c { padding: 0 0.6rem; }
+.ml-a { background: var(--ml-accent); color: var(--ml-accent-fg); font-weight: 700; }
+.ml-b { background: var(--ml-mid); color: var(--fg-muted); }
+.ml-c { background: var(--ml-base); color: var(--fg-muted); }
+.ml-fill { flex: 1; background: var(--bg); min-width: 1rem; }
+.ml-sep::before { display: inline-block; }
+.ml-fwd::before { content: "\e0b0"; }
+.ml-bwd::before { content: "\e0b2"; }
+.sep-a-b   { color: var(--ml-accent); background: var(--ml-mid); }
+.sep-b-c   { color: var(--ml-mid);    background: var(--ml-base); }
+.sep-c-bar { color: var(--ml-base);   background: var(--bg); }
+.sep-bar-c { color: var(--ml-base);   background: var(--bg); }
+.sep-c-b   { color: var(--ml-mid);    background: var(--ml-base); }
+.sep-b-a   { color: var(--ml-accent); background: var(--ml-mid); }
+
+/* code blocks: ONE box. plain <pre> and the pandoc wrapper both get exactly one border. */
+pre { border: 1px solid var(--border); background-color: var(--bg-secondary); overflow-x: auto; }
+
+div.sourceCode {
+  background: var(--bg-secondary);
+  border: 1px solid var(--border);
+  border-radius: 6px;
+  margin: 1rem 0;
+  overflow: hidden;
+}
+pre.sourceCode {
+  margin: 0;
+  padding: 0.85rem 1rem;
+  background: none;
+  border: none;
+  border-radius: 0;
+  overflow-x: auto;
+}
+pre.sourceCode code, div.sourceCode code { color: var(--fg); white-space: pre; word-break: normal; }
+.sourceCode a { color: inherit; text-decoration: none; }
+
+/* pandoc/skylighting token colours -> tokyo night */
+.sourceCode .kw, .sourceCode .cf              { color: var(--purple); }
+.sourceCode .fu, .sourceCode .ex, .sourceCode .bu { color: var(--link); }
+.sourceCode .dt                                { color: var(--cyan); }
+.sourceCode .st, .sourceCode .ch, .sourceCode .vs, .sourceCode .ss { color: var(--green); }
+.sourceCode .co                                { color: var(--fg-subtle); font-style: italic; }
+.sourceCode .dv, .sourceCode .bn, .sourceCode .fl, .sourceCode .cn { color: var(--orange); }
+.sourceCode .va                                { color: var(--yellow); }
+.sourceCode .at, .sourceCode .pp               { color: var(--cyan); }
+.sourceCode .op                                { color: var(--fg-muted); }
+
+/* ===== overrides: forums-style header + sticky TOC + responsive cards ===== */
+
+.site-header {
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: space-between;
+  flex-wrap: wrap;
+  gap: 1rem;
+  background-color: var(--bg-secondary);
+  background-image: none;
+  border-bottom: 1px solid var(--border);
+  min-height: 0;
+  padding: 1rem 2rem;
+  color: var(--fg);
+}
+.site-masthead {
+  background-color: transparent;
+  box-shadow: none;
+  border: none;
+  width: 100%;
+}
+.navbar {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  width: 100%;
+  flex-wrap: wrap;
+  gap: 1rem;
+  padding: 0;
+}
+.navbar-brand {
+  font-size: 1.15rem;
+  font-weight: 700;
+  background: linear-gradient(to right, var(--link), var(--purple));
+  -webkit-background-clip: text;
+  background-clip: text;
+  -webkit-text-fill-color: transparent;
+  text-decoration: none;
+}
+.navbar-brand:hover { text-decoration: none; filter: brightness(1.15); }
+.nav-menu {
+  display: flex;
+  align-items: center;
+  gap: 1.25rem;
+  list-style: none;
+  margin: 0;
+  padding: 0;
+  flex-wrap: wrap;
+}
+.nav-menu a { color: var(--fg-muted); text-decoration: none; }
+.nav-menu a:hover { color: var(--fg); }
+.nav-menu a.discord {
+  background: var(--link);
+  color: var(--ml-accent-fg);
+  padding: 0.3rem 0.8rem;
+  border-radius: 4px;
+  font-weight: 700;
+}
+.nav-menu a.discord:hover { text-decoration: none; background: var(--link-hover); }
+
+/* hamburger (pure CSS, no JS): hidden on desktop */
+.nav-toggle { display: none; }
+
+@media (max-width: 768px) {
+  .nav-toggle {
+    display: block;
+    background: none;
+    border: none;
+    cursor: pointer;
+    color: var(--fg);
+    font-size: 1.6rem;
+    line-height: 1;
+    padding: 0 0.25rem;
+    order: 2;
+  }
+  .nav-menu {
+    display: none;
+    flex-basis: 100%;
+    flex-direction: column;
+    align-items: stretch;
+    gap: 0;
+    order: 3;
+    margin-top: 0.5rem;
+  }
+  .nav-toggle-cb:checked ~ .nav-menu { display: flex; }
+  .nav-menu li { width: 100%; }
+  .nav-menu li a {
+    display: block;
+    padding: 0.7rem 0.25rem;
+    border-top: 1px solid var(--border);
+  }
+  .nav-menu a.discord {
+    display: inline-block;
+    width: auto;
+    margin: 0.6rem 0.25rem 0;
+    border-top: none;
+  }
+}
+
+.site-post-title { text-align: center; }
+.site-post-meta { text-align: center; margin-bottom: 1.5rem; }
+
+main.container > .row {
+  display: flex;
+  flex-wrap: nowrap;
+  align-items: flex-start;
+  gap: 2rem;
+}
+main.container > .row > .column { flex: 1 1 auto; min-width: 0; width: auto; max-width: none; }
+aside.content-panel {
+  flex: 0 0 260px;
+  align-self: flex-start;
+  position: sticky;
+  top: 1.5rem;
+  max-height: calc(100vh - 3rem);
+  overflow-y: auto;
+}
+.content-panel .toc-label {
+  font-size: 0.8rem;
+  text-transform: uppercase;
+  letter-spacing: 0.05em;
+  color: var(--fg-subtle);
+  display: block;
+  margin-bottom: 0.5rem;
+}
+
+@media (max-width: 900px) {
+  main.container > .row { flex-direction: column; }
+  aside.content-panel { display: none; }
+}
+
+/* cards: drop the fixed 426px width so the grid is responsive */
+.tutorial-card { width: auto; }
+.tutorial-card:hover { border-color: var(--link); }
+
+/* ---- tag chips ---- */
+.card-tags { display: flex; flex-wrap: wrap; gap: 0.4rem; margin-top: 0.6rem; }
+.ctag {
+  font-size: 0.75rem;
+  color: var(--cyan);
+  border: 1px solid var(--border);
+  border-radius: 3px;
+  padding: 0 0.4rem;
+  text-decoration: none;
+}
+.ctag:hover { border-color: var(--cyan); text-decoration: none; }
+
+/* ---- TOC list (pandoc emits a bare <ul>, not <nav>) ---- */
+#tableOfContentContainer ul { list-style: none; padding-left: 0.75rem; margin: 0; }
+#tableOfContentContainer > ul { padding-left: 0; }
+#tableOfContentContainer li { margin: 0.15rem 0; font-size: 0.9rem; }
+#tableOfContentContainer a { color: var(--link); text-decoration: none; }
+#tableOfContentContainer a:hover { text-decoration: underline; }
+#tableOfContentContainer ul ul { margin-left: 0.75rem; padding-left: 0.5rem; border-left: 1px solid var(--border); }
+
+/* ---- article body images (match original: full-width, centered) ---- */
+#content img { max-width: 100%; width: auto; height: auto; display: block; margin: 1rem auto; border-radius: 8px; }
diff --git a/assets/fonts/iosevka-Bold.woff2 b/assets/fonts/iosevka-Bold.woff2
new file mode 100644
index 0000000..198491f
Binary files /dev/null and b/assets/fonts/iosevka-Bold.woff2 differ
diff --git a/assets/fonts/iosevka-Italic.woff2 b/assets/fonts/iosevka-Italic.woff2
new file mode 100644
index 0000000..7e29f15
Binary files /dev/null and b/assets/fonts/iosevka-Italic.woff2 differ
diff --git a/assets/fonts/iosevka-Regular.woff2 b/assets/fonts/iosevka-Regular.woff2
new file mode 100644
index 0000000..6562fd6
Binary files /dev/null and b/assets/fonts/iosevka-Regular.woff2 differ
diff --git a/assets/img/community/argos/gif1.gif b/assets/img/community/argos/gif1.gif
new file mode 100644
index 0000000..767ce70
Binary files /dev/null and b/assets/img/community/argos/gif1.gif differ
diff --git a/assets/img/community/argos/gif2.gif b/assets/img/community/argos/gif2.gif
new file mode 100644
index 0000000..64821be
Binary files /dev/null and b/assets/img/community/argos/gif2.gif differ
diff --git a/assets/img/community/argos/gif3.gif b/assets/img/community/argos/gif3.gif
new file mode 100644
index 0000000..4d5d56a
Binary files /dev/null and b/assets/img/community/argos/gif3.gif differ
diff --git a/assets/img/community/argos/gif4.gif b/assets/img/community/argos/gif4.gif
new file mode 100644
index 0000000..763a216
Binary files /dev/null and b/assets/img/community/argos/gif4.gif differ
diff --git a/assets/img/community/argos/scrshot1.png b/assets/img/community/argos/scrshot1.png
new file mode 100644
index 0000000..3efa556
Binary files /dev/null and b/assets/img/community/argos/scrshot1.png differ
diff --git a/assets/img/community/emacs-guide/emacs-1.png b/assets/img/community/emacs-guide/emacs-1.png
new file mode 100644
index 0000000..dae4eba
Binary files /dev/null and b/assets/img/community/emacs-guide/emacs-1.png differ
diff --git a/assets/img/community/emzy/nix-search-tv-showcase.png b/assets/img/community/emzy/nix-search-tv-showcase.png
new file mode 100644
index 0000000..3db84db
Binary files /dev/null and b/assets/img/community/emzy/nix-search-tv-showcase.png differ
diff --git a/static/img/community/errium/frfr.jpg b/assets/img/community/errium/frfr.jpg
similarity index 100%
rename from static/img/community/errium/frfr.jpg
rename to assets/img/community/errium/frfr.jpg
diff --git a/assets/img/community/nullsector-dev/bspwm.png b/assets/img/community/nullsector-dev/bspwm.png
new file mode 100644
index 0000000..7f3d38b
Binary files /dev/null and b/assets/img/community/nullsector-dev/bspwm.png differ
diff --git a/assets/img/community/nullsector-dev/bspwmss.png b/assets/img/community/nullsector-dev/bspwmss.png
new file mode 100644
index 0000000..b6a87b8
Binary files /dev/null and b/assets/img/community/nullsector-dev/bspwmss.png differ
diff --git a/assets/img/community/nullsector-dev/freebsd.png b/assets/img/community/nullsector-dev/freebsd.png
new file mode 100644
index 0000000..d53be92
Binary files /dev/null and b/assets/img/community/nullsector-dev/freebsd.png differ
diff --git a/assets/img/community/zakky/qtile.png b/assets/img/community/zakky/qtile.png
new file mode 100644
index 0000000..a0b3e57
Binary files /dev/null and b/assets/img/community/zakky/qtile.png differ
diff --git a/assets/img/dwl.png b/assets/img/dwl.png
new file mode 100644
index 0000000..f0f305d
Binary files /dev/null and b/assets/img/dwl.png differ
diff --git a/assets/img/dwm.png b/assets/img/dwm.png
new file mode 100755
index 0000000..8a0e5b3
Binary files /dev/null and b/assets/img/dwm.png differ
diff --git a/assets/img/favicon.png b/assets/img/favicon.png
new file mode 100644
index 0000000..3b07381
Binary files /dev/null and b/assets/img/favicon.png differ
diff --git a/assets/img/hyprland.png b/assets/img/hyprland.png
new file mode 100644
index 0000000..a8bd869
Binary files /dev/null and b/assets/img/hyprland.png differ
diff --git a/assets/img/lfs.png b/assets/img/lfs.png
new file mode 100644
index 0000000..982419e
Binary files /dev/null and b/assets/img/lfs.png differ
diff --git a/assets/img/mangowc.png b/assets/img/mangowc.png
new file mode 100644
index 0000000..5d6636a
Binary files /dev/null and b/assets/img/mangowc.png differ
diff --git a/assets/img/neovim.png b/assets/img/neovim.png
new file mode 100755
index 0000000..ad34377
Binary files /dev/null and b/assets/img/neovim.png differ
diff --git a/assets/img/niri.png b/assets/img/niri.png
new file mode 100644
index 0000000..e74fb28
Binary files /dev/null and b/assets/img/niri.png differ
diff --git a/assets/img/nixos-from-scratch.png b/assets/img/nixos-from-scratch.png
new file mode 100644
index 0000000..05b03f8
Binary files /dev/null and b/assets/img/nixos-from-scratch.png differ
diff --git a/assets/img/nixos-hyprland.png b/assets/img/nixos-hyprland.png
new file mode 100644
index 0000000..151fa88
Binary files /dev/null and b/assets/img/nixos-hyprland.png differ
diff --git a/assets/img/quickshell.png b/assets/img/quickshell.png
new file mode 100644
index 0000000..652dd98
Binary files /dev/null and b/assets/img/quickshell.png differ
diff --git a/assets/img/suckless-nixos.png b/assets/img/suckless-nixos.png
new file mode 100644
index 0000000..429331c
Binary files /dev/null and b/assets/img/suckless-nixos.png differ
diff --git a/assets/img/tmux.png b/assets/img/tmux.png
new file mode 100755
index 0000000..295c6d6
Binary files /dev/null and b/assets/img/tmux.png differ
diff --git a/assets/img/vim.png b/assets/img/vim.png
new file mode 100755
index 0000000..4d9c6fc
Binary files /dev/null and b/assets/img/vim.png differ
diff --git a/assets/img/xmonad.png b/assets/img/xmonad.png
new file mode 100644
index 0000000..610323c
Binary files /dev/null and b/assets/img/xmonad.png differ
diff --git a/content/community/bspwm.md b/content/community/bspwm/index.md
similarity index 100%
rename from content/community/bspwm.md
rename to content/community/bspwm/index.md
diff --git a/content/community/emacs-guide.md b/content/community/emacs-guide/index.md
similarity index 100%
rename from content/community/emacs-guide.md
rename to content/community/emacs-guide/index.md
diff --git a/content/community/example.md b/content/community/example.md
deleted file mode 100644
index a0622f4..0000000
--- a/content/community/example.md
+++ /dev/null
@@ -1,69 +0,0 @@
----
-title: "Example Community Article: My Minimal DWM Rice"
-date: 2025-09-15
-author: your-handle
-tags: ["dwm", "rice", "linux", "dotfiles"]
-# Put this file at: content/community/<your-title>.md
-# Screenshots should live under: static/img/community/<your-name>/
----
-
-> This is an example of how to contribute to the **community** section of tonybtw.com.
-> Share a Linux tip, a rice showcase, or a small guide others will enjoy.
-
----
-
-## Short Description
-A lightweight DWM setup using JetBrainsMono Nerd Font, Gruvbox colors, and a few small patches.
-
-## Screenshots
-Place images in the repo at:
-```
-static/img/community/<your-name>/<file>.png
-```
-
-Then reference them in your Markdown like this (Hugo will serve from `/img/...`):
-```
-![My DWM rice](/img/community/your-name/dwm-rice.png)
-```
-![Bugs DWM rice](/img/community/your-name/dwm-rice.png)
-
-## What This Is
-- A quick write-up of your setup or tutorial.
-- Keep it reproducible and concise.
-- Link out to full dotfiles instead of dumping huge configs here.
-
-## Steps / Explanation
-1) Install DWM from source.
-
-2) Apply a couple of patches (e.g., vanity gaps, systray).  
-   Example snippet for fonts in `config.h`:
-```
-static const char *fonts[] = {
-    "JetBrainsMono Nerd Font Mono:style=Bold:size=14",
-};
-```
-
-3) Set some Gruvbox colors in `config.h`:
-```
-static const char col_gray1[] = "#282828";
-static const char col_gray2[] = "#3c3836";
-static const char col_gray3[] = "#ebdbb2";
-```
-
-4) Rebuild and start DWM. Include a short note on any keybinds you changed and why.
-
-## Tips for Good Submissions
-- Use fenced code blocks (three backticks) for configs and commands.
-- Add 1–2 screenshots (compressed PNG/JPEG/WebP is best).
-- Include a one-sentence summary at the top and a few tags.
-
-## Links
-- Full dotfiles: https://github.com/yourname/dotfiles
-- DWM homepage: https://dwm.suckless.org
-
----
-**File placement recap**
-- This file: `content/community/example.md`
-- Your images: `static/images/community/<your-handle>/...`
-- In Markdown, link images as: `/images/community/<your-handle>/<file>.png`
-
diff --git a/content/community/freebsd.md b/content/community/freebsd/index.md
similarity index 100%
rename from content/community/freebsd.md
rename to content/community/freebsd/index.md
diff --git a/content/community/mango.md b/content/community/mango/index.md
similarity index 100%
rename from content/community/mango.md
rename to content/community/mango/index.md
diff --git a/content/community/nix-search-tv.md b/content/community/nix-search-tv/index.md
similarity index 100%
rename from content/community/nix-search-tv.md
rename to content/community/nix-search-tv/index.md
diff --git a/content/community/qtile.md b/content/community/qtile/index.md
similarity index 100%
rename from content/community/qtile.md
rename to content/community/qtile/index.md
diff --git a/content/community/ZRAM in NixOS - download more RAM?.md b/content/community/zram-in-nixos---download-more-ram/index.md
similarity index 100%
rename from content/community/ZRAM in NixOS - download more RAM?.md
rename to content/community/zram-in-nixos---download-more-ram/index.md
diff --git a/content/org-files/_vim.org b/content/org-files/_vim.org
deleted file mode 100644
index 5883134..0000000
--- a/content/org-files/_vim.org
+++ /dev/null
@@ -1,388 +0,0 @@
-#+title: How to Customize Vim in 2026
-#+author: Tony, btw
-#+date: 2025-10-01
-#+HUGO_TITLE: How to Customize Vim in 2026
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/vim.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/vim
-#+EXPORT_FILE_NAME: index
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless tutorial on how to get vanilla vim up and running.
-
-* Table of Contents :toc:
-- [[#intro][Intro]]
-- [[#install-dependencies-for-vim][Install Dependencies for Vim]]
-  - [[#arch-linux][Arch Linux]]
-  - [[#nixos][NixOS]]
-  - [[#gentoo][Gentoo]]
-- [[#create-config-file][Create config file]]
-- [[#bare-minimum-what-i-use-on-servers][Bare minimum (what i use on servers)]]
-- [[#modularize-options][Modularize options]]
-- [[#keybinds][Keybinds!]]
-- [[#plugins][Plugins]]
-  - [[#colorsvim][Colors.vim]]
-  - [[#fzf-file-searching][Fzf file searching]]
-  - [[#lightline][Lightline]]
-  - [[#lsp][LSP...]]
-- [[#outro][Outro]]
-
-* Intro
-What's up guys, my name is Tony, and today, I'm going to give you a quick and painless guide on Vim.
-
-Vim is a blazingly fast text editor that leverages different modes in order to facilitate a keyboard centric efficient experience.
-
-I use neovim on my main machine, but I find myself on servers a lot, or inside of install iso images, where I only have access to vi, or vim if I'm lucky. That's why I always keep my vanilla vim config up to date.
-
-* Install Dependencies for Vim
-
-To get things started, we're gonna need some dependencies. I have a written article to accompany this tutorial in a link below the subscribe button that will show you how to install these on your favorite operating system, but for today's guide, we're going to be using Arch, btw, so heres what we need:
-
-#+begin_src
-yay -S git vim ripgrep fd fzf rust-analzyer
-#+end_src
-
-- git
-- vim
-- ripgrep
-- fd
-- fzf
-- rust_analyzer
-
-** Arch Linux
-
-#+begin_src
-sudo pacman -S git vim ripgrep fd fzf rust-analyzer
-#+end_src
-
-** NixOS
-
-#+begin_src nix
-# vim.nix
-{ config, pkgs, lib, ...}
-
-{
-  # Install Vim and dependencies
-  home.packages = with pkgs; [
-    # Tools required for Telescope
-    ripgrep
-    fd
-    fzf
-    # Language Servers
-    rust-analzyer
-  ];
-
-  programs.git.enable = true;
-  programs.vim.enable = true;
-
-}
-#+end_src
-
-** Gentoo
-
-#+begin_src sh
-sudo emerge -q \
-  app-shells/fzf \
-  sys-apps/ripgrep \
-  sys-apps/fd \
-  dev-util/rust-analyzer \
-  app-editors/vim
-#+end_src
-
-* Create config file
-ls .vim
-mkdir .vim
-vim .vimrc
-
-#+begin_src vim
-echom "hello world"
-#+end_src
-
-We can use `:so` to source this file immediately
-and we see, 'hello world' in the console.
-
-lets add a print statement to vimrc inside of our .vim folder, so its easier to modularize.
-
-cd .vim
-vim vimrc
-
-#+begin_src vimrc
-echom "subsrcibe to my channel"
-#+end_src
-
-now in our ~/.vimrc, lets source this file
-
-#+begin_src vimrc
-echom "hello world"
-source ~/.vim/vimrc
-#+end_src
-
-Now vim will always load the ~/.vim/vimrc file when launched. we can test by running `vim`
-
-
-* Bare minimum (what i use on servers)
-
-this is my 8 line copy paste that i use on servers, or take with me in isos
-
-#+begin_src vim
-filetype plugin indent on
-set expandtab
-set shiftwidth=4
-set softtabstop=4
-set tabstop=4
-set number
-set relativenumber
-set smartindent
-set showmatch
-set backspace=indent,eol,start
-syntax on
-#+end_src
-
-This will get you by for like 90% of your needs, unless you are into lsps and programming. If you literally just tinker with config files, this is enough.
-
-Let's go further though.
-
-* Modularize options
-
-Let's move these options over to an options file, and lets also add a keybinds file.
-So, lets actually just yank this entire file, since its all options, and then lets press y to yank all of it. Now we can do :e options.vim, to create and open options.vim and just paste this here. we can save this new file with :w, and now if we hit control-o to get back to our vimrc, we can delete all of this by pressing shift v, shift g to highlight everything in visual mode, and press c to delete and enter insert mode, and lets just replace it with source options.vim. Now we can modularize everything and source it right in our vimrc.
-
-#+begin_src
-source ~/.vim/options.vim
-#+end_src
-
-* Keybinds!
-
-for keybinds, lets create a keybinds.vim file. let's just presource it here, since we know its coming.
-
-#+begin_src vim
-source ~/.vim/options.vim
-source ~/.vim/keybinds.vim
-#+end_src
-
-:e keybinds.vim
-
-Lets start by adding a leader key, its going to be the key that we press before hitting a keycombo in order to bind stuff.
-#+begin_src vim
-" Set leader key
-let mapleader = " "
-
-" Open netrw with <leader>cd
-nnoremap <leader>cd :Ex<CR>
-#+end_src
-
-Let's source this file with :so, and now we can test this bind here by pressing space cd (for change directory), and BOOM we're right in our netrw.
-
-We'll certainly add more keybinds later. Let's move onto plugins.
-
-* Plugins
-
-There is a plugin manager called 'plug', but I just wrote my own 6 line function to handle plugins. its a glorified wrapper for `git clone`. You guys can just paste it in here, I'll share it in a link below the subscribe button.
-
-#+begin_src vimscript
-let s:plugin_dir = expand('~/.vim/plugged')
-
-function! s:ensure(repo)
-  let name = split(a:repo, '/')[-1]
-  let path = s:plugin_dir . '/' . name
-
-  if !isdirectory(path)
-    if !isdirectory(s:plugin_dir)
-      call mkdir(s:plugin_dir, 'p')
-    endif
-    execute '!git clone --depth=1 https://github.com/' . a:repo . ' ' . shellescape(path)
-  endif
-
-  execute 'set runtimepath+=' . fnameescape(path)
-endfunction
-#+end_src
-
-We need to add this file to our vimrc like so:
-
-#+begin_src vimrc
-source ~/.vim/options.vim
-source ~/.vim/keybinds.vim
-source ~/.vim/plugins.vim
-#+end_src
-
-
-And to use this plugin script, all we need to do as add a plugin to the bottom like so:
-
-** Colors.vim
-
-First lets head over to this [[https://github.com/ghifarit53/tokyonight-vim][github link]] and take a look at this plugin. We have a simple colorscheme plugin here for the tokyonight flavor, we can yank this url here, and throw it in the bottom of our plugin.vim:
-
-#+begin_src vim
-call s:ensure('ghifarit53/tokyonight-vim')
-#+end_src
-
-And lets source this file, and we see that tokyonight starts to download. Now that its downloaded, we can see it worked by typing :colorscheme tokyonight.
-
-But lets add a custom colors.vim file to handle some options related to this plugin.
-
-:e colors.vim (or space cd, and %colors.vim)
-
-** Fzf file searching
-
-One of the best plugins for neovim besides treesitter is Telescope, but we can achieve the same thing in vanilla vim here with f (zed) f .vim
-
-#+begin_src
-call s:ensure('junegunn/fzf')
-call s:ensure('junegunn/fzf.vim')
-#+end_src
-Source this file now to install these with :so
-
-And let's create fzf.vim to setup some options and binds for it:
-:e fzf.vim
-
-#+begin_src
-" FZF keymaps (requires Plug 'junegunn/fzf.vim')
-
-" Files
-nnoremap <leader>ff :Files<CR>
-nnoremap <leader>fo :History<CR>
-nnoremap <leader>fb :Buffers<CR>
-nnoremap <leader>fq :CList<CR>    " For quickfix list
-nnoremap <leader>fh :Helptags<CR>
-
-" Grep current string
-nnoremap <leader>fs :Rg <C-r><C-w><CR>
-
-" Grep input string (fzf prompt)
-nnoremap <leader>fg :Rg<Space>
-
-" Grep for current file name (without extension)
-nnoremap <leader>fc :execute 'Rg ' . expand('%:t:r')<CR>
-
-" Find files in your Vim config
-nnoremap <leader>fi :Files ~/.vim<CR>
-#+end_src
-
-so now we can type space ff and we see our files. let's clean this up though, this is way too many files by default
-
-First lets change fzf to point to fd instead of find. This has to be done in our .bashrc, or .zshrc if you're into that
-
-#+begin_src bash
-export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow'
-#+end_src
-
-Now we can create a file that tells fd what to ignore called `.fdignore` like so:
-
-vim ~/.fdignore
-
-And lets add these 3 folders to it:
-#+begin_src
-undodir/
-plugged/
-.git
-#+end_src
-
-Now lets source bash, and check it out, we only see our files in .vim that we want to see. We can do the same with rg... .rgignore
-
-Let's test rg by typing space fg and searching for vim. nice, we see 19 entries here.
-
-So this is pretty much my fzf.vim config
-
-** Lightline
-Let's get a powerline here:
-#+begin_src
-call s:ensure('itchyny/lightline.vim')
-#+end_src
-
-And lets import our lightline config like so:
-
-:e lightline.vim
-
-TODO Test minimalism
-
-#+begin_src
-set laststatus=2
-let g:lightline = {
-      \ 'colorscheme' : 'tokyonight',
-      \ 'active': {
-      \   'left': [ [ 'mode', 'paste' ],
-      \             [ 'gitbranch', 'readonly', 'filename', 'modified' ] ],
-      \   'right': [ [ 'lineinfo' ], [ 'fileformat', 'fileencoding', 'filetype' ] ]
-      \ },
-      \ 'component_function': {
-      \   'gitbranch': 'FugitiveHead',
-      \   'filename': 'LightlineFilename'
-      \ }
-      \ }
-
-function! LightlineFilename()
-  return expand('%:t') !=# '' ? expand('%:t') : '[No Name]'
-endfunction
-#+end_src
-
-Now we just need to add lightline to our vimrc, and we're good to go.
-
-#+begin_src
-source ~/.vim/lightline.vim
-#+end_src
-** LSP...
-Alright so this is the hard part. an lsp that works on vim!
-I've tried to make this as simple as possible so let's roll with it. First lets download this plugin:
-
-#+begin_src
-call s:ensure('yegappan/lsp')
-#+end_src
-
-Lets create our lsp.vim file, and just paste this in there (my lsp config)
-#+begin_src
-" Enable diagnostics highlighting
-let lspOpts = #{autoHighlightDiags: v:true}
-autocmd User LspSetup call LspOptionsSet(lspOpts)
-let lspServers = [
-      \ #{
-      \   name: 'rust-analyzer',
-      \   filetype: ['rust'],
-      \   path: 'rust-analyzer',
-      \   args: []
-      \ }
-      \ ]
-
-autocmd User LspSetup call LspAddServer(lspServers)
-
-" Key mappings
-nnoremap gd :LspGotoDefinition<CR>
-nnoremap gr :LspShowReferences<CR>
-nnoremap K  :LspHover<CR>
-nnoremap gl :LspDiag current<CR>
-nnoremap <leader>nd :LspDiag next \| LspDiag current<CR>
-nnoremap <leader>pd :LspDiag prev \| LspDiag current<CR>
-inoremap <silent> <C-Space> <C-x><C-o>
-
-" Set omnifunc for completion
-autocmd FileType php setlocal omnifunc=lsp#complete
-
-" Custom diagnostic sign characters
-autocmd User LspSetup call LspOptionsSet(#{
-    \   diagSignErrorText: '✘',
-    \   diagSignWarningText: '▲',
-    \   diagSignInfoText: '»',
-    \   diagSignHintText: '⚑',
-    \ })
-
-#+end_src
-
-You have to install rust_analyzer, I already have it installed, but on arch, we can do it like so:
-
-#+begin_src
-npm install -g rust_analzyer
-#+end_src
-
-And we see we have rust analyzer here, so lets open a rust project and test if its working.
-
-vim ~/repos/oxwm/src/main.rs
-and we can test hover with shift k, and if we add bad code here we should see an error.
-Bad Code
-And go to definition works!
-
-* Outro
-
-Alright, thats gonna be it for todays video. If you have any questions or recommendations on any other linux related content, as usual just drop a comment.
-
-It wouldn't be a proper video without an obligatory neofetch.
diff --git a/content/org-files/dwl.org b/content/org-files/dwl.org
deleted file mode 100644
index b842fc9..0000000
--- a/content/org-files/dwl.org
+++ /dev/null
@@ -1,318 +0,0 @@
-#+title: How to Install and Customize DWL | Wayland Minimalism Endgame?
-#+author: Tony, btw
-#+date: 2025-09-05
-#+HUGO_TITLE: How to Install and Customize DWL | Wayland Minimalism Endgame?
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/dwl.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/dwl
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless guide on how to install and customize DWL, which is a DWM port to wayland, more or less. Is it the end game of desktop minimalism?
-
-* Table of Contents :toc:
-- [[#intro][Intro]]
-- [[#install-dependencies-for-dwl][Install Dependencies for DWL]]
-  - [[#installation-commands-by-distribution][Installation Commands by Distribution]]
-- [[#create-config-file][Create config file]]
-  - [[#patch-this-shit-so-we-can-use-monitors][patch this shit so we can use monitors...]]
-- [[#load-dwl][Load DWL]]
-- [[#slstatus][Slstatus]]
-- [[#wallpaper][Wallpaper]]
-- [[#screenshot-script][Screenshot Script]]
-- [[#remove-boxes-and-other-cleanup][Remove Boxes, and other cleanup.]]
-- [[#keybinds][Keybinds]]
-  - [[#application-launchers][Application Launchers]]
-  - [[#screenshots][Screenshots]]
-  - [[#window-management][Window Management]]
-  - [[#layout-management][Layout Management]]
-  - [[#status-bar-and-gaps][Status Bar and Gaps]]
-  - [[#tag-management-workspaces][Tag Management (Workspaces)]]
-  - [[#monitor-management][Monitor Management]]
-  - [[#system-control][System Control]]
-- [[#final-thoughts][Final Thoughts]]
-
-* Intro
-What's up guys, my name is Tony, and today I'm gonna give you a quick and painless guide on installing and configuring DWL.
-
-DWL is basically a drop in replacement for DWM, but for the wayland display server. DWM is often reffered to as the most minimal window manager you can run on xorg, however, due to xorg's client/server model, many people view wayland as a better late-game solution for security and simplicity.
-
-If you're someone who loves the simplicity, extensibility, and minimality of DWM, but prefers the wayland display protocol over xorg, this is the perfect solution for you. Let's jump right into it.
-
-* Install Dependencies for DWL
-
-Alright so I'm on arch linux, btw, but this is going to work on Nix, gentoo, etc. I'll leave install instructions for all 3 of those distributions in this written guide in a link below the subscribe button.
-
-For arch, here are the dependencies we need to install:
-
-1. wayland, wayland-protocols
-2. wlroots_0_19 (dependency for dwl)
-3. foot (terminal emulator)
-4. base-devel (so we can compile dwl)
-5. git (to clone the 2 repos for dwl, and slstatus)
-6. wmenu (a dmenu clone for wayland)
-7. wl-clipboard (wayland clipboard tool)
-8. grim, slurp for screenshots
-9. swaybg (for wallpapers)
-10. firefox (web browser)
-11. ttf-jetbrains-mono-nerd (font)
-
-And let's clone dwl, and slstatus while we're at it.
-#+begin_src sh
-git clone https://codeberg.org/dwl/dwl.git
-git clone https://git.suckless.org/slstatus
-#+end_src
-
-Alright, let's start modifying dwl before we launch it.
-
-** Installation Commands by Distribution
-
-*** Arch Linux
-#+begin_src sh
-sudo pacman -S wayland wayland-protocols wlroots foot base-devel git wmenu wl-clipboard grim slurp swaybg firefox ttf-jetbrains-mono-nerd
-#+end_src
-
-*** Gentoo Linux
-#+begin_src sh
-sudo emerge -av dev-libs/wayland dev-libs/wayland-protocols gui-libs/wlroots x11-terms/foot sys-devel/base-devel dev-vcs/git gui-apps/wmenu gui-apps/wl-clipboard media-gfx/grim gui-apps/slurp gui-apps/swaybg www-client/firefox media-fonts/jetbrains-mono
-#+end_src
-
-*** NixOS
-Add to your =configuration.nix=:
-#+begin_src nix
-environment.systemPackages = with pkgs; [
-  wayland
-  wayland-protocols
-  wlroots_0_19
-  foot
-  git
-  wmenu
-  wl-clipboard
-  grim
-  slurp
-  swaybg
-  firefox
-  jetbrains-mono
-];
-#+end_src
-
-
-* Create config file
-Let's jump into our config.def.h file and setup some sane defaults before launching into dwl
-
-As always, I'm going to change my mod key from alt to super. We can do that here on line 110:
-
-#+begin_src c
-#define MODKEY WLR_MODIFIER_LOGO
-#+end_src
-
-And on line 66, we have the repeat delay settings right here:
-
-#+begin_src c
-static const int repeat_rate = 35;
-static const int repeat_delay = 200;
-#+end_src
-
-Also, lets change up some keybinds here to what I'm used to.
-
-#+begin_src c
-static const Key keys[] = {
-    { MODKEY,                    XKB_KEY_d,          spawn,          {.v = wmenucmd} },
-    { MODKEY,                    XKB_KEY_Return,     spawn,          {.v = termcmd} },
-	{ MODKEY,                    XKB_KEY_q,          killclient,     {0} },
-
-    // To avoid duplicate keybind, swap inc master to p
-    { MODKEY,                    XKB_KEY_p,          incnmaster,     {.i = -1} },
-};
-#+end_src
-
-I just like to change my terminal to super enter, my run prompt to super d, and my kill client with super q.
-Alright I think that should be good enough for a first build. Let's save and quit this file, run sudo make clean install,
-lets jump into a tty, and run dwl.
-
-** TODO patch this shit so we can use monitors...
-
-* Load DWL
-We're in dwl now by and as you can see, it's literally just a blank screen with a mouse cursor. Super minimal.
-
-Ok so because dwl is so minimal, we literally have to patch it to get a bar. So lets open firefox here, we have our wmenu binded to super d, and lets type firefox (we'll customize that later), and lets search dwl patches. Here the 2nd link, we see a community repo of patches. Link will be provided to this below the subscribe button.
-
-Let's grab the bar patch, and apply it. Save it to dotfiles/dwl/patches
-
-#+begin_src sh
-cd ~/dotfiles/dwl
-patch -i patches/bar.diff
-#+end_src
-
-And that looks good. Let's customize it a little bit here with the font.
-Open up config.def.h and specify the font here:
-#+begin_src c
-static const char *fonts[]                 = {"JetBrainsMono Nerd Font Mono:style=Bold:size=16"};
-#+end_src
-
-While we're in here, let's make our wmenu prompt look a little better by changing our wmenu command to this:
-
-#+begin_src c
-static const char *wmenucmd[] = {
-    "wmenu-run",
-    "-f", "JetBrainsMono Nerd Font 16",
-    "-l", "10",
-    NULL
-};
-#+end_src
-
-This just tells wmenu to run in a list of 10 items vertically, and changes the font to match our bar.
-Alright, we're ready to bounce rebuild dwl, and relaunch it. Let's give it a go.
-
-#+begin_src sh
-rm config.h
-sudo make clean install
-#+end_src
-
-Why we remove config.h is because config.def.h gets copied into config.h every time we rebuild, and if config.h is already there, we wont see our changes.
-
-We can quit back to the tty with super shift q, and lets run dwl again by typing dwl. Awesome. There is our bar. And if we run wmenu with super d, we see it matches our new setup, and is actually readable. Sweet.
-
-Let's jump into slstatus.
-
-* Slstatus
-So we've cloned slstatus, we really just need to build it. Let's cd into it for now and just use the defaults.
-
-Let's run sudo make clean install. ok lets quit out of dwl here, and now instead of running dwl, lets run
-
-#+begin_src sh
-slstatus -s | dwl
-#+end_src
-
-That is going to tell slstatus to print to std out, and dwl will take it in.
-Now we have a status bar on the right side. It's minimal for now but we'll fix it up later.
-
-* Wallpaper
-We need a wallpaper. With swaybg, we can set one, but we need to download one first. so lets open firefox, and head over to wallhaven.cc and pick one from there.
-
-Let's grab this one, and put it in ~/walls/wall1.png
-
-Now we can set that with
-
-#+begin_src sh
-swaybg -i ~/walls/wall1.png & disown
-#+end_src
-
-Let's add disown here so when we close this terminal, our wallpaper persists.
-
-But we see the issue here, we want this wallpaper to be enabled whenever we launch dwl.
-So we need to create a 1 line startup script. Let's just do it in our home directory for now, and if you want to use it in a display manager, i advise you move it over to .local/bin, and add that to your path. I'll leave instructions below on that, but for now lets just make a new file caled start_dwl.sh
-
-#+begin_src sh
-#!/bin/sh
-slstatus -s | dwl -s "sh -c 'swaybg -i /home/tony/walls/wall1.png &'"
-#+end_src
-
-If you want to add this to your path, heres how to do it:
-
-#+begin_src sh
-mkdir ~/.local/bin
-cp ~/start_dwl.sh ~/.local/bin/start_dwl
-vim ~/.bashrc
-export PATH="$HOME/.local/bin:$PATH"
-source ~/.bashrc
-#+end_src
-
-This will create .local/bin, and add this to your existing script path.
-
-We can launch dwl now with ./start_dwl.sh, and there we go. we see slstatus, we see our wallpaper. Awesome.
-
-* Screenshot Script
-We can add a screenshot script here with `grim`, `slurp`, and `wl-copy`
-
-#!/bin/sh
-timeout 10 slurp > /tmp/selection.txt 2>/dev/null
-if [ $? -eq 0 ] && [ -s /tmp/selection.txt ]; then
-    grim -g "$(cat /tmp/selection.txt)" - | wl-copy
-else
-    grim - | wl-copy
-fi
-rm -f /tmp/selection.txt
-
-* Remove Boxes, and other cleanup.
-So at this point, the world is really your oyster. For me, the first thin I see that is a problem, is that I don't like the visual indicator in my workspace numbers that shows what workspaces are occupied. In DWM, there is a patch to remove these boxes, but there isn't one in dwl, so I had to simply modify the source code. It's not that bad, I just jumped into dwl.c and found this section here where that box was drawn, and removed it.
-
-While I was in this file, I did a lot more, because I wanted a specific setup where I could see differentiate my active, occupied, and empty workspaces just like I do in qtile, hyprland, dwm, etc. So I tinkered with this file a lot, and I'm not going to go through all those changes today. I've went ahead and just pulled down my full version of dwl here, and you can too if you'd like, a link is of course below the subscribe button.
-
-Here you can see the behaviour: Teal numbers if occupied, purple underline if active, white number if empty.
-Also, you'll notice I have tweaked my slstatus to accept colors, and underlines as well. That was a heavily lift, but I got it done.
-
-* Keybinds
-
-Here are all the configured keybinds for this dwl setup. MODKEY is typically the Super/Windows key.
-
-** Application Launchers
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + d= | wmenu | Launch application menu |
-| =MODKEY + Return= | foot | Launch terminal |
-
-** Screenshots
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =Ctrl + F12= | snip script | Take screenshot (via script) |
-| =MODKEY + s= | /home/tony/scripts/snip.sh | Take screenshot |
-| =MODKEY + Shift + S= | Screenshot selection | Select area and copy to clipboard |
-
-** Window Management
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + j= | Focus next | Focus next window in stack |
-| =MODKEY + k= | Focus previous | Focus previous window in stack |
-| =MODKEY + q= | Kill client | Close focused window |
-| =MODKEY + Return= | Zoom | Move focused window to master |
-| =MODKEY + Tab= | View last tag | Switch to previously viewed tag |
-| =MODKEY + e= | Toggle fullscreen | Make window fullscreen |
-| =MODKEY + Shift + Space= | Toggle floating | Make window floating/tiled |
-
-** Layout Management
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + t= | Tiled layout | Set layout to tiled |
-| =MODKEY + f= | Floating layout | Set layout to floating |
-| =MODKEY + m= | Monocle layout | Set layout to monocle |
-| =MODKEY + Space= | Toggle layout | Cycle through layouts |
-| =MODKEY + h= | Decrease master | Decrease master area size |
-| =MODKEY + l= | Increase master | Increase master area size |
-| =MODKEY + i= | Increase masters | Increase number of masters |
-| =MODKEY + p= | Decrease masters | Decrease number of masters |
-
-** Status Bar and Gaps
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + b= | Toggle bar | Show/hide status bar |
-| =MODKEY + a= | Toggle gaps | Enable/disable window gaps |
-
-** Tag Management (Workspaces)
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + [1-9]= | View tag | Switch to tag 1-9 |
-| =MODKEY + Shift + [1-9]= | Move to tag | Move window to tag 1-9 |
-| =MODKEY + 0= | View all tags | Show windows from all tags |
-| =MODKEY + Shift + )= | Tag all | Tag window with all tags |
-
-** Monitor Management
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + ,= | Focus left monitor | Focus monitor to the left |
-| =MODKEY + .= | Focus right monitor | Focus monitor to the right |
-| =MODKEY + Shift + <= | Move to left monitor | Move window to left monitor |
-| =MODKEY + Shift + >= | Move to right monitor | Move window to right monitor |
-
-** System Control
-| Key Combination | Action | Description |
-|-----------------|--------|-------------|
-| =MODKEY + Shift + Q= | Quit dwl | Exit window manager |
-| =Ctrl + Alt + Backspace= | Terminate server | Force quit (emergency exit) |
-
-* Final Thoughts
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/dwm.org b/content/org-files/dwm.org
deleted file mode 100644
index 20e1f88..0000000
--- a/content/org-files/dwm.org
+++ /dev/null
@@ -1,289 +0,0 @@
-#+TITLE: DWM on Arch | Minimal Config Tutorial
-#+AUTHOR: Tony, btw
-#+DATE: 2025-04-27
-#+HUGO_TITLE: DWM on Arch | Minimal Config Tutorial
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/dwm.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/www/tonybtw.com
-#+HUGO_SECTION: tutorial/dwm
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: A complete DWM setup on Arch Linux with minimal patches, autostart, custom bar, and keybinds.
-
-* Table of Contents :toc:noexport:
-- [[#introduction][Introduction]]
-- [[#installation][Installation]]
-- [[#modifying-configh-keybinds][Modifying config.h (Keybinds)]]
-- [[#aliases][Aliases]]
-- [[#commands][Commands]]
-- [[#autostart][Autostart]]
-- [[#patches][Patches]]
-- [[#dwmblocks][DWMBlocks]]
-- [[#custom-icons--fonts][Custom Icons & Fonts]]
-- [[#my-personal-keybinds][My personal keybinds]]
-- [[#dwm-keybindings][DWM Keybindings]]
-- [[#final-thoughts][Final Thoughts]]
-
-* Introduction
-
-This is a full DWM tutorial for Arch users who want a minimal, fast, patched build without bloat.
-
-The philosophy of the developers of dwm is as follows:
-Keep things simple, minimal and usable.
-
-#+begin_quote
-"Unfortunately, the tendency for complex, error-prone and slow software seems to be prevalent in the present-day software industry. We intend to prove the opposite with our software projects. "
-– DWM Developers
-#+end_quote
-
-Because of this philosophy, DWM is blazingly fast, and strikes a balance of minimalism, efficienty, and extensibility.
-
-You’ll get a working, beautiful setup with basic patches, autostart, a functional bar, and a clean workflow.
-
-* Installation
-
-The pre-requisites for today's tutorial are: xorg, make, gcc, and a few others. If you follow the video guide,
-I'm starting from almost a brand new arch install, so you can just start from that, and get the following packages like so:
-
-
-#+begin_src sh
-pacman -S git base-devel xorg xorg-xinit xorg-xrandr
-git clone https://git.suckless.org/dwm
-cd dwm
-sudo make clean install
-#+end_src
-
-We will need st as well, a terminal manager made by the developers of dwm. Same concept here.
-
-#+begin_src sh
-git clone https://git.suckless.org/st
-cd st
-sudo make clean install
-#+end_src
-
-Note: If you are on another distribution such as Debian, or Gentoo, getting dwm will be exactly the same, but getting the xorg server and developer tools to build dwm (base-devel on arch) will be slightly different. Refer
-to your distribution's handbook on how to get these tools.
-
-I personally am a 'startx' kinda guy, but if you have a display manager, just add dwm to your display manager list.
-
-Last thing here is to add exec dwm to the .xinitrc file:
-
-#+begin_src sh
-echo 'exec dwm' >> .xinitrc
-#+end_src
-
-* Modifying config.h (Keybinds)
-
-Alright, let's open a terminal here and start modifying config.h.
-
-#+begin_src sh
-chown -R dwm
-cd dwm; vim config.h
-#+end_src
-
-The first thing we want to do is head on down to the modkey section, and change
-mod1mask to mod4mask (this changes the mod key from alt to super)
-
-#+begin_src c
-#define MODKEY Mod4Mask
-#define TAGKEYS(KEY,TAG) \
-	{ MODKEY,                       KEY,      view,           {.ui = 1 << TAG} }, \
-	{ MODKEY|ControlMask,           KEY,      toggleview,     {.ui = 1 << TAG} }, \
-	{ MODKEY|ShiftMask,             KEY,      tag,            {.ui = 1 << TAG} }, \
-	{ MODKEY|ControlMask|ShiftMask, KEY,      toggletag,      {.ui = 1 << TAG} },
-#+end_src
-
-Let's take a look at the keybinds section here, and I'm going to change stuff for my personal needs, you feel free to tinker with this as usual. The usual suspects for me are, change opening a terminal to Super + Enter,
-change the application launcher menu to Super + D, and change closing a program to Super + Q.
-
-#+begin_src c
-static const Key keys[] = {
-	/* modifier                     key        function        argument */
-	{ MODKEY,                       XK_r,      spawn,          {.v = dmenucmd } },
-	{ MODKEY,                       XK_Return, spawn,          {.v = termcmd } },
-	{ MODKEY,                       XK_b,      togglebar,      {0} },
-	{ MODKEY,                       XK_q,      killclient,     {0} },
-	TAGKEYS(                        XK_1,                      0)
-	TAGKEYS(                        XK_2,                      1)
-};
-#+end_src
-
-Once you're done with these first small changes, go ahead and run:
-
-#+begin_src sh
-sudo make clean install; pkill x; startx
-#+end_src
-
-Beautiful. You've succesfully rebuilt your first DWM binary. You can officialy tell all of your friends that you are a C developer. Let's move on to the next step.
-
-* Aliases
-
-For QoL, I like to use 2 aliases for dwm, one to just jump into the config file, and another to rebuild dwm.
-So if you want those, open up your bashrc file and add these aliases:
-
-#+begin_src bash
-alias cdwm="vim ~/dwm/config.h"
-alias mdwm="cd ~/dwm; sudo make clean install; cd -";
-#+end_src
-
-This will make it so you can jump straight into your config.h file, and rebuild dwm from anywhere and return back to whatever directory you were in after rebuilding it.
-
-* Commands
-
-Let's mess with some of the commands. I like to use rofi, although dmenu is perfectly fine if not better, rofi just ports over really nice to all my other configs, so I'll show you how to set that up in dwm.
-
-First, ensure rofi is installed, and a config.rasi exists in .config/rofi/config.rasi (feel free to copy my config.rasi file [[https://www.github.com/tonybanters/rofi][here]])
-
-Let's jump back into config.h, and look at the commands section.
-
-#+begin_src c
-static char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
-static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
-static const char *termcmd[]  = { "st", NULL };
-static const char *firefoxcmd[]  = { "firefox-bin", NULL };
-static const char *slock[]    = { "slock", NULL };
-static const char *screenshotcmd[] = { "/bin/sh", "-c", "maim -s | xclip -selection clipboard -t image/png", NULL };
-static const char *rofi[]  = { "rofi", "-show", "drun", "-theme", "~/.config/rofi/config.rasi", NULL };
-static const char *emacsclient[]  = { "emacsclient", "-c", "-a", "", NULL };
-#+end_src
-
-These are some of my commands. Notice I have rofi, slock which is a minimal screen lock tool, a screenshot command which just utilizes main and xclip, and i've got an emacsclient command. Don't worry about that emacs command if you are below the age of 30.
-
-Make sure to add these commands to the keybind section like so:
-
-#+begin_src c
-static const Key keys[] = {
-	/* modifier                     key        function        argument */
-	{ MODKEY,                       XK_r,      spawn,          {.v = dmenucmd } },
-	{ MODKEY,                       XK_e,      spawn,          {.v = emacsclient } },
-	{ MODKEY,                       XK_Return, spawn,          {.v = termcmd } },
-	{ MODKEY,                       XK_l,      spawn,          {.v = slock } },
-	{ ControlMask,                  XK_Print,  spawn,          {.v = screenshotcmd } },
-	{ MODKEY,                       XK_d,      spawn,          {.v = rofi } },
-	{ MODKEY,                       XK_b,      spawn,          {.v = firefoxcmd } },
-    ...
-};
-#+end_src
-
-* Autostart
-
-Use this to launch programs like wallpaper setter, bar, compositor: (if they are not in .xinitrc)
-
-#+begin_src c
-/* add this to config.h */
-static const char *autostart[] = {
-  "dwm-autostart.sh", NULL
-};
-#+end_src
-
-Example script:
-
-#+begin_src sh
-#!/bin/sh
-xwallpaper --zoom ~/wall.png &
-dwmblocks &
-picom -b
-#+end_src
-
-* Patches
-
-Alright, patches are something that deters people from using dwm because they feel it can be daunting, but its really easy.
-
-Head on over to: [[https://dwm.suckless.org/patches][DWM's Official Community Patch List]]
-
-Grab a patch, vanity-gaps for example, and right click the patch, and save link as. Put this in dwm/patches/
-
-To patch your dwm, just run
-
-#+begin_src sh
-patch -i ~/dwm/patches/name-of-patch.diff
-#+end_src
-
-Hopefully you don't get any errors, but if you do, they are usually pretty simple to resolve. Checkout my video on dwm to learn more about resolving patches.
-
-After that, remake dwm with the `mdwm` alias, and restart x. Boom, your patch is ready to go.
-
-* DWMBlocks
-
-DWM Blocks is a program that renders blocks in the top right of the dwm bar. Similar to widgets in Qtile, or polybar modules. These blocks can all be customizable sh scripts, and ricing this will be for another tutorial, but for now the base version is good enough. You can take mine as well:
-
-Install:
-#+begin_src sh
-git clone https://github.com/tonybanters/dwmblocks
-cd dwmblocks
-sudo make clean install
-#+end_src
-
-Basic usage:
-Add `dwmblocks &` to your autostart script.
-
-* Custom Icons & Fonts
-For a custom font, I like jetbrains mono nerd font, and we can just install it like so:
-
-#+begin_src sh
-sudo pacman -S ttf-jetbrains-mono-nerd
-#+end_src
-
-And we can set that font in `config.h`:
-
-#+begin_src c
-static const char *fonts[] = { "JetBrainsMono Nerd Font:size=14" };
-#+end_src
-
-* My personal keybinds
-
-If you want to just clone my build of dwm, thats perfectly fine, just take a look at this table here for my keybinds as a guide:
-
-* DWM Keybindings
-
-| Modifier            | Key         | Action            | Description                         |
-|---------------------+-------------+-------------------+-------------------------------------|
-| MOD                 | r           | spawn             | Launch dmenu                        |
-| MOD                 | Return      | spawn             | Launch terminal                     |
-| MOD                 | l           | spawn             | Lock screen (slock)                 |
-| Ctrl                | Print       | spawn             | Screenshot                          |
-| MOD                 | d           | spawn             | Launch Rofi                         |
-| MOD                 | b           | togglebar         | Toggle top bar                      |
-| MOD                 | j           | focusstack +1     | Focus next window                   |
-| MOD                 | k           | focusstack -1     | Focus previous window               |
-| MOD                 | i           | incnmaster +1     | Increase master windows             |
-| MOD                 | p           | incnmaster -1     | Decrease master windows             |
-| MOD                 | g           | setmfact -0.05    | Shrink master area                  |
-| MOD                 | h           | setmfact +0.05    | Grow master area                    |
-| MOD                 | z           | incrgaps +3       | Increase gaps                       |
-| MOD                 | x           | incrgaps -3       | Decrease gaps                       |
-| MOD                 | a           | togglegaps        | Toggle gaps                         |
-| MOD+Shift           | a           | defaultgaps       | Reset gaps                          |
-| MOD                 | Tab         | view              | Toggle last workspace               |
-| MOD                 | q           | killclient        | Close focused window                |
-| MOD                 | t           | setlayout tile    | Set tiling layout                   |
-| MOD                 | f           | setlayout float   | Set floating layout                 |
-| MOD                 | m           | setlayout monocle | Set monocle layout                  |
-| MOD                 | c           | setlayout custom1 | Custom layout (slot 3)              |
-| MOD                 | o           | setlayout custom2 | Custom layout (slot 4)              |
-| MOD+Shift           | Return      | setlayout default | Reset to default layout             |
-| MOD+Shift           | f           | fullscreen        | Toggle fullscreen                   |
-| MOD+Shift           | Space       | togglefloating    | Toggle floating                     |
-| MOD                 | 0           | view all tags     | View all workspaces                 |
-| MOD+Shift           | 0           | tag all           | Move window to all tags             |
-| MOD                 | ,           | focusmon -1       | Focus monitor left                  |
-| MOD                 | .           | focusmon +1       | Focus monitor right                 |
-| MOD+Shift           | ,           | tagmon -1         | Send window to monitor left         |
-| MOD+Shift           | .           | tagmon +1         | Send window to monitor right        |
-| MOD                 | 1–9         | view tag N        | Switch to tag N                     |
-| MOD+Shift           | 1–9         | tag window to N   | Move window to tag N                |
-| MOD+Shift           | q           | quit              | Exit DWM                            |
-| (none)              | XF86Audio+  | pactl +3%         | Raise volume                        |
-| (none)              | XF86Audio-  | pactl -3%         | Lower volume                        |
-
-#+caption: Default keybindings in my DWM setup
-
-* Final Thoughts
-
-This setup is minimalist but powerful. From here, you can add more patches (like systray or gaps), or just keep it lean.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/hyprland.org b/content/org-files/hyprland.org
deleted file mode 100644
index 9d9c193..0000000
--- a/content/org-files/hyprland.org
+++ /dev/null
@@ -1,840 +0,0 @@
-#+TITLE: Hyprland on Arch — Minimal Setup Guide
-#+AUTHOR: Tony, btw
-#+DATE: 2025-08-24
-#+HUGO_TITLE: Hyprland on Arch | Minimal Customization Tutorial
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/hyprland.png" :showTableOfContents true
-#+HUGO_CUSTOM_FRONT_MATTER: :showTableOfContents true
-#+HUGO_BASE_DIR: ~/www/tonybtw.com
-#+HUGO_SECTION: tutorial/hyprland
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: A zero to hero Hyprland setup, which if you follow along, will help you produce a rice thats truly yours.
-
-* Table of Contents :toc:noexport:
-- [[#intro][Intro]]
-- [[#install-arch-linux][Install Arch Linux]]
-- [[#install-required-tools-for-hyprland][Install required tools for hyprland]]
-- [[#create-config-file][Create config file]]
-- [[#load-hyprland][Load hyprland]]
-- [[#foot-config][Foot config]]
-- [[#hyprland-and-waybar][Hyprland and Waybar]]
-- [[#waybar][Waybar]]
-  - [[#configjsonc][Config.jsonc]]
-  - [[#styles][Styles]]
-- [[#wallpaper][Wallpaper]]
-- [[#wofi][Wofi]]
-- [[#hyprland-keybinds][Hyprland Keybinds]]
-  - [[#directional-focus][Directional Focus]]
-  - [[#workspaces][Workspaces]]
-  - [[#special-workspace][Special Workspace]]
-  - [[#scroll-to-switch-workspaces][Scroll to Switch Workspaces]]
-- [[#final-thoughts][Final Thoughts]]
-
-* Intro
-What's up guys, my name is Tony, and today, I'm going to give you a quick and painless guide
-on installing Hyprland on Arch linux.
-
-Hyprland is a dynamic window manager and wayland compositor that is highly customizable, and it
-emphasizes aesthetics, functionality, and extensibility.
-
-We're going to be using Arch linux today, but hyprland is available on most distrobutions, so if you
-are a NixOS user, or Gentoo, or even Debian, check out the wiki for installation instructions, but other
-than that, the customization aspect of this guide will still apply to you.
-
-At the end of this guide, you will no longer be using x11, and you will be able to fully
-customize your own build of hyprland on your own hardware.
-
-* Install Arch Linux
-- basic stuff
-- pacstrap everything
-
-The first thing I'm going to do is install a fresh Arch linux, and since today's guide is not about
-how to install Arch linux, I'm going to speed through that process and catch you guys at the login
-screen. If you want help installing arch linux, check out my Arch Linux tutorial.
-
-[[https://youtu.be/oeDbo-HRaZo][Arch Linux Tutorial]]
-
-* Install required tools for hyprland
-
-Alright, so we're staring at a very minimal arch build, we only installed base, base-devel, linux, linux-firmware, and sof-firmware.
-That's all you need to get started, and if you are an arch user, you can start basically anywhere as long as you've installed these
-basic packages, and got a bootloader up and running.
-
-So lets start by installing all of the required packages for today's setup. The beatiful thing about starting on a fresh install
-like this is that, you guys get to see the most minimal setup as possible in terms of packages. So let's grab all the hyprland
-tools.
-
-The 'hyprland' package actually comes with a lot on Arch linux. It comes with the wayland compositor among other things. Let's grab that,
-xorg-xwayland (just in case we need to use xwayland utils), and hyprpaper (a minimal hyprland wallpaper tool)
-
-[[https://archlinux.org/packages/extra/x86_64/hyprland/][Hyprland Arch Wiki Page]]
-
-For other packages, I'm going to be using vim today to edit all the files, you can feel free to use your text editor of choice.
-We need wofi (an application launcher for wayland), foot (a terminal emulator in wayland), waybar (the powerbar that we'll be using today),
-dolphin (a file manager that works in wayland), and firefox. Let's also grab git for version controlling.
-
-Lastly, we want a nerd font to render some of the icons here, so lets grab `ttf-jetbrains-mono-nerd`
-
-And that's basically it. We really don't need much, and if we need anything else along the way, we can just grab it from pacman.
-
-- hyprland
-- vim
-- git
-- foot
-- waybar
-- firefox
-- wofi
-- kitty (hyprland default terminal)
-- dolphin
-- jetbrains mono nerd
-
-#+begin_src sh
-sudo pacman -S hyprland xorg-xwayland hyprpaper
-sudo pacman -S vim wofi git foot waybar firefox dolphin
-sudo pacman -S ttf-jetbrains-mono-nerd
-#+end_src
-
-* Create config file
-
-Let's create the directory for the hyprland config file here, and copy the template config file into it. This is important because we're using foot
-instead of kitty, we have to do this before launching hyprland.
-
-#+begin_src sh
-mkdir -p ~/.config/hypr; cp /usr/share/hypr/hyprland.conf ~/.config/hypr/
-#+end_src
-
-Edit this file, swap kitty with foot.
-
-#+begin_src hyprlang
-$terminal = foot;
-#+end_src
-
-* Load hyprland
-
-We're ready to launch hyprland, and we can do so easily by just typing hyprland.
-
-#+begin_src sh
-hyprland
-#+end_src
-
-From inside of hyprland, we'll open a terminal with super Q
-and lets immediately edit the monitors block:
-
-Since my monitor is 1920x1080, I'll set that in my hyprland config. Also, we'll change this last 'auto' flag to 1.0.
-This is the scale flag, and auto will set it to 1.5.
-
-#+begin_example
-monitor=,1920x1080,auto,1.0
-#+end_example
-
-You can display what monitor we have with:
-
-#+begin_src sh
-hyprctl monitors
-#+end_src
-
-* Foot config
-
-Now lets jump into our foot config to quickly make our terminal readable
-lets set this up,
-#+begin_src sh
-mkdir .config/foot
-vim .config/foot/foot.ini
-#+end_src
-
-#+begin_src ini
-font=JetBrainsMono NF:size=16
-pad=8x8 center-when-maximized-and-fullscreen
-#+end_src
-
-And we're going to go with a tokyonight theme for todays rice, so lets check this website out for tokyonight ports. I'll leave a link
-to this site below the subscribe button of this video.
-
-[[https://wixdaq.github.io/Tokyo-Night-Website/ports.html][Tokyo Night Theme Site]]
-
-Let's navigate to 'foot', and copy this colors block, and add it to our foot.ini file.
-
-#+begin_src ini
-[colors]
-foreground=c0caf5
-background=1a1b26
-
-## Normal/regular colors (color palette 0-7)
-regular0=15161E  # black
-regular1=f7768e  # red
-regular2=9ece6a  # green
-regular3=e0af68  # yellow
-regular4=7aa2f7  # blue
-regular5=bb9af7  # magenta
-regular6=7dcfff  # cyan
-regular7=a9b1d6  # white
-
-## Bright colors (color palette 8-15)
-bright0=414868   # bright black
-bright1=f7768e   # bright red
-bright2=9ece6a   # bright green
-bright3=e0af68   # bright yellow
-bright4=7aa2f7   # bright blue
-bright5=bb9af7   # bright magenta
-bright6=7dcfff   # bright cyan
-bright7=c0caf5   # bright white
-
-## dimmed colors (see foot.ini(5) man page)
-dim0=ff9e64
-dim1=db4b4b
-
-alpha=0.9
-#+end_src
-
-Alright that looks great. Let's jump into the next step
-
-* Hyprland and Waybar
-
-When we modify hyprlands config file, it automatically refreshes hyprland on save, which is convenient.
-lets jump back into the hyprland.conf file and change a few things for QoL
-
-We're gonna use waybar today, and in order to quickly reload that, we can use one line command here:
-Also, to add it to start when we load hyprland, lets add it to exec-once.
-
-#+begin_src conf
-$reload_waybar = pkill waybar; waybar &
-exec-once = waybar &
-#+end_src
-
-And we scroll down here and ensure our reload waybar script is binded:
-
-#+begin_src conf
-bind = $mainMod, R, exec, $reload_waybar
-#+end_src
-
-While we're in the binding section, lets clean up some of these binds. I like Q for quit, Enter for
-terminal, and D for $menu (which is wofi)
-
-#+begin_src conf
-bind = $mainMod, Return, exec, $terminal
-bind = $mainMod, Q, killactive,
-bind = $mainMod, D, exec, $menu
-#+end_src
-
-Now that these are good to go, lets do one or two more huge qol updates:
-
-#+begin_src conf
-input {
-    # xset r rate 200 35
-    # This allows your key repeat rate set to 200ms delay, 35 repeats per second
-    repeat_rate = 35
-    repeat_delay = 200
-}
-
-cursor {
-    # this ensures your mouse cursor doesn't glitch out
-    inactive_timeout = 30
-    no_hardware_cursors = true
-}
-#+end_src
-
-Alright, we should be good to go for now and move on to the next step.
-
-* Waybar
-
-Now that Waybar is binded to super R, lets go ahead and load it once with super R.
-Let's customize this by opening up the config file:
-Lets copy over the default waybar config, since its loading a null config file now.
-To ensure we can edit it, we need to change ownership of the file from root to tony. (use your username here)
-
-#+begin_src bash
-sudo cp -R /etc/xdg/waybar ~/.config/waybar
-sudo chown -R tony:tony .config/waybar
-vim .config/waybar/.
-#+end_src
-
-So this has 2 parts to it, style.css, and config.jsconc. let's start with config.jsonc, thats where all the
-widgets, and workspace stuff lives.
-
-At the top of this file we see layer, position, etc. If you are a bottom bar user, you can swap this to bottom, and it would look like this:
-We're gonna put the bar on the top today, and build it out from there.
-
-** Config.jsonc
-*** Left Modules
-
-So we see in config.jsonc, there are a bunch of modules loaded on the left side.
-
-#+begin_src json
-"modules-left": [
-    "sway/workspaces",
-    "sway/mode",
-    "sway/scratchpad",
-    "custom/media"
-],
-#+end_src
-
-We can delete the bottom 3 of these, they aren't needed. We only want the workspaces module on the left for now
-and since we're not using sway, we're using hyprland, lets just change sway to hyprland. Sway is an i3 clone for
-wayland. Will be a video on that in the future.
-
-#+begin_src json
-"modules-left": [
-    "hyprland/workspaces",
-],
-#+end_src
-
-So this module exists, but its not defined in our file, lets go down to where the sway/workspaces module was defined.
-Luckily, these modules use the same syntax, so all we need to do is switch sway to hyprland here too.
-
-#+begin_src json
-"hyprland/workspaces": {
-    "disable-scroll": true,
-    "all-outputs": true,
-    "warp-on-scroll": false,
-    "format": "{name}: {icon}",
-    "format-icons": {
-        "1": "",
-        "2": "",
-        "3": "",
-        "4": "",
-        "5": "",
-        "urgent": "",
-        "focused": "",
-        "default": ""
-    }
-},
-#+end_src
-
-So lets just uncomment this block, and change 'sway' to 'hyprland'.
-Lets save this file, and reload waybar with that super R keybind.
-
-And now we see this workpace module on the left side. Beautiful. Let's clean this up a little bit.
-
-These Icons are customizable, similar to my dwm config, where if you know whats going on that workspace
-at all times, you can use a font awesome or nerd font icon for that application, and throw it on that
-workspace number. For us today, we're going to just go with the classic 1,2,3,4 ... so lets delete this block
-here, and change this to just {name}
-
-#+begin_src json
-"hyprland/workspaces": {
-    "disable-scroll": true,
-    "all-outputs": true,
-    "warp-on-scroll": false,
-    "format": "{name}",
-},
-#+end_src
-
-We can reload this again with super R, and there we go. much better already.
-
-Also, we'll add persistent-workspaces, so that all the numbers show even if they aren't active.
-
-#+begin_src json
-    "persistent-workspaces": {
-        "*": 9,
-    }
-#+end_src
-
-One more thing for now, lets add the window module that displays what is open in your current window.
-lets just put it on the left side for now
-
-And let's define this module here, and add 2 attributes to it:
-max-length, and separate-outputs: false
-Max length is just making the max length 40 characters, so it doesn't impede on the right side that we'll setup next.
-Separate-outputs: This is for those of you with multiple monitors, it will show the window thats focused on all monitors
-instead of showing it on a per monitor basis.
-
-#+begin_src json
-"modules-left": [
-    "hyprland/workspaces",
-    "hyprland/window"
-],
-
-"hyprland/window": {
-    "max-length": 40,
-    "separate-outputs": false
-},
-#+end_src
-
-Let's work on some of these right-side modules.
-
-*** Center Module
-
-Lets leave this empty for now. It's easier to handle spacing imo if we just do left and right side modules.
-
-#+begin_src json
-"modules-center": [],
-#+end_src
-
-*** Right Modules
-
-Lets start by deleting a lot of these modules. most of them aren't needed, and we are going for a semi-minimal
-config today. Remember, that you can take this information from this tutorial, and really make your bar custom for
-your own setup.
-
-#+begin_src json
-"modules-right": [
-    "mpd",
-    "idle_inhibitor",
-    "pulseaudio",
-    "network",
-    "power-profiles-daemon",
-    "cpu",
-    "memory",
-    "temperature",
-    "backlight",
-    "keyboard-state",
-    "sway/language",
-    "battery",
-    "battery#bat2",
-    "clock",
-    "tray",
-    "custom/power"
-],
-#+end_src
-
-Let's trim this down to just this for now: we can remove all of these, lets remove temperature
-, lets get backlight, keyboard-state, language out of here. if you're on a laptop, keep batery. otherwise, get rid of it.
-lets keep clock, and keep tray. we'll add some in here as well, but this is good for now.
-
-#+begin_src json
-"modules-right": [
-    "network",
-    "cpu",
-    "memory",
-    // "battery",
-    "clock",
-    "tray"
-],
-#+end_src
-
-Let's reload this with super R, and there we go. super minimal config for now. lets add 1 or 2 custom modules here, and then move onto
-the styling.
-
-Let's make this network widget super minimal.
-
-#+begin_src json
-"network": {
-    "format": "Online",
-    "format-disconnected": "Disconnected ()"
-},
-#+end_src
-
-Let's change the CPU widget to something more clean:
-
-#+begin_src json
-"cpu": {
-    "format": "CPU: {usage}%",
-    "tooltip": false
-},
-#+end_src
-
-Same thing for RAM:
-
-#+begin_src json
-"memory": {
-    "format": "Mem: {used}GiB"
-},
-#+end_src
-
-Let's add a disk widget, and this is inspired by DT's xmonad widgets a little bit, which i've been interested in for my qtile setup.
-
-Interval so that it doesnt run every 1 seconds (the default value)
-#+begin_src json
-"disk": {
-    "interval": 60,
-    "path": "/",
-    "format": "Disk: {free}",
-},
-#+end_src
-
-And let's add "disk" to the right modules array:
-
-#+begin_src json
-"modules-right": [
-    "cpu",
-    "memory",
-    "disk",
-    "battery",
-    "clock",
-    "tray"
-],
-#+end_src
-
-Heres the battery modifications: (for those of you with laptops, this should be included)
-
-#+begin_src json
-"battery": {
-    "states": {
-        "good": 80,
-        "warning": 30,
-        "critical": 15
-    },
-    "format": "Bat: {capacity}% {icon} {time}",
-    "format-alt": "Bat: {capacity}%",
-    "format-time": "{H}:{M}",
-    "format-icons": ["", "", "", "", ""]
-},
-#+end_src
-
-And lets add a simple separator module as follows:
-
-#+begin_src json
-"custom/sep": {
-    "format": "|",
-    "interval": 0,
-    "tooltip": false
-},
-#+end_src
-
-Now lets add this separator in between all of our widgets. it will look weird for now, but we'll fix the styling after.
-
-#+begin_src json
-"modules-left": [
-    "hyprland/workspaces",
-    "custom/sep",
-    "hyprland/window",
-    "custom/sep"
-],
-"modules-center": [
-],
-
-"modules-right": [
-    "custom/sep",
-    "network",
-    "custom/sep",
-    "cpu",
-    "custom/sep",
-    "memory",
-    "custom/sep",
-    "disk",
-    "custom/sep",
-    "clock",
-    "custom/sep",
-    "tray"
-],
-#+end_src
-
-And thats it for the modules, we can move into the styles of these now.
-
-** Styles
-
-The first thing we want to do is have our colors match the tokyonight aesthetic, so lets define these colors at the top of the file. Note, you can just copy and
-paste these from my github repo.
-
-[[https://github.com/tonybanters/hyprland-btw][Github Repo]]
-
-#+begin_src css
-@define-color bg    #1a1b26;
-@define-color fg    #a9b1d6;
-@define-color blk   #32344a;
-@define-color red   #f7768e;
-@define-color grn   #9ece6a;
-@define-color ylw   #e0af68;
-@define-color blu   #7aa2f7;
-@define-color mag   #ad8ee6;
-@define-color cyn   #0db9d7;
-@define-color brblk #444b6a;
-@define-color wht   #ffffff;
-#+end_src
-
-Alright, now we see the global styles with '*', lets add some options here.
-
-#+begin_src css
-,* {
-    font-family: "JetBrainsMono Nerd Font", monospace;
-    font-size: 16px;
-    font-weight: bold;
-}
-#+end_src
-
-We're just changing the font to Jetbrains mono, and we are making it bold, and increasing the zie a little bit so its readable.
-
-Now for the actual window on waybar, lets change some stuff here:
-#+begin_src css
-window#waybar {
-  background: @bg;
-  color: @fg;
-}
-#+end_src
-
-Let's get rid of the border, and get rid of the transition propertys for now. Keep it minimal,
-since we added those variables at the top for the colors, its going to make our lives much easier when setting up these styles.
-
-And yea, this is already looking much better as far as usability, and stylistically speaking. Let's keep going.
-
-Lets handle the behaviour of the workspace toggles, so that the colors of the workspaces that have applications running on them
-are all the same, but there is a visual indicator of the active workspace.
-
-#+begin_src css
-#workspaces button {
-    padding: 0 6px;
-    color: @cyn;
-    background: transparent;
-    border-bottom: 3px solid @bg;
-}
-#workspaces button.active {
-    color: @cyn;
-    border-bottom: 3px solid @mag;
-}
-#workspaces button.empty {
-    color: @wht;
-}
-#workspaces button.empty.active {
-    color: @cyn;
-    border-bottom: 3px solid @mag;
-}
-#+end_src
-
-So this basically says that if the workspace is active, it will be visually indicated with the purple underline. if it
-is not active, but not empty, it will still be cyan, but not be underlined. Waybar has a weird issue where when you swap
-to a new workspace, and dont open an application on it yet, its technically empty, and active. so we will cover for that case here
-as well. Feel free to copy and paste this from my config file.
-
-Let's clean up this file now. I think we can delete pretty much everything except this massive block that just adds padding to every
-widget here.
-
-We're going to add custom separators here, so lets add that to this list, and add the css for it now, so when we jump back into the json file
-we can already have it styled
-
-#+begin_src css
-#clock,
-#custom-sep,
-#battery,
-#cpu,
-#memory,
-#disk,
-#network,
-#tray {
-    padding: 0 8px;
-    color: @white;
-}
-
-#custom-sep {
-    color: @brblk;
-}
-#+end_src
-
-This tells waybar to show a white font for all the text on all these widgets by default, and
-also tells the separator to use this special black font, which will add later.
-
-Let's quickly go through these right side widgets, and make them more minimal.
-I like the underline style here, feel free to tinker with the colors on your setup, but im going for the
-more minimal tokyonight style.
-
-#+begin_src css
-#clock {
-    color: @cyn;
-    border-bottom: 4px solid @cyn;
-}
-
-#battery {
-    color: @mag;
-    border-bottom: 4px solid @mag;
-}
-
-#disk {
-    color: @ylw;
-    border-bottom: 4px solid @ylw;
-}
-
-#memory {
-    color: @mag;
-    border-bottom: 4px solid @mag;
-}
-
-#cpu {
-    color: @grn;
-    border-bottom: 4px solid @grn;
-}
-
-#network {
-    color: @blu;
-    border-bottom: 4px solid @blu;
-}
-#+end_src
-
-Alright, thats enough css for one day... This bar is looking really good. Feel free to customize it even further from here.
-Let's setup wofi, add a wallpaper, and get this show on the road.
-
-* Wallpaper
-First thing we need to do is get a wallpaper.. so lets head over to firefox and grab this one i picked out for this rice, its on my github.
-Let's save this into a folder in the home directory called walls, and save it is wall1.png
-
-Now let's create a hyprpaper.conf file in the hypr directory like so:
-
-vim .config/hypr/hyprpaper.conf
-#+begin_src conf
-preload = ~/walls/wall1.jpg
-wallpaper = ,~/walls/wall1.jpg
-#+end_src
-
-Now in our hyprland.conf, lets turn on hyprpaper like so:
-
-#+begin_src
-exec-once waybar & hyprpaper
-#+end_src
-
-I'll run this in a terminal here but it will now always launch when we start hyprland. And there we go. Awesome
-Last thing to do is get a proper config for wofi.
-
-* Wofi
-
-For this wofi config, we'll grab it from that same website of tokyonight configs, but I modified it slightly as follows:
-#+begin_src sh
-mkdir .config/wofi
-vim .config/wofi/config
-#+end_src
-
-#+begin_src
-# mode & placement
-show=drun
-location=top
-width=700
-lines=8
-columns=2
-dynamic_lines=false
-
-# icons
-allow_images=true
-image_size=36
-
-# search & UX
-matching=fuzzy
-insensitive=true
-hide_scroll=false
-prompt=
-
-# terminal
-term=foot
-
-# keybinds (vim-ish)
-key_up=Ctrl-k
-key_down=Ctrl-j
-key_left=Ctrl-h
-key_right=Ctrl-l
-key_submit=Return
-key_forward=Tab
-key_backward=Shift-ISO_Left_Tab
-
-# stylesheet
-style=/home/tony/.config/wofi/style.css
-#+end_src
-
-And to make that stylesheet, its right here in the style.css file of that config,
-
-so lets make this file:
-#+begin_src sh
-vim ~/.config/wofi/style.css
-#+end_src
-
-#+begin_src css
-,* {
-    font-family: "JetBrainsMono Nerd Font", monospace;
-    font-size: 16px;
-    font-weight: bold;
-}
-
-window {
-    margin: 0px;
-    border: 2px solid #414868;
-    border-radius: 5px;
-    background-color: #24283b;
-    font-family: monospace;
-    font-size: 12px;
-}
-
-#input {
-    margin: 5px;
-    border: 1px solid #24283b;
-    color: #c0caf5;
-    background-color: #24283b;
-}
-
-#input image {
-    color: #c0caf5;
-}
-
-#inner-box {
-    margin: 5px;
-    border: none;
-    background-color: #24283b;
-}
-
-#outer-box {
-    margin: 5px;
-    border: none;
-    background-color: #24283b;
-}
-
-#scroll {
-    margin: 0px;
-    border: none;
-}
-
-#text {
-    margin: 5px;
-    border: none;
-    color: #c0caf5;
-}
-
-#entry:selected {
-    background-color: #414868;
-    font-weight: normal;
-}
-
-#text:selected {
-    background-color: #414868;
-    font-weight: normal;
-}
-#+end_src
-
-And this system is looking pretty good. We got our waybar all setup, our widgets, we have our foot terminal looking good, our wallpaper, and our wofi config.
-This is just the beginning of hyprland, but this should be a great source for you to start customizing your own personal setup.
-
-* Hyprland Keybinds
-
-| Mod Key       | Key / Input  | Action                 | Target / Notes         |
-|---------------+--------------+------------------------+-------------------------|
-| SUPER         | Return       | exec                   | $terminal               |
-| SUPER         | Q            | killactive             |                         |
-| SUPER         | M            | exit                   |                         |
-| SUPER         | E            | exec                   | $fileManager            |
-| SUPER         | V            | togglefloating         |                         |
-| SUPER         | D            | exec                   | $menu                   |
-| SUPER         | R            | exec                   | $reload_waybar          |
-| SUPER         | P            | pseudo                 | dwindle only            |
-| SUPER         | J            | togglesplit            | dwindle only            |
-
-** Directional Focus
-
-| Mod Key       | Key      | Action      | Direction |
-|---------------+----------+-------------+-----------|
-| SUPER         | left     | movefocus   | l         |
-| SUPER         | right    | movefocus   | r         |
-| SUPER         | up       | movefocus   | u         |
-| SUPER         | down     | movefocus   | d         |
-
-** Workspaces
-
-| Mod Key       | Key       | Action            | Workspace |
-|---------------+-----------+-------------------+-----------|
-| SUPER         | 1–0       | workspace         | 1–10      |
-| SUPER+SHIFT   | 1–0       | movetoworkspace   | 1–10      |
-
-** Special Workspace
-
-| Mod Key       | Key       | Action                  | Workspace      |
-|---------------+-----------+-------------------------+----------------|
-| SUPER         | S         | togglespecialworkspace  | magic          |
-| SUPER+SHIFT   | S         | movetoworkspace         | special:magic  |
-
-** Scroll to Switch Workspaces
-
-| Mod Key       | Mouse Input | Action     | Workspace     |
-|---------------+-------------+------------+---------------|
-| SUPER         | mouse_down  | workspace  | e+1 (next)     |
-| SUPER         | mouse_up    | workspace  | e-1 (previous) |
-
-* Final Thoughts
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/lfs.org b/content/org-files/lfs.org
deleted file mode 100644
index c9bf473..0000000
--- a/content/org-files/lfs.org
+++ /dev/null
@@ -1,3734 +0,0 @@
-#+TITLE: Linux From Scratch
-#+AUTHOR: Tony, btw
-#+date: 2025-10-22
-#+HUGO_TITLE: How to Install Linux from Scratch
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/lfs.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/linux-from-scratch
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a slow, and painful tutorial on how to install linux from scratch in 2026. We go over the entire lfs book, from 0 to booting into our LFS system. A challenging, but educational and rewarding process.
-
-* Intro
-What's up guys, my name is Tony, and today, I'm gonna give you a slow and painful guide on installing Linux from Scratch.
-* Chapter 1 - Introduction:
-** Install Gentoo ISO
-
-For the iso image, we're going to use the gentoo gui live cd, and drop into a tty immediatly, and ssh to it from another machine. This is because it will already have all of the required tools needed to compile all the software, and other than that it is relatively minimal.
-
-** Setup ISO, and enable SSH
-
-Let's boot into our Gentoo Live CD. I see this kde nonsense, lets just drop into a tty right on with Control Alt F2, and lets do a few things.
-
-Let's begin by creating a root password on this machine, and switching to root, and enabling ssh. Now we check the ip here with ip a, and then we can ssh to it from our other machine.
-
-#+begin_src sh
-sudo passwd root
-su
-rc-service sshd start
-ip a
-#+end_src
-
-ssh root@192.168.x.x
-
-** Testing Versions:
-
-We need to prepare for this by testing the versions of our toolchain. Let's run this script here on the lfs manual like so:
-
-And here's the output:
-
-#+begin_src sh
-bash check-version.sh
-OK:    Coreutils 9.7    >= 8.1
-OK:    Bash      5.3.3  >= 3.2
-OK:    Binutils  2.45   >= 2.13.1
-OK:    Bison     3.8.2  >= 2.7
-OK:    Diffutils 3.12   >= 2.8.1
-OK:    Findutils 4.10.0 >= 4.2.31
-OK:    Gawk      5.3.2  >= 4.0.1
-OK:    GCC       14.3.1 >= 5.4
-OK:    GCC (C++) 14.3.1 >= 5.4
-OK:    Grep      3.12   >= 2.5.1a
-OK:    Gzip      1.14   >= 1.3.12
-OK:    M4        1.4.20 >= 1.4.10
-OK:    Make      4.4.1  >= 4.0
-OK:    Patch     2.8    >= 2.5.4
-OK:    Perl      5.40.2 >= 5.8.8
-OK:    Python    3.13.5 >= 3.4
-OK:    Sed       4.9    >= 4.1.5
-OK:    Tar       1.35   >= 1.22
-OK:    Texinfo   7.2    >= 5.0
-OK:    Xz        5.8.1  >= 5.0.0
-OK:    Linux Kernel 6.12.47 >= 5.4
-OK:    Linux Kernel supports UNIX 98 PTY
-Aliases:
-OK:    awk  is GNU
-OK:    yacc is Bison
-OK:    sh   is Bash
-Compiler check:
-OK:    g++ works
-OK: nproc reports 12 logical cores are available
-#+end_src
-
-And we are ready to move on to the next step.
-* Chapter 2 - Preparing the Host System:
-** Create Partitions
-This part might be familiar to those of you who have installed gentoo, arch, or even nix using the minimal iso. Let's hop into cfdisk and create our partitions.
-
-lsblk will tell us what our disk is named. Mine is /dev/vda
-Let's run cfdisk on /dev/vda, your disk might be named something else, such as /dev/sda
-Let's select gpt for the label type because we are on a UEFI system.
-
-For the partitions, let's create a 1G boot partition, a 4G swap partition, and the rest can be the root partition.
-
-Lets write and quit here, and move on to creating the filesystems
-#+begin_src
-vda    252:0    0   50G  0 disk
-├─vda1 252:1    0    1G  0 part
-├─vda2 252:2    0    4G  0 part
-└─vda3 252:3    0   45G  0 part
-#+end_src
-
-** Make Filesystems
-
-Lets make those filesystems.
-
-For the root partition:
-For the boot partition:
-And for that swap:
-#+begin_src
-mkfs.ext4 /dev/vda3
-mkfs.fat -F 32 /dev/vda1
-mkswap /dev/vda2
-#+end_src
-
-#+begin_src
-vda    252:0    0   50G  0 disk
-├─vda1 252:1    0    1G  0 part
-├─vda2 252:2    0    4G  0 part
-└─vda3 252:3    0   45G  0 part
-livecd ~ # mkfs.ext4 /dev/vda3
-mke2fs 1.47.3 (8-Jul-2025)
-Discarding device blocks: done
-Creating filesystem with 11795968 4k blocks and 2949120 inodes
-Filesystem UUID: cf482c8d-d5e7-4cd5-82b9-1fe1e21156e4
-Superblock backups stored on blocks:
-        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
-        4096000, 7962624, 11239424
-
-Allocating group tables: done
-Writing inode tables: done
-Creating journal (65536 blocks): done
-Writing superblocks and filesystem accounting information: done
-
-livecd ~ # mkfs.fat -F 32 /dev/vda1
-mkfs.fat 4.2 (2021-01-31)
-livecd ~ # mkswap /dev/vda2
-Setting up swapspace version 1, size = 4 GiB (4294963200 bytes)
-no label, UUID=9ad48deb-4292-4267-95a3-0b189a8d2acd
-livecd ~ #
-#+end_src
-
-Let's move on to mounting the filesystems.
-** Exporting $LFS and confirming Umask:
-So this is where we deviate from the arch installs, and what have you. We need to export the $LFS variable here mainly for convenience, because we will be referencing the path of $LFS throughout this installation.
-
-So lets run
-
-#+begin_src
-export LFS=/mnt/lfs
-#+end_src
-
-And we need to ensure `umask` is set to `022` so that newly created files and directories are only writable by their owner, but are readable and searchable by anyone.
-
-so lets run
-#+begin_src sh
-umask 022
-#+end_src
-
-And we look good here, we can echo $LFS and we see umask is correct. Let's create the filesystems.
-** Mounting Partitions
-
-Let's create the directory here for lfs and mount it. We can run
-#+begin_src
-mount --mkdir /dev/vda3 $LFS
-#+end_src
-
-And for our root partition:
-#+begin_src sh
-mount --mkdir /dev/vda1 $LFS/boot/efi
-#+end_src
-
-And lastly, for our swap:
-#+begin_src
-swapon /dev/vda2
-#+end_src
-
-We can confirm this worked with the following commands:
-#+begin_src
-livecd ~ # mount | grep vda
-/dev/vda3 on /mnt/lfs type ext4 (rw,relatime)
-/dev/vda1 on /mnt/lfs/boot/efi type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
-livecd ~ # lsblk
-NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
-vda    252:0    0   50G  0 disk
-├─vda1 252:1    0    1G  0 part /mnt/lfs/boot/efi
-├─vda2 252:2    0    4G  0 part [SWAP]
-└─vda3 252:3    0   45G  0 part /mnt/lfs
-#+end_src
-
-Following the book it suggests to chown the $LFS directory here:
-
-#+begin_src
-chown root:root $LFS
-chmod 755 $LFS
-#+end_src
-
-And confirm with ls -la $LFS
-
-#+begin_src
-livecd ~ # ls -la $LFS
-total 24
-drwxr-xr-x 4 root root  4096 Oct 17 05:05 .
-drwxr-xr-x 1 root root    60 Oct 17 05:03 ..
-drwxr-xr-x 3 root root  4096 Oct 17 05:05 boot
-drwx------ 2 root root 16384 Oct 17 04:48 lost+found
-#+end_src
-
-And it looks good to go! We are ready to move to Chapter 3. Sources.
-
-* Chapter 3 - Packages and Patches:
-** Sources:
-We need to make a directory for the sources here, like so:
-#+begin_src
-mkdir -v $LFS/sources
-#+end_src
-
-And we need to make it 'sticky', so that even if any user can have write permissions on a directory, only the owner can delete a file within the directory. We can achieve this with:
-
-#+begin_src
-chmod -v a+wt $LFS/sources
-#+end_src
-
-Which will look like this:
-#+begin_src
-livecd ~ # mkdir -v $LFS/sources
-mkdir: created directory '/mnt/lfs/sources'
-livecd ~ # chmod -v a+wt $LFS/sources
-mode of '/mnt/lfs/sources' changed from 0755 (rwxr-xr-x) to 1777 (rwxrwxrwt)
-livecd ~ #
-#+end_src
-
-** Retrieve wget-list and md5sums
-
-Let's cd into the sources directory here and download the sources.
-
-#+begin_src
-cd $LFS/sources
-#+end_src
-
-So we can grab all of the sources here from a wget list. let's wget the wget list (inception) like so: right click this link and copy link as, and do:
-
-Let's also grab the md5sums so we can verify the download succeeded with no corrupted data like so:
-#+begin_src
-wget https://www.linuxfromscratch.org/lfs/view/12.4/wget-list-sysv
-wget https://www.linuxfromscratch.org/lfs/downloads/stable/md5sums
-#+end_src
-
-And our ouput should look like this:
-#+begin_src
-livecd /mnt/lfs/sources # wget https://www.linuxfromscratch.org/lfs/view/12.4/wget-list-sysv
---2025-10-17 09:14:50--  https://www.linuxfromscratch.org/lfs/view/12.4/wget-list-sysv
-Resolving www.linuxfromscratch.org... 208.118.68.85
-Connecting to www.linuxfromscratch.org|208.118.68.85|:443... connected.
-HTTP request sent, awaiting response... 200 OK
-Length: 6107 (6.0K)
-Saving to: ‘wget-list-sysv’
-
-wget-list-sysv                    100%[===========================================================>]   5.96K  --.-KB/s    in 0s
-
-2025-10-17 09:14:50 (9.62 GB/s) - ‘wget-list-sysv’ saved [6107/6107]
-#+end_src
-
-** Grab All Packages from wget-list
-
-So we can see what this wget list is by running less on it, and we see its just a list of urls with each package we need. So let's just download them here with this wget command:
-
-And now for the fun part...
-#+begin_src
-wget --input-file=wget-list-sysv --continue --directory-prefix=$LFS/sources
-#+end_src
-
-This will iterate through the wget list and grab all the files in it. I will see you in a minute.
-
-** Check md5sums:
-
-Alright, looks like our wget command finished, so lets test the md5sums here, this will let us know if all of the packages are downloaded to, as well as confirm if any of them are corrupted or not.
-
-#+begin_src
-md5sum -c md5sums | less
-#+end_src
-
-#+begin_src
-acl-2.3.2.tar.xz: OK
-attr-2.5.2.tar.gz: OK
-autoconf-2.72.tar.xz: OK
-automake-1.18.1.tar.xz: OK
-bash-5.3.tar.gz: OK
-bc-7.0.3.tar.xz: OK
-binutils-2.45.tar.xz: OK
-bison-3.8.2.tar.xz: OK
-bzip2-1.0.8.tar.gz: OK
-coreutils-9.7.tar.xz: OK
-dejagnu-1.6.3.tar.gz: OK
-diffutils-3.12.tar.xz: OK
-e2fsprogs-1.47.3.tar.gz: OK
-elfutils-0.193.tar.bz2: OK
-expat-2.7.1.tar.xz: OK
-expect5.45.4.tar.gz: OK
-file-5.46.tar.gz: OK
-findutils-4.10.0.tar.xz: OK
-flex-2.6.4.tar.gz: OK
-flit_core-3.12.0.tar.gz: OK
-gawk-5.3.2.tar.xz: OK
-gcc-15.2.0.tar.xz: OK
-gdbm-1.26.tar.gz: OK
-gettext-0.26.tar.xz: OK
-glibc-2.42.tar.xz: OK
-gmp-6.3.0.tar.xz: OK
-gperf-3.3.tar.gz: OK
-grep-3.12.tar.xz: OK
-groff-1.23.0.tar.gz: OK
-grub-2.12.tar.xz: OK
-gzip-1.14.tar.xz: OK
-iana-etc-20250807.tar.gz: OK
-#+end_src
-
-As we see here, our md5sums are all verified, meaning we have all the necessary packages. The book recommends to change ownership of these files to root, but we are root so they are already owned by us. If you downloaded them as a non root user, just run this to be safe
-
-#+begin_src
-chown root:root $LFS/sources/*
-#+end_src
-
-We're ready to move onto Chapter 4.
-* Chapter 4 - Final Preparations:
-** Creating the LFS Filesystem
-So we want to actually create the LFS filesystem here, so lets create some directories like so:
-#+begin_src
-mkdir -pv $LFS/{etc,var} $LFS/usr/{bin,lib,sbin}
-#+end_src
-
-Expected output:
-#+begin_src
-mkdir: created directory '/mnt/lfs/etc'
-mkdir: created directory '/mnt/lfs/var'
-mkdir: created directory '/mnt/lfs/usr'
-mkdir: created directory '/mnt/lfs/usr/bin'
-mkdir: created directory '/mnt/lfs/usr/lib'
-mkdir: created directory '/mnt/lfs/usr/sbin'
-#+end_src
-
-And to create symlinks here:
-
-#+begin_src
-for i in bin lib sbin; do
-  ln -sv usr/$i $LFS/$i
-done
-#+end_src
-
-Expected output:
-#+begin_src
-'/mnt/lfs/bin' -> 'usr/bin'
-'/mnt/lfs/lib' -> 'usr/lib'
-'/mnt/lfs/sbin' -> 'usr/sbin'
-#+end_src
-
-And for the lib64 directory in my case (because I am on x86_64 technology)
-
-#+begin_src
-case $(uname -m) in
-  x86_64) mkdir -pv $LFS/lib64 ;;
-esac
-#+end_src
-
-Expected output:
-#+begin_src
-mkdir: created directory '/mnt/lfs/lib64'
-#+end_src
-
-And for the tools directory, we will use this to keep some of the temporary programs we will be compiling.
-#+begin_src
-mkdir -pv $LFS/tools
-#+end_src
-
-Expected output:
-#+begin_src
-mkdir: created directory '/mnt/lfs/tools'
-#+end_src
-
-And we're ready to add the LFS user.
-
-** Adding LFS user:
-We want an LFS user because running things as root could break our system, and if we do it as LFS, we dont risk nefariously affecting the host iso in any way.
-
-So lets add the group and create the user like so:
-#+begin_src
-groupadd lfs
-useradd -s /bin/bash -g lfs -m -k /dev/null lfs
-#+end_src
-
-And add a passwd so we can log in to it:
-
-#+begin_src
-passwd lfs
-#+end_src
-
-And we want lfs to have full access to all lfs directories so lets run:
-#+begin_src
-chown -v lfs $LFS/{usr{,/*},var,etc,tools}
-case $(uname -m) in
-  x86_64) chown -v lfs $LFS/lib64 ;;
-esac
-#+end_src
-
-Expected output:
-#+begin_src
-livecd /mnt/lfs/sources # chown -v lfs $LFS/{usr{,/*},var,etc,tools}
-changed ownership of '/mnt/lfs/usr' from root to lfs
-changed ownership of '/mnt/lfs/usr/bin' from root to lfs
-changed ownership of '/mnt/lfs/usr/lib' from root to lfs
-changed ownership of '/mnt/lfs/usr/sbin' from root to lfs
-changed ownership of '/mnt/lfs/var' from root to lfs
-changed ownership of '/mnt/lfs/etc' from root to lfs
-changed ownership of '/mnt/lfs/tools' from root to lfs
-livecd /mnt/lfs/sources # case $(uname -m) in
->   x86_64) chown -v lfs $LFS/lib64 ;;
-> esac
-changed ownership of '/mnt/lfs/lib64' from root to lfs
-#+end_src
-
-And we're ready to switch into our new user. We can ignore this warning here, since gentoo wont give us issues, but take a look at this warning if you are on a different host.
-#+begin_src
-su - lfs
-#+end_src
-
-And now we're LFS, so we are ready to setup the environment
-
-** Setup Environment for lfs user
-Let's create a bash profile like so:
-#+begin_src
-cat > ~/.bash_profile << "EOF"
-exec env -i HOME=$HOME TERM=$TERM PS1='\u:\w\$ ' /bin/bash
-EOF
-#+end_src
-
-And as we see here, this will ensure that no unwanted and potentially hazardous environment variables from the host system leak into the build environment
-
-And lets create the bashrc here like so:
-#+begin_src
-cat > ~/.bashrc << "EOF"
-set +h
-umask 022
-LFS=/mnt/lfs
-LC_ALL=POSIX
-LFS_TGT=$(uname -m)-lfs-linux-gnu
-PATH=/usr/bin
-if [ ! -L /bin ]; then PATH=/bin:$PATH; fi
-PATH=$LFS/tools/bin:$PATH
-CONFIG_SITE=$LFS/usr/share/config.site
-export LFS LC_ALL LFS_TGT PATH CONFIG_SITE
-EOF
-#+end_src
-
-Main things here are setting +h which turns off the hashing feature, which we need to disable in order to force our shell to search for the proper path whenever a program is to be run. The rest of these options are things we already did previously such as umask, or exporting the LFS path, or can be explained here.
-
-For this important block here, we dont need to do this on gentoo because the usrs environment is already clean of the /etc/bash.bashrc, but we can run it anyway to be safe. we have to run it as root, though, so lets do this:
-
-#+begin_src
-logout
-[ ! -e /etc/bash.bashrc ] || mv -v /etc/bash.bashrc /etc/bash.bashrc.NOUSE
-su - lfs
-#+end_src
-
-No output means we are in the clear.
-
-Now to update our makeflags to reflect our cpus. Our cpu has 12 logical cores, so we can use 12 instead of 32... or better yet we can just automatically use nproc to get the true value of logical cores and append it to our bashrc like so, and then source our bash_profile like so:
-
-#+begin_src
-cat >> ~/.bashrc << "EOF"
-export MAKEFLAGS=-j$(nproc)
-EOF
-
-source ~/.bash_profile
-#+end_src
-
-** SBUs
-This will be a unit that measures how long it takes to compile/install a package. We can use the time command to test that when we install Binutils Pass 1.
-** Test Suites
-And here it just says that test suites can't run in Chapters 5-6 because we're cross-compiling. We'll run them later when building inside the LFS chroot environment where we are agnostic to the host machine.
-* Chapter 5 - Compiling a Cross Toolchain:
-** Overview
-First we compile a cross toolchain, then use it to build temporary tools, and finally install the permanent system. We separate these stages because cross-compilation prevents any dependencies on the host system, ensuring a clean, self-contained build.
-
-To build these tools, its going to be a 3 step method:
-
-1. untar the source tarball
-2. follow instructions on lfs book to install tool
-3. cd back into sources and clean it up
-
-We will repeat this process over 100 times in lfs, so I'll go slow for the first few and as soon as I finish 3-4 of them, you will sort of understand the pattern here.
-
-I'll also do my best to explain what each tool is, and thats the real benefit of LFS in my opinion, you learn what ever tool on your system is and what it does.
-
-So let's jump straight into Binutils.
-
-** Binutils-2.45 - Pass 1
-
-The Binutils package contains a linker, an assembler, and other tools for handling object files.
-
-Some of the binutils you may be familiar with are:
-strings, size, strip.
-
-This will be a pattern we see.. extract the tool, cd into it, and run the commands from the handbook to create/compile the tool.
-
-#+begin_src
-cd $LFS/sources
-tar -xvf binutils
-cd binutils
-#+end_src
-
-#+begin_src
-mkdir -v build
-cd       build
-#+end_src
-
-So lets actually time this compilation to see what we're working with:
-Prepare for compilation:
-#+begin_src
-time { ../configure --prefix=$LFS/tools \
-             --with-sysroot=$LFS \
-             --target=$LFS_TGT   \
-             --disable-nls       \
-             --enable-gprofng=no \
-             --disable-werror    \
-             --enable-new-dtags  \
-             --enable-default-hash-style=gnu && make && make install; }
-#+end_src
-
-As we see at the top here, binutils is 1 sbu, so that means we can use it as a reference. so if glibc is 2 sbus, we can expect it to take 2 times the amount of time that binutils took.
-
-Once thats complete, lets get back to the sources directory, and remove the binutils directory like so:
-#+begin_src
-cd ../..
-rm -Rf binutils
-#+end_src
-
-** GCC-15.2.0 - Pass 1
-The GCC package contains the GNU compiler collection, which includes the C and C++ compilers.
-You are probabily familiar with this.. if you have ever compiled any C code, you probably used gcc.
-
-This is our first pass of GCC, and this will be simply so that we can cross compile all the necessary tools in chapter 5.
-
-#+begin_src
-tar -xvf gcc-tab
-cd gcc-tab
-#+end_src
-
-Now in here we have to extract subpackages, and rename them like so:
-
-#+begin_src
-tar -xf ../mpfr-4.2.2.tar.xz
-mv -v mpfr-4.2.2 mpfr
-tar -xf ../gmp-6.3.0.tar.xz
-mv -v gmp-6.3.0 gmp
-tar -xf ../mpc-1.3.1.tar.gz
-mv -v mpc-1.3.1 mpc
-#+end_src
-
-Run these individually in case one errors out
-And since were on 64 bit architecture lets run this:
-
-#+begin_src
-case $(uname -m) in
-  x86_64)
-    sed -e '/m64=/s/lib64/lib/' \
-        -i.orig gcc/config/i386/t-linux64
- ;;
-esac
-#+end_src
-
-And now time to build gcc...
-
-#+begin_src
-mkdir -v build
-cd       build
-#+end_src
-
-#+begin_src
-time { ../configure                  \
-    --target=$LFS_TGT         \
-    --prefix=$LFS/tools       \
-    --with-glibc-version=2.42 \
-    --with-sysroot=$LFS       \
-    --with-newlib             \
-    --without-headers         \
-    --enable-default-pie      \
-    --enable-default-ssp      \
-    --disable-nls             \
-    --disable-shared          \
-    --disable-multilib        \
-    --disable-threads         \
-    --disable-libatomic       \
-    --disable-libgomp         \
-    --disable-libquadmath     \
-    --disable-libssp          \
-    --disable-libvtv          \
-    --disable-libstdcxx       \
-    --enable-languages=c,c++ && make && make install; }
-#+end_src
-
-And we need to recreate this header file:
-
-#+begin_src
-cd ..
-cat gcc/limitx.h gcc/glimits.h gcc/limity.h > \
-  `dirname $($LFS_TGT-gcc -print-libgcc-file-name)`/include/limits.h
-#+end_src
-
-and cleanup:
-#+begin_src
-cd ..
-rm -rf gcc-tab
-#+end_src
-
-** Linux-6.16.1 API Headers:
-The Linux API Headers provide the kernel interface that Glibc uses to interact with the Linux kernel.
-
-Ensure no stale files embedded in this package:
-#+begin_src
-make mrproper
-#+end_src
-
-Expect no output above, and then run:
-#+begin_src
-make headers
-find usr/include -type f ! -name '*.h' -delete
-cp -rv usr/include $LFS/usr
-#+end_src
-
-So all we're doing here is creating the linux header files, and copying them to the lfs/usr directory.
-
-#+begin_src
-cd ..
-rm -rf linux-tab
-#+end_src
-
-** Glibc-2.42
-
-This is the main C library.
-
-First we need to create symlinks for 'LSB Compliance' which is the linux standard base, which depends on your architecture so we can run this case statement here to create symlinks for where the dynamic linkers need to point to respectively:
-
-#+begin_src
-case $(uname -m) in
-    i?86)   ln -sfv ld-linux.so.2 $LFS/lib/ld-lsb.so.3
-    ;;
-    x86_64) ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64
-            ln -sfv ../lib/ld-linux-x86-64.so.2 $LFS/lib64/ld-lsb-x86-64.so.3
-    ;;
-esac
-#+end_src
-
-And to apply this patch here:
-
-#+begin_src sh
-patch -Np1 -i ../glibc-2.42-fhs-1.patch
-#+end_src
-
-Expected output:
-#+begin_src
-patching file Makeconfig
-Hunk #1 succeeded at 262 (offset 12 lines).
-patching file nscd/nscd.h
-Hunk #1 succeeded at 160 (offset 48 lines).
-patching file nss/db-Makefile
-Hunk #1 succeeded at 21 (offset -1 lines).
-patching file sysdeps/generic/paths.h
-patching file sysdeps/unix/sysv/linux/paths.h
-#+end_src
-
-And to build glibc:
-#+begin_src
-mkdir -v build
-cd       build
-echo "rootsbindir=/usr/sbin" > configparms
-
-../configure                             \
-      --prefix=/usr                      \
-      --host=$LFS_TGT                    \
-      --build=$(../scripts/config.guess) \
-      --disable-nscd                     \
-      libc_cv_slibdir=/usr/lib           \
-      --enable-kernel=5.4
-#+end_src
-
-#+begin_src
-make
-make DESTDIR=$LFS install
-sed '/RTLDLIST=/s@/usr@@g' -i $LFS/usr/bin/ldd
-#+end_src
-
-Sanity checks for the symlinks:
-
-#+begin_src
-echo 'int main(){}' | $LFS_TGT-gcc -x c - -v -Wl,--verbose &> dummy.log
-readelf -l a.out | grep ': /lib'
-#+end_src
-
-Expected output:
-#+begin_src
-[Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
-#+end_src
-
-Ensure we are setup to choose the correct start files:
-#+begin_src
-grep -E -o "$LFS/lib.*/S?crt[1in].*succeeded" dummy.log
-#+end_src
-
-Expected output:
-#+begin_src
-/mnt/lfs/lib/../lib/Scrt1.o succeeded
-/mnt/lfs/lib/../lib/crti.o succeeded
-/mnt/lfs/lib/../lib/crtn.o succeeded
-#+end_src
-
-Verify that the compiler is searching for the correct header files:
-#+begin_src
-grep -B3 "^ $LFS/usr/include" dummy.log
-#+end_src
-
-Expected output:
-#+begin_src
-#include <...> search starts here:
- /mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/15.2.0/include
- /mnt/lfs/tools/lib/gcc/x86_64-lfs-linux-gnu/15.2.0/include-fixed
- /mnt/lfs/usr/include
-#+end_src
-
-Next, verify that the new linker is being used with the correct search paths:
-#+begin_src
-grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
-#+end_src
-
-Expected output:
-#+begin_src
-SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib64")
-SEARCH_DIR("=/usr/local/lib64")
-SEARCH_DIR("=/lib64")
-SEARCH_DIR("=/usr/lib64")
-SEARCH_DIR("=/mnt/lfs/tools/x86_64-lfs-linux-gnu/lib")
-SEARCH_DIR("=/usr/local/lib")
-SEARCH_DIR("=/lib")
-SEARCH_DIR("=/usr/lib");
-#+end_src
-
-Ensure correct version of glibc:
-#+begin_src
-grep "/lib.*/libc.so.6 " dummy.log
->> attempt to open /mnt/lfs/usr/lib/libc.so.6 succeeded
-#+end_src
-
-Make sure gcc is using correct dynamic linker:
-#+begin_src
-grep found dummy.log
->> found ld-linux-x86-64.so.2 at /mnt/lfs/usr/lib/ld-linux-x86-64.so.2
-#+end_src
-
-Clean up dummy.log
-#+begin_src
-rm -v a.out dummy.log
-cd ../..
-rm -Rf glibc
-#+end_src
-
-** Libstdc++ from GCC-15.2.0
-Lib standard C++ is needed to compile c++ code.
-
-#+begin_src
-tar -xvf gcc-15.2.0...
-cd gcc...
-#+end_src
-
-#+begin_src
-mkdir -v build; cd build
-#+end_src
-
-#+begin_src
-../libstdc++-v3/configure      \
-    --host=$LFS_TGT            \
-    --build=$(../config.guess) \
-    --prefix=/usr              \
-    --disable-multilib         \
-    --disable-nls              \
-    --disable-libstdcxx-pch    \
-    --with-gxx-include-dir=/tools/$LFS_TGT/include/c++/15.2.0
-make
-make DESTDIR=$LFS install
-rm -v $LFS/usr/lib/lib{stdc++{,exp,fs},supc++}.la
-#+end_src
-
-Clean this up:
-#+begin_src
-cd ../..
-rm -rf gcc-tab
-#+end_src
-
-And that is the end of chaper 5. We are ready to move on to cross compiling temporary tools!
-* Chapter 6 - Cross Compiling Temporary Tools:
-#+begin_quote
-"This chapter shows how to cross-compile basic utilities using the just built cross-toolchain. Those utilities are installed into their final location, but cannot be used yet. Basic tasks still rely on the host's tools. Nevertheless, the installed libraries are used when linking."  - LFS manual
-#+end_quote
-
-** M4-1.4.20
-#+begin_src sh
-cd $LFS/sources
-tar -xf m4-1.4.20.tar.xz
-cd m4-1.4.20
-
-./configure --prefix=/usr   \
-            --host=$LFS_TGT \
-            --build=$(build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf m4-1.4.20
-#+end_src
-
-** Ncurses-6.5-20250809
-#+begin_src sh
-tar -xf ncurses-6.5-20250809.tar.gz
-cd ncurses-6.5-20250809
-
-sed -i s/mawk// configure
-
-mkdir build
-pushd build
-  ../configure
-  make -C include
-  make -C progs tic
-popd
-
-./configure --prefix=/usr                \
-            --host=$LFS_TGT              \
-            --build=$(./config.guess)    \
-            --mandir=/usr/share/man      \
-            --with-manpage-format=normal \
-            --with-shared                \
-            --without-normal             \
-            --with-cxx-shared            \
-            --without-debug              \
-            --without-ada                \
-            --disable-stripping          \
-            --enable-widec
-
-make
-make DESTDIR=$LFS TIC_PATH=$(pwd)/build/progs/tic install
-ln -sv libncursesw.so $LFS/usr/lib/libncurses.so
-sed -e 's/^#if.*XOPEN.*$/#if 1/' \
-    -i $LFS/usr/include/curses.h
-
-cd $LFS/sources
-rm -rf ncurses-6.5-20250809
-#+end_src
-
-** Bash-5.3
-#+begin_src sh
-tar -xf bash-5.3.tar.gz
-cd bash-5.3
-
-./configure --prefix=/usr                      \
-            --build=$(sh support/config.guess) \
-            --host=$LFS_TGT                    \
-            --without-bash-malloc              \
-            bash_cv_strtold_broken=no
-
-make
-make DESTDIR=$LFS install
-
-ln -sv bash $LFS/bin/sh
-
-cd $LFS/sources
-rm -rf bash-5.3
-#+end_src
-
-** Coreutils-9.7
-#+begin_src sh
-tar -xf coreutils-9.7.tar.xz
-cd coreutils-9.7
-
-./configure --prefix=/usr                     \
-            --host=$LFS_TGT                   \
-            --build=$(build-aux/config.guess) \
-            --enable-install-program=hostname \
-            --enable-no-install-program=kill,uptime
-
-make
-make DESTDIR=$LFS install
-
-mv -v $LFS/usr/bin/chroot $LFS/usr/sbin
-mkdir -pv $LFS/usr/share/man/man8
-mv -v $LFS/usr/share/man/man1/chroot.1 $LFS/usr/share/man/man8/chroot.8
-sed -i 's/"1"/"8"/' $LFS/usr/share/man/man8/chroot.8
-
-cd $LFS/sources
-rm -rf coreutils-9.7
-#+end_src
-
-** Diffutils-3.12
-#+begin_src sh
-tar -xf diffutils-3.12.tar.xz
-cd diffutils-3.12
-
-./configure --prefix=/usr   \
-            --host=$LFS_TGT \
-            --build=$(./build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf diffutils-3.12
-#+end_src
-
-** File-5.46
-#+begin_src sh
-tar -xf file-5.46.tar.gz
-cd file-5.46
-
-mkdir build
-pushd build
-  ../configure --disable-bzlib      \
-               --disable-libseccomp \
-               --disable-xzlib      \
-               --disable-zlib
-  make
-popd
-
-./configure --prefix=/usr --host=$LFS_TGT --build=$(./config.guess)
-
-make FILE_COMPILE=$(pwd)/build/src/file
-make DESTDIR=$LFS install
-
-rm -v $LFS/usr/lib/libmagic.la
-
-cd $LFS/sources
-rm -rf file-5.46
-#+end_src
-
-** Findutils-4.10.0
-#+begin_src sh
-tar -xf findutils-4.10.0.tar.xz
-cd findutils-4.10.0
-
-./configure --prefix=/usr                   \
-            --localstatedir=/var/lib/locate \
-            --host=$LFS_TGT                 \
-            --build=$(build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf findutils-4.10.0
-#+end_src
-
-** Gawk-5.3.2
-#+begin_src sh
-tar -xf gawk-5.3.2.tar.xz
-cd gawk-5.3.2
-
-sed -i 's/extras//' Makefile.in
-
-./configure --prefix=/usr   \
-            --host=$LFS_TGT \
-            --build=$(build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf gawk-5.3.2
-#+end_src
-
-** Grep-3.12
-#+begin_src sh
-tar -xf grep-3.12.tar.xz
-cd grep-3.12
-
-./configure --prefix=/usr   \
-            --host=$LFS_TGT \
-            --build=$(./build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf grep-3.12
-#+end_src
-
-** Gzip-1.14
-#+begin_src sh
-tar -xf gzip-1.14.tar.xz
-cd gzip-1.14
-
-./configure --prefix=/usr --host=$LFS_TGT
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf gzip-1.14
-#+end_src
-
-** Make-4.4.1
-#+begin_src sh
-tar -xf make-4.4.1.tar.gz
-cd make-4.4.1
-
-./configure --prefix=/usr   \
-            --without-guile \
-            --host=$LFS_TGT \
-            --build=$(build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf make-4.4.1
-#+end_src
-
-** Patch-2.8
-#+begin_src sh
-tar -xf patch-2.8.tar.xz
-cd patch-2.8
-
-./configure --prefix=/usr   \
-            --host=$LFS_TGT \
-            --build=$(build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf patch-2.8
-#+end_src
-
-** Sed-4.9
-#+begin_src sh
-tar -xf sed-4.9.tar.xz
-cd sed-4.9
-
-./configure --prefix=/usr   \
-            --host=$LFS_TGT \
-            --build=$(./build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf sed-4.9
-#+end_src
-
-** Tar-1.35
-#+begin_src sh
-tar -xf tar-1.35.tar.xz
-cd tar-1.35
-
-./configure --prefix=/usr                     \
-            --host=$LFS_TGT                   \
-            --build=$(build-aux/config.guess)
-
-make
-make DESTDIR=$LFS install
-
-cd $LFS/sources
-rm -rf tar-1.35
-#+end_src
-
-** Xz-5.8.1
-#+begin_src sh
-tar -xf xz-5.8.1.tar.xz
-cd xz-5.8.1
-
-./configure --prefix=/usr                     \
-            --host=$LFS_TGT                   \
-            --build=$(build-aux/config.guess) \
-            --disable-static                  \
-            --docdir=/usr/share/doc/xz-5.8.1
-
-make
-make DESTDIR=$LFS install
-
-rm -v $LFS/usr/lib/liblzma.la
-
-cd $LFS/sources
-rm -rf xz-5.8.1
-#+end_src
-
-** Binutils-2.45 - Pass 2
-#+begin_src sh
-tar -xf binutils-2.45.tar.xz
-cd binutils-2.45
-
-sed '6009s/$add_dir//' -i ltmain.sh
-
-mkdir -v build
-cd build
-
-../configure                   \
-    --prefix=/usr              \
-    --build=$(../config.guess) \
-    --host=$LFS_TGT            \
-    --disable-nls              \
-    --enable-shared            \
-    --enable-gprofng=no        \
-    --disable-werror           \
-    --enable-64-bit-bfd        \
-    --enable-new-dtags         \
-    --enable-default-hash-style=gnu
-
-make
-make DESTDIR=$LFS install
-
-rm -v $LFS/usr/lib/lib{bfd,ctf,ctf-nobfd,opcodes,sframe}.{a,la}
-
-cd $LFS/sources
-rm -rf binutils-2.45
-#+end_src
-
-** GCC-15.2.0 - Pass 2
-#+begin_src sh
-tar -xf gcc-15.2.0.tar.xz
-cd gcc-15.2.0
-
-tar -xf ../mpfr-4.2.2.tar.xz
-mv -v mpfr-4.2.2 mpfr
-tar -xf ../gmp-6.3.0.tar.xz
-mv -v gmp-6.3.0 gmp
-tar -xf ../mpc-1.3.1.tar.gz
-mv -v mpc-1.3.1 mpc
-
-case $(uname -m) in
-  x86_64)
-    sed -e '/m64=/s/lib64/lib/' \
-        -i.orig gcc/config/i386/t-linux64
-  ;;
-esac
-
-sed '/thread_header =/s/@.*@/gthr-posix.h/' \
-    -i libgcc/Makefile.in libstdc++-v3/include/Makefile.in
-
-mkdir -v build
-cd build
-
-../configure                                       \
-    --build=$(../config.guess)                     \
-    --host=$LFS_TGT                                \
-    --target=$LFS_TGT                              \
-    LDFLAGS_FOR_TARGET=-L$PWD/$LFS_TGT/libgcc      \
-    --prefix=/usr                                  \
-    --with-build-sysroot=$LFS                      \
-    --enable-default-pie                           \
-    --enable-default-ssp                           \
-    --disable-nls                                  \
-    --disable-multilib                             \
-    --disable-libatomic                            \
-    --disable-libgomp                              \
-    --disable-libquadmath                          \
-    --disable-libsanitizer                         \
-    --disable-libssp                               \
-    --disable-libvtv                               \
-    --enable-languages=c,c++
-
-make
-make DESTDIR=$LFS install
-
-ln -sv gcc $LFS/usr/bin/cc
-
-cd $LFS/sources
-rm -rf gcc-15.2.0
-#+end_src
-
-* Chapter 7 - Entering Chroot and Building Additional Temporary Tools:
-
-** Changing Ownership
-Before we enter chroot, we need to change ownership of everything to root:
-
-#+begin_src sh
-chown -R root:root $LFS/{usr,lib,var,etc,bin,sbin,tools}
-case $(uname -m) in
-  x86_64) chown -R root:root $LFS/lib64 ;;
-esac
-#+end_src
-
-** Preparing Virtual Kernel File Systems
-
-To enter chroot, we need to create and mount all the binded directories like so:
-
-#+begin_src sh
-mkdir -pv $LFS/{dev,proc,sys,run}
-mount -v --bind /dev $LFS/dev
-mount -vt devpts devpts -o gid=5,mode=0620 $LFS/dev/pts
-mount -vt proc proc $LFS/proc
-mount -vt sysfs sysfs $LFS/sys
-mount -vt tmpfs tmpfs $LFS/run
-
-if [ -h $LFS/dev/shm ]; then
-  install -v -d -m 1777 $LFS$(realpath /dev/shm)
-else
-  mount -vt tmpfs -o nosuid,nodev tmpfs $LFS/dev/shm
-fi
-#+end_src
-
-** Entering Chroot
-
-Then we can chroot into our new system like so:
-
-#+begin_src sh
-chroot "$LFS" /usr/bin/env -i   \
-    HOME=/root                  \
-    TERM="$TERM"                \
-    PS1='(lfs chroot) \u:\w\$ ' \
-    PATH=/usr/bin:/usr/sbin     \
-    MAKEFLAGS="-j$(nproc)"      \
-    TESTSUITEFLAGS="-j$(nproc)" \
-    /bin/bash --login
-#+end_src
-
-You should now see your prompt change to `(lfs chroot) root:/#` - you're inside your new LFS system!
-
-** Creating Directories
-
-Now we need to create the remaining directory structure:
-
-#+begin_src sh
-mkdir -pv /{boot,home,mnt,opt,srv}
-mkdir -pv /etc/{opt,sysconfig}
-mkdir -pv /lib/firmware
-mkdir -pv /media/{floppy,cdrom}
-mkdir -pv /usr/{,local/}{include,src}
-mkdir -pv /usr/local/{bin,lib,sbin}
-mkdir -pv /usr/{,local/}share/{color,dict,doc,info,locale,man}
-mkdir -pv /usr/{,local/}share/{misc,terminfo,zoneinfo}
-mkdir -pv /usr/{,local/}share/man/man{1..8}
-mkdir -pv /var/{cache,local,log,mail,opt,spool}
-mkdir -pv /var/lib/{color,misc,locate}
-
-ln -sfv /run /var/run
-ln -sfv /run/lock /var/lock
-
-install -dv -m 0750 /root
-install -dv -m 1777 /tmp /var/tmp
-#+end_src
-
-** Creating Essential Files and Symlinks
-
-Create essential system files:
-
-#+begin_src sh
-ln -sv /proc/self/mounts /etc/mtab
-
-cat > /etc/hosts << EOF
-127.0.0.1  localhost $(hostname)
-::1        localhost
-EOF
-
-cat > /etc/passwd << "EOF"
-root:x:0:0:root:/root:/bin/bash
-bin:x:1:1:bin:/dev/null:/usr/bin/false
-daemon:x:6:6:Daemon User:/dev/null:/usr/bin/false
-messagebus:x:18:18:D-Bus Message Daemon User:/run/dbus:/usr/bin/false
-systemd-journal-gateway:x:73:73:systemd Journal Gateway:/:/usr/bin/false
-systemd-journal-remote:x:74:74:systemd Journal Remote:/:/usr/bin/false
-systemd-journal-upload:x:75:75:systemd Journal Upload:/:/usr/bin/false
-systemd-network:x:76:76:systemd Network Management:/:/usr/bin/false
-systemd-resolve:x:77:77:systemd Resolver:/:/usr/bin/false
-systemd-timesync:x:78:78:systemd Time Synchronization:/:/usr/bin/false
-systemd-coredump:x:79:79:systemd Core Dumper:/:/usr/bin/false
-uuidd:x:80:80:UUID Generator Daemon User:/dev/null:/usr/bin/false
-systemd-oom:x:81:81:systemd Out Of Memory Daemon:/:/usr/bin/false
-nobody:x:65534:65534:Unprivileged User:/dev/null:/usr/bin/false
-EOF
-
-cat > /etc/group << "EOF"
-root:x:0:
-bin:x:1:daemon
-sys:x:2:
-kmem:x:3:
-tape:x:4:
-tty:x:5:
-daemon:x:6:
-floppy:x:7:
-disk:x:8:
-lp:x:9:
-dialout:x:10:
-audio:x:11:
-video:x:12:
-utmp:x:13:
-cdrom:x:15:
-adm:x:16:
-messagebus:x:18:
-systemd-journal:x:23:
-input:x:24:
-mail:x:34:
-kvm:x:61:
-systemd-journal-gateway:x:73:
-systemd-journal-remote:x:74:
-systemd-journal-upload:x:75:
-systemd-network:x:76:
-systemd-resolve:x:77:
-systemd-timesync:x:78:
-systemd-coredump:x:79:
-uuidd:x:80:
-systemd-oom:x:81:
-wheel:x:97:
-users:x:999:
-nogroup:x:65534:
-EOF
-
-echo "tester:x:101:101::/home/tester:/bin/bash" >> /etc/passwd
-echo "tester:x:101:" >> /etc/group
-install -o tester -d /home/tester
-
-exec /usr/bin/bash --login
-
-touch /var/log/{btmp,lastlog,faillog,wtmp}
-chgrp -v utmp /var/log/lastlog
-chmod -v 664  /var/log/lastlog
-chmod -v 600  /var/log/btmp
-#+end_src
-
-Now we build the remaining temporary tools in chroot:
-
-** Gettext-0.26
-#+begin_src sh
-cd /sources
-tar -xf gettext-0.26.tar.xz
-cd gettext-0.26
-
-./configure --disable-shared
-
-make
-cp -v gettext-tools/src/{msgfmt,msgmerge,xgettext} /usr/bin
-
-cd /sources
-rm -rf gettext-0.26
-#+end_src
-
-** Bison-3.8.2
-#+begin_src sh
-tar -xf bison-3.8.2.tar.xz
-cd bison-3.8.2
-
-./configure --prefix=/usr \
-            --docdir=/usr/share/doc/bison-3.8.2
-
-make
-make install
-
-cd /sources
-rm -rf bison-3.8.2
-#+end_src
-
-** Perl-5.42.0
-#+begin_src sh
-tar -xf perl-5.42.0.tar.xz
-cd perl-5.42.0
-
-sh Configure -des                                          \
-             -D prefix=/usr                                \
-             -D vendorprefix=/usr                          \
-             -D useshrplib                                 \
-             -D privlib=/usr/lib/perl5/5.42/core_perl      \
-             -D archlib=/usr/lib/perl5/5.42/core_perl      \
-             -D sitelib=/usr/lib/perl5/5.42/site_perl      \
-             -D sitearch=/usr/lib/perl5/5.42/site_perl     \
-             -D vendorlib=/usr/lib/perl5/5.42/vendor_perl  \
-             -D vendorarch=/usr/lib/perl5/5.42/vendor_perl
-
-make
-make install
-
-cd /sources
-rm -rf perl-5.42.0
-#+end_src
-
-** Python-3.13.7
-Use capital P here, and ignore ssl warnings.
-#+begin_src sh
-tar -xf Python-3.13.7.tar.xz
-cd Python-3.13.7
-
-./configure --prefix=/usr   \
-            --enable-shared \
-            --without-ensurepip
-
-make
-make install
-
-cd /sources
-rm -rf Python-3.13.7
-#+end_src
-
-** Texinfo-7.2
-#+begin_src sh
-tar -xf texinfo-7.2.tar.xz
-cd texinfo-7.2
-
-./configure --prefix=/usr
-
-make
-make install
-
-cd /sources
-rm -rf texinfo-7.2
-#+end_src
-
-** Util-linux-2.41.1
-#+begin_src sh
-tar -xf util-linux-2.41.1.tar.xz
-cd util-linux-2.41.1
-
-mkdir -pv /var/lib/hwclock
-
-./configure --libdir=/usr/lib     \
-            --runstatedir=/run    \
-            --disable-chfn-chsh   \
-            --disable-login       \
-            --disable-nologin     \
-            --disable-su          \
-            --disable-setpriv     \
-            --disable-runuser     \
-            --disable-pylibmount  \
-            --disable-static      \
-            --disable-liblastlog2 \
-            --without-python      \
-            ADJTIME_PATH=/var/lib/hwclock/adjtime \
-            --docdir=/usr/share/doc/util-linux-2.41.1
-
-make
-make install
-
-cd /sources
-rm -rf util-linux-2.41.1
-#+end_src
-
-** Cleaning up and Saving the Temporary System
-
-Now let's clean up the temporary system:
-
-#+begin_src sh
-rm -rf /usr/share/{info,man,doc}/*
-
-find /usr/{lib,libexec} -name \*.la -delete
-
-rm -rf /tools
-#+end_src
-
-At this point, you can optionally backup your system. If something goes wrong in Chapter 8, you can restore from here:
-
-#+begin_src sh
-# Exit chroot
-logout
-
-# From the host system:
-cd $LFS
-tar -cJpf $HOME/lfs-temp-tools-12.4.tar.xz .
-#+end_src
-
-To restore the backup later if needed:
-
-#+begin_src sh
-cd $LFS
-rm -rf ./*
-tar -xpf $HOME/lfs-temp-tools-12.4.tar.xz
-#+end_src
-
-And you're done with Chapter 7! The temporary tools are now built and you're ready to move on to Chapter 8 where you'll build the final LFS system.
-
-* Chapter 8 - Installing Basic System Software:
-** Man-pages-6.15
-#+begin_src sh
-cd /sources
-tar -xf man-pages-6.15.tar.xz
-cd man-pages-6.15
-
-rm -v man3/crypt*
-make prefix=/usr install
-
-cd /sources
-rm -rf man-pages-6.15
-#+end_src
-
-** Iana-Etc-20250807
-#+begin_src sh
-tar -xf iana-etc-20250807.tar.gz
-cd iana-etc-20250807
-
-cp services protocols /etc
-
-cd /sources
-rm -rf iana-etc-20250807
-#+end_src
-
-** Glibc-2.42
-#+begin_src sh
-tar -xf glibc-2.42.tar.xz
-cd glibc-2.42
-
-patch -Np1 -i ../glibc-2.42-fhs-1.patch
-
-mkdir -v build
-cd build
-
-echo "rootsbindir=/usr/sbin" > configparms
-
-../configure --prefix=/usr                            \
-             --disable-werror                         \
-             --enable-kernel=5.4                      \
-             --enable-stack-protector=strong          \
-             --disable-nscd                           \
-             libc_cv_slibdir=/usr/lib
-
-make
-
-# Optional but recommended - run tests
-make check
-
-# Install
-touch /etc/ld.so.conf
-sed '/test-installation/s@$(PERL)@echo not running@' -i ../Makefile
-make install
-sed '/RTLDLIST=/s@/usr@@g' -i /usr/bin/ldd
-
-# Configure Glibc
-cat > /etc/nsswitch.conf << "EOF"
-passwd: files
-group: files
-shadow: files
-
-hosts: files dns
-networks: files
-
-protocols: files
-services: files
-ethers: files
-rpc: files
-EOF
-
-# Add timezone data
-tar -xf ../../tzdata2025b.tar.gz
-
-ZONEINFO=/usr/share/zoneinfo
-mkdir -pv $ZONEINFO/{posix,right}
-
-for tz in etcetera southamerica northamerica europe africa antarctica  \
-          asia australasia backward; do
-    zic -L /dev/null   -d $ZONEINFO       ${tz}
-    zic -L /dev/null   -d $ZONEINFO/posix ${tz}
-    zic -L leapseconds -d $ZONEINFO/right ${tz}
-done
-
-cp -v zone.tab zone1970.tab iso3166.tab $ZONEINFO
-zic -d $ZONEINFO -p America/New_York
-unset ZONEINFO
-
-# Set your timezone (adjust as needed)
-ln -sfv /usr/share/zoneinfo/America/Los_Angeles /etc/localtime
-
-# Configure dynamic loader
-cat > /etc/ld.so.conf << "EOF"
-/usr/local/lib
-/opt/lib
-EOF
-
-# Configure limits
-cat > /etc/ld.so.conf << "EOF"
-/usr/local/lib
-/opt/lib
-EOF
-
-mkdir -pv /usr/lib/locale
-localedef -i C -f UTF-8 C.UTF-8
-localedef -i en_US -f UTF-8 en_US.UTF-8
-
-cd /sources
-rm -rf glibc-2.42
-#+end_src
-
-** Zlib-1.3.1
-I had a bug with this package so I copied it from the host iso image.
-#+begin_src
-sudo cp -av /usr/lib64/libz.so* /mnt/lfs/usr/lib/
-#+end_src
-
-Or do it the proper way:
-#+begin_src sh
-tar -xf zlib-1.3.1.tar.xz
-cd zlib-1.3.1
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-rm -fv /usr/lib/libz.a
-
-cd /sources
-rm -rf zlib-1.3.1
-#+end_src
-
-** Bzip2-1.0.8
-#+begin_src sh
-tar -xf bzip2-1.0.8.tar.gz
-cd bzip2-1.0.8
-
-patch -Np1 -i ../bzip2-1.0.8-install_docs-1.patch
-
-sed -i 's@\(ln -s -f \)$(PREFIX)/bin/@\1@' Makefile
-sed -i "s@(PREFIX)/man@(PREFIX)/share/man@g" Makefile
-
-make -f Makefile-libbz2_so
-make clean
-make
-make PREFIX=/usr install
-
-cp -av libbz2.so.* /usr/lib
-ln -sv libbz2.so.1.0.8 /usr/lib/libbz2.so
-
-cp -v bzip2-shared /usr/bin/bzip2
-for i in /usr/bin/{bzcat,bunzip2}; do
-  ln -sfv bzip2 $i
-done
-
-rm -fv /usr/lib/libbz2.a
-
-cd /sources
-rm -rf bzip2-1.0.8
-#+end_src
-
-** Xz-5.8.1
-#+begin_src sh
-tar -xf xz-5.8.1.tar.xz
-cd xz-5.8.1
-
-./configure --prefix=/usr    \
-            --disable-static \
-            --docdir=/usr/share/doc/xz-5.8.1
-
-make
-make check
-make install
-
-cd /sources
-rm -rf xz-5.8.1
-#+end_src
-
-** Lz4-1.10.0
-#+begin_src sh
-tar -xf lz4-1.10.0.tar.gz
-cd lz4-1.10.0
-
-make BUILD_STATIC=no PREFIX=/usr
-make -j1 check
-make BUILD_STATIC=no PREFIX=/usr install
-
-cd /sources
-rm -rf lz4-1.10.0
-#+end_src
-
-** Zstd-1.5.7
-#+begin_src sh
-tar -xf zstd-1.5.7.tar.gz
-cd zstd-1.5.7
-
-make prefix=/usr
-make check
-make prefix=/usr install
-
-rm -v /usr/lib/libzstd.a
-
-cd /sources
-rm -rf zstd-1.5.7
-#+end_src
-
-** File-5.46
-#+begin_src sh
-tar -xf file-5.46.tar.gz
-cd file-5.46
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf file-5.46
-#+end_src
-
-** Readline-8.3
-#+begin_src sh
-tar -xf readline-8.3.tar.gz
-cd readline-8.3
-
-sed -i '/MV.*old/d' Makefile.in
-sed -i '/{OLDSUFF}/c:' support/shlib-install
-
-./configure --prefix=/usr    \
-            --disable-static \
-            --with-curses    \
-            --docdir=/usr/share/doc/readline-8.3
-
-make SHLIB_LIBS="-lncursesw"
-make SHLIB_LIBS="-lncursesw" install
-
-install -v -m644 doc/*.{ps,pdf,html,dvi} /usr/share/doc/readline-8.3
-
-cd /sources
-rm -rf readline-8.3
-#+end_src
-
-** M4-1.4.20
-#+begin_src sh
-tar -xf m4-1.4.20.tar.xz
-cd m4-1.4.20
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf m4-1.4.20
-#+end_src
-
-** Bc-7.0.3
-#+begin_src sh
-tar -xf bc-7.0.3.tar.xz
-cd bc-7.0.3
-
-CC=gcc ./configure --prefix=/usr -G -O3 -r
-
-make
-make test
-make install
-
-cd /sources
-rm -rf bc-7.0.3
-#+end_src
-
-** Flex-2.6.4
-#+begin_src sh
-tar -xf flex-2.6.4.tar.gz
-cd flex-2.6.4
-
-./configure --prefix=/usr \
-            --docdir=/usr/share/doc/flex-2.6.4 \
-            --disable-static
-
-make
-make check
-make install
-
-ln -sv flex /usr/bin/lex
-ln -sv flex.1 /usr/share/man/man1/lex.1
-
-cd /sources
-rm -rf flex-2.6.4
-#+end_src
-
-** Tcl-8.6.16
-#+begin_src sh
-tar -xf tcl8.6.16-src.tar.gz
-cd tcl8.6.16
-
-SRCDIR=$(pwd)
-cd unix
-./configure --prefix=/usr           \
-            --mandir=/usr/share/man
-
-make
-
-sed -e "s|$SRCDIR/unix|/usr/lib|" \
-    -e "s|$SRCDIR|/usr/include|"  \
-    -i tclConfig.sh
-
-sed -e "s|$SRCDIR/unix/pkgs/tdbc1.1.10|/usr/lib/tdbc1.1.10|" \
-    -e "s|$SRCDIR/pkgs/tdbc1.1.10/generic|/usr/include|"    \
-    -e "s|$SRCDIR/pkgs/tdbc1.1.10/library|/usr/lib/tcl8.6|" \
-    -e "s|$SRCDIR/pkgs/tdbc1.1.10|/usr/include|"            \
-    -i pkgs/tdbc1.1.10/tdbcConfig.sh
-
-sed -e "s|$SRCDIR/unix/pkgs/itcl4.2.5|/usr/lib/itcl4.2.5|" \
-    -e "s|$SRCDIR/pkgs/itcl4.2.5/generic|/usr/include|"    \
-    -e "s|$SRCDIR/pkgs/itcl4.2.5|/usr/include|"            \
-    -i pkgs/itcl4.2.5/itclConfig.sh
-
-unset SRCDIR
-
-make test
-make install
-
-chmod -v u+w /usr/lib/libtcl8.6.so
-
-make install-private-headers
-
-ln -sfv tclsh8.6 /usr/bin/tclsh
-mv /usr/share/man/man3/{Thread,Tcl_Thread}.3
-
-cd /sources
-rm -rf tcl8.6.16
-#+end_src
-
-** Expect-5.45.4
-#+begin_src sh
-tar -xf expect5.45.4.tar.gz
-cd expect5.45.4
-
-python3 -c 'from pty import spawn; spawn(["echo", "ok"])'
-
-patch -Np1 -i ../expect-5.45.4-gcc15-1.patch
-
-./configure --prefix=/usr           \
-            --with-tcl=/usr/lib     \
-            --enable-shared         \
-            --disable-rpath         \
-            --mandir=/usr/share/man \
-            --with-tclinclude=/usr/include
-
-make
-make test
-make install
-ln -svf expect5.45.4/libexpect5.45.4.so /usr/lib
-
-cd /sources
-rm -rf expect5.45.4
-#+end_src
-
-** DejaGNU-1.6.3
-#+begin_src sh
-tar -xf dejagnu-1.6.3.tar.gz
-cd dejagnu-1.6.3
-
-mkdir -v build
-cd build
-
-../configure --prefix=/usr
-makeinfo --html --no-split -o doc/dejagnu.html ../doc/dejagnu.texi
-makeinfo --plaintext       -o doc/dejagnu.txt  ../doc/dejagnu.texi
-
-make install
-install -v -dm755  /usr/share/doc/dejagnu-1.6.3
-install -v -m644   doc/dejagnu.{html,txt} /usr/share/doc/dejagnu-1.6.3
-
-make check
-
-cd /sources
-rm -rf dejagnu-1.6.3
-#+end_src
-
-** Pkgconf-2.5.1
-#+begin_src sh
-tar -xf pkgconf-2.5.1.tar.xz
-cd pkgconf-2.5.1
-
-./configure --prefix=/usr              \
-            --disable-static           \
-            --docdir=/usr/share/doc/pkgconf-2.5.1
-
-make
-make install
-
-ln -sv pkgconf   /usr/bin/pkg-config
-ln -sv pkgconf.1 /usr/share/man/man1/pkg-config.1
-
-cd /sources
-rm -rf pkgconf-2.5.1
-#+end_src
-
-** Binutils-2.45
-#+begin_src sh
-tar -xf binutils-2.45.tar.xz
-cd binutils-2.45
-
-mkdir -v build
-cd build
-
-../configure --prefix=/usr       \
-             --sysconfdir=/etc   \
-             --enable-gold       \
-             --enable-ld=default \
-             --enable-plugins    \
-             --enable-shared     \
-             --disable-werror    \
-             --enable-64-bit-bfd \
-             --enable-new-dtags  \
-             --with-system-zlib  \
-             --enable-default-hash-style=gnu
-
-make tooldir=/usr
-
-make -k check
-
-make tooldir=/usr install
-
-rm -fv /usr/lib/lib{bfd,ctf,ctf-nobfd,gprofng,opcodes,sframe}.a
-
-cd /sources
-rm -rf binutils-2.45
-#+end_src
-
-** GMP-6.3.0
-#+begin_src sh
-tar -xf gmp-6.3.0.tar.xz
-cd gmp-6.3.0
-
-./configure --prefix=/usr    \
-            --enable-cxx     \
-            --disable-static \
-            --docdir=/usr/share/doc/gmp-6.3.0
-
-make
-make html
-
-make check 2>&1 | tee gmp-check-log
-awk '/# PASS:/{total+=$3} ; END{print total}' gmp-check-log
-
-make install
-make install-html
-
-cd /sources
-rm -rf gmp-6.3.0
-#+end_src
-
-** MPFR-4.2.2
-#+begin_src sh
-tar -xf mpfr-4.2.2.tar.xz
-cd mpfr-4.2.2
-
-./configure --prefix=/usr        \
-            --disable-static     \
-            --enable-thread-safe \
-            --docdir=/usr/share/doc/mpfr-4.2.2
-
-make
-make html
-
-make check
-
-make install
-make install-html
-
-cd /sources
-rm -rf mpfr-4.2.2
-#+end_src
-
-** MPC-1.3.1
-#+begin_src sh
-tar -xf mpc-1.3.1.tar.gz
-cd mpc-1.3.1
-
-./configure --prefix=/usr    \
-            --disable-static \
-            --docdir=/usr/share/doc/mpc-1.3.1
-
-make
-make html
-
-make check
-
-make install
-make install-html
-
-cd /sources
-rm -rf mpc-1.3.1
-#+end_src
-
-** Attr-2.5.2
-#+begin_src sh
-tar -xf attr-2.5.2.tar.gz
-cd attr-2.5.2
-
-./configure --prefix=/usr     \
-            --disable-static  \
-            --sysconfdir=/etc \
-            --docdir=/usr/share/doc/attr-2.5.2
-
-make
-make check
-make install
-
-cd /sources
-rm -rf attr-2.5.2
-#+end_src
-
-** Acl-2.3.2
-#+begin_src sh
-tar -xf acl-2.3.2.tar.xz
-cd acl-2.3.2
-
-./configure --prefix=/usr         \
-            --disable-static      \
-            --docdir=/usr/share/doc/acl-2.3.2
-
-make
-make install
-
-cd /sources
-rm -rf acl-2.3.2
-#+end_src
-
-** Libcap-2.76
-#+begin_src sh
-tar -xf libcap-2.76.tar.xz
-cd libcap-2.76
-
-sed -i '/install -m.*STA/d' libcap/Makefile
-
-make prefix=/usr lib=lib
-make test
-make prefix=/usr lib=lib install
-
-cd /sources
-rm -rf libcap-2.76
-#+end_src
-
-** Libxcrypt-4.4.38
-We can ignore note about api headers
-#+begin_src sh
-tar -xf libxcrypt-4.4.38.tar.xz
-cd libxcrypt-4.4.38
-
-./configure --prefix=/usr                \
-            --enable-hashes=strong,glibc \
-            --enable-obsolete-api=no     \
-            --disable-static             \
-            --disable-failure-tokens
-
-make
-make check
-make install
-
-cd /sources
-rm -rf libxcrypt-4.4.38
-#+end_src
-
-** Shadow-4.18.0
-#+begin_src sh
-tar -xf shadow-4.18.0.tar.xz
-cd shadow-4.18.0
-
-sed -i 's/groups$(EXEEXT) //' src/Makefile.in
-find man -name Makefile.in -exec sed -i 's/groups\.1 / /'   {} \;
-find man -name Makefile.in -exec sed -i 's/getspnam\.3 / /' {} \;
-find man -name Makefile.in -exec sed -i 's/passwd\.5 / /'   {} \;
-
-sed -e 's:#ENCRYPT_METHOD DES:ENCRYPT_METHOD YESCRYPT:' \
-    -e 's:/var/spool/mail:/var/mail:'                   \
-    -e '/PATH=/{s@/sbin:@@;s@/bin:@@}'                  \
-    -i etc/login.defs
-
-touch /usr/bin/passwd
-./configure --sysconfdir=/etc   \
-            --disable-static    \
-            --with-{b,yes}crypt \
-            --without-libbsd    \
-            --with-group-name-max-length=32
-
-make
-make exec_prefix=/usr install
-make -C man install-man
-
-pwconv
-grpconv
-
-mkdir -p /etc/default
-useradd -D --gid 999
-
-sed -i '/MAIL/s/yes/no/' /etc/default/useradd
-
-cd /sources
-rm -rf shadow-4.18.0
-#+end_src
-
-** GCC-15.2.0
-Check gcc failures with the link in the build logs in the book
-pr0576 or whatever is a known fail
-#+begin_src sh
-tar -xf gcc-15.2.0.tar.xz
-cd gcc-15.2.0
-
-case $(uname -m) in
-  x86_64)
-    sed -e '/m64=/s/lib64/lib/' \
-        -i.orig gcc/config/i386/t-linux64
-  ;;
-esac
-
-mkdir -v build
-cd build
-
-../configure --prefix=/usr            \
-             LD=ld                    \
-             --enable-languages=c,c++ \
-             --enable-default-pie     \
-             --enable-default-ssp     \
-             --enable-host-pie        \
-             --disable-multilib       \
-             --disable-bootstrap      \
-             --disable-fixincludes    \
-             --with-system-zlib
-
-make
-
-# Test suite (takes a long time)
-ulimit -s -H unlimited
-sed -e '/cpython/d'               -i ../gcc/testsuite/gcc.dg/plugin/plugin.exp
-sed -e 's/no-pic /&-no-pie /'     -i ../gcc/testsuite/gcc.target/i386/pr113689-1.c
-sed -e 's/300000/(1|300000)/'     -i ../libgomp/testsuite/libgomp.c-c++-common/pr94366.c
-sed -e 's/{ target nonpic }//' -e '/GOTPCREL/d' -i ../gcc/testsuite/gcc.target/i386/fentryname3.c
-
-chown -R tester .
-su tester -c "PATH=$PATH make -k check"
-
-# See test results
-../contrib/test_summary
-
-make install
-
-chown -v -R root:root \
-    /usr/lib/gcc/$(gcc -dumpmachine)/15.2.0/include{,-fixed}
-
-ln -svr /usr/bin/cpp /usr/lib
-
-ln -sv gcc.1 /usr/share/man/man1/cc.1
-
-ln -sfv ../../libexec/gcc/$(gcc -dumpmachine)/15.2.0/liblto_plugin.so \
-        /usr/lib/bfd-plugins/
-
-echo 'int main(){}' > dummy.c
-cc dummy.c -v -Wl,--verbose &> dummy.log
-readelf -l a.out | grep ': /lib'
-
-# Should output: [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]
-
-grep -E -o '/usr/lib.*/S?crt[1in].*succeeded' dummy.log
-grep -B4 '^ /usr/include' dummy.log
-grep 'SEARCH.*/usr/lib' dummy.log |sed 's|; |\n|g'
-grep "/lib.*/libc.so.6 " dummy.log
-grep found dummy.log
-
-rm -v dummy.c a.out dummy.log
-
-mkdir -pv /usr/share/gdb/auto-load/usr/lib
-mv -v /usr/lib/*gdb.py /usr/share/gdb/auto-load/usr/lib
-
-cd /sources
-rm -rf gcc-15.2.0
-#+end_src
-
-** Ncurses-6.5-20250809
-Ignore warning, and do cd test and play with some of these. could be good content. ./hanoi, ./knight
-#+begin_src sh
-tar -xf ncurses-6.5-20250809.tar.gz
-cd ncurses-6.5-20250809
-
-./configure --prefix=/usr           \
-            --mandir=/usr/share/man \
-            --with-shared           \
-            --without-debug         \
-            --without-normal        \
-            --with-cxx-shared       \
-            --enable-pc-files       \
-            --with-pkg-config-libdir=/usr/lib/pkgconfig
-
-make
-make DESTDIR=$PWD/dest install
-install -vm755 dest/usr/lib/libncursesw.so.6.5 /usr/lib
-rm -v  dest/usr/lib/libncursesw.so.6.5
-sed -e 's/^#if.*XOPEN.*$/#if 1/' \
-    -i dest/usr/include/curses.h
-cp -av dest/* /
-
-for lib in ncurses form panel menu ; do
-    ln -sfv lib${lib}w.so /usr/lib/lib${lib}.so
-    ln -sfv ${lib}w.pc    /usr/lib/pkgconfig/${lib}.pc
-done
-
-ln -sfv libncursesw.so /usr/lib/libcurses.so
-
-cp -v -R doc -T /usr/share/doc/ncurses-6.5-20250809
-
-# Optional - play with demos
-make distclean
-./configure --prefix=/usr    \
-            --with-shared    \
-            --without-normal \
-            --without-debug  \
-            --without-cxx-binding \
-            --with-abi-version=5
-
-make sources libs
-cp -av lib/lib*.so.5* /usr/lib
-
-cd /sources
-rm -rf ncurses-6.5-20250809
-#+end_src
-
-** Sed-4.9
-#+begin_src sh
-tar -xf sed-4.9.tar.xz
-cd sed-4.9
-
-./configure --prefix=/usr
-
-make
-make html
-
-chown -R tester .
-su tester -c "PATH=$PATH make check"
-
-make install
-install -d -m755           /usr/share/doc/sed-4.9
-install -m644 doc/sed.html /usr/share/doc/sed-4.9
-
-cd /sources
-rm -rf sed-4.9
-#+end_src
-
-** Psmisc-23.7
-#+begin_src sh
-tar -xf psmisc-23.7.tar.xz
-cd psmisc-23.7
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf psmisc-23.7
-#+end_src
-
-** Gettext-0.26
-#+begin_src sh
-tar -xf gettext-0.26.tar.xz
-cd gettext-0.26
-
-./configure --prefix=/usr    \
-            --disable-static \
-            --docdir=/usr/share/doc/gettext-0.26
-
-make
-make check
-make install
-chmod -v 0755 /usr/lib/preloadable_libintl.so
-
-cd /sources
-rm -rf gettext-0.26
-#+end_src
-
-** Bison-3.8.2
-#+begin_src sh
-tar -xf bison-3.8.2.tar.xz
-cd bison-3.8.2
-
-./configure --prefix=/usr --docdir=/usr/share/doc/bison-3.8.2
-
-make
-make check
-make install
-
-cd /sources
-rm -rf bison-3.8.2
-#+end_src
-
-** Grep-3.12
-#+begin_src sh
-tar -xf grep-3.12.tar.xz
-cd grep-3.12
-
-sed -i "s/echo/#echo/" src/egrep.sh
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf grep-3.12
-#+end_src
-
-** Bash-5.3
-#+begin_src sh
-tar -xf bash-5.3.tar.gz
-cd bash-5.3
-
-./configure --prefix=/usr             \
-            --without-bash-malloc     \
-            --with-installed-readline \
-            bash_cv_strtold_broken=no \
-            --docdir=/usr/share/doc/bash-5.3
-
-make
-
-chown -R tester .
-
-su -s /usr/bin/expect tester << "EOF"
-set timeout -1
-spawn make tests
-expect eof
-lassign [wait] _ _ _ value
-exit $value
-EOF
-
-make install
-
-# Start a new shell
-exec /usr/bin/bash --login
-
-cd /sources
-rm -rf bash-5.3
-#+end_src
-
-** Libtool-2.5.4
-#+begin_src sh
-tar -xf libtool-2.5.4.tar.xz
-cd libtool-2.5.4
-
-./configure --prefix=/usr
-
-make
-make -k check
-make install
-
-rm -fv /usr/lib/libltdl.a
-
-cd /sources
-rm -rf libtool-2.5.4
-#+end_src
-
-** GDBM-1.26
-#+begin_src sh
-tar -xf gdbm-1.26.tar.gz
-cd gdbm-1.26
-
-./configure --prefix=/usr    \
-            --disable-static \
-            --enable-libgdbm-compat
-
-make
-make check
-make install
-
-cd /sources
-rm -rf gdbm-1.26
-#+end_src
-
-** Gperf-3.3
-#+begin_src sh
-tar -xf gperf-3.3.tar.gz
-cd gperf-3.3
-
-./configure --prefix=/usr --docdir=/usr/share/doc/gperf-3.3
-
-make
-make -j1 check
-make install
-
-cd /sources
-rm -rf gperf-3.3
-#+end_src
-
-** Expat-2.7.1
-#+begin_src sh
-tar -xf expat-2.7.1.tar.xz
-cd expat-2.7.1
-
-./configure --prefix=/usr    \
-            --disable-static \
-            --docdir=/usr/share/doc/expat-2.7.1
-
-make
-make check
-make install
-
-install -v -m644 doc/*.{html,css} /usr/share/doc/expat-2.7.1
-
-cd /sources
-rm -rf expat-2.7.1
-#+end_src
-
-** Inetutils-2.6
-#+begin_src sh
-tar -xf inetutils-2.6.tar.xz
-cd inetutils-2.6
-
-sed -i 's/def HAVE_TERMCAP_TGETENT/ 1/' telnet/telnet.c
-
-./configure --prefix=/usr        \
-            --bindir=/usr/bin    \
-            --localstatedir=/var \
-            --disable-logger     \
-            --disable-whois      \
-            --disable-rcp        \
-            --disable-rexec      \
-            --disable-rlogin     \
-            --disable-rsh        \
-            --disable-servers
-
-make
-make check
-make install
-
-mv -v /usr/{,s}bin/ifconfig
-
-cd /sources
-rm -rf inetutils-2.6
-#+end_src
-
-** Less-679
-#+begin_src sh
-tar -xf less-679.tar.gz
-cd less-679
-
-./configure --prefix=/usr --sysconfdir=/etc
-
-make
-make check
-make install
-
-cd /sources
-rm -rf less-679
-#+end_src
-
-** Perl-5.42.0
-#+begin_src sh
-tar -xf perl-5.42.0.tar.xz
-cd perl-5.42.0
-
-export BUILD_ZLIB=False
-export BUILD_BZIP2=0
-
-sh Configure -des                                          \
-             -D prefix=/usr                                \
-             -D vendorprefix=/usr                          \
-             -D privlib=/usr/lib/perl5/5.42/core_perl      \
-             -D archlib=/usr/lib/perl5/5.42/core_perl      \
-             -D sitelib=/usr/lib/perl5/5.42/site_perl      \
-             -D sitearch=/usr/lib/perl5/5.42/site_perl     \
-             -D vendorlib=/usr/lib/perl5/5.42/vendor_perl  \
-             -D vendorarch=/usr/lib/perl5/5.42/vendor_perl \
-             -D man1dir=/usr/share/man/man1                \
-             -D man3dir=/usr/share/man/man3                \
-             -D pager="/usr/bin/less -isR"                 \
-             -D useshrplib                                 \
-             -D usethreads
-
-make
-TEST_JOBS=$(nproc) make test_harness
-make install
-unset BUILD_ZLIB BUILD_BZIP2
-
-cd /sources
-rm -rf perl-5.42.0
-#+end_src
-
-** XML::Parser-2.47
-#+begin_src sh
-tar -xf XML-Parser-2.47.tar.gz
-cd XML-Parser-2.47
-
-perl Makefile.PL
-
-make
-make test
-make install
-
-cd /sources
-rm -rf XML-Parser-2.47
-#+end_src
-
-** Intltool-0.51.0
-#+begin_src sh
-tar -xf intltool-0.51.0.tar.gz
-cd intltool-0.51.0
-
-sed -i 's:\\\${:\\\$\\{:' intltool-update.in
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-install -v -Dm644 doc/I18N-HOWTO /usr/share/doc/intltool-0.51.0/I18N-HOWTO
-
-cd /sources
-rm -rf intltool-0.51.0
-#+end_src
-
-** Autoconf-2.72
-#+begin_src sh
-tar -xf autoconf-2.72.tar.xz
-cd autoconf-2.72
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf autoconf-2.72
-#+end_src
-
-** Automake-1.18.1
-#+begin_src sh
-tar -xf automake-1.18.1.tar.xz
-cd automake-1.18.1
-
-./configure --prefix=/usr --docdir=/usr/share/doc/automake-1.18.1
-
-make
-make -j$(($(nproc)>4?$(nproc):4)) check
-make install
-
-cd /sources
-rm -rf automake-1.18.1
-#+end_src
-
-** OpenSSL-3.5.2
-#+begin_src sh
-tar -xf openssl-3.5.2.tar.gz
-cd openssl-3.5.2
-
-./config --prefix=/usr         \
-         --openssldir=/etc/ssl \
-         --libdir=lib          \
-         shared                \
-         zlib-dynamic
-
-make
-HARNESS_JOBS=$(nproc) make test
-sed -i '/INSTALL_LIBS/s/libcrypto.a libssl.a//' Makefile
-make MANSUFFIX=ssl install
-
-mv -v /usr/share/doc/openssl /usr/share/doc/openssl-3.5.2
-
-cp -vfr doc/* /usr/share/doc/openssl-3.5.2
-
-cd /sources
-rm -rf openssl-3.5.2
-#+end_src
-
-** Libelf from Elfutils-0.193
-Known failure in dwarf_scrlang_check
-#+begin_src sh
-tar -xf elfutils-0.193.tar.bz2
-cd elfutils-0.193
-
-./configure --prefix=/usr                \
-            --disable-debuginfod         \
-            --enable-libdebuginfod=dummy
-
-make
-make check
-make -C libelf install
-install -vm644 config/libelf.pc /usr/lib/pkgconfig
-rm /usr/lib/libelf.a
-
-cd /sources
-rm -rf elfutils-0.193
-#+end_src
-
-** Libffi-3.5.2
-#+begin_src sh
-tar -xf libffi-3.5.2.tar.gz
-cd libffi-3.5.2
-
-./configure --prefix=/usr          \
-            --disable-static       \
-            --with-gcc-arch=native
-
-make
-make check
-make install
-
-cd /sources
-rm -rf libffi-3.5.2
-#+end_src
-
-** Python-3.13.7
-Known expected warning can be surpressed by adding root user action to the global pip.conf like so
-#+begin_src sh
-tar -xf Python-3.13.7.tar.xz
-cd Python-3.13.7
-
-./configure --prefix=/usr        \
-            --enable-shared      \
-            --with-system-expat  \
-            --enable-optimizations
-
-make
-make test
-make install
-
-cat > /etc/pip.conf << EOF
-[global]
-root-user-action = ignore
-disable-pip-version-check = true
-EOF
-
-install -v -dm755 /usr/share/doc/python-3.13.7/html
-
-tar --no-same-owner \
-    -xvf ../python-3.13.7-docs-html.tar.bz2
-cp -R --no-preserve=mode python-3.13.7-docs-html/* \
-    /usr/share/doc/python-3.13.7/html
-
-cd /sources
-rm -rf Python-3.13.7
-#+end_src
-
-** Flit-Core-3.12.0
-#+begin_src sh
-tar -xf flit_core-3.12.0.tar.gz
-cd flit_core-3.12.0
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --no-user --find-links dist flit_core
-
-cd /sources
-rm -rf flit_core-3.12.0
-#+end_src
-
-** Packaging-25.0
-#+begin_src sh
-tar -xf packaging-25.0.tar.gz
-cd packaging-25.0
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --no-user --find-links dist packaging
-
-cd /sources
-rm -rf packaging-25.0
-#+end_src
-
-** Wheel-0.46.1
-#+begin_src sh
-tar -xf wheel-0.46.1.tar.gz
-cd wheel-0.46.1
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --find-links=dist wheel
-
-cd /sources
-rm -rf wheel-0.46.1
-#+end_src
-
-** Setuptools-80.9.0
-#+begin_src sh
-tar -xf setuptools-80.9.0.tar.gz
-cd setuptools-80.9.0
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --find-links dist setuptools
-
-cd /sources
-rm -rf setuptools-80.9.0
-#+end_src
-
-** Ninja-1.13.1
-#+begin_src sh
-tar -xf ninja-1.13.1.tar.gz
-cd ninja-1.13.1
-
-export NINJAJOBS=$(nproc)
-
-sed -i '/int Guess/a \
-  int   j = 0;\
-  char* jobs = getenv( "NINJAJOBS" );\
-  if ( jobs != NULL ) j = atoi( jobs );\
-  if ( j > 0 ) return j;\
-' src/ninja.cc
-
-python3 configure.py --bootstrap
-
-./ninja ninja_test
-./ninja_test --gtest_filter=-SubprocessTest.SetWithLots
-
-install -vm755 ninja /usr/bin/
-install -vDm644 misc/bash-completion /usr/share/bash-completion/completions/ninja
-install -vDm644 misc/zsh-completion  /usr/share/zsh/site-functions/_ninja
-
-cd /sources
-rm -rf ninja-1.13.1
-#+end_src
-
-** Meson-1.8.3
-#+begin_src sh
-tar -xf meson-1.8.3.tar.gz
-cd meson-1.8.3
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --find-links dist meson
-install -vDm644 data/shell-completions/bash/meson /usr/share/bash-completion/completions/meson
-install -vDm644 data/shell-completions/zsh/_meson /usr/share/zsh/site-functions/_meson
-
-cd /sources
-rm -rf meson-1.8.3
-#+end_src
-
-** Kmod-34.2
-#+begin_src sh
-tar -xf kmod-34.2.tar.xz
-cd kmod-34.2
-
-./configure --prefix=/usr     \
-            --sysconfdir=/etc \
-            --with-openssl    \
-            --with-xz         \
-            --with-zstd       \
-            --with-zlib       \
-            --disable-manpages
-
-make
-make install
-
-for target in depmod insmod modinfo modprobe rmmod; do
-  ln -sfv ../bin/kmod /usr/sbin/$target
-  rm -fv /usr/bin/$target
-done
-
-cd /sources
-rm -rf kmod-34.2
-#+end_src
-
-** Coreutils-9.7
-#+begin_src sh
-tar -xf coreutils-9.7.tar.xz
-cd coreutils-9.7
-
-patch -Np1 -i ../coreutils-9.7-i18n-2.patch
-
-autoreconf -fiv
-FORCE_UNSAFE_CONFIGURE=1 ./configure \
-            --prefix=/usr            \
-            --enable-no-install-program=kill,uptime
-
-make
-make NON_ROOT_USERNAME=tester check-root
-
-groupadd -g 102 dummy -U tester
-
-chown -R tester .
-
-su tester -c "PATH=$PATH make -k RUN_EXPENSIVE_TESTS=yes check"
-
-groupdel dummy
-
-make install
-
-mv -v /usr/bin/chroot /usr/sbin
-mv -v /usr/share/man/man1/chroot.1 /usr/share/man/man8/chroot.8
-sed -i 's/"1"/"8"/' /usr/share/man/man8/chroot.8
-
-cd /sources
-rm -rf coreutils-9.7
-#+end_src
-
-** Diffutils-3.12
-#+begin_src sh
-tar -xf diffutils-3.12.tar.xz
-cd diffutils-3.12
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf diffutils-3.12
-#+end_src
-
-** Gawk-5.3.2
-#+begin_src sh
-tar -xf gawk-5.3.2.tar.xz
-cd gawk-5.3.2
-
-sed -i 's/extras//' Makefile.in
-
-./configure --prefix=/usr
-
-make
-chown -R tester .
-su tester -c "PATH=$PATH make check"
-rm -f /usr/bin/gawk-5.3.2
-make install
-
-ln -sv gawk.1 /usr/share/man/man1/awk.1
-
-mkdir -pv                                   /usr/share/doc/gawk-5.3.2
-cp    -v doc/{awkforai.txt,*.{eps,pdf,jpg}} /usr/share/doc/gawk-5.3.2
-
-cd /sources
-rm -rf gawk-5.3.2
-#+end_src
-
-** Findutils-4.10.0
-#+begin_src sh
-tar -xf findutils-4.10.0.tar.xz
-cd findutils-4.10.0
-
-./configure --prefix=/usr --localstatedir=/var/lib/locate
-
-make
-chown -R tester .
-su tester -c "PATH=$PATH make check"
-
-make install
-
-cd /sources
-rm -rf findutils-4.10.0
-#+end_src
-
-** Groff-1.23.0
-#+begin_src sh
-tar -xf groff-1.23.0.tar.gz
-cd groff-1.23.0
-
-PAGE=letter ./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf groff-1.23.0
-#+end_src
-
-** GRUB-2.12
-#+begin_src sh
-tar -xf grub-2.12.tar.xz
-cd grub-2.12
-
-unset {C,CPP,CXX,LD}FLAGS
-
-echo depends bli part_gpt > grub-core/extra_deps.lst
-
-./configure --prefix=/usr          \
-            --sysconfdir=/etc      \
-            --disable-efiemu       \
-            --disable-werror
-
-make
-make install
-mv -v /etc/bash_completion.d/grub /usr/share/bash-completion/completions
-
-cd /sources
-rm -rf grub-2.12
-#+end_src
-
-** Gzip-1.14
-#+begin_src sh
-tar -xf gzip-1.14.tar.xz
-cd gzip-1.14
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf gzip-1.14
-#+end_src
-
-** IPRoute2-6.16.0
-#+begin_src sh
-tar -xf iproute2-6.16.0.tar.xz
-cd iproute2-6.16.0
-
-sed -i /ARPD/d Makefile
-rm -fv man/man8/arpd.8
-
-make NETNS_RUN_DIR=/run/netns
-make SBINDIR=/usr/sbin install
-
-mkdir -pv             /usr/share/doc/iproute2-6.16.0
-cp -v COPYING README* /usr/share/doc/iproute2-6.16.0
-
-cd /sources
-rm -rf iproute2-6.16.0
-#+end_src
-
-** Kbd-2.8.0
-#+begin_src sh
-tar -xf kbd-2.8.0.tar.xz
-cd kbd-2.8.0
-
-patch -Np1 -i ../kbd-2.8.0-backspace-1.patch
-
-sed -i '/RESIZECONS_PROGS=/s/yes/no/' configure
-sed -i 's/resizecons.8 //' docs/man/man8/Makefile.in
-
-./configure --prefix=/usr --disable-vlock
-
-make
-make check
-make install
-
-cp -R -v docs/doc -T /usr/share/doc/kbd-2.8.0
-
-cd /sources
-rm -rf kbd-2.8.0
-#+end_src
-
-** Libpipeline-1.5.8
-#+begin_src sh
-tar -xf libpipeline-1.5.8.tar.gz
-cd libpipeline-1.5.8
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf libpipeline-1.5.8
-#+end_src
-
-** Make-4.4.1
-#+begin_src sh
-tar -xf make-4.4.1.tar.gz
-cd make-4.4.1
-
-./configure --prefix=/usr
-
-make
-chown -R tester .
-su tester -c "PATH=$PATH make check"
-
-make install
-
-cd /sources
-rm -rf make-4.4.1
-#+end_src
-
-** Patch-2.8
-#+begin_src sh
-tar -xf patch-2.8.tar.xz
-cd patch-2.8
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-cd /sources
-rm -rf patch-2.8
-#+end_src
-
-** Tar-1.35
-Known failure test suite 233 (read comment)
-#+begin_src sh
-tar -xf tar-1.35.tar.xz
-cd tar-1.35
-
-FORCE_UNSAFE_CONFIGURE=1  \
-./configure --prefix=/usr
-
-make
-make check
-make install
-make -C doc install-html docdir=/usr/share/doc/tar-1.35
-
-cd /sources
-rm -rf tar-1.35
-#+end_src
-
-** Texinfo-7.2
-#+begin_src sh
-tar -xf texinfo-7.2.tar.xz
-cd texinfo-7.2
-
-./configure --prefix=/usr
-
-make
-make check
-make install
-
-make TEXMF=/usr/share/texmf install-tex
-
-cd /sources
-rm -rf texinfo-7.2
-#+end_src
-
-** Vim-9.1.1629
-Use my own vimrc, ignore vi symlink
-#+begin_src sh
-tar -xf vim-9.1.1629.tar.gz
-cd vim-9.1.1629
-
-echo '#define SYS_VIMRC_FILE "/etc/vimrc"' >> src/feature.h
-
-./configure --prefix=/usr
-
-make
-chown -R tester .
-su tester -c "TERM=xterm-256color LANG=en_US.UTF-8 make -j1 test" \
-   &> vim-test.log
-
-make install
-
-ln -sv vim /usr/bin/vi
-for L in  /usr/share/man/{,*/}man1/vim.1; do
-    ln -sv vim.1 $(dirname $L)/vi.1
-done
-
-ln -sv ../vim/vim91/doc /usr/share/doc/vim-9.1.1629
-
-cat > /etc/vimrc << "EOF"
-" Begin /etc/vimrc
-
-filetype plugin indent on
-set expandtab
-set shiftwidth=4
-set softtabstop=4
-set tabstop=4
-set number
-set relativenumber
-set smartindent
-set showmatch
-set backspace=indent,eol,start
-syntax on
-
-if (&term == "xterm") || (&term == "putty")
-  set background=dark
-endif
-
-" End /etc/vimrc
-EOF
-
-cd /sources
-rm -rf vim-9.1.1629
-#+end_src
-
-** MarkupSafe-3.0.2
-#+begin_src sh
-tar -xf MarkupSafe-3.0.2.tar.gz
-cd MarkupSafe-3.0.2
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --no-user --find-links dist Markupsafe
-
-cd /sources
-rm -rf MarkupSafe-3.0.2
-#+end_src
-
-** Jinja2-3.1.6
-#+begin_src sh
-tar -xf jinja2-3.1.6.tar.gz
-cd jinja2-3.1.6
-
-pip3 wheel -w dist --no-cache-dir --no-build-isolation --no-deps $PWD
-
-pip3 install --no-index --no-user --find-links dist Jinja2
-
-cd /sources
-rm -rf jinja2-3.1.6
-#+end_src
-
-** Udev from Systemd-257.8
-#+begin_src sh
-tar -xf systemd-257.8.tar.gz
-cd systemd-257.8
-
-sed -i -e 's/GROUP="render"/GROUP="video"/' \
-       -e 's/GROUP="sgx", //' rules.d/50-udev-default.rules.in
-
-sed '/systemd-sysctl/s/^/#/' -i rules.d/99-systemd.rules.in
-
-sed '/NETWORK_DIRS/s/systemd/udev/' -i src/basic/path-lookup.h
-
-mkdir -p build
-cd       build
-
-meson setup ..                \
-      --prefix=/usr           \
-      --buildtype=release     \
-      -D mode=release         \
-      -D dev-kvm-mode=0660    \
-      -D link-udev-shared=false \
-      -D logind=false         \
-      -D vconsole=false
-
-export udev_helpers=$(grep "'name' :" ../src/udev/meson.build | \
-                      awk '{print $2}' | tr -d ",'" | grep -v 'udevadm')
-
-ninja udevadm systemd-hwdb \
-      $(ninja -n | grep -Eo '(src/(lib)?udev|rules.d|hwdb.d)/[^ ]*') \
-      $(realpath libudev.so --relative-to .) \
-      $udev_helpers
-
-install -vm755 -d {/usr/lib,/etc}/udev/{hwdb.d,rules.d,network}
-install -vm755 -d /usr/{lib,share}/pkgconfig
-install -vm755 udevadm                            /usr/bin/
-install -vm755 systemd-hwdb                       /usr/bin/udev-hwdb
-ln      -svfn  ../bin/udevadm                     /usr/sbin/udevd
-cp      -av    libudev.so{,*[0-9]}                /usr/lib/
-install -vm644 ../src/libudev/libudev.h           /usr/include/
-install -vm644 src/libudev/*.pc                   /usr/lib/pkgconfig/
-install -vm644 src/udev/*.pc                      /usr/share/pkgconfig/
-install -vm644 ../src/udev/udev.conf              /etc/udev/
-install -vm644 rules.d/* ../rules.d/README        /usr/lib/udev/rules.d/
-install -vm644 $(find ../rules.d/*.rules \
-                      -not -name '*power-switch*') /usr/lib/udev/rules.d/
-install -vm644 hwdb.d/*  ../hwdb.d/{*.hwdb,README} /usr/lib/udev/hwdb.d/
-install -vm755 $udev_helpers                      /usr/lib/udev
-install -vm644 ../network/99-default.link         /usr/lib/udev/network
-
-tar -xvf ../../udev-lfs-20230818.tar.xz
-make -f udev-lfs-20230818/Makefile.lfs install
-
-tar -xf ../../systemd-man-pages-257.8.tar.xz                            \
-    --no-same-owner --strip-components=1                              \
-    -C /usr/share/man --wildcards '*/udev*' '*/libudev*'             \
-                                  '*/systemd.link.5'                 \
-                                  '*/systemd-'{hwdb,udevd.service}.8
-
-sed 's|systemd/network|udev/network|'                                 \
-    /usr/share/man/man5/systemd.link.5                                \
-  > /usr/share/man/man5/udev.link.5
-
-sed 's/systemd\(\\\?-\)/udev\1/' /usr/share/man/man8/systemd-hwdb.8   \
-                                 > /usr/share/man/man8/udev-hwdb.8
-
-sed 's|lib.*udevd|sbin/udevd|'                                        \
-    /usr/share/man/man8/systemd-udevd.service.8                       \
-  > /usr/share/man/man8/udevd.8
-
-rm /usr/share/man/man*/systemd*
-
-unset udev_helpers
-
-udev-hwdb update
-
-cd /sources
-rm -rf systemd-257.8
-#+end_src
-
-** Man-DB-2.13.1
-#+begin_src sh
-tar -xf man-db-2.13.1.tar.xz
-cd man-db-2.13.1
-
-./configure --prefix=/usr                         \
-            --docdir=/usr/share/doc/man-db-2.13.1 \
-            --sysconfdir=/etc                     \
-            --disable-setuid                      \
-            --enable-cache-owner=bin              \
-            --with-browser=/usr/bin/lynx          \
-            --with-vgrind=/usr/bin/vgrind         \
-            --with-grap=/usr/bin/grap             \
-            --with-systemdtmpfilesdir=            \
-            --with-systemdsystemunitdir=
-
-make
-make check
-make install
-
-cd /sources
-rm -rf man-db-2.13.1
-#+end_src
-
-** Procps-ng-4.0.5
-#+begin_src sh
-tar -xf procps-ng-4.0.5.tar.xz
-cd procps-ng-4.0.5
-
-./configure --prefix=/usr                           \
-            --docdir=/usr/share/doc/procps-ng-4.0.5 \
-            --disable-static                        \
-            --disable-kill                          \
-            --with-systemd
-
-make src_w_LDADD='$(LDADD) -lsystemd'
-make check
-make install
-
-cd /sources
-rm -rf procps-ng-4.0.5
-#+end_src
-
-** Util-linux-2.41.1
-Kill error is known
-#+begin_src sh
-tar -xf util-linux-2.41.1.tar.xz
-cd util-linux-2.41.1
-
-./configure --bindir=/usr/bin              \
-            --libdir=/usr/lib              \
-            --runstatedir=/run             \
-            --sbindir=/usr/sbin            \
-            --disable-chfn-chsh            \
-            --disable-login                \
-            --disable-nologin              \
-            --disable-su                   \
-            --disable-setpriv              \
-            --disable-runuser              \
-            --disable-pylibmount           \
-            --disable-static               \
-            --disable-liblastlog2          \
-            --without-python               \
-            ADJTIME_PATH=/var/lib/hwclock/adjtime \
-            --docdir=/usr/share/doc/util-linux-2.41.1
-
-make
-# Skip tests in chroot
-# chown -R tester .
-# su tester -c "make -k check"
-
-make install
-
-cd /sources
-rm -rf util-linux-2.41.1
-#+end_src
-
-** E2fsprogs-1.47.3
-Known m_asdfasfd test fail
-#+begin_src sh
-tar -xf e2fsprogs-1.47.3.tar.gz
-cd e2fsprogs-1.47.3
-
-mkdir -v build
-cd       build
-
-../configure --prefix=/usr           \
-             --sysconfdir=/etc       \
-             --enable-elf-shlibs     \
-             --disable-libblkid      \
-             --disable-libuuid       \
-             --disable-uuidd         \
-             --disable-fsck
-
-make
-make check
-make install
-
-rm -fv /usr/lib/{libcom_err,libe2p,libext2fs,libss}.a
-
-gunzip -v /usr/share/info/libext2fs.info.gz
-install-info --dir-file=/usr/share/info/dir /usr/share/info/libext2fs.info
-
-makeinfo -o      doc/com_err.info ../lib/et/com_err.texinfo
-install -v -m644 doc/com_err.info /usr/share/info
-install-info --dir-file=/usr/share/info/dir /usr/share/info/com_err.info
-
-sed 's/metadata_csum_seed,//' -i /etc/mke2fs.conf
-
-cd /sources
-rm -rf e2fsprogs-1.47.3
-#+end_src
-
-** Sysklogd-2.7.2
-#+begin_src sh
-tar -xf sysklogd-2.7.2.tar.gz
-cd sysklogd-2.7.2
-
-./configure --prefix=/usr      \
-            --sysconfdir=/etc  \
-            --runstatedir=/run \
-            --without-logger
-
-make
-make install
-
-cat > /etc/syslog.conf << "EOF"
-# Begin /etc/syslog.conf
-
-auth,authpriv.* -/var/log/auth.log
-*.*;auth,authpriv.none -/var/log/sys.log
-daemon.* -/var/log/daemon.log
-kern.* -/var/log/kern.log
-mail.* -/var/log/mail.log
-user.* -/var/log/user.log
-*.emerg *
-
-# End /etc/syslog.conf
-EOF
-
-cd /sources
-rm -rf sysklogd-2.7.2
-#+end_src
-
-** SysVinit-3.14
-#+begin_src sh
-tar -xf sysvinit-3.14.tar.xz
-cd sysvinit-3.14
-
-patch -Np1 -i ../sysvinit-3.14-consolidated-1.patch
-
-make
-make install
-
-cd /sources
-rm -rf sysvinit-3.14
-#+end_src
-
-** Stripping Debug Symbols
-
-Now we clean up debug symbols to save space:
-
-#+begin_src sh
-save_usrlib="$(cd /usr/lib; ls ld-linux*[^g])
-             libc.so.6
-             libthread_db.so.1
-             libquadmath.so.0.0.0
-             libstdc++.so.6.0.33
-             libitm.so.1.0.0
-             libatomic.so.1.2.0"
-
-cd /usr/lib
-
-for LIB in $save_usrlib; do
-    objcopy --only-keep-debug --compress-debug-sections=zlib $LIB $LIB.dbg
-    cp $LIB /tmp/$LIB
-    strip --strip-unneeded /tmp/$LIB
-    objcopy --add-gnu-debuglink=$LIB.dbg /tmp/$LIB
-    install -vm755 /tmp/$LIB /usr/lib
-    rm /tmp/$LIB
-done
-
-online_usrbin="bash find strip"
-online_usrlib="libbfd-2.45.so
-               libsframe.so.1.0.0
-               libhistory.so.8.3
-               libncursesw.so.6.5
-               libm.so.6
-               libreadline.so.8.3
-               libz.so.1.3.1
-               libzstd.so.1.5.7
-               $(cd /usr/lib; find libnss*.so* -type f)"
-
-for BIN in $online_usrbin; do
-    cp /usr/bin/$BIN /tmp/$BIN
-    strip --strip-unneeded /tmp/$BIN
-    install -vm755 /tmp/$BIN /usr/bin
-    rm /tmp/$BIN
-done
-
-for LIB in $online_usrlib; do
-    cp /usr/lib/$LIB /tmp/$LIB
-    strip --strip-unneeded /tmp/$LIB
-    install -vm755 /tmp/$LIB /usr/lib
-    rm /tmp/$LIB
-done
-
-for i in $(find /usr/lib -type f -name \*.so* ! -name \*dbg) \
-         $(find /usr/lib -type f -name \*.a)                 \
-         $(find /usr/{bin,sbin,libexec} -type f); do
-    case "$online_usrbin $online_usrlib $save_usrlib" in
-        *$(basename $i)* )
-            ;;
-        * ) strip --strip-unneeded $i 2>/dev/null
-            ;;
-    esac
-done
-
-unset BIN LIB save_usrlib online_usrbin online_usrlib
-#+end_src
-
-** Cleaning Up
-
-#+begin_src sh
-rm -rf /tmp/{*,.*}
-find /usr/lib /usr/libexec -name \*.la -delete
-find /usr -depth -name $(uname -m)-lfs-linux-gnu\* | xargs rm -rf
-userdel -r tester
-#+end_src
-
-** GRUB BLFS LINK
-mkdir BLFS
-cd BLFS
-screen -> control A D
-cd /mnt/lfs/sources/BLFS
-(middle click freetype, middle click efitbootmgr, copy links..)
-wget https://downloads.sourceforge.net/freetype/freetype-2.13.3.tar.xz
-wget https://downloads.sourceforge.net/freetype/freetype-doc-2.13.3.tar.xz
-md5sum * (eyeball check on this to match the md5sums)
-screen -r lfs
-extract freetype-2
-cd freetype-2
-follow instructions from here..
-https://www.linuxfromscratch.org/blfs/view/12.4/general/freetype2.html
-tar -xf ../freetype-doc-2.13.3.tar.xz --strip-components=2 -C docs
-...
-
-we need to get dependencies for efibootmgr...
-
-efivar-39 and popt-1.19
-skip api documentaiton for popt as it is optional
-get grub the same way, just the additional dependency
-then in BLFS, do
-#+begin_src
-tar -xvf ../grub-2.
-#+end_src
-https://youtu.be/ReIeiTqYTGc?list=PLyc5xVO2uDsDzdT8lkx430hZ-gY69wgS3&t=15288
-
-* Chapter 9 - System Configuration:
-** Managing Devies:
-Udev script wont work on qemu..
-We dont need to run it though because all it does is rename enp1s0 to eth0
-We can skip the rest of all this actually since we are not worried about changing our network interface.
-** Network Interface:
-#+begin_src
-cd /etc/sysconfig/
-vim ifconfig.enp1s0
-ONBOOT=yes
-IFACE=enp1s0
-SERVICE=ipv4-static
-IP=192.168.122.101
-GATEWAY=192.168.122.1
-PREFIX=24
-BROADCAST=192.168.122.255
-#+end_src
-
-You can get all this information from running ip a on another machine, or your host machine
-
-#+begin_src
-vim /etc/resolv.conf
-# Begin /etc/resolv.conf
-
-nameserver 8.8.8.8
-nameserver 1.1.1.1
-
-# End /etc/resolv.conf
-#+end_src
-
-I use lfs, btw..
-#+begin_src
-echo 'lfs-btw' >> /etc/hostname
-#+end_src
-
-
-/etc/hosts..
-#+begin_src
-cat > /etc/hosts << "EOF"
-# Begin /etc/hosts
-
-127.0.0.1 localhost
-127.0.1.1 lfs-btw
-::1       localhost
-
-# End /etc/hosts
-EOF
-#+end_src
-
-** sysvinit
-
-Create inittab file for sysvinit
-
-#+begin_src
-cat > /etc/inittab << "EOF"
-# Begin /etc/inittab
-
-id:3:initdefault:
-
-si::sysinit:/etc/rc.d/init.d/rc S
-
-l0:0:wait:/etc/rc.d/init.d/rc 0
-l1:S1:wait:/etc/rc.d/init.d/rc 1
-l2:2:wait:/etc/rc.d/init.d/rc 2
-l3:3:wait:/etc/rc.d/init.d/rc 3
-l4:4:wait:/etc/rc.d/init.d/rc 4
-l5:5:wait:/etc/rc.d/init.d/rc 5
-l6:6:wait:/etc/rc.d/init.d/rc 6
-
-ca:12345:ctrlaltdel:/sbin/shutdown -t1 -a -r now
-
-su:S06:once:/sbin/sulogin
-s1:1:respawn:/sbin/sulogin
-
-1:2345:respawn:/sbin/agetty --noclear tty1 9600
-2:2345:respawn:/sbin/agetty tty2 9600
-3:2345:respawn:/sbin/agetty tty3 9600
-4:2345:respawn:/sbin/agetty tty4 9600
-5:2345:respawn:/sbin/agetty tty5 9600
-6:2345:respawn:/sbin/agetty tty6 9600
-
-# End /etc/inittab
-EOF
-#+end_src
-
-Hardware clock: Linux only, leave it as 1
-#+begin_src
-cat > /etc/sysconfig/clock << "EOF"
-# Begin /etc/sysconfig/clock
-
-UTC=1
-
-# Set this to any options you might need to give to hwclock,
-# such as machine hardware clock type for Alphas.
-CLOCKPARAMS=
-
-# End /etc/sysconfig/clock
-EOF
-#+end_src
-
-We can run this since we're on en-us_UTF-8
-#+begin_src
-cat > /etc/sysconfig/console << "EOF"
-# Begin /etc/sysconfig/console
-
-UNICODE="1"
-FONT="Lat2-Terminus16"
-
-# End /etc/sysconfig/console
-EOF
-#+end_src
-
-If you are on a different keymap, such as gb, or romania or something, check out these instructions here on how to change that.
-
-The rest is optional, let's move on to generating the locales
-** Locale Configuration
-For my situation, im on en_US.UTF-8, and you can check yours with `locale -a`
-
-so i'll do:
-#+begin_src
-cat > /etc/profile << "EOF"
-# Begin /etc/profile
-
-for i in $(locale); do
-  unset ${i%=*}
-done
-
-if [[ "$TERM" = linux ]]; then
-  export LANG=C.UTF-8
-else
-  export LANG=en_US.UTF-8
-fi
-
-# End /etc/profile
-EOF
-#+end_src
-
-If you are on a different locale, you will need to run this command to figure out what to add to the suffix of en_<>
-
-LC_ALL=en_GB locale charmap
-* Chapter 10 - Make System Bootable:
-** Fstab
-
-I can make my fstab just like this, you just need to ensure your /dev/vda matches your actual partition names.
-
-#+begin_src
-cat > /etc/fstab << "EOF"
-# Begin /etc/fstab
-
-# file system  mount-point    type     options             dump  fsck
-#                                                                order
-
-/dev/vda3      /              ext4     defaults            1     1
-/dev/vda1      /boot/efi      vfat     defaults            0     2
-/dev/vda2      swap           swap     pri=1               0     0
-proc           /proc          proc     nosuid,noexec,nodev 0     0
-sysfs          /sys           sysfs    nosuid,noexec,nodev 0     0
-devpts         /dev/pts       devpts   gid=5,mode=620      0     0
-tmpfs          /run           tmpfs    defaults            0     0
-devtmpfs       /dev           devtmpfs mode=0755,nosuid    0     0
-tmpfs          /dev/shm       tmpfs    nosuid,nodev        0     0
-cgroup2        /sys/fs/cgroup cgroup2  nosuid,noexec,nodev 0     0
-
-# End /etc/fstab
-EOF
-#+end_src
-
-** Kernel
-
-Hard part... but final boss if you will
-
-cd /sources
-tar -xvf linux-16
-cd linux-
-
-
-make mrproper
-make defconfig
-
-This creates a config based on my current system architecture. It doesnt make sense for me to customize the kernel here since your hardware will not be the same as mine, so I'll just show you the defaults and how to get it up and running.
-
-Lets add some defaults to get it working
-
-make menuconfig
-
-Actually everything here is good, but just verify some stuff
-For my situation, I'm going to just take a look at every default setting the guide offers, and provide those, as well as enable a few virtio drivers for my qemu setup. Also its important here to follow the blfs guide on EFI since we installed grub using efi.
-
-#+begin_src
-Bare Minimum to Enable for QEMU/KVM VM:
-1. Virtio Drivers (CRITICAL - without these you won't see your disk!)
-Navigate to: Device Drivers → Block devices
-
-Enable: [*] Virtio block driver
-
-Navigate to: Device Drivers → Network device support
-
-Enable: [*] Virtio network driver
-
-Navigate to: Device Drivers → SCSI device support
-
-Enable: [*] virtio-scsi support
-
-Or search in menuconfig (press / then type VIRTIO):
-
-CONFIG_VIRTIO_BLK=y
-CONFIG_VIRTIO_NET=y
-CONFIG_VIRTIO_PCI=y
-CONFIG_SCSI_VIRTIO=y
-
-2. EXT4 Filesystem
-Navigate to: File systems
-
-Enable: [*] The Extended 4 (ext4) filesystem
-Already enabled in defconfig, but verify
-
-3. EFI Boot Support
-Navigate to: Processor type and features
-
-Enable: [*] EFI runtime service support
-Enable: [*] EFI stub support
-
-That's it
-Save and exit (Save → Exit), then:
-#+end_src
-
-time to build the kernel:
-
-#+begin_src
-make
-make modules_install
-#+end_src
-
-Copy these boot files...
-Change ownership of this for BLFS
-#+begin_src
-chown -R 0:0 ../linux-6.16.1
-#+end_src
-
-Skip the modprobe, we didnt do anything with usb ports so we are good.
-We're ready to install grub.
-
-** GRUB
-Skip all of this, just go straight to BLFS page because we are on UEFI, not bios.
-I've installed grub over 100 times on efi, we can just do the following:
-
-mount the efi vars:
-
-#+begin_src
-# mount efivarfs
-mountpoint /sys/firmware/efi/efivars || mount -v -t efivarfs efivarfs /sys/firmware/efi/efivars
-
-# Add efivarfs to fstab
-cat >> /etc/fstab << "EOF"
-efivarfs /sys/firmware/efi/efivars efivarfs defaults 0 0
-EOF
-
-# Install GRUB
-grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=LFS --recheck
-
-# Generate config
-We need to generate a minimal grub config here, we can do so by just pasting this in here:
-cat > /boot/grub/grub.cfg << EOF
-# Begin /boot/grub/grub.cfg
-set default=0
-set timeout=5
-
-insmod part_gpt
-insmod ext2
-set root=(hd0,3)
-
-insmod efi_gop
-insmod efi_uga
-if loadfont /boot/grub/fonts/unicode.pf2; then
-  terminal_output gfxterm
-fi
-
-menuentry "GNU/Linux, Linux 6.16.1-lfs-12.4" {
-  linux   /boot/vmlinuz-6.16.1-lfs-12.4 root=/dev/vda3 ro
-}
-
-menuentry "Firmware Setup" {
-  fwsetup
-}
-EOF
-#+end_src
-
-Note i've changed sda to vda here, and 2 to 3, because that is where my root file system is.
-I cant believe I'm about to say this but its finally time to reboot into our LFS system..
-
-* Reboot and Pray:
-
-#+begin_src
-# Exit chroot
-logout
-
-# Unmount everything (from live CD)
-umount -v /mnt/lfs/dev/pts
-umount -v /mnt/lfs/dev
-umount -v /mnt/lfs/run
-umount -v /mnt/lfs/proc
-umount -v /mnt/lfs/sys
-umount -v /mnt/lfs/boot/efi
-umount -v /mnt/lfs
-
-# Reboot
-reboot
-#+end_src
-
-* Final Thoughts:
-
-Alright, that's it. We just built an entire Linux system from scratch. This is probably
-the most educational project you can do in Linux.
-
-We compiled over 80 packages, built a custom kernel, configured a bootloader, and created
-a fully functional system. You now understand how Linux works at a fundamental level - how
-packages depend on each other, how the toolchain works, how the boot process functions.
-
-This is just the base LFS system. From here, you can continue with BLFS (Beyond Linux From
-Scratch) to add X11, desktop environments, browsers, and all the software you actually use
-day to day.
-
-If you provide proof that you installed LFS using this guide, I will give you a special role in my discord server.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/mangowc.org b/content/org-files/mangowc.org
deleted file mode 100644
index 29ea3b8..0000000
--- a/content/org-files/mangowc.org
+++ /dev/null
@@ -1,332 +0,0 @@
-#+TITLE: MangoWC Installation + Customization Guide
-#+AUTHOR: Tony, btw
-#+date: 2025-10-15
-#+HUGO_TITLE: MangoWC Installation + Customization Guide
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/mangowc.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/mangowc
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless tutorial on how to setup Hyprland on NixOS using flakes + home manager, and optionally using UWSM (the Universal Wayland Session Manager)
-
-* Intro
-What's up guys, my name is Tony, and today I'm gonna give you a quick and painless guide on installing and configuring MangoWC.
-
-MangoWC is a wayland compositor inspired by DWL, but turned into something much greater. It has adopted new features such as scrolling, scratchpad functionality, overview, gestures, animations, and more. It very well may be the best wayland compositor out there.
-
-A quote from the developer:
-#+begin_quote
-"Mango is as lightweight as dwl, and can be built completely within a few seconds. Despite this, Mango does not compromise on functionality."
-– DreamMaoMao
-#+end_quote
-
-* Install Dependencies for Mango
-
-Alright so I'm on arch linux, btw, but this is going to work on NixOS, Gentoo, Slackware, etc. I'll leave install instructions for all 3 of those distributions in this written guide in a link below the subscribe button.
-
-For arch, here are the dependencies we need to install:
-
-[[https://github.com/DreamMaoMao/mangowc][Mango's Official Github]]
-
-#+begin_src sh
-yay -S mangowc-git
-#+end_src
-
-** Requirements for MangoWC
-- glibc
-- wayland
-- wayland-protocols
-- libinput
-- libdrm
-- libxkbcommon
-- pixman
-- git
-- meson
-- ninja
-- libdisplay-info
-- libliftoff
-- hwdata
-- seatd
-- pcre2
-
-** Extra stuff for my setup today:
-- foot (terminal emulator)
-- wmenu (a dmenu clone for wayland)
-- wl-clipboard (wayland clipboard tool)
-- grim, slurp for screenshots
-- swaybg (for wallpapers)
-- firefox (web browser)
-- ttf-jetbrains-mono-nerd (font)
-* Installation Guide per Distro:
-** Arch Linux
-
-For Arch Linux, installation is straightforward using the AUR:
-
-#+begin_src sh
-yay -S mangowc-git
-#+end_src
-
-Then install the required dependencies:
-
-#+begin_src sh
-sudo pacman -Sy foot wl-clipboard wmenu grim slurp swaybg firefox ttf-jetbrains-mono-nerd
-#+end_src
-
-** NixOS
-
-For NixOS, you'll need to add MangoWC as a flake input to your configuration.
-First, add the flake input to your =flake.nix=:
-
-#+begin_src nix
-{
-  inputs = {
-    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
-    mangowc = {
-      url = "github:DreamMaoMao/mangowc";
-      inputs.nixpkgs.follows = "nixpkgs";
-    };
-  };
-
-  outputs = { self, nixpkgs, mangowc, ... }: {
-    nixosConfigurations.yourHostname = nixpkgs.lib.nixosSystem {
-      system = "x86_64-linux";
-      modules = [
-        ./configuration.nix
-        mangowc.nixosModules.default
-      ];
-    };
-  };
-}
-#+end_src
-
-Then enable MangoWC in your =configuration.nix=:
-
-#+begin_src nix
-{ config, pkgs, ... }:
-
-{
-  programs.mangowc.enable = true;
-
-  environment.systemPackages = with pkgs; [
-    foot
-    wmenu
-    wl-clipboard
-    grim
-    slurp
-    swaybg
-    firefox
-  ];
-
-  fonts.packages = with pkgs; [
-    nerd-fonts.jetbrains-mono
-  ];
-}
-#+end_src
-
-Rebuild your system:
-
-#+begin_src sh
-sudo nixos-rebuild switch --flake .#your_hostname
-#+end_src
-
-** Gentoo
-
-For Gentoo users, you'll need to add MangoWC via an overlay or manually compile it.
-
-First, install the dependencies:
-
-#+begin_src sh
-sudo emerge --ask \
-  dev-libs/wayland \
-  dev-libs/wayland-protocols \
-  gui-libs/wlroots \
-  dev-libs/libinput \
-  x11-libs/libdrm \
-  x11-libs/libxkbcommon \
-  x11-libs/pixman \
-  dev-util/meson \
-  dev-util/ninja \
-  sys-apps/hwdata \
-  sys-auth/seatd \
-  dev-libs/libpcre2 \
-  gui-apps/foot \
-  gui-apps/wmenu \
-  gui-apps/wl-clipboard \
-  gui-apps/grim \
-  gui-apps/slurp \
-  gui-apps/swaybg \
-  www-client/firefox \
-  media-fonts/jetbrains-mono
-#+end_src
-
-Then clone and build MangoWC from source:
-
-#+begin_src sh
-git clone https://github.com/DreamMaoMao/mangowc
-cd mangowc
-meson setup build
-ninja -C build
-sudo ninja -C build install
-#+end_src
-
-* Load MangoWC
-
-We're in mangowc now by and as you can see, it's literally just a blank screen with a mouse cursor. Super minimal.
-
-Let's jump into mango's config.conf and get started with some keybinds.
-So lets hit Alt + Enter to open foot, by defualt.
-
-Open up .config/mango/config.conf, and lets change a few keybinds, and add a wmenu script.
-
-#+begin_src conf
-bind=SUPER,Return,spawn,foot
-bind=SUPER,q,killclient,
-bind=SUPER,d,spawn,wmenu-run -l 10
-#+end_src
-
-We can reload the config file with Super R. Now we can spawn terminals with Super Enter as we are used to. Alright this is nice, but we can do better. I personally could get by just like this, with no bar, but lets add one.
-
-Let's add some custom binds for movements, and whatnot later, but for now lets move on to the bar. I encourage you to play around with this file and add/change your binds as needed, and a great place to start especially if you are coming over from dwm is to checkout ArgosNothing's DWM config conversion, and add stuff to it. He made this mango config and this article about it on my website here:
-https://tonybtw.com/community/mango
-
-* Waybar + Autostart
-
-So the file structure for the config directory is gonna be pretty simple today, we're just going to use an autostart.sh, a config.conf, and we'll put waybar's config.jsonc and style.css in here. This will allow you to use waybar with other configs as needed, and not disrupt your other wayland compositor's waybar configs.
-
-#+begin_src sh
-/home/tony/.config/mango
-├── autostart.sh
-├── config.conf
-├── config.jsonc
-├── menu.sh
-├── rebar.sh
-└── style.css
-#+end_src
-
-I already made a video about waybar, so I'm just going to clone my waybar config and start it up with autostart.sh. If you want guidance on customizing waybar, I encourage you to check out the waybar video.
-
-#+begin_src
-git clone https://github.com/tonybanters/waybar
-cp waybar/* ~/.config/mango/.
-#+end_src
-
-And let's add waybar to our autostart.sh
-
-#+begin_src
-vim ~/.config/mango/autostart.sh
-waybar -c ~/.config/mango/config.jsonc -s ~/.config/mango/style.css >/dev/null 2>&1 &
-#+end_src
-
-This will tell mango to start up with a wallpaper, and waybar.
-So we're ready to launch Mango at this point. Let's go ahead and do so, by typing `mango`
-
-* Wallpaper
-We need a wallpaper. With swaybg, we can set one, but we need to download one first. so lets open firefox, and head over to wallhaven.cc and pick one from there.
-
-Let's grab this one, and put it in ~/walls/wall1.png
-
-Now we can set that with
-
-#+begin_src sh
-swaybg -i ~/walls/wall1.png & disown
-#+end_src
-
-Let's add disown here so when we close this terminal, our wallpaper persists.
-
-But we see the issue here, we want this wallpaper to be enabled whenever we launch mangoWC. We can accomplish this simply by adding it to autostart.sh
-
-#+begin_src sh
-vim ~/.config/mango/autostart.sh
-waybar -c ~/.config/mango/config.jsonc -s ~/.config/mango/style.css >/dev/null 2>&1 &
-swaybg -i ~/walls/wall1.png >/dev/null 2>&1 &
-#+end_src
-
-Now if we relaunch mangoWC, we see our wallpaper persists.
-
-* Screenshot Script
-We can add a screenshot script here with `grim`, `slurp`, and `wl-copy`
-
-#+begin_src sh
-#!/bin/sh
-grim -l 0 -g "$(slurp)" - | wl-copy
-#+end_src
-
-And bind this screenshot in our config.conf here:
-
-#+begin_src conf
-bind=SUPER,s,spawn,snip
-#+end_src
-
-* My Keybinds:
-
-Here's a breakdown of all the essential keybinds for MangoWC. These are configured in your =~/.config/mango/config.conf= file:
-
-** Basic Controls
-
-| Keybind              | Action              | Description                                      |
-|----------------------+---------------------+--------------------------------------------------|
-| =Super + Enter=      | Launch Terminal     | Opens foot terminal emulator                     |
-| =Super + d=          | Application Launcher| Opens wmenu for launching applications           |
-| =Super + q=          | Kill Window         | Closes the currently focused window              |
-| =Super + Shift + r=  | Reload Config       | Reloads the MangoWC configuration file           |
-| =Super + R=          | Reload Waybar       | Runs the rebar script to restart waybar         |
-| =Super + s=          | Screenshot          | Takes a screenshot of selected area (using snip.sh) |
-
-** Workspace Management
-
-| Keybind         | Action          | Description                              |
-|-----------------+-----------------+------------------------------------------|
-| =Super + 1-9=   | Switch Tag      | Switches to workspace/tag 1 through 9    |
-| =Super + i=     | Increase Master | Adds one more window to master area      |
-| =Super + p=     | Decrease Master | Removes one window from master area      |
-| =Super + 0=     | Toggle Overview | Shows overview of all windows/workspaces |
-
-** Window Management
-
-| Keybind                 | Action       | Description                              |
-|-------------------------+--------------+------------------------------------------|
-| =Super + j=             | Focus Next   | Focuses the next window in the stack     |
-| =Super + k=             | Focus Previous | Focuses the previous window in the stack |
-| =Super + h=             | Focus Left   | Focuses the window to the left           |
-| =Super + l=             | Focus Right  | Focuses the window to the right          |
-| =Super + Shift + j=     | Swap Down    | Swaps current window with the one below  |
-| =Super + Shift + k=     | Swap Up      | Swaps current window with the one above  |
-| =Super + Shift + h=     | Swap Left    | Swaps current window with the one on the left |
-| =Super + Shift + l=     | Swap Right   | Swaps current window with the one on the right |
-| =Ctrl + Shift + j/k/h/l= | Smart Move   | Moves window in specified direction      |
-
-** Layout Controls
-
-| Keybind             | Action           | Description                             |
-|---------------------+------------------+-----------------------------------------|
-| =Super + t=         | Tile Layout      | Sets layout to tiled mode               |
-| =Super + v=         | Vertical Grid    | Sets layout to vertical grid            |
-| =Super + c=         | Spiral Layout    | Sets layout to spiral mode              |
-| =Super + x=         | Scroller Layout  | Sets layout to scroller mode            |
-| =Super + n=         | Switch Layout    | Cycles through available layouts        |
-| =Super + a=         | Toggle Gaps      | Toggles window gaps on/off              |
-| =Super + f=         | Toggle Float     | Toggles floating mode for current window |
-| =Super + Shift + f= | Toggle Fullscreen | Toggles fullscreen for current window   |
-
-** Mouse Bindings
-
-| Keybind                | Action        | Description                              |
-|------------------------+---------------+------------------------------------------|
-| =Super + Left Click=   | Move Window   | Click and drag to move floating windows  |
-| =Super + Right Click=  | Resize Window | Click and drag to resize windows         |
-
-** Touchpad Gestures
-
-| Gesture                          | Action          | Description                              |
-|----------------------------------+-----------------+------------------------------------------|
-| 3-finger swipe left/right/up/down | Focus Direction | Focuses window in the swipe direction    |
-| 4-finger swipe left              | Previous Tag    | Switches to previous tag with clients    |
-| 4-finger swipe right             | Next Tag        | Switches to next tag with clients        |
-| 4-finger swipe up/down           | Toggle Overview | Shows/hides workspace overview           |
-* Final Thoughts
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/neovim.org b/content/org-files/neovim.org
deleted file mode 100644
index 8ecd4fb..0000000
--- a/content/org-files/neovim.org
+++ /dev/null
@@ -1,350 +0,0 @@
-#+TITLE: Neovim on Linux — Complete IDE Tutorial
-#+AUTHOR: Tony, btw
-#+DATE: 2025-05-10
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/neovim.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/www/tonybtw.com
-#+HUGO_SECTION: tutorial/neovim
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+HUGO_TITLE: Neovim | Complete IDE Tutorial
-#+DESCRIPTION: A quick and painless guide on installing and configuring Neovim, and how to use it as your full daily driver IDE, btw.
-#+IMAGE: /img/neovim.png
-
-* Intro
-
-A clean and painless guide to turning Neovim into a modern IDE.
-
-Neovim is a Vim-based text editor built for extensibility and usability. In this tutorial, you’ll learn how to set it up with plugins, keybinds, and full LSP support. This guide assumes you're using a Unix-like system and are comfortable with basic terminal commands.
-
-* Install Neovim and dependencies
-
-Use your system’s package manager to install Neovim, along with a few tools that will be required later (like npm and ripgrep).
-
-#+begin_src sh
-# Gentoo
-sudo emerge app-editors/neovim
-sudo emerge net-libs/nodejs
-sudo emerge sys-apps/ripgrep
-
-# Arch
-sudo pacman -S neovim nodejs npm ripgrep
-#+end_src
-
-* Set up your Neovim config directory
-
-Create your config folder and add the main config file.
-
-#+begin_src sh
-mkdir -p ~/.config/nvim
-cd ~/.config/nvim
-nvim .
-#+end_src
-
-In Neovim, press =%= to create a new file named =init.lua=:
-
-#+begin_src lua
-print("I use Neovim by the way")
-#+end_src
-
-Save and quit with =:wq=, then reopen Neovim.
-
-* Create a Lua module for options
-
-#+begin_src sh
-mkdir -p ~/.config/nvim/lua/config
-nvim lua/config/options.lua
-#+end_src
-
-#+begin_src lua
-vim.opt.number = true
-vim.opt.relativenumber = true
-vim.opt.cursorline = true
-vim.opt.shiftwidth = 4
-#+end_src
-
-Then in =init.lua=:
-
-#+begin_src lua
-require("config.options")
-#+end_src
-
-* Add keybindings
-
-Here is how I set my leader key:
-
-#+begin_src lua
-vim.g.mapleader = " "
-vim.keymap.set("n", "<leader>cd", vim.cmd.Ex)
-#+end_src
-
-In =init.lua=:
-
-#+begin_src lua
-require("config.keybinds")
-#+end_src
-
-* Install Lazy.nvim
-
-Clone it into your runtime path.
-
-#+begin_src lua
-local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
-if not vim.loop.fs_stat(lazypath) then
-  vim.fn.system({
-    "git",
-    "clone",
-    "--filter=blob:none",
-    "https://github.com/folke/lazy.nvim.git",
-    "--branch=stable",
-    lazypath,
-  })
-end
-vim.opt.rtp:prepend(lazypath)
-
-require("lazy").setup({})
-#+end_src
-
-Then:
-
-#+begin_src lua
-require("config.lazy")
-#+end_src
-
-* Add a theme plugin
-
-#+begin_src lua
-return {
-  "folke/tokyonight.nvim",
-  config = function()
-    vim.cmd.colorscheme("tokyonight")
-  end,
-}
-#+end_src
-
-* Add Telescope for fuzzy finding
-
-#+begin_src lua
-return {
-  "nvim-telescope/telescope.nvim",
-  dependencies = { "nvim-lua/plenary.nvim" },
-  config = function()
-    local builtin = require("telescope.builtin")
-    vim.keymap.set("n", "<leader>ff", builtin.find_files)
-    vim.keymap.set("n", "<leader>fg", builtin.live_grep)
-    vim.keymap.set("n", "<leader>fb", builtin.buffers)
-    vim.keymap.set("n", "<leader>fh", builtin.help_tags)
-  end,
-}
-#+end_src
-
-* Add Treesitter for syntax highlighting
-
-#+begin_src lua
-return {
-  "nvim-treesitter/nvim-treesitter",
-  build = ":TSUpdate",
-  config = function()
-    require("nvim-treesitter.configs").setup({
-      highlight = { enable = true },
-      indent = { enable = true },
-      ensure_installed = { "lua" },
-      auto_install = false,
-    })
-  end,
-}
-#+end_src
-
-* Add Harpoon for file bookmarking
-
-#+begin_src lua
-return {
-  "ThePrimeagen/harpoon",
-  config = function()
-    local harpoon = require("harpoon")
-    vim.keymap.set("n", "<leader>a", function() harpoon:list():add() end)
-    vim.keymap.set("n", "<C-e>", function() harpoon.ui:toggle_quick_menu(harpoon:list()) end)
-  end,
-}
-#+end_src
-
-* Add LSP, autocompletion, and snippets
-
-#+begin_src lua
-return {
-  "neovim/nvim-lspconfig",
-  dependencies = {
-    "williamboman/mason.nvim",
-    "hrsh7th/nvim-cmp",
-    "L3MON4D3/LuaSnip",
-  },
-  config = function()
-    require("mason").setup()
-    require("mason-lspconfig").setup({ ensure_installed = { "lua_ls" } })
-
-    local lspconfig = require("lspconfig")
-    lspconfig.lua_ls.setup({})
-
-    local cmp = require("cmp")
-    cmp.setup({
-      snippet = {
-        expand = function(args)
-          require("luasnip").lsp_expand(args.body)
-        end,
-      },
-      mapping = cmp.mapping.preset.insert({
-        ["<Tab>"] = cmp.mapping.select_next_item(),
-        ["<S-Tab>"] = cmp.mapping.select_prev_item(),
-      }),
-      sources = { { name = "nvim_lsp" }, { name = "luasnip" } },
-    })
-  end,
-}
-#+end_src
-
-* One-liner utility plugins
-
-#+begin_src lua
-return {
-  { "tpope/vim-fugitive" },
-  { "ojroques/nvim-osc52" },
-  {
-    "norcalli/nvim-colorizer.lua",
-    config = function()
-      require("colorizer").setup()
-    end,
-  },
-}
-#+end_src
-
-* Final =init.lua= Example
-
-#+begin_src lua
-require("config.options")
-require("config.keybinds")
-require("config.lazy")
-#+end_src
-#+begin_src sh
-/home/tony/.config/nvim
-├── init.lua
-├── lazy-lock.json
-├── lua
-│   ├── config
-│   │   ├── keybinds.lua
-│   │   ├── lazy.lua
-│   │   └── options.lua
-│   └── plugins
-│       ├── colors.lua
-│       ├── harpoon.lua
-│       ├── init.lua
-│       ├── lsp.lua
-│       ├── lualine.lua
-│       ├── one-liners.lua
-│       ├── orgmode.lua
-│       ├── telescope.lua
-│       └── treesitter.lua
-├── plugin
-│   └── flterm.lua
-└── README.md
-
-5 directories, 16 files
-
-#+end_src
-
-* My keybinds
-
-If you want to just copy my nvim config, my keybind documentation is here:
-
-** General
-
-| Mode | Key             | Action                                                 |
-|------+-----------------+--------------------------------------------------------|
-| n    | <leader>cd      | Open Ex mode (`:Ex`)                                   |
-| n    | J               | Join lines while keeping the cursor in place           |
-| n    | <C-d>           | Scroll half-page down and center cursor                |
-| n    | <C-u>           | Scroll half-page up and center cursor                  |
-| n    | n               | Next search result (centered)                          |
-| n    | N               | Prev search result (centered)                          |
-| n    | Q               | Disable Ex mode                                        |
-| n    | <C-k>           | Next quickfix entry (centered)                         |
-| n    | <C-j>           | Prev quickfix entry (centered)                         |
-| n    | <leader>k       | Next location list entry (centered)                    |
-| n    | <leader>j       | Prev location list entry (centered)                    |
-| i    | <C-c>           | Exit insert mode                                       |
-| n    | <leader>x       | Make current file executable                           |
-| n    | <leader>u       | Toggle Undotree                                        |
-| n    | <leader>rl      | Reload config                                          |
-| n    | <leader><leader>| Source current file                                    |
-
-** Visual Mode
-
-| Mode | Key         | Action                                      |
-|------+-------------+---------------------------------------------|
-| v    | J           | Move block down                             |
-| v    | K           | Move block up                               |
-| x    | <leader>p   | Paste without overwriting clipboard         |
-| v    | <leader>y   | Yank to system clipboard                    |
-
-** Linting & Formatting
-
-| Mode | Key      | Action                          |
-|------+----------+---------------------------------|
-| n    | <leader>cc | Run php-cs-fixer              |
-| n    | <F3>     | Format (LSP)                    |
-
-** Telescope
-
-| Mode | Key         | Action                                  |
-|------+-------------+-----------------------------------------|
-| n    | <leader>ff  | Find files                              |
-| n    | <leader>fg  | Git-tracked files                       |
-| n    | <leader>fo  | Recent files                            |
-| n    | <leader>fq  | Quickfix list                           |
-| n    | <leader>fh  | Help tags                               |
-| n    | <leader>fb  | Buffers                                 |
-| n    | <leader>fs  | Grep string under cursor                |
-| n    | <leader>fc  | Grep current filename (no extension)    |
-| n    | <leader>fi  | Search in ~/.config/nvim                |
-
-** Harpoon
-
-| Mode | Key         | Action                           |
-|------+-------------+----------------------------------|
-| n    | <leader>a   | Add to Harpoon                   |
-| n    | <C-e>       | Toggle Harpoon quick menu        |
-| n    | <leader>fl  | Telescope Harpoon marks          |
-| n    | <C-p>       | Prev Harpoon mark                |
-| n    | <C-n>       | Next Harpoon mark                |
-
-** LSP
-
-| Mode     | Key     | Action                            |
-|----------+---------+-----------------------------------|
-| n        | K       | Hover docs                        |
-| n        | gd      | Go to definition                  |
-| n        | gD      | Go to declaration                 |
-| n        | gi      | Go to implementation              |
-| n        | go      | Go to type definition             |
-| n        | gr      | List references                   |
-| n        | gs      | Signature help                    |
-| n        | gl      | Show diagnostics float            |
-| n        | <F2>    | Rename symbol                     |
-| n,x      | <F3>    | Format code                       |
-| n        | <F4>    | Code actions                      |
-
-** Misc
-
-| Mode | Key         | Action                                     |
-|------+-------------+--------------------------------------------|
-| n    | <leader>dg  | Run DogeGenerate                           |
-| n    | <leader>s   | Replace word on current line               |
-
-
-* Final Thoughts
-
-You're now ready to use Neovim as a modern, fast, and extensible code editor.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/niri.org b/content/org-files/niri.org
deleted file mode 100644
index 6a7787a..0000000
--- a/content/org-files/niri.org
+++ /dev/null
@@ -1,394 +0,0 @@
-#+TITLE: Niri, btw
-#+AUTHOR: Tony, btw
-#+date: 2025-11-05
-#+HUGO_TITLE: Niri, btw!
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/niri.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/niri
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless tutorial on how to setup Niri on Arch/NixOS/Gentoo. It is a wonderful wayland compositor masquerading as a window manager.
-
-* Intro
-
-What's up guys, my name is Tony, and today I'm gonna give you a quick and painless guide on installing and configuring Niri.
-
-Niri is a "scrollable-tiling" wayland compositor that masquerades as a window manager. Here are some of the unique features of niri:
-
-- Infinite horizontal Scroll
-- Dynamic workspaces like in GNOME
-- An Overview that zooms out workspaces and windows
-- Built-in screenshot UI
-- Per Monitor Workspaces (Shoutout to The Linux Cast because I know he loves that so much, and he loves xwayland-sattelite.)
-- and much more.
-
-A quote from the famous philosopher, Argocrates:
-#+begin_quote
-"Niri is the anti-window manager. I can just constantly spawn new windows, without having to worry about my window manager trying to "manage" my windows layout against a set output size. The only downside is that sometimes I forget I have 300 terminals opened all the way to the right."
-#+end_quote
-
-Let's jump into the installation.
-
-* Install Dependencies for Niri
-
-Alright so I'm on arch linux, btw, but this is going to work on NixOS, Gentoo, LFS, etc. I'll leave install instructions for all 3 of those distributions in this written guide in a link below the subscribe button.
-
-For arch, here are the dependencies we need to install:
-
-[[https://github.com/YaLTeR/niri][Github Repo]]
-
-*** Arch Linux
-#+begin_src sh
-yay -S niri noctalia-shell
-#+end_src
-
-*** NixOS
-For NixOS, you can add niri to your system configuration. Here's how to enable it:
-
-#+begin_src nix
-# In your configuration.nix or flake.nix
-{
-  programs.niri.enable = true;
-
-  # Or add to your packages
-  environment.systemPackages = with pkgs; [
-    niri
-    xwayland-satellite
-  ];
-}
-#+end_src
-
-For noctalia-shell on NixOS, you'll need to add it as a flake input (see the noctalia-shell section below for details).
-
-*** Gentoo
-For Gentoo, niri can be installed from GURU overlay:
-
-#+begin_src sh
-# Add the GURU overlay
-sudo eselect repository enable guru
-sudo emerge --sync guru
-
-# Install niri
-sudo emerge gui-wm/niri
-#+end_src
-
-We're going to use Noctalia Shell today as a bar, because I've used waybar for all of my previous wayland videos, I wanted to shake things up a bit. I'll do more of a deep dive on Quickshell in a separate video, but for today we're going to focus on Niri and how to customize and utilize it.
-
-** Requirements for Niri
-- glibc
-- wayland
-- wayland-protocols
-- libinput
-- libdrm
-- libxkbcommon
-- pixman
-- git
-- meson
-- ninja
-- libdisplay-info
-- libliftoff
-- hwdata
-- seatd
-- pcre2
-
-** Extra stuff for my setup today:
-- alacritty (terminal emulator)
-- fuzzel (a dmenu clone for wayland)
-- swaybg (for wallpapers)
-- firefox (web browser)
-- ttf-jetbrains-mono-nerd (font)
-- xwayland-sattelite
-
-So let's install these with pacman -Sy
-#+begin_src sh
-sudo pacman -Sy alacritty fuzzel swaybg firefox ttf-jetbrains-mono-nerd xwayland-sattelite
-#+end_src
-
-Alright, lets jump into niri by typing 'Niri'
-
-* Load Niri
-We're in niri now by and as you can see, this awesome help tool reminds you of the default kebinds. You can open this at any time with super shift slash.
-
-So lets hit Super + T to open alacritty, by defualt.
-
-Open up .config/niri/config.kdl, and lets change a few keybinds, and options.
-
-First, lets add this option to the top of the file:
-
-#+begin_src kdl
-prefer-no-csd
-#+end_src
-
-This flag will make niri ask the applications to omit their client-side decorations, so we won't see this header on alacritty.
-
-As always, let's fix the repeat rate and repeat delay, heres how to do it in niri:
-
-#+begin_src kdl
-input {
-    keyboard {
-        repeat-delay 200
-        repeat-rate 35
-    }
-}
-#+end_src
-
-For touchpad settings, this is up to you, I prefer 'natural-scroll' off, but I'll leave all these options commented out in my config so you guys can adjust them as needed for your preferences.
-
-And let's uncomment this so our focus follows our mouse:
-
-#+begin_src kdl
-focus-follows-mouse max-scroll-amount="0%"
-#+end_src
-
-Let's add some keybinds here:
-#+begin_src kdl
-    Mod+Return hotkey-overlay-title="Open a Terminal: alacritty" { spawn "alacritty"; }
-    Mod+D hotkey-overlay-title="Run an Application: fuzzel" { spawn "fuzzel"; }
-
-    Mod+Shift+1 { move-column-to-workspace 1; }
-    Mod+Shift+2 { move-column-to-workspace 2; }
-    Mod+Shift+3 { move-column-to-workspace 3; }
-    Mod+Shift+4 { move-column-to-workspace 4; }
-    Mod+Shift+5 { move-column-to-workspace 5; }
-    Mod+Shift+6 { move-column-to-workspace 6; }
-    Mod+Shift+7 { move-column-to-workspace 7; }
-    Mod+Shift+8 { move-column-to-workspace 8; }
-    Mod+Shift+9 { move-column-to-workspace 9; }
-#+end_src
-
-And lets change control to shift here as well for moving things to separate workspaces.
-
-Now for the layout section, let's customize the gaps and focus ring:
-
-#+begin_src kdl
-layout {
-    gaps 5
-
-    focus-ring {
-        width 1.5
-        active-color "#7fc8ff"
-        inactive-color "#505050"
-    }
-
-    border {
-        off
-    }
-}
-#+end_src
-
-I also like to add some rounded corners to my windows with window rules:
-
-#+begin_src kdl
-window-rule {
-    geometry-corner-radius 4
-    clip-to-geometry true
-}
-#+end_src
-
-This is about 90% complete, and thats because the defaults for niri are already really good imo. If you have multiple monitors, you need to edit the monitors block, and you can get information about your monitors with `niri msg outputs`
-
-The file reloads automatically so we can test opening another terminal here, and boom there we go.
-
-Alright this is nice, but we can do better. I personally could get by just like this, but lets add that noctalia shell.
-
-* Noctalia Shell + Autostart
-So for noctalia shell, we've already installed it with yay if you're on Arch. Here are the instructions for all distributions:
-
-*** Arch Linux
-#+begin_src sh
-yay -S noctalia-shell
-#+end_src
-
-*** NixOS
-For NixOS, noctalia-shell needs to be added as a flake input. Add this to your flake.nix:
-
-#+begin_src nix
-{
-  inputs = {
-    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
-    noctalia-shell.url = "github:Noctalia-Shell/noctalia-shell";
-  };
-
-  outputs = { self, nixpkgs, noctalia-shell }: {
-    nixosConfigurations.yourHostname = nixpkgs.lib.nixosSystem {
-      system = "x86_64-linux";
-      modules = [
-        ./configuration.nix
-        ({ pkgs, ... }: {
-          environment.systemPackages = [
-            noctalia-shell.packages.x86_64-linux.default
-          ];
-        })
-      ];
-    };
-  };
-}
-#+end_src
-
-*** Gentoo
-For Gentoo, noctalia-shell can be compiled from source:
-
-#+begin_src sh
-# Install quickshell first (dependency)
-git clone https://github.com/outfoxxed/quickshell
-cd quickshell
-# Follow the build instructions in their README
-
-# Then install noctalia-shell
-git clone https://github.com/Noctalia-Shell/noctalia-shell
-# Copy the config to ~/.config/quickshell/noctalia
-#+end_src
-
-Lets test to see if we have access to noctalia shell by typing:
-
-`noctalia-shell`
-`qs -c ~/.config/quickshell/noctalia`
-
-So lets add this to our spawn-at-startup!
-
-#+begin_src kdl
-spawn-at-startup "noctalia-shell"
-#+end_src
-
-Noctalia-shell is highly customizable. Here are some of my settings that you can adjust in `~/.config/quickshell/noctalia/settings.json`:
-
-#+begin_src json
-{
-    "bar": {
-        "position": "top",
-        "widgets": {
-            "left": [
-                { "id": "SystemMonitor", "showCpuTemp": true, "showCpuUsage": true, "showMemoryUsage": true },
-                { "id": "ActiveWindow", "showIcon": true, "maxWidth": 145 },
-                { "id": "MediaMini", "maxWidth": 145 }
-            ],
-            "center": [
-                { "id": "Workspace", "labelMode": "name", "hideUnoccupied": false }
-            ],
-            "right": [
-                { "id": "ScreenRecorder" },
-                { "id": "Tray" },
-                { "id": "Battery" },
-                { "id": "Volume" },
-                { "id": "Clock", "formatHorizontal": "HH:mm ddd, MMM dd" },
-                { "id": "ControlCenter" }
-            ]
-        }
-    },
-    "colorSchemes": {
-        "darkMode": true,
-        "predefinedScheme": "Tokyo Night"
-    },
-    "ui": {
-        "fontDefault": "JetBrainsMono Nerd Font Propo"
-    }
-}
-#+end_src
-
-The color scheme is in `~/.config/quickshell/noctalia/colors.json`, and I'm using a Tokyo Night theme.
-
-
-* Wallpaper
-Actually, if you're using noctalia-shell, wallpaper management is built right in! Noctalia has a wallpaper selector and can automatically rotate through your wallpapers.
-
-In your `~/.config/quickshell/noctalia/settings.json`, configure the wallpaper settings:
-
-#+begin_src json
-{
-    "wallpaper": {
-        "directory": "/home/tony/walls",
-        "enabled": true,
-        "fillMode": "crop",
-        "randomEnabled": true,
-        "randomIntervalSec": 300,
-        "transitionDuration": 1500
-    }
-}
-#+end_src
-
-This will automatically handle your wallpapers with smooth transitions. But if you want to use swaybg manually, you can still add it to your niri config:
-
-#+begin_src kdl
-spawn-sh-at-startup "swaybg -i ~/walls/wall1.png"
-#+end_src
-
-* Screenshot Script
-Good news! Niri has a built-in screenshot UI that's actually really nice. You can trigger it with these keybinds (already in the default config):
-
-#+begin_src kdl
-Mod+S { screenshot; }
-Ctrl+Print { screenshot-screen; }
-Alt+Print { screenshot-window; }
-#+end_src
-
-Screenshots are saved to `~/Pictures/Screenshots/` by default, but you can change this in your config:
-
-#+begin_src kdl
-screenshot-path "~/Pictures/Screenshots/Screenshot from %Y-%m-%d %H-%M-%S.png"
-#+end_src
-
-If you prefer the traditional grim + slurp workflow, you can still use that:
-
-#+begin_src sh
-#!/bin/sh
-grim -g "$(slurp)" - | wl-copy
-#+end_src
-
-And bind it in your config.kdl:
-
-#+begin_src kdl
-Mod+Shift+S { spawn "path-to-your-screenshot-script"; }
-#+end_src
-
-* Additional Customizations
-So at this point, the world is really your oyster. Niri is incredibly flexible and customizable.
-
-Here's a summary of my favorite keybinds:
-
-| Keybind             | Action                              |
-|---------------------+-------------------------------------|
-| Super+Return        | Opens a terminal (alacritty)        |
-| Super+D             | Runs fuzzel (application launcher)  |
-| Super+Q             | Closes a window                     |
-| Super+H/J/K/L       | Navigate between windows (vim-style)|
-| Super+1-9           | Switch to workspace 1-9             |
-| Super+Shift+1-9     | Move window to workspace 1-9        |
-| Super+S             | Take a screenshot                   |
-| Super+O             | Toggle Overview mode                |
-| Super+F             | Maximize column                     |
-| Super+Shift+F       | Fullscreen window                   |
-| Super+R             | Cycle through preset column widths  |
-| Super+C             | Center the current column           |
-
-Some advanced features I really like:
-
-Named workspaces - You can create custom named workspaces instead of just numbers:
-
-#+begin_src kdl
-workspace "a" { }
-workspace "b" { }
-workspace "c" { }
-#+end_src
-
-Window rules - Automatically manage specific applications:
-
-#+begin_src kdl
-window-rule {
-    match title="Firefox"
-    open-on-workspace "c"
-    open-maximized true
-}
-#+end_src
-
-The Overview feature (Super+O) is absolutely killer - it gives you a birds-eye view of all your workspaces and windows, similar to GNOME's Activities view.
-
-* Final Thoughts
-
-You're now ready to use Niri as a modern, fast, and extensible wayland compositor.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/nixos-from-scratch.org b/content/org-files/nixos-from-scratch.org
deleted file mode 100644
index 953a693..0000000
--- a/content/org-files/nixos-from-scratch.org
+++ /dev/null
@@ -1,513 +0,0 @@
-#+title: How to Install NixOS From Scratch | Flakes + Home Manager Full Guide
-#+author: Tony, btw
-#+date: 2025-09-05
-#+HUGO_TITLE: How to Install NixOS From Scratch | Flakes + Home Manager Full Guide
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/nixos-from-scratch.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/tonybtw/www/tonybtw.com
-#+HUGO_SECTION: tutorial/nixos-from-scratch
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is the 4th installment of the NixOS Tutorials. It emphasizes going from Zero to Hero and starting out with flakes and home manager before running nixos-install.
-
-* Table Of Contents: :toc::noexport:
-- [[#intro][Intro:]]
-- [[#install-from-minimal-iso][Install from Minimal ISO]]
-  - [[#load-up-live-iso][Load up Live ISO]]
-  - [[#initial-nixos-config][Initial NixOS Config]]
-  - [[#flakenix][flake.nix]]
-  - [[#configurationnix][configuration.nix]]
-  - [[#homenix][home.nix]]
-  - [[#install][Install:]]
-- [[#post-install-first-boot][Post Install, First Boot]]
-  - [[#create-dotfiles-directory][Create Dotfiles Directory]]
-  - [[#modularize-home-manager-directories-with-symlinks][Modularize home manager directories with symlinks]]
-  - [[#make-it-extensible-with-a-for-loop][Make it extensible with a for loop]]
-- [[#turning-neovim-into-its-own-nix-file-the-right-way][Turning Neovim into it's own .nix file (the right way)]]
-- [[#final-thoughts][Final Thoughts]]
-
-* Intro:
-What's up guys, my name is Tony, and today I'm going to give you a quick and painless guide
-on daily driving NixOS from Scratch, with Flakes and Home manager.
-
-As I've said before, NixOS really is the end-game of linux in many respects, due to its reproducibility, and it's stability in nature. Because of flakes, which allow you to pin your packages to a specific commit, and home manager, which enables you to version control and reproduce your user configuration, the combination of these powerful tools really make NixOS both rock solid like debian, and bleeding edge like Arch.
-
-#+begin_quote
-"In many respects, if Arch, and Debian had a son, his name would be NixOS."
-– Tony
-#+end_quote
-
-Let's jump into the tutorial.
-
-* Install from Minimal ISO
-https://nixos.org/manual/nixos/stable/index.html#ch-installation
-
-You can use the graphical installer, but I'm going to use the minimal iso today, because I'm like that.
-
-** Load up Live ISO
-
-Let's start by installing NixOS. I've loaded up the minimal ISO, and I have already created a video on installing NixOS like this, so I'll run through tihs part pretty quick. Feel free to follow along the written guide in the link below the subscribe button for this part.
-
-This set of commands is going to dictate what hardware.nix looks like. If you've installed arch before, a lot of this stuf will look familiar to you. Let's get into it.
-
-Let's switch into sudo here, and set up our partition scheme.
-#+begin_src
-sudo -i
-lsblk
-cfdisk /dev/vda
-
-gpt labels
-
-1G type: EFI
-4G type: swap
-remaining space, type: Linux Filesystem
-#+end_src
-
-Alright, let's sanity check that with an lsblk to confirm, and ther we go. We see our 3 partitions we just made. Let's make those file systems.
-
-And the nixos handbook recommends we use labels for our partitions, so let's go ahead and do so.
-#+begin_src sh
-mkfs.ext4 -L nixos /dev/vda3
-mkswap -L swap /dev/vda2
-mkfs.fat -F 32 -n boot /dev/vda1
-#+end_src
-
-Alright so we have made those file systems, its time to mount them like so:
-#+begin_src sh
-mount /dev/vda3 /mnt
-mount --mkdir /dev/vda1 /mnt/boot
-swapon /dev/vda2
-#+end_src
-
-#+begin_src sh
-[root@nixos:~]# lsblk
-NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
-loop0    7:0    0  1.5G  1 loop /nix/.ro-store
-sr0     11:0    1  1.6G  0 rom  /iso
-vda    253:0    0   50G  0 disk
-├─vda1 253:1    0    1G  0 part /mnt/boot
-├─vda2 253:2    0    4G  0 part [SWAP]
-└─vda3 253:3    0   45G  0 part /mnt
-#+end_src
-
-Alright this looks good, and we're ready to move onto actually generating the config. Please note, I'm using vim here, but if you want to use a different editor, I would just run nixos-install right now, and rebooting, and then creating home.nix and flake.nix. If you're built different like me, just use vim.
-
-** Initial NixOS Config
-
-[[https://nixos.org/manual/nixos/stable/index.html#sec-installation-manual][Official NixOS Installation Handbook]]
-
-Alright, we're ready to generate the config file, so let's do so with the following command:
-
-This part is going to be a lot of configuration and text editing, so if you want everything I've put into these files, feel free to follow along with my written article:
-[[https://www.tonybtw.com/tutorial/nixos-from-scratch][NixOS from Scratch]]
-
-#+begin_src
-nixos-generate-config --root /mnt
-cd /mnt/etc/nixos/
-touch flake.nix home.nix
-#+end_src
-
-Let's create flake.nix, and home.nix
-
-(For those watching the video and are curious about my vimrc, I did import it to the live iso image.)
-#+begin_src vim
-filetype plugin indent on
-set expandtab
-set shiftwidth=4
-set softtabstop=4
-set tabstop=4
-set number
-set relativenumber
-set smartindent
-set showmatch
-set backspace=indent,eol,start
-syntax on
-#+end_src
-
-** flake.nix
-
-Jumping into our flake.nix, this is where we define where our packages come from, so both configuration.nix and home.nix can inherit them through the flake and use them consistently.
-
-Couple of things worth noting here:
-
-1. nixpkgs is shorthand for github:NixOS/nixpkgs/nixos-25.05
-2. inputs.nixpkgs.follows = "nixpkgs": This prevents home-manager from pulling its own version of nixpkgs, keeping everything consistent and avoiding mismatched package sets.
-3. This modules section tells our flake to build the system using configuration.nix, and to configure Home Manager for the tony user using home.nix, with some options set inline.
-4. We include home-manager as a NixOS module here because we want Home Manager to be managed by the flake itself — meaning we don’t need to bootstrap it separately, and we don’t need to run home-manager switch. Instead, everything gets applied in one go with nixos-rebuild switch.
-
-vim flake.nix
-#+begin_src nix
-{
-  description = "NixOS from Scratch";
-
-  inputs = {
-    nixpkgs.url = "nixpkgs/nixos-25.05";
-    home-manager = {
-      url = "github:nix-community/home-manager/release-25.05";
-      inputs.nixpkgs.follows = "nixpkgs";
-    };
-  };
-
-  outputs = { self, nixpkgs, home-manager, ... }: {
-    nixosConfigurations.nixos-btw = nixpkgs.lib.nixosSystem {
-      system = "x86_64-linux";
-      modules = [
-        ./configuration.nix
-        home-manager.nixosModules.home-manager
-        {
-          home-manager = {
-            useGlobalPkgs = true;
-            useUserPackages = true;
-            users.tony = import ./home.nix;
-            backupFileExtension = "backup";
-          };
-        }
-      ];
-    };
-  };
-}
-#+end_src
-
-We're ready to move onto our configuration.nix file.
-
-** configuration.nix
-
-List
-
-We're going to do a lot to this default config file, mainly just deleting comments and whatnot, but heres a list of stuff I'm going to do to it:
-
-1. Delete comments
-2. Change hostname
-3. Remove wpa supplicant (keep if you are on wifi)
-4. Change timezone
-5. Delete proxy settings
-6. Change xserver.enable to its own attribute set
-   - Enable `ly` display manager: [[https://github.com/fairyglade/ly][ly display manager]]
-   - Enable qtile
-   - Modify Key Repeat Settings: `xset r rate 200 35 &`
-7. Delete rest of comments until User section
-8. Enable firefox at the system level
-9. Remove comments on systempackages, add git, and alacritty at the system level
-10. Delete rest of comments, and then add nerd font package
-11. add nix-command and flakes =)
-
-#+begin_src nix
-{ config, lib, pkgs, ... }:
-
-{
-  imports =
-    [
-      ./hardware-configuration.nix
-    ];
-
-  boot.loader.systemd-boot.enable = true;
-  boot.loader.efi.canTouchEfiVariables = true;
-
-  networking.hostName = "nixos";
-  networking.networkmanager.enable = true;
-
-  time.timeZone = "America/Los_Angeles";
-
-  services.displayManager.ly.enable = true;
-  services.xserver = {
-    enable = true;
-    autoRepeatDelay = 200;
-    autoRepeatInterval = 35;
-    windowManager.qtile.enable = true;
-  };
-
-  users.users.tony = {
-    isNormalUser = true;
-    extraGroups = [ "wheel" ];
-    packages = with pkgs; [
-      tree
-    ];
-  };
-
-  programs.firefox.enable = true;
-
-  environment.systemPackages = with pkgs; [
-    vim
-    wget
-    alacritty
-    git
-  ];
-
-  fonts.packages = with pkgs; [
-    nerd-fonts.jetbrains-mono
-  ];
-
-  nix.settings.experimental-features = [ "nix-command" "flakes" ];
-  system.stateVersion = "25.05";
-
-}
-#+end_src
-
-** home.nix
-Let's set up our home.nix. we'll heavily modify this after installing nixos and logging in for the first time.
-
-Just going to specify the home directory, enable git, and for a sanity check, let's setup a bash alias so we can confirm everything worked when we initially log in.
-
-vim home.nix
-#+begin_src nix
-{ config, pkgs, ... }:
-
-{
-  home.username = "tony";
-  home.homeDirectory = "/home/tony";
-  programs.git.enable = true;
-  home.stateVersion = "25.05";
-  programs.bash = {
-    enable = true;
-    shellAliases = {
-      btw = "echo i use nixos, btw";
-    };
-  };
-}
-#+end_src
-
-
-** Install:
-
-Alright we're finally ready to install this. We can do that with this command here, to specify the location of the flake.
-#+begin_src sh
-nixos-install --flake /mnt/etc/nixos#nixos-btw
-
-## type your password
-nixos-enter --root /mnt -c 'passwd tony'
-reboot
-#+end_src
-Make sure to create this password otherwise you wont be able to log in
-
-We can safely ignore this warning — it's just complaining that /boot is readable by all users, which is fine for us in this context.
-
-Let's boot into our system!
-
-* Post Install, First Boot
-
-Lets open up a terminal to confirm our home manager worked. Remember we put that bash alias in our home.nix file? Let's run it.
-Super Enter opens a terminal by default in Qtile.
-
-#+begin_src sh
-btw // I use nixos, btw
-#+end_src
-
-** Create Dotfiles Directory
-
-We're going to create our dotfiles directory in our home folder so we can handle all of our nixos files right here in our home folder. This will help for version controlling everything too.
-
-#+begin_src sh
-mkdir ~/nixos-dotfiles
-sudo cp -R /etc/nixos/* ~/nixos-dotfiles/.
-mkdir ~/nixos-dotfiles/config
-git clone https://github.com/tonybanters/qtile ~/nixos-dotfiles/config/qtile
-vim ~/nixos-dotfiles/home.nix
-#+end_src
-
-Inside of home.nix, add this line:
-#+begin_src nix
-home.file.".config/qtile".source = ./config/qtile;
-#+end_src
-
-This will tell home manager to look for this file for our qtile config.
-
-Lets also grab our neovim config, so we can edit these files a bit easier.
-
-#+begin_src nix
-git clone https://github.com/tonybanters/nvim ~/nixos-dotfiles/config/nvim
-home.file.".config/nvim".source = ./config/nvim;
-#+end_src
-
-To get my nvim config to work, we need a few packages while we're in this file.
-#+begin_src nix
-home.packages = with pkgs; [
-  neovim
-  ripgrep
-  nil
-  nixpkgs-fmt
-  nodejs
-  gcc
-];
-#+end_src
-
-Alright, we're ready to rebuild our system for the first time. Let's run this command: It tells nixos to use a flake, and points to the flake directory, and specifies the hostname.
-run:
-#+begin_src sh
-sudo nixos-rebuild switch --flake ~/nixos-dotfiles#nixos-btw
-#+end_src
-Remember to use your hostname instead of `nixos-btw`
-
-Alright that looks like it worked, lets confirm it with our refresh qtile keybind. Super Control R
-Wow, incredible. it worked. That's my qtile config right there, inspired by DT's xmonad and qtile config.
-Let's check out neovim, see if that worked.
-
-Beautiful, we see lazy installing our plugins. Awesome.
-Now our qtile config, and our neovim configs are good to go, but this isn't quite right yet.
-
-This is suboptimal for 2 main reasons:
-
-    1. we cant edit the config files because Root owns it
-    2. we cant get live updates when we DO edit them with sudo because they are not symlinked to our actual directory.
-
-Solution: *mkOutOfStoreSymlink*
-
-** Modularize home manager directories with symlinks
-We can use mkOutOfStoreSymlink to tell nixos to create a symlink of our dotfiles right into ~/.config, instead of in /etc/nixos/store, or whatever.
-Let's use xdg.configFile instead of home.file, because xdg.configFile is for dotfiles that are stored in ~/.config
-We only need to use home.file if the file is stored somewhere else.
-And let's specify recursive = true, so that nixos looks for the entire directory, with all subdirectories when creating the symlink.
-
-phase 1
-#+begin_src nix
-xdg.configFile."qtile" = {
-    source = config.lib.file.mkOutOfStoreSymlink "/home/tony/nixos-dotfiles/config/qtile";
-    recursive = true;
-};
-xdg.configFile."nvim" = {
-    source = config.lib.file.mkOutOfStoreSymlink "/home/tony/nixos-dotfiles/config/nvim";
-    recursive = true;
-};
-#+end_src
-
-Alright, we can run sudo nixos-rebuild switch again, and we should be able to make live updates here.
-
-#+begin_src sh
-ln -sf ~/nixos-dotfiles/config/
-#+end_src
-
-We see the symlinks are actually pointing to ~/.config this time.
-
-Let's edit our qtile config again, and a hot reload should work. Awesome.
-
-We can clean this up by declaring dotfiles, and creating a variable for mkOutOfStoreSymlink (its too verbose this way).
-#+begin_src nix
-{ config, ... }
-
-let
-    dotfiles = "${config.home.homeDirectory}/nixos-dotfiles/config";
-    create_symlink = path: config.lib.file.mkOutOfStoreSymlink path;
-in
-
-{
-    xdg.configFile."qtile" = {
-        source = create_symlink "${dotfiles}/qtile";
-        recursive = true;
-    };
-    xdg.configFile."nvim" = {
-        source = create_symlink "${dotfiles}/nvim";
-        recursive = true;
-    };
-
-}
-#+end_src
-
-** Make it extensible with a for loop
-
-And one more step would be to just make a for loop to iterate over a list of configs, and that way we can remove code duplication.
-#+begin_src nix
-{ config, ... }
-
-let
-    dotfiles = "${config.home.homeDirectory}/nixos-dotfiles/config";
-    create_symlink = path: config.lib.file.mkOutOfStoreSymlink path;
-    # Standard .config/directory
-    configs = {
-        qtile = "qtile";
-        nvim = "nvim";
-    };
-in
-
-{
-    # Iterate over xdg configs and map them accordingly
-    xdg.configFile = builtins.mapAttrs (name: subpath: {
-        source = create_symlink "${dotfiles}/${subpath}";
-        recursive = true;
-    }) configs;
-
-}
-#+end_src
-
-This will make it much easier to add dotfile configs to our system. With this forloop we can actually just clone our entire dotfiles repo and throw it in here.
-
-* Turning Neovim into it's own .nix file (the right way)
-If we take Neovim out of this giant home.packages list, we can move it into its own file, and put all of its dependencies in that file as well, to keep things organized. This is beneficial for 2 reasons.
-
-1. If someone just wants my neovim, they can take neovim.nix and my neovim config, and be good to go.
-2. If we need to add lsps, or specific packages for just neovim, but we aren't using neovim on a different machine, we dont need to import the entire neovim suite.
-3. Scales: you can drop in more modules later (emacs.nix, alacritty.nix, etc.) without cluttering home.nix.
-
-Let's do this by making a folder called `modules` and putting `neovim.nix` in that folder.
-
-The structure will look like so:
-
-#+begin_src
-├── home.nix
-└── modules
-    └── neovim.nix
-#+end_src
-
-Inside of that neovim.nix file, we can do the following:
-
-#+begin_src nix
-{ config, pkgs, lib, ...}
-
-{
-  # Install Neovim and dependencies
-  home.packages = with pkgs; [
-    # Tools required for Telescope
-    ripgrep
-    fd
-    fzf
-
-    # Language Servers
-    lua-language-server
-    nil # nix language server
-    nixpkgs-fmt # nix formatter
-
-    # Needed for lazy.nvim
-    nodejs
-  ];
-
-  programs.neovim = {
-    enable = true;
-    viAlias = true;
-    vimAlias = true;
-
-    # optional: If you want to manage your plugins with nix, instead of with lazy.nvim,
-    # you can do it with the plugins key.
-    # plugins = with pkgs.vimPlugins; [
-    #     telescope-nvim
-    #     nvim-treesitter
-    #     nvim-lspconfig
-    #     # Any other packages you want pinned at.
-    # ];
-  };
-
-}
-#+end_src
-
-Then in our home.nix, we would just import this like so:
-
-#+begin_src nix
-{pkgs, config, lib ...}:
-
-{
-  imports = [
-    ./modules/neovim.nix
-  ];
-  ...
-}
-
-#+end_src
-
-* Final Thoughts
-
-In the next installment of "NixOS From Scratch", we'll create 2 package variables, and use unstable to update stuff that we don't care if it breaks our system, and lock the core utils to stable.
-
-This has been heavily 'programming oriented', but this will leapfrog you forward in your nixos journey. Let me know if you like this sort of content, or what else you would like to see.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/nixos-hyprland.org b/content/org-files/nixos-hyprland.org
deleted file mode 100644
index 241c5dc..0000000
--- a/content/org-files/nixos-hyprland.org
+++ /dev/null
@@ -1,307 +0,0 @@
-#+TITLE: Hyprland on NixOS (w/ UWSM)
-#+AUTHOR: Tony, btw
-#+date: 2025-10-08
-#+HUGO_TITLE: Hyprland on NixOS (w/ UWSM)
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/nixos-hyprland.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/nixos-hyprland
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless tutorial on how to setup Hyprland on NixOS using flakes + home manager, and optionally using UWSM (the Universal Wayland Session Manager)
-
-* Intro
-
-It's the year 20xx. Everyone's prebuilt PC at best buy comes with Linux and hyprland installed by default. The apple stores have Macbooks with a new propietary version of hyprland called iLand. Your grandson asks you, "My laptop broke, but I don't know how to re-install my operating system. Can you help me??"
-
-What's up guys, my name is Tony, and today, I'm going to give you a quick and painless guide on setting up Hyprland on NixOS optionally with UWSM.
-
-Hyprland is a wayland compositor that really feels like the King of beginner friendly compositors. It just works out of the box, with clean and aesthetically pleasing animations, and its getting more and more people into wayland, and linux in general. If you are converting over from a Desktop Environment such as Gnome, or Kde plasma, and you want to start with a wayland compositor, Hyprland is a great entry level choice.
-
-Setting it up with NixOS is quite easy, so let's jump straight into the installation process.
-
-* Installation
-
-We're jumping straight into the minimal iso, and we'll speed run this since you've probably seen it 3 times by now, but a written guide will be provided below the subscribe button.
-
-First thing we need to do is run lsblk to know what our disk is named. We see its vda, so lets run
-#+begin_src sh
-cfdisk /dev/vda
-#+end_src
-
-And let's setup 2 partitions. First one will be 1gb, and lets change the type to EFI Filesystem, which is going to be our 1 gigabyte boot partition.
-
-Secondly, we'll just hit enter twice to use the remaining space for our root file system. Let's write, type yes, and quit here.
-
-Now lets make the filesystems.
-
-#+begin_src sh
-mkfs.ext4 -L nixos /dev/vda2
-mkfs.fat -F 32 -n BOOT /dev/vda1
-#+end_src
-
-And lets mount these:
-
-#+begin_src sh
-mount /dev/vda2 /mnt
-mount --mkdir /dev/vda1 /mnt/boot
-#+end_src
-
-And we can type lsblk to confirm here:
-
-#+begin_src sh
-[root@nixos:~]# lsblk
-NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
-loop0    7:0    0  1.5G  1 loop /nix/.ro-store
-sr0     11:0    1  1.6G  0 rom  /iso
-vda    253:0    0   50G  0 disk
-├─vda1 253:1    0    1G  0 part /mnt/boot
-└─vda2 253:3    0   49G  0 part /mnt
-#+end_src
-
-And we're already ready to generate the nixos configuration file.
-
-** Initial NixOS Config
-
-[[https://nixos.org/manual/nixos/stable/index.html#sec-installation-manual][Official NixOS Installation Handbook]]
-
-Alright, we're ready to generate the config file, so let's do so with the following command:
-
-This part is going to be a lot of configuration and text editing, so if you want everything I've put into these files, just follow along this written article.
-
-#+begin_src
-nixos-generate-config --root /mnt
-cd /mnt/etc/nixos/
-#+end_src
-
-Let's create flake.nix, and home.nix
-
-(This is my minimal vimrc that I use even on install ISOs)
-#+begin_src vim
-filetype plugin indent on
-set expandtab
-set shiftwidth=4
-set softtabstop=4
-set tabstop=4
-set number
-set relativenumber
-set smartindent
-set showmatch
-set backspace=indent,eol,start
-syntax on
-#+end_src
-
-*** flake.nix
-
-vim flake.nix
-
-Jumping into our flake.nix, this is where we define where our packages come from, so both configuration.nix and home.nix can inherit them through the flake and use them consistently.
-
-Couple of things worth noting here:
-
-1. nixpkgs is shorthand for github:NixOS/nixpkgs/nixos-unstable
-2. inputs.nixpkgs.follows = "nixpkgs": This prevents home-manager from pulling its own version of nixpkgs, keeping everything consistent and avoiding mismatched package sets.
-3. This modules section tells our flake to build the system using configuration.nix, and to configure Home Manager for the tony user using home.nix, with some options set inline.
-4. We include home-manager as a NixOS module here because we want Home Manager to be managed by the flake itself — meaning we don’t need to bootstrap it separately, and we don’t need to run home-manager switch. Instead, everything gets applied in one go with nixos-rebuild switch.
-
-vim flake.nix
-#+begin_src nix
-{
-  description = "Hyprland on Nixos";
-
-  inputs = {
-    nixpkgs.url = "nixpkgs/nixos-unstable";
-    home-manager = {
-      url = "github:nix-community/home-manager";
-      inputs.nixpkgs.follows = "nixpkgs";
-    };
-  };
-
-  outputs = { self, nixpkgs, home-manager, ... }: {
-    nixosConfigurations.nixos-btw = nixpkgs.lib.nixosSystem {
-      system = "x86_64-linux";
-      modules = [
-        ./configuration.nix
-        home-manager.nixosModules.home-manager
-        {
-          home-manager = {
-            useGlobalPkgs = true;
-            useUserPackages = true;
-            users.tony = import ./home.nix;
-            backupFileExtension = "backup";
-          };
-        }
-      ];
-    };
-  };
-}
-#+end_src
-
-We're ready to move onto our configuration.nix file.
-
-*** configuration.nix
-
-One of the beautiful things about NixOS is that your system is defined in various config files. You can think of it almost like of how your window manager is defined with config files, and you can port your window manager dotfiles to another distro, or another computer, and use the same keybinds/options on both machines. Well nixos has a 'config file' that lives above those window manager dotfiles from a heirerarchical perspective.
-
-Alright, so I'm going to start off by deleting a bunch of comments.
-I'll change the hostname here to `nixos-btw`, because I'm using NixOS, by the way.
-We'll remove the wpa supplicant option and just uncomment the NetworkManager block here. If you are using wifi, keep the wpa supplicant option, and remove the NetworkManager block instead.
-For my situation, I am going to chnage the timezone to America/Los Angeles.
-We can delete all these proxy settings comments.
-
-#+begin_src nix
-{ config, lib, pkgs, ... }:
-
-{
-  imports =
-    [
-      ./hardware-configuration.nix
-    ];
-
-  boot.loader.systemd-boot.enable = true;
-  boot.loader.efi.canTouchEfiVariables = true;
-
-  services.getty.autologinUser = "tony";
-
-  networking.hostName = "nixos";
-  networking.networkmanager.enable = true;
-
-  time.timeZone = "America/Los_Angeles";
-
-  programs.hyprland = {
-    enable = true;
-    withUWSM = true;
-    xwayland.enable = true;
-  };
-
-  users.users.tony = {
-    isNormalUser = true;
-    extraGroups = [ "wheel" ];
-    packages = with pkgs; [
-      tree
-    ];
-  };
-
-  programs.firefox.enable = true;
-  environment.systemPackages = with pkgs; [
-    vim
-    wget
-    foot
-    waybar
-    kitty
-  ];
-
-  nix.settings.experimental-features = [ "nix-command" "flakes" ];
-  system.stateVersion = "25.05";
-
-}
-
-#+end_src
-
-And we can use the getty auto login service above. Feel free to skip UWSM if you are not interested in it, as it is more or less deprecated.
-
-Alright we're ready to move on to our home.nix.
-
-*** home.nix
-Let's set up our home.nix. we'll heavily modify this after installing nixos and logging in for the first time.
-
-Just going to specify the home directory, enable git, and for a sanity check, let's setup a bash alias so we can confirm everything worked when we initially log in.
-
-vim home.nix
-#+begin_src nix
-{ config, pkgs, ... }:
-
-{
-  home.username = "tony";
-  home.homeDirectory = "/home/tony";
-  home.stateVersion = "25.05";
-  programs.git.enable = true;
-  programs.bash = {
-    enable = true;
-    shellAliases = {
-      btw = "echo i use nixos, btw";
-    };
-    profileExtra = ''
-      if [ -z "$WAYLAND_DISPLAY" ] && [ "$XDG_VTNR" = 1 ]; then
-        exec uwsm start -S hyprland-uwsm.desktop
-      fi
-    '';
-  };
-}
-#+end_src
-
-** Install:
-
-Alright we're finally ready to install this. We can do that with this command here, to specify the location of the flake.
-
-#+begin_src sh
-nixos-install --flake /mnt/etc/nixos#nixos-btw
-
-## type your password
-nixos-enter --root /mnt -c 'passwd tony'
-reboot
-#+end_src
-
-Make sure to create this password otherwise you wont be able to log in
-
-Let's boot into our system!
-
-* Create config file
-
-And we see we are instantly booted into hyprland. Awesome. Let's do a little tinkering here so that our monitor is actually the correct resolution. So we see its super Q to open a terminal, and lets vim the config file. We'll clean this up later, but for now, lets just change this one line here:
-
-To 1920x1080. For me, that should do it.
-
-Alright, I'm going to clone a couple of my dotfiles for my terminal, my hyprland and my waybar configurations. This video is more of a how to install hyprland on nixos video, and I'll show a really cool nix feature after.
-
-#+begin_src sh
-mkdir ~/nixos-dotfiles/config
-cd ~/nixos-dotfiles/config
-git clone https://github.com/tonybanters/hypr
-git clone https://github.com/tonybanters/waybay
-git clone https://github.com/tonybanters/foot
-#+end_src
-
-So in home.nix lets specify that our configs are going to come from config like so:
-
-#+begin_src nix
-home.file.".config/hypr".source = ./config/hypr;
-home.file.".config/waybar".source = ./config/waybar;
-home.file.".config/foot".source = ./config/foot;
-#+end_src
-
-And we can rebuild like so:
-
-#+begin_src
-sudo nixos-rebuild swith --flake ~/nixos-dotifles#hyprland-btw
-#+end_src
-
-* Nix Search TV
-So we messed around with nix shells already, lets actually show something that I use on a daily basis, called nix-search-tv. This guide was written up by my friend Emzy, and we can use it to install a great tool that helps us search for nix packages, and use commands to just jump right into a nix shell.
-
-So let's add this to our home manager packages list:
-
-#+begin_src nix
-#home.nix
-
-home.packages = with pkgs; [
-  (pkgs.writeShellApplication {
-    name = "ns";
-    runtimeInputs = with pkgs; [
-      fzf
-      nix-search-tv
-    ];
-    text = builtins.readFile "${pkgs.nix-search-tv.src}/nixpkgs.sh";
-  })
-];
-
-#+end_src
-
-Now we can rebuild/switch again, and run ns to demo this. Incredible
-
-* Outro
-
-Alright, thats gonna be it for todays video. If you have any questions or recommendations on any other linux related content, as usual just drop a comment.
-
-It wouldn't be a proper video without an obligatory neofetch.
diff --git a/content/org-files/quickshell.org b/content/org-files/quickshell.org
deleted file mode 100644
index 7b6a688..0000000
--- a/content/org-files/quickshell.org
+++ /dev/null
@@ -1,438 +0,0 @@
-#+TITLE: Quickshell Tutorial - Build Your Own Bar
-#+AUTHOR: Tony, btw
-#+date: 2025-12-03
-#+HUGO_TITLE: Quickshell Tutorial - Build Your Own Bar
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/quickshell.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/quickshell
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless tutorial on how to build a custom status bar using Quickshell, a powerful Qt/QML based shell framework for Wayland.
-
-* Intro
-
-What's up guys, my name is Tony, and today I'm gonna give you a quick and painless introduction to Quickshell.
-
-Quickshell is a full shell framework built on Qt/QML. You can build pretty much any desktop widget you can imagine with it - bars, dashboards, wallpaper managers, screen lock widgets, and more.
-
-We're going to do a basic overview of how to create a bar using Quickshell today. In future tutorials I'll cover creating a wallpaper manager, building a dashboard overlay, and making a screen lock widget. But for now, let's start with the fundamentals by building a functional status bar step by step.
-
-* Install Quickshell
-
-Alright so I'm on NixOS today, but this is going to work on Arch, Gentoo, and other distributions. I'll leave install instructions for all of those below.
-
-[[https://quickshell.org/docs/v0.2.1/types/][Quickshell Documentation]]
-
-*** NixOS
-#+begin_src nix
-{
-  environment.systemPackages = with pkgs; [
-    quickshell
-  ];
-}
-#+end_src
-
-*** Arch Linux
-#+begin_src sh
-yay -S quickshell-git
-#+end_src
-
-*** Gentoo
-For Gentoo, you'll need to compile from source:
-
-#+begin_src sh
-git clone https://github.com/outfoxxed/quickshell
-cd quickshell
-# Follow the build instructions in their README
-#+end_src
-
-* Running Examples
-
-You can run any of these examples with:
-
-#+begin_src sh
-qs -p ~/.config/testshell/01-hello.qml
-#+end_src
-
-Just swap out the filename as we go through each one.
-
-* 01 - Hello World
-
-Quickshell has excellent documentation, and we're going to be following that today. Let's start with the absolute basics - just getting something on screen.
-
-#+begin_src qml
-import Quickshell
-import QtQuick
-
-FloatingWindow {
-    visible: true
-    width: 200
-    height: 100
-
-    Text {
-        anchors.centerIn: parent
-        text: "Hello, Quickshell!"
-        color: "#0db9d7"
-        font.pixelSize: 18
-    }
-}
-#+end_src
-
-So what's going on here?
-
-Every Quickshell config starts with imports. We're pulling in =Quickshell= for the core stuff and =QtQuick= for basic UI elements like =Text= and =Rectangle=.
-
-We're using =FloatingWindow= as our root element. This is just a regular floating window - it doesn't dock to any edges or reserve any screen space. We're setting it to 200x100 pixels and making it visible.
-
-The =Text= element is pretty self-explanatory. The =anchors.centerIn: parent= bit is QML's layout system - it just centers the text inside its parent container.
-
-* 02 - Empty Bar
-
-Alright, let's turn this into an actual bar that docks to the top of your screen.
-
-#+begin_src qml
-import Quickshell
-import Quickshell.Wayland
-import QtQuick
-
-PanelWindow {
-    anchors.top: true
-    anchors.left: true
-    anchors.right: true
-    implicitHeight: 30
-    color: "#1a1b26"
-
-    Text {
-        anchors.centerIn: parent
-        text: "My First Bar"
-        color: "#a9b1d6"
-        font.pixelSize: 14
-    }
-}
-#+end_src
-
-The big change here is we're using =PanelWindow= as our root element instead of =FloatingWindow=. This is a Wayland-specific thing (hence the new import), and it lets us dock the window to screen edges.
-
-Setting =anchors.top=, =anchors.left=, and =anchors.right= to =true= tells it to stick to the top edge and span the full width. The =implicitHeight: 30= gives us a 30 pixel tall bar.
-
-Unlike a floating window, a =PanelWindow= actually reserves space - your other windows won't overlap with it.
-
-* 03 - Workspaces
-
-So we are on Hyprland today, lets add quickshell to our Hyprland config.
-
-Now let's add some actual functionality - workspace indicators that show which workspace you're on and let you click to switch.
-
-#+begin_src qml
-import Quickshell
-import Quickshell.Wayland
-import Quickshell.Hyprland
-import QtQuick
-import QtQuick.Layouts
-
-PanelWindow {
-    anchors.top: true
-    anchors.left: true
-    anchors.right: true
-    implicitHeight: 30
-    color: "#1a1b26"
-
-    RowLayout {
-        anchors.fill: parent
-        anchors.margins: 8
-
-        Repeater {
-            model: 9
-
-            Text {
-                property var ws: Hyprland.workspaces.values.find(w => w.id === index + 1)
-                property bool isActive: Hyprland.focusedWorkspace?.id === (index + 1)
-                text: index + 1
-                color: isActive ? "#0db9d7" : (ws ? "#7aa2f7" : "#444b6a")
-                font { pixelSize: 14; bold: true }
-
-                MouseArea {
-                    anchors.fill: parent
-                    onClicked: Hyprland.dispatch("workspace " + (index + 1))
-                }
-            }
-        }
-
-        Item { Layout.fillWidth: true }
-    }
-}
-#+end_src
-
-Okay, there's a lot more going on here. Let me break it down.
-
-We're importing =Quickshell.Hyprland= which gives us access to Hyprland's IPC.
-
-=QtQuick.Layouts= gives us =RowLayout=, which arranges its children horizontally. Way easier than manually positioning everything.
-
-The =Repeater= is super useful - it takes a model (in this case, just the number 9) and creates that many copies of whatever's inside it. Each copy gets an =index= variable (0-8).
-
-For each workspace number, we're looking up the actual workspace from the window manager with =Hyprland.workspaces.values.find()=. This gives us live data - when workspaces change, the bar updates automatically. We also check if it's the active workspace using =Hyprland.focusedWorkspace=.
-
-The color logic is straightforward: cyan if it's the active workspace, blue if it exists but isn't active, and muted gray if there's no windows on that workspace.
-
-The =MouseArea= makes the whole thing clickable, and =Hyprland.dispatch()= sends commands to Hyprland. So clicking on "3" runs =workspace 3=.
-
-That =Item { Layout.fillWidth: true }= at the end is just a spacer - it pushes everything to the left.
-
-* 04 - System Stats
-
-Now let's add some system stats. This is where things get interesting because we need to run shell commands and parse their output.
-
-** Theme Properties
-
-Instead of hardcoding colors everywhere, we define them once on the PanelWindow. Now you can reference =root.colBg= anywhere in your config, and if you want to change your color scheme, you only have to do it in one place.
-
-#+begin_src qml
-PanelWindow {
-    id: root
-    property color colBg: "#1a1b26"
-    property color colFg: "#a9b1d6"
-    property color colMuted: "#444b6a"
-    property color colCyan: "#0db9d7"
-    property color colBlue: "#7aa2f7"
-    property color colYellow: "#e0af68"
-    property string fontFamily: "JetBrainsMono Nerd Font"
-    property int fontSize: 14
-}
-#+end_src
-
-** Running Shell Commands
-
-This is how you run external commands and capture their output. We import =Quickshell.Io= which gives us the =Process= type.
-
-#+begin_src qml
-Process {
-    id: cpuProc
-    command: ["sh", "-c", "head -1 /proc/stat"]
-    stdout: SplitParser {
-        onRead: data => {
-            if (!data) return
-            var p = data.trim().split(/\s+/)
-            var idle = parseInt(p[4]) + parseInt(p[5])
-            var total = p.slice(1, 8).reduce((a, b) => a + parseInt(b), 0)
-            if (lastCpuTotal > 0) {
-                cpuUsage = Math.round(100 * (1 - (idle - lastCpuIdle) / (total - lastCpuTotal)))
-            }
-            lastCpuTotal = total
-            lastCpuIdle = idle
-        }
-    }
-    Component.onCompleted: running = true
-}
-#+end_src
-
-The =command= is an array - first element is the program, rest are arguments. The =SplitParser= attached to =stdout= calls =onRead= for each line of output. Setting =running = true= triggers the process to run.
-
-** Timers
-
-To update the CPU usage periodically, we use a =Timer=. This one fires every 2 seconds and re-runs the CPU process.
-
-#+begin_src qml
-Timer {
-    interval: 2000        // Every 2 seconds
-    running: true         // Start immediately
-    repeat: true          // Keep going forever
-    onTriggered: cpuProc.running = true
-}
-#+end_src
-
-* 05 - Adding Widgets
-
-Let's expand our bar with a clock and memory usage. This builds on the same patterns - more =Process= calls and =Timer= elements.
-
-** Memory Widget
-
-#+begin_src qml
-// Add to your system data properties
-property int memUsage: 0
-
-// Memory process
-Process {
-    id: memProc
-    command: ["sh", "-c", "free | grep Mem"]
-    stdout: SplitParser {
-        onRead: data => {
-            if (!data) return
-            var parts = data.trim().split(/\s+/)
-            var total = parseInt(parts[1]) || 1
-            var used = parseInt(parts[2]) || 0
-            memUsage = Math.round(100 * used / total)
-        }
-    }
-    Component.onCompleted: running = true
-}
-
-// Update your timer to run both processes
-Timer {
-    interval: 2000
-    running: true
-    repeat: true
-    onTriggered: {
-        cpuProc.running = true
-        memProc.running = true
-    }
-}
-#+end_src
-
-** Clock
-
-The clock is just a =Text= element with its own timer. Every second it updates the text with the current time.
-
-#+begin_src qml
-Text {
-    id: clock
-    text: Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm")
-
-    Timer {
-        interval: 1000
-        running: true
-        repeat: true
-        onTriggered: clock.text = Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm")
-    }
-}
-#+end_src
-
-** Adding Dividers
-
-To visually separate widgets, you can use simple =Rectangle= elements:
-
-#+begin_src qml
-Rectangle { width: 1; height: 16; color: root.colMuted }
-#+end_src
-
-* Complete Bar Example
-
-Here's the final bar with workspaces, CPU, memory, and a clock all together:
-
-#+begin_src qml
-import Quickshell
-import Quickshell.Wayland
-import Quickshell.Io
-import Quickshell.Hyprland
-import QtQuick
-import QtQuick.Layouts
-
-PanelWindow {
-    id: root
-
-    // Theme
-    property color colBg: "#1a1b26"
-    property color colFg: "#a9b1d6"
-    property color colMuted: "#444b6a"
-    property color colCyan: "#0db9d7"
-    property color colBlue: "#7aa2f7"
-    property color colYellow: "#e0af68"
-    property string fontFamily: "JetBrainsMono Nerd Font"
-    property int fontSize: 14
-
-    // System data
-    property int cpuUsage: 0
-    property int memUsage: 0
-    property var lastCpuIdle: 0
-    property var lastCpuTotal: 0
-
-    // Processes and timers here...
-
-    anchors.top: true
-    anchors.left: true
-    anchors.right: true
-    implicitHeight: 30
-    color: root.colBg
-
-    RowLayout {
-        anchors.fill: parent
-        anchors.margins: 8
-        spacing: 8
-
-        // Workspaces
-        Repeater {
-            model: 9
-            Text {
-                property var ws: Hyprland.workspaces.values.find(w => w.id === index + 1)
-                property bool isActive: Hyprland.focusedWorkspace?.id === (index + 1)
-                text: index + 1
-                color: isActive ? root.colCyan : (ws ? root.colBlue : root.colMuted)
-                font { family: root.fontFamily; pixelSize: root.fontSize; bold: true }
-                MouseArea {
-                    anchors.fill: parent
-                    onClicked: Hyprland.dispatch("workspace " + (index + 1))
-                }
-            }
-        }
-
-        Item { Layout.fillWidth: true }
-
-        // CPU
-        Text {
-            text: "CPU: " + cpuUsage + "%"
-            color: root.colYellow
-            font { family: root.fontFamily; pixelSize: root.fontSize; bold: true }
-        }
-
-        Rectangle { width: 1; height: 16; color: root.colMuted }
-
-        // Memory
-        Text {
-            text: "Mem: " + memUsage + "%"
-            color: root.colCyan
-            font { family: root.fontFamily; pixelSize: root.fontSize; bold: true }
-        }
-
-        Rectangle { width: 1; height: 16; color: root.colMuted }
-
-        // Clock
-        Text {
-            id: clock
-            color: root.colBlue
-            font { family: root.fontFamily; pixelSize: root.fontSize; bold: true }
-            text: Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm")
-            Timer {
-                interval: 1000
-                running: true
-                repeat: true
-                onTriggered: clock.text = Qt.formatDateTime(new Date(), "ddd, MMM dd - HH:mm")
-            }
-        }
-    }
-}
-#+end_src
-
-* Key Concepts Summary
-
-| Concept       | Description                                           |
-|---------------+-------------------------------------------------------|
-| FloatingWindow | A regular floating window, doesn't dock              |
-| PanelWindow   | Docks to screen edges, reserves space                 |
-| RowLayout     | Arranges children horizontally                        |
-| Repeater      | Creates multiple copies of a component                |
-| Process       | Runs shell commands and captures output               |
-| Timer         | Triggers actions at intervals                         |
-| MouseArea     | Makes elements clickable                              |
-| anchors       | QML's layout system for positioning                   |
-| property      | Declare custom variables on components                |
-
-* Next Steps
-
-That's the core of it. Quickshell can do way more than just bars though - you can build:
-
-- Wallpaper managers with smooth transitions
-- Dashboard overlays with system stats
-- Screen lock widgets
-- Notification centers
-- Application launchers
-
-Check out the Quickshell documentation for more advanced features and the full API reference.
-
-* Final Thoughts
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/suckless-nixos.org b/content/org-files/suckless-nixos.org
deleted file mode 100644
index 95f4e18..0000000
--- a/content/org-files/suckless-nixos.org
+++ /dev/null
@@ -1,324 +0,0 @@
-#+title: How to Install Suckless Programs on NixOS | Dwm, Dmenu, St
-#+author: Tony, btw
-#+date: 2025-09-14
-#+HUGO_TITLE:
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/suckless-nixos.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/suckless-nixos
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is the 5th installment of the NixOS Tutorials. We discuss dev shells and how to implement suckless utilities in NixOS, such as dwm, dmenu, and st.
-
-* Intro
-What's up guys, my name is Tony, and today I'm going to give you a quick and painless guide on installing suckless utilities on NixOS, the right way.
-
-Disclaimer: This guide is heavily nix and programming oriented. If you aren't tapped into this type of content, I suggest jumping over to a channel more suitable for you such as MR.BEAST or Ms. Rachel
-
-NixOS is great, but the hardest part of most people's journey into it is installing DWM, Dmenu, St, and other suckless utilities. This is because of how Nix stores binaries, and how there is no 'config file' with sucless software, in the same way as other software such as qtile, i3, hyprland, etc. This is by design, in a good way, because Suckless Software is meant to be minimal and extensible, so the source code is the config.
-
-#+begin_src quote
-"Unfortunately, the tendency for complex, error-prone and slow software seems to be prevalent in the present-day software industry. We intend to prove the opposite with our software projects." - suckless philosophy
-#+end_src
-
-Let's get into it.
-
-* Dependencies
-Part of this tutorial is going to be assuming you already have flakes, and home manager set up. If you watched my nixos from scratch series, it covers all of that. If not, I highly suggest just cloning the nixos-from-scratch repo, and following along this tutorial with that config directory already set up.
-
-1. [[https://www.github.com/tonybanters/nixos-from-scratch][NixOS From Scratch Repo]]
-2. [[https://www.youtube.com/watch?v=2QjzI5dXwDY][YouTube Guide]]
-
-* DWM
-Let's get started with dwm. You don't need a flake or home manager to set this up, its actually quite easy.
-
-** Configuration.nix
-
-First, we need to add this block in our services.xserver.windowManager set.
-
-#+begin_src nix
-services.xserver.windowManager.dwm = {
-    enable = true;
-    package = pkgs.dwm.overrideAttrs {
-        src = ./config/dwm;
-    };
-};
-#+end_src
-
-So the entire block will look like this:
-#+begin_src nix
-  services = {
-
-    displayManager = {
-      ly.enable = true;
-    };
-
-    xserver = {
-      enable = true;
-      autoRepeatDelay = 200;
-      autoRepeatInterval = 35;
-      windowManager.qtile.enable = true;
-      windowManager.dwm = {
-        enable = true;
-        package = pkgs.dwm.overrideAttrs {
-          src = ./config/dwm;
-        };
-      };
-    };
-
-    picom.enable = true;
-  };
-#+end_src
-
-
-** Cloning Dwm
-Now we need to ensure our dwm folder exists and is in fact in ~/nixos-dotfiles/config
-
-#+begin_src sh
-git clone https://git.suckless.org/dwm ~/nixos-dotfiles/config/dwm
-#+end_src
-
-While we have cloned this, before we actually build dwm, let's just change 1 or 2 things so we can show that this works:
-
-let's open `config.h` with vim here, `nvim ~/nixos-dotfiles/config/dwm/.`
-
-We'll change the font here, and we'll change the terminal to alacritty (since we don't have st installed yet.) Also, we'll change our modkey to super.
-
-#+begin_src c
-static const char *fonts[] = {"JetBrainsMono Nerd Font:size=16"};
-// ...
-static const char *termcmd[]  = { "alacritty", NULL };
-#+end_src
-
-** Rebuild
-
-It's literally that easy. Now dwm will be enabled at the display manager as soon as we rebuild. So let's run:
-
-#+begin_src sh
-sudo nixos-rebuild switch --flake ~/nixos-dotfiles#nixos-btw
-#+end_src
-
-Remember to replace #nixos-btw with whatever your host is specified in your flake. If you aren't using flakes, just run it without the --flake parameter.
-
-Now we can log out of qtile, or just reboot, and we see Dwm as an option in our display manager.
-My logout keybind in qtile is Super Control Q, so I'll hit that right now and there we go.
-
-So we see DWM here in our ly config, and thats perfect. Exactly what we're expecting. Let's hop into it to see if the stuff we changed in config.def.h changed.
-
-Boom, there we go. We see our jetbrains mono nerd font, and we see its size has been adjusted.
-
-* How to Patch DWM in NixOS
-Let's cover how to patch dwm in nixos, the nix way. I will demonstrate this with a quick patch, and then I'll just clone my version of dwm, so we can move onto st and dmenu.
-
-Let's make a folder called patches in our dwm config folder.
-
-Open alacritty with Alt Shift Enter
-
-#+begin_src sh
-mkdir ~/nixos-dotfiles/config/dwm/patches
-#+end_src
-
-Now we can open up firefox. since we dont have dmenu, lets just run firefox from our terminal.
-
-#+begin_src sh
-firefox & disown
-#+end_src
-
-And let's go to [[https://dwm.suckless.org/patches/][Dwm's Patches Directory]]
-
-Let's grab the vanity gaps patch as an example here. So we'll go down to vanity gaps, and we'll
-right click-> save link as on this version of it, and lets save it into that patches folder we just created. Now we can exit firefox with super shift c.
-
-There’s a way to put patches straight into the Nix set, but I prefer to do it the old-school way — just patching directly in our folder. Honestly, what’s the point of pointing to our own dwm folder if we aren’t going to patch it ourselves?
-
-Back in our Alacritty terminal, lets cd into that dwm directory and apply the patch.
-
-#+begin_src sh
-cd ~/nixos-dotfiles/config/dwm
-patch -i patches/<tab>
-#+end_src
-
-And based on the output, we see the patch was succesful.
-
-#+begin_src output
-patching file config.def.h
-Hunk #1 succeeded at 3 with fuzz 1.
-Hunk #2 succeeded at 43 with fuzz 2 (offset 1 line).
-Hunk #3 succeeded at 92 (offset 1 line).
-patching file dwm.c
-Hunk #1 succeeded at 86 (offset -1 lines).
-Hunk #2 succeeded at 119 (offset -1 lines).
-Hunk #3 succeeded at 205 (offset -1 lines).
-Hunk #4 succeeded at 213 (offset -1 lines).
-Hunk #5 succeeded at 645 (offset -1 lines).
-Hunk #6 succeeded at 1051 (offset -1 lines).
-Hunk #7 succeeded at 1530 (offset -1 lines).
-Hunk #8 succeeded at 1711 (offset -1 lines).
-patching file vanitygaps.c
-#+end_src
-
-Alright, let's reload rebuild switch one more time here, and reload dwm to show that the patch worked.
-
-#+begin_src sh
-sudo nixos-rebuild switch --flake ~/nixos-dotfiles#nixos-btw
-#+end_src
-
-Alt Shift Q to reload dwm here. And we'll jump back into it. Now we can just open 2 terminals here and we see the gaps. Great. Let's move onto st and dmenu.
-
-* Install ST and DMENU
-First of all, lets actually create a nixos module for the suckless utilities.
-
-modules/suckless.nix:
-#+begin_src nix
-{ pkgs, ... }:
-
-{
-  home.packages = with pkgs; [
-    (pkgs.st.overrideAttrs (_: {
-      src = ../config/st;
-      patches = [ ];
-    }))
-    (pkgs.dmenu.overrideAttrs (_: {
-      src = ../config/dmenu;
-      patches = [ ];
-    }))
-    slock
-    surf
-  ];
-}
-#+end_src
-
-And let's add it to our home.nix file:
-#+begin_src
-
-  imports =
-    [
-      ./modules/neovim.nix
-      ./modules/suckless.nix
-    ];
-
-#+end_src
-
-Now we just need to clone st, and dmenu into our config directory.
-#+begin_src sh
-cd ~/nixos-dotfiles/config
-git clone https://git.suckless.org/st
-git clone https://git.suckless.org/dmenu
-#+end_src
-
-So if we run `sudo nixos-rebuild switch --flake ~/nixos-dotfiles#nixos-btw`
-we should have st and dmenu ready to go. Now it's time to talk about DevShells
-
-* DevShell to configure ST and Dmenu
-
-A dev shell is sort of like a container, but its declarative. I can drop devShell parameters into a flake, and someone else can take my flake, and immediately hop into that devShell with the same environment as me. This makes it really easy to reproduce the expected environment, and move forward with the development process. Let's do it the nix way.
-
-** ST
-
-Let's set up our dev shell by opening our flake.nix and adding this in the outputs section:
-
-#+begin_src nix
-...
-    let
-      system = "x86_64-linux";
-      pkgs = import nixpkgs { inherit system; };
-    in
-    {
-      devShells.${system}.suckless = pkgs.mkShell {
-        # toolchain + headers/libs
-        packages = with pkgs; [
-          pkg-config
-          xorg.libX11
-          xorg.libXft
-          xorg.libXinerama
-          fontconfig
-          freetype
-          harfbuzz
-          gcc
-          gnumake
-        ];
-      };
-      ...
-#+end_src
-
-Now we can run nixos-rebuild switch again, and jump into this devshell to start working on our st.
-
-#+begin_src sh
-sudo nixos-rebuild switch --flake ~/nixos-dotfiles#nixos-btw
-cd ~/nixos-dotfiles
-#+end_src
-
-To run this devShell, its very simple. lets just run
-#+begin_src sh
-nix develop .#suckless
-cd config/st
-#+end_src
-
-We're now in a nix development shell with the packages that we specified in our flake. We can open st by just typing st (our current version of st). We see, its the default st. Let's open up config.def.h and make some changes, and build st again.
-
-Let's just change the font and make it huge, so you can see this works.
-#+begin_src c
-static char *font = "JetBrainsMono Nerd Font:pixelsize=24:antialias=true:autohint=true";
-#+end_src
-
-Alright, let's save this file, and run `make`. Looks like it built correctly, so we can now run
-this new version of st by typing `./st`, and there we go. Beautiful new build of st right there. Let's check out this beautiful default colorscheme with nitch. Wow. Amaazing
-
-So basically, once we're happy with our changes, we can quit out of this devshell, and rebuild our system again. Just type `make clean` first, so we can get rid of any extraneous files, and then exit.
-
-Now we run nixos-rebuild switch again, and we can just open st, and now our nixos is pointing to our new build of st.
-
-** DMENU
-
-For dmenu, we can use the same devShell as before. So let's enter it again here:
-
-#+begin_src sh
-nix develop .#suckless
-cd config/dmenu
-#+end_src
-
-Let's change some stuff here to show what the devshell does again
-#+begin_src c
-static const char *fonts[] = {
-	"JetBrainsMono Nerd Font:size=16"
-};
-static const char *prompt      = NULL;      /* -p  option; prompt to the left of input field */
-static const char *colors[SchemeLast][2] = {
-	/*     fg         bg       */
-    [SchemeNorm] = { "#7dcfff", "#24283b" },
-    [SchemeSel]  = { "#000000", "#7aa2f7" },
-    [SchemeOut]  = { "#000000", "#7dcfff" },
-};
-
-static unsigned int lines      = 10;
-#+end_src
-
-We can run make now, and lets test our new build:
-
-#+begin_src sh
-ls | ./dmenu
-#+end_src
-
-And if we wanted to apply a patch here, we would do the same thing as before.
-
-Once we're happy with what it looks like, we can exit our shell again, but first lets make clean to get rid of the unnecessary files.
-
-#+begin_src
-make clean; exit.
-sudo nixos-rebuild switch --flake ~/nixos-dotfiles#nixos-btw
-ls | dmenu
-#+end_src
-
-And there we go. We see our dmenu binary is actualy pointing to the dmenu we just built. Awesome
-
-* Final Thoughts
-
-In the next installment of "NixOS From Scratch", we'll create 2 package variables, and use unstable to update stuff that we don't care if it breaks our system, and lock the core utils to stable.
-
-This has been heavily 'programming oriented', but this will leapfrog you forward in your nixos journey. Let me know if you like this sort of content, or what else you would like to see.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/tmux.org b/content/org-files/tmux.org
deleted file mode 100644
index 870e6b7..0000000
--- a/content/org-files/tmux.org
+++ /dev/null
@@ -1,293 +0,0 @@
-#+TITLE: Tmux with Zero Plugins
-#+AUTHOR: Tony, btw
-#+date: 2025-11-13
-#+HUGO_TITLE: Tmux with Zero Plugins
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/tmux.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/tmux
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless guide on how to configure tmux with zero plugins. Heavily inspired by Henry Misc's via negativa philosophy on removing things to solve problems, rather than adding them.
-
-* Intro
-What's up guys, my name is Tony, and today I'm gonna give you a quick and painless guide on configuring tmux with ZERO plugins.
-
-Tmux is probably the most essential tool in my development workflow. It's a terminal multiplexer that allows you to split your terminal into multiple panes, create multiple windows, and detach/reattach sessions.
-
-In the past, I relied on TPM as a plugin manager, but taking inspiration from Henry Misc, I decided to debloat my entire config into a plugin-less config. This means I don't need to rely on any plugins, and can just use the native Tmux settings.
-
-Let's jump into it.
-
-* What is Tmux?
-Tmux stands for "Terminal Multiplexer". Here's what that means:
-
-- *Sessions*: A tmux session is like a workspace. You can detach from it, close your terminal, and reattach later - everything is still there.
-- *Windows*: Think of these like browser tabs. Each window is a full terminal view.
-- *Panes*: These are splits within a window. You can have multiple terminals visible at once.
-
-This is crucial if you SSH into servers, work on multiple projects, or just want to keep your terminal organized without using a tiling window manager.
-
-* Installation
-
-Alright so I'm on arch linux, btw, but this is going to work on literally any distro. Tmux is in every package manager.
-
-For arch:
-#+begin_src sh
-sudo pacman -S tmux
-#+end_src
-
-For Ubuntu/Debian:
-#+begin_src sh
-sudo apt install tmux
-#+end_src
-
-NixOS... just add `tmux` to wherever you install your nixpkgs.
-
-That's it. No plugins, no plugin managers, nothing. Just tmux.
-
-* Key Pivotal Binds
-
-** Prefix Key
-The most important concept in tmux is the *prefix key*. By default, it's =Ctrl-b=, but we're gonna change it to =Ctrl-a= because it's way easier to reach.
-
-Every tmux command starts with the prefix. So when I say "prefix + c", that means:
-1. Press =Ctrl-a=
-2. Release
-3. Press =c=
-
-** Sessions, Windows & Panes
-
-Here's the hierarchy:
-- A *session* contains multiple *windows*
-- A *window* contains multiple *panes*
-
-Think of it like this:
-- Session = Project
-- Window = Task within that project
-- Pane = Terminal view for that task
-
-** Pane Navigation
-
-These are the binds you'll use 1000 times a day:
-
-| Bind                | Action                    |
-|---------------------+---------------------------|
-| =prefix + \vert=    | Split vertically          |
-| =prefix + -=        | Split horizontally        |
-| =prefix + h/j/k/l=  | Navigate panes (vim-like) |
-| =Alt + h/j/k/l=     | Navigate without prefix   |
-
-** Window Management
-
-| Bind                      | Action                |
-|---------------------------+-----------------------|
-| =prefix + c=              | Create new window     |
-| =prefix + n=              | Next window           |
-| =prefix + p=              | Previous window       |
-| =Alt + 1-9=               | Jump to window 1-9    |
-
-** Copy Mode
-
-Copy mode lets you scroll through terminal history and copy text:
-
-| Bind                 | Action                      |
-|----------------------+-----------------------------|
-| =prefix + [=         | Enter copy mode             |
-| =v=                  | Start selection (vim-like)  |
-| =Ctrl-v=             | Rectangle selection         |
-| =y=                  | Copy selection              |
-| =q=                  | Exit copy mode              |
-
-* Configuration
-
-Let's build a clean, readable config with zero plugins.
-
-** Basic Settings
-
-Create =~/.config/tmux/tmux.conf=:
-
-#+begin_src conf
-# Enable 256 color support
-set -g default-terminal "tmux-256color"
-set -ga terminal-overrides ",*:RGB"
-
-# Enable mouse support
-set -g mouse on
-
-# Enable clipboard
-set -g set-clipboard on
-#+end_src
-
-Let me break these down:
-
-- =default-terminal "tmux-256color"= tells tmux to advertise itself as a 256-color terminal, which is essential for proper color rendering in modern terminal applications like Neovim.
-- =terminal-overrides ",*:RGB"= enables true color (24-bit RGB) support, giving you access to millions of colors instead of just 256. This is what makes your color schemes look properly vibrant.
-- =mouse on= is controversial in the terminal purist community, but it's genuinely useful for quickly clicking between panes or dragging borders to resize them. You can always disable it later if you go full keyboard-only.
-- =set-clipboard on= allows tmux to integrate with your system clipboard, so when you copy text in tmux copy-mode, it actually goes to your system clipboard.
-
-** Better Keybinds
-
-#+begin_src conf
-# Change prefix from Ctrl-b to Ctrl-a
-unbind C-b
-set -g prefix C-a
-bind-key C-a send-prefix
-
-# Vim-style pane navigation
-bind h select-pane -L
-bind j select-pane -D
-bind k select-pane -U
-bind l select-pane -R
-
-# Split windows (opens in same directory)
-unbind %
-bind | split-window -h -c "#{pane_current_path}"
-
-unbind '"'
-bind - split-window -v -c "#{pane_current_path}"
-
-# Reload config
-unbind r
-bind r source-file $HOME/.config/tmux/tmux.conf
-
-# Alt+hjkl to switch panes without prefix
-bind -n M-h select-pane -L
-bind -n M-j select-pane -D
-bind -n M-k select-pane -U
-bind -n M-l select-pane -R
-
-# Alt+number to select window
-bind -n M-1 select-window -t 1
-bind -n M-2 select-window -t 2
-bind -n M-3 select-window -t 3
-bind -n M-4 select-window -t 4
-bind -n M-5 select-window -t 5
-bind -n M-6 select-window -t 6
-bind -n M-7 select-window -t 7
-bind -n M-8 select-window -t 8
-bind -n M-9 select-window -t 9
-#+end_src
-
-Let me explain the key concepts here:
-
-- =unbind C-b= removes the default Ctrl-b prefix because it's awkward to reach. =set -g prefix C-a= changes it to Ctrl-a, which is way more ergonomic since your pinky is already on Ctrl.
-- =bind-key C-a send-prefix= allows you to send the actual Ctrl-a to the terminal (useful in nested tmux sessions or when an app needs Ctrl-a).
-- The vim-style =hjkl= binds are essential if you're a vim user - they let you navigate panes with prefix+h/j/k/l instead of the default arrow keys.
-- =split-window -h -c "#{pane_current_path}"= is crucial - the =-c= flag makes new panes open in the same directory as your current pane. Without this, splits would open in your home directory, which is super annoying.
-- =unbind %= and =unbind '"'= remove the default split bindings so we can use =|= and =-= instead, which are way more intuitive (vertical bar for vertical split, dash for horizontal split).
-- =bind -n= means "bind without prefix". So =bind -n M-h= lets you use Alt+h to switch panes instantly, without hitting prefix first. This is a MASSIVE quality of life improvement once you get used to it.
-- The Alt+number binds (M-1 through M-9) let you jump directly to windows without prefix, similar to how browser tabs work with Ctrl+1-9.
-
-** Theme Colors
-
-Now here's where we make it look good. I'm using Tokyo Night Moon colors, but you can swap these out for any color scheme.
-
-#+begin_src conf
-# Tokyo Night Moon theme colors
-thm_bg="#222436"
-thm_fg="#c8d3f5"
-thm_cyan="#86e1fc"
-thm_black="#1b1d2b"
-thm_gray="#3a3f5a"
-thm_magenta="#c099ff"
-thm_pink="#ff757f"
-thm_red="#ff757f"
-thm_green="#c3e88d"
-thm_yellow="#ffc777"
-thm_blue="#82aaff"
-thm_orange="#ff9e64"
-thm_black4="#444a73"
-
-# Status bar settings
-set -g status "on"
-set -g status-bg "${thm_bg}"
-set -g status-justify "left"
-set -g status-left-length "100"
-set -g status-right-length "100"
-
-# Messages
-set -g message-style "fg=${thm_cyan},bg=${thm_gray},align=centre"
-set -g message-command-style "fg=${thm_cyan},bg=${thm_gray},align=centre"
-
-# Panes
-set -g pane-border-style "fg=${thm_gray}"
-set -g pane-active-border-style "fg=${thm_blue}"
-
-# Windows
-set -g window-status-activity-style "fg=${thm_fg},bg=${thm_bg},none"
-set -g window-status-separator ""
-set -g window-status-style "fg=${thm_fg},bg=${thm_bg},none"
-#+end_src
-
-** Status Bar Customization
-
-This is where it gets interesting. The status bar shows your current windows and session info.
-
-#+begin_src conf
-# Statusline - current window
-set -g window-status-current-format "#[fg=${thm_blue},bg=${thm_bg}] #I: #[fg=${thm_magenta},bg=${thm_bg}](✓) #[fg=${thm_cyan},bg=${thm_bg}]#(echo '#{pane_current_path}' | rev | cut -d'/' -f-2 | rev) #[fg=${thm_magenta},bg=${thm_bg}]"
-
-# Statusline - other windows
-set -g window-status-format "#[fg=${thm_blue},bg=${thm_bg}] #I: #[fg=${thm_fg},bg=${thm_bg}]#W"
-
-# Statusline - right side
-set -g status-right "#[fg=${thm_blue},bg=${thm_bg},nobold,nounderscore,noitalics]#[fg=${thm_bg},bg=${thm_blue},nobold,nounderscore,noitalics] #[fg=${thm_fg},bg=${thm_gray}] #W #{?client_prefix,#[fg=${thm_magenta}],#[fg=${thm_cyan}]}#[bg=${thm_gray}]#{?client_prefix,#[bg=${thm_magenta}],#[bg=${thm_cyan}]}#[fg=${thm_bg}] #[fg=${thm_fg},bg=${thm_gray}] #S "
-
-# Statusline - left side (empty)
-set -g status-left ""
-
-# Modes
-set -g clock-mode-colour "${thm_blue}"
-set -g mode-style "fg=${thm_blue} bg=${thm_black4} bold"
-#+end_src
-
-This is where things get interesting. Let me break down what's happening:
-
-- =window-status-current-format= defines how the active window looks in the status bar. It shows the window index (=#I=), a checkmark, and the last two parts of the current path.
-- The =#(echo '#{pane_current_path}' | rev | cut -d'/' -f-2 | rev)= command runs a shell command every time the status bar updates. It reverses the path, takes the last 2 parts, then reverses again. So =/home/tony/projects/dotfiles= becomes =projects/dotfiles=.
-- =window-status-format= is for inactive windows - just shows the index and window name.
-- =status-right= shows the window name (=#W=), a visual indicator that changes from cyan to magenta when prefix is pressed using =#{?client_prefix,...}= conditional, and the session name (=#S=).
-- =#I= is the window index (number), =#W= is the window name, =#S= is the session name - these are tmux's format variables.
-
-The =#{?client_prefix,...}= syntax is tmux's conditional - it means "if prefix is pressed, use magenta, otherwise use cyan". This gives you a visual indicator when you're in prefix mode.
-
-* Extra Binds & Tweaks
-
-Here are some nice-to-haves that should be placed earlier in the config (after the basic settings):
-
-#+begin_src conf
-# Change from 0 based to 1 based because keyboard layout
-set -g base-index 1
-set -g pane-base-index 1
-set-window-option -g pane-base-index 1
-set-option -g renumber-windows on
-
-# Vim-like copy/paste
-set-window-option -g mode-keys vi
-bind-key -T copy-mode-vi v send-keys -X begin-selection
-bind-key -T copy-mode-vi C-v send-keys -X rectangle-toggle
-bind-key -T copy-mode-vi y send-keys -X copy-selection-and-cancel
-unbind -T copy-mode-vi MouseDragEnd1Pane
-#+end_src
-
-Here's what these do:
-
-- =base-index 1= makes windows start counting from 1 instead of 0. This is way more ergonomic because window 1 is on the left of your keyboard (the 1 key), not the right (0 is to the right of 9). It's a small thing but it makes a huge difference.
-- =pane-base-index 1= does the same for panes.
-- =renumber-windows on= automatically renumbers your windows when you close one. So if you have windows 1, 2, 3, 4 and you close window 2, the remaining windows become 1, 2, 3. Without this, you'd have gaps like 1, 3, 4.
-- =mode-keys vi= enables vim keybindings in copy mode. This is essential if you're a vim user - it means you can use j/k to navigate, v to start visual selection, etc.
-- The =copy-mode-vi= bindings make =v= start a selection (like visual mode in vim) and =y= yank (copy) the selection.
-- =C-v= lets you do rectangle selection (block visual mode in vim).
-- =unbind -T copy-mode-vi MouseDragEnd1Pane= prevents mouse selection from automatically exiting copy mode, so you can still use =y= to copy after selecting with the mouse.
-- You enter copy mode with =prefix + [=, navigate with vim keys, =v= to select, =y= to copy.
-
-* Final Thoughts
-
-You're now ready to use Tmux as a minimal, fast, and efficient terminal multiplexer.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/org-files/xmonad.org b/content/org-files/xmonad.org
deleted file mode 100644
index 19beb2c..0000000
--- a/content/org-files/xmonad.org
+++ /dev/null
@@ -1,745 +0,0 @@
-#+TITLE: The Last Honest X11 Window Manager: Xmonad
-#+AUTHOR: Tony, btw
-#+date: 2025-11-26
-#+HUGO_TITLE: The Last Honest X11 Window Manager: Xmonad
-#+HUGO_FRONT_MATTER_FORMAT: yaml
-#+HUGO_CUSTOM_FRONT_MATTER: :image "/img/xmonad.png" :showTableOfContents true
-#+HUGO_BASE_DIR: ~/repos/tonybtw.com
-#+HUGO_SECTION: tutorial/xmonad
-#+EXPORT_FILE_NAME: index
-#+OPTIONS: toc:nil broken-links:mark
-#+HUGO_AUTO_SET_HEADLINE_SECTION: nil
-#+DESCRIPTION: This is a quick and painless guide on how to install and configure XMonad, written in Haskell. An honest X11 window manager written in an honest functional programming language.
-
-#+begin_quote
-In an era of dishonesty, there is one X11 window manager that continues to flourish.
-The final frontier of honesty.
-The last pillar of hope in an unsettling ecosystem where windows are no longer managed by human users… but by committees, protocols, and corporations.
-
-For nearly twenty years, this window manager has been battle-tested.
-It has shined through the smoke of AUR DDoS attacks…
-endless attempts to force Wayland adoption by Red Hat and Canonical…
-and a relentless wave of dishonest “modern UX improvements” designed to undermine your ability to simply move a window one pixel to the left.
-
-At the end of the day, that’s all an X11 window manager was ever supposed to be.
-
-And XMonad is—
-as YouTux might put it—
-the last honest window manager.
-#+end_quote
-
-* Intro
-What's up guys, my name is Tony, and today I'm gonna give you a quick and painless guide on installing and configuring Xmonad.
-
-Let's jump into the installation.
-
-* Install Dependencies for Xmonad
-
-Today, we're going to be using NixOS for the installation and configuration, but Xmonad is available on virtually every package manager in existence, (at least all the honest ones.) If you are using a legacy distro such as Arch, Gentoo, or Debian, a link will be provided below the subscribe button for a written guide to accompany this video.
-
-For nixos, we just need to do 3 things.
-
-In our configuration.nix:
-#+begin_src nix
-services = {
-  picom.enable = true;
-  displayManager = {
-    ly.enable = true;
-  };
-  xserver = {
-    enable = true;
-    autoRepeatDelay = 200;
-    autoRepeatInterval = 35;
-    windowManager = {
-      xmonad = {
-        enable = true;
-        enableContribAndExtras = true;
-        extraPackages = hpkgs: [
-          hpkgs.xmonad
-          hpkgs.xmonad-extras
-          hpkgs.xmonad-contrib
-        ];
-      };
-    };
-    displayManager.sessionCommands = ''
-      xwallpaper --zoom ~/walls/wall1.png
-    '';
-  };
-};
-#+end_src
-
-And then in our home.nix:
-#+begin_src nix
-home.packages = with pkgs; [
-  haskell-language-server
-  xmobar
-];
-#+end_src
-
-
-** Requirements for Xmonad
-If you're on Arch, btw, here are the core dependencies:
-- xorg-server
-- xorg-xinit
-- xmonad
-- xmonad-contrib
-- ghc (Glasgow Haskell Compiler)
-- xmobar
-- dmenu (or rofi if you prefer)
-- picom (for compositing)
-
-** Extra stuff for my setup today:
-- alacritty (terminal emulator)
-- dmenu/rofi (application launcher)
-- feh or xwallpaper (for wallpapers, we're using xwallpaper in our nix config)
-- firefox (web browser)
-- ttf-jetbrains-mono-nerd (font)
-- scrot or maim (for screenshots)
-- picom (compositor for shadows and transparency)
-
-So let's install these with pacman -Sy
-#+begin_src sh
-sudo pacman -Sy xorg-server xorg-xinit xmonad xmonad-contrib ghc xmobar dmenu alacritty xwallpaper firefox ttf-jetbrains-mono-nerd scrot picom
-#+end_src
-
-Alright, let's configure xmonad and get it up and running.
-
-* Configure Xmonad
-After running nixos-rebuild switch (or installing via pacman if you're on Arch), we need to create our xmonad.hs config file.
-
-Let's create the directory and config:
-
-#+begin_src sh
-mkdir -p ~/.config/xmonad
-vim ~/.config/xmonad/xmonad.hs
-#+end_src
-
-** Starting from Zero
-
-Let's start with the absolute minimum xmonad configuration. This is a complete, working config that does nothing more than launch xmonad with default settings:
-
-#+begin_src haskell
-import XMonad
-
-main = xmonad def
-#+end_src
-
-That's it. Three lines. This will give you a tiling window manager with default keybindings. Alt+Shift+Enter opens a terminal, Alt+p for dmenu, etc.
-
-Let's compile and test it:
-
-#+begin_src sh
-xmonad --recompile
-#+end_src
-
-Now let's build it up piece by piece.
-
-** Adding Custom Terminal and Mod Key
-
-Most people want to use the Super key (Windows key) instead of Alt, and specify their preferred terminal:
-
-#+begin_src haskell
-import XMonad
-
-main = xmonad def
-    { modMask = mod4Mask      -- Use Super instead of Alt
-    , terminal = "alacritty"  -- Use alacritty as terminal
-    }
-#+end_src
-
-** Adding Basic Keybindings
-
-Let's add some custom keybindings using EZConfig for a more readable syntax:
-
-#+begin_src haskell
-import XMonad
-import XMonad.Util.EZConfig (additionalKeysP)
-
-myKeys =
-    [ ("M-<Return>", spawn "alacritty")
-    , ("M-d", spawn "dmenu_run")
-    , ("M-q", kill)
-    ]
-
-main = xmonad $ def
-    { modMask = mod4Mask
-    , terminal = "alacritty"
-    }
-    `additionalKeysP` myKeys
-#+end_src
-
-** Adding Colors and Borders
-
-Let's add some visual customization:
-
-#+begin_src haskell
-import XMonad
-import XMonad.Util.EZConfig (additionalKeysP)
-
-myKeys =
-    [ ("M-<Return>", spawn "alacritty")
-    , ("M-d", spawn "dmenu_run")
-    , ("M-q", kill)
-    ]
-
-main = xmonad $ def
-    { modMask = mod4Mask
-    , terminal = "alacritty"
-    , borderWidth = 2
-    , normalBorderColor = "#444b6a"
-    , focusedBorderColor = "#ad8ee6"
-    }
-    `additionalKeysP` myKeys
-#+end_src
-
-** Adding Gaps and Spacing
-
-Now let's add some breathing room with gaps between windows:
-
-#+begin_src haskell
-import XMonad
-import XMonad.Util.EZConfig (additionalKeysP)
-import XMonad.Layout.Spacing
-
-myLayoutHook = spacingWithEdge 3 $ layoutHook def
-
-myKeys =
-    [ ("M-<Return>", spawn "alacritty")
-    , ("M-d", spawn "dmenu_run")
-    , ("M-q", kill)
-    ]
-
-main = xmonad $ def
-    { modMask = mod4Mask
-    , terminal = "alacritty"
-    , borderWidth = 2
-    , normalBorderColor = "#444b6a"
-    , focusedBorderColor = "#ad8ee6"
-    , layoutHook = myLayoutHook
-    }
-    `additionalKeysP` myKeys
-#+end_src
-
-** Adding XMobar Status Bar
-
-Now let's integrate xmobar to show workspaces and window information:
-
-#+begin_src haskell
-import XMonad
-import XMonad.Util.EZConfig (additionalKeysP)
-import XMonad.Layout.Spacing
-import XMonad.Hooks.DynamicLog
-import XMonad.Hooks.StatusBar
-import XMonad.Hooks.StatusBar.PP
-import XMonad.Hooks.ManageDocks
-
-myLayoutHook = avoidStruts $ spacingWithEdge 3 $ layoutHook def
-
-myXmobarPP :: PP
-myXmobarPP = def
-    { ppCurrent = xmobarColor "#0db9d7" ""
-    , ppHidden = xmobarColor "#a9b1d6" ""
-    , ppHiddenNoWindows = xmobarColor "#444b6a" ""
-    }
-
-myStatusBar = statusBarProp "xmobar" (pure myXmobarPP)
-
-myKeys =
-    [ ("M-<Return>", spawn "alacritty")
-    , ("M-d", spawn "dmenu_run")
-    , ("M-q", kill)
-    , ("M-S-r", spawn "xmonad --recompile && xmonad --restart")
-    ]
-
-main = xmonad $ withEasySB myStatusBar defToggleStrutsKey $ def
-    { modMask = mod4Mask
-    , terminal = "alacritty"
-    , borderWidth = 2
-    , normalBorderColor = "#444b6a"
-    , focusedBorderColor = "#ad8ee6"
-    , layoutHook = myLayoutHook
-    , manageHook = manageDocks
-    }
-    `additionalKeysP` myKeys
-#+end_src
-
-Now we have a pretty solid foundation! But what does a full-featured config look like?
-
-** My Full Xmonad Configuration
-
-Here's my actual daily driver xmonad configuration with TokyoNight colors, custom layouts, workspace rules, gap controls, and all my keybindings:
-
-#+begin_src haskell
-import Data.Map qualified as M
-import XMonad
-import XMonad.Hooks.DynamicLog
-import XMonad.Hooks.EwmhDesktops
-import XMonad.Hooks.ManageDocks
-import XMonad.Hooks.StatusBar
-import XMonad.Hooks.StatusBar.PP
-import XMonad.Hooks.InsertPosition
-import XMonad.Layout.NoBorders
-import XMonad.Layout.ResizableTile
-import XMonad.Layout.Spacing
-import XMonad.Layout.Spiral
-import XMonad.Layout.Renamed
-import XMonad.StackSet qualified as W
-import XMonad.Util.EZConfig (additionalKeysP)
-import XMonad.Util.Loggers
-import XMonad.Util.SpawnOnce
-
--- TokyoNight Colors
-colorBg = "#1a1b26" -- background
-colorFg = "#a9b1d6" -- foreground
-colorBlk = "#32344a" -- black
-colorRed = "#f7768e" -- red
-colorGrn = "#9ece6a" -- green
-colorYlw = "#e0af68" -- yellow
-colorBlu = "#7aa2f7" -- blue
-colorMag = "#ad8ee6" -- magenta
-colorCyn = "#0db9d7" -- cyan
-colorBrBlk = "#444b6a" -- bright black
-
--- Appearance
-myBorderWidth = 2
-
-myNormalBorderColor = colorBrBlk
-
-myFocusedBorderColor = colorMag
-
--- Gaps (matching dwm: 3px all around)
-mySpacing = spacingWithEdge 3
-
--- Workspaces
-myWorkspaces = ["1", "2", "3", "4", "5", "6", "7", "8", "9"]
-
--- Mod key (Super/Windows key)
-myModMask = mod4Mask
-
--- Terminal
-myTerminal = "st"
-
--- Layouts
-myLayoutHook =
-  avoidStruts $
-        renamed [Replace "Tall"] (mySpacing tall)
-        ||| renamed [Replace "Wide"] (mySpacing (Mirror tall))
-        ||| renamed [Replace "Full"] (mySpacing Full)
-        ||| renamed [Replace "Spiral"] (mySpacing (spiral (6 / 7)))
-  where
-    tall = ResizableTall 1 (3 / 100) (11 / 20) []
-
--- Window rules (matching dwm config)
-myManageHook =
-  composeAll
-    [ className =? "Gimp" --> doFloat
-    , className =? "Brave-browser" --> doShift "2"
-    , className =? "firefox" --> doShift "3"
-    , className =? "Slack" --> doShift "4"
-    , className =? "kdenlive" --> doShift "8"
-    ]
-    <+> insertPosition Below Newer
-
--- Key bindings (matching dwm as closely as possible)
-myKeys =
-  -- Launch applications
-  [ ("M-<Return>", spawn myTerminal)
-  , ("M-d", spawn "rofi -show drun -theme ~/.config/rofi/config.rasi")
-  , ("M-r", spawn "dmenu_run")
-  , ("M-l", spawn "slock")
-  , ("C-<Print>", spawn "maim -s | xclip -selection clipboard -t image/png")
-  , -- Window management
-    ("M-q", kill)
-  , ("M-j", windows W.focusDown)
-  , ("M-k", windows W.focusUp)
-  , ("M-<Tab>", windows W.focusDown)
-  , -- Master area
-    ("M-h", sendMessage Expand)
-  , ("M-g", sendMessage Shrink)
-  , ("M-i", sendMessage (IncMasterN 1))
-  , ("M-p", sendMessage (IncMasterN (-1)))
-  , -- Layout switching
-    ("M-t", sendMessage $ JumpToLayout "Tall")
-  , ("M-f", sendMessage $ JumpToLayout "Full")
-  , ("M-c", sendMessage $ JumpToLayout "Spiral")
-  , ("M-S-<Return>", sendMessage NextLayout)
-  , ("M-n", sendMessage NextLayout)
-  , -- Floating
-    ("M-S-<Space>", withFocused toggleFloat)
-  , -- Gaps (z to increase, x to decrease, a to toggle)
-    ("M-z", incWindowSpacing 3)
-  , ("M-x", decWindowSpacing 3)
-  , ("M-a", toggleWindowSpacingEnabled >> toggleScreenSpacingEnabled)
-  , ("M-S-a", setWindowSpacing (Border 3 3 3 3) >> setScreenSpacing (Border 3 3 3 3))
-  , -- Quit/Restart
-    ("M-S-r", spawn "xmonad --recompile && xmonad --restart")
-  , -- Keychords for tag navigation (Mod+Space then number)
-    ("M-<Space> 1", windows $ W.greedyView "1")
-  , ("M-<Space> 2", windows $ W.greedyView "2")
-  , ("M-<Space> 3", windows $ W.greedyView "3")
-  , ("M-<Space> 4", windows $ W.greedyView "4")
-  , ("M-<Space> 5", windows $ W.greedyView "5")
-  , ("M-<Space> 6", windows $ W.greedyView "6")
-  , ("M-<Space> 7", windows $ W.greedyView "7")
-  , ("M-<Space> 8", windows $ W.greedyView "8")
-  , ("M-<Space> 9", windows $ W.greedyView "9")
-  , ("M-<Space> f", spawn "firefox")
-  , -- Volume controls
-    ("<XF86AudioRaiseVolume>", spawn "pactl set-sink-volume @DEFAULT_SINK@ +3%")
-  , ("<XF86AudioLowerVolume>", spawn "pactl set-sink-volume @DEFAULT_SINK@ -3%")
-  , ("<XF86AudioMute>", spawn "pactl set-sink-mute @DEFAULT_SINK@ toggle")
-  ]
-    ++
-    -- Standard TAGKEYS behavior (Mod+# to view, Mod+Shift+# to move)
-    [ (mask ++ "M-" ++ [key], windows $ action tag)
-    | (tag, key) <- zip myWorkspaces "123456789"
-    , (action, mask) <- [(W.greedyView, ""), (W.shift, "S-")]
-    ]
-
--- Helper function for toggling float
-toggleFloat w =
-  windows
-    ( \s ->
-        if M.member w (W.floating s)
-          then W.sink w s
-          else W.float w (W.RationalRect 0.15 0.15 0.7 0.7) s
-    )
-
--- XMobar PP (Pretty Printer) configuration
-myXmobarPP :: PP
-myXmobarPP =
-  def
-    { ppSep = xmobarColor colorBrBlk "" " │ "
-    , ppTitleSanitize = xmobarStrip
-    , ppCurrent = xmobarColor colorCyn ""
-    , ppHidden = xmobarColor colorFg ""
-    , ppHiddenNoWindows = xmobarColor colorBrBlk ""
-    , ppUrgent = xmobarColor colorRed colorYlw
-    , ppOrder = \[ws, l, _, wins] -> [ws, l, wins]
-    , ppExtras = [logTitles formatFocused formatUnfocused]
-    }
-  where
-    formatFocused = wrap (xmobarColor colorCyn "" "[") (xmobarColor colorCyn "" "]") . xmobarColor colorFg "" . ppWindow
-    formatUnfocused = wrap (xmobarColor colorBrBlk "" "[") (xmobarColor colorBrBlk "" "]") . xmobarColor colorBrBlk "" . ppWindow
-    ppWindow :: String -> String
-    ppWindow = xmobarRaw . (\w -> if null w then "untitled" else w) . shorten 30
-
--- Main configuration
-myConfig =
-  def
-    { modMask = myModMask
-    , terminal = myTerminal
-    , workspaces = myWorkspaces
-    , borderWidth = myBorderWidth
-    , normalBorderColor = myNormalBorderColor
-    , focusedBorderColor = myFocusedBorderColor
-    , layoutHook = myLayoutHook
-    , manageHook = myManageHook <+> manageDocks
-    , startupHook = spawnOnce "xsetroot -cursor_name left_ptr"
-    }
-    `additionalKeysP` myKeys
-
--- XMobar status bar configuration
-myStatusBar = statusBarProp "xmobar ~/.config/xmobar/xmobarrc" (pure myXmobarPP)
-
-main :: IO ()
-main = xmonad . ewmhFullscreen . ewmh . withEasySB myStatusBar defToggleStrutsKey $ myConfig
-#+end_src
-
-This config includes TokyoNight colors, custom layouts (Tall, Wide, Full, Spiral), gap controls, workspace rules for automatically moving apps to specific workspaces, and tons of keybindings.
-
-Now let's compile and test it:
-
-#+begin_src sh
-xmonad --recompile
-#+end_src
-
-If you're on NixOS, you can just rebuild and then either log out and select xmonad from your display manager, or if you want to test it immediately:
-
-#+begin_src sh
-nixos-rebuild switch
-startx
-#+end_src
-
-Alright, we're in xmonad now. As you can see, we have a clean slate with xmobar at the top. Super minimal, super honest.
-
-* Xmobar Configuration
-We already have xmobar launching from our xmonad config, but let's customize it. Let's create an xmobar config:
-
-#+begin_src sh
-mkdir -p ~/.config/xmobar
-vim ~/.config/xmobar/xmobarrc
-#+end_src
-
-** Starting with a Minimal Xmobar Config
-
-Here's the absolute minimal xmobar configuration:
-
-#+begin_src haskell
-Config {
-     font     = "xft:monospace-10"
-   , bgColor  = "#000000"
-   , fgColor  = "#ffffff"
-   , position = Top
-   , commands = [ Run XMonadLog ]
-   , template = "%XMonadLog%"
-   }
-#+end_src
-
-This will show your workspaces and focused window. Nothing fancy, but it works.
-
-** Adding System Information
-
-Let's add some system monitors like CPU, memory, and the date:
-
-#+begin_src haskell
-Config {
-     font     = "xft:monospace-10"
-   , bgColor  = "#000000"
-   , fgColor  = "#ffffff"
-   , position = Top
-   , sepChar  = "%"
-   , alignSep = "}{"
-   , template = "%XMonadLog% }{ CPU: %cpu% | MEM: %memory% | %date%"
-   , commands =
-        [ Run XMonadLog
-        , Run Cpu ["-t", "<total>%"] 10
-        , Run Memory ["-t", "<usedratio>%"] 10
-        , Run Date "%a %b %_d %H:%M" "date" 10
-        ]
-   }
-#+end_src
-
-Now we have workspace info on the left, and system stats on the right.
-
-** Adding Colors and Better Formatting
-
-Let's make it prettier with some color coding:
-
-#+begin_src haskell
-Config {
-     font     = "xft:JetBrainsMono Nerd Font-12"
-   , bgColor  = "#1a1b26"
-   , fgColor  = "#a9b1d6"
-   , position = TopSize C 100 30
-   , sepChar  = "%"
-   , alignSep = "}{"
-   , template = " %XMonadLog% }{ <fc=#7aa2f7>CPU:</fc> %cpu% | <fc=#7aa2f7>MEM:</fc> %memory% | <fc=#ad8ee6>%date%</fc> "
-   , commands =
-        [ Run XMonadLog
-        , Run Cpu
-            [ "-t", "<total>%"
-            , "-L", "30"
-            , "-H", "70"
-            , "-l", "#9ece6a"
-            , "-n", "#e0af68"
-            , "-h", "#f7768e"
-            ] 10
-        , Run Memory
-            [ "-t", "<usedratio>%"
-            , "-L", "30"
-            , "-H", "70"
-            , "-l", "#9ece6a"
-            , "-n", "#e0af68"
-            , "-h", "#f7768e"
-            ] 10
-        , Run Date "<fc=#ad8ee6>%a %b %_d %H:%M</fc>" "date" 10
-        ]
-   }
-#+end_src
-
-Now we've got TokyoNight colors, with green for low usage, yellow for medium, and red for high.
-
-** My Full Xmobar Configuration
-
-Here's my actual daily driver xmobar config with borders, Nerd Font icons, battery monitoring, and full TokyoNight theming:
-
-#+begin_src haskell
--- TokyoNight XMobar Config
-Config {
-   -- Appearance
-     font            = "JetBrainsMono Nerd Font Mono Bold 16"
-   , additionalFonts = [ "JetBrainsMono Nerd Font Mono 18" ]
-   , bgColor         = "#1a1b26"
-   , fgColor         = "#a9b1d6"
-   , position        = TopSize C 100 35
-   , border          = BottomB
-   , borderColor     = "#444b6a"
-   , borderWidth     = 2
-
-   -- Layout
-   , sepChar         = "%"
-   , alignSep        = "}{"
-   , template        = " %XMonadLog% }{ %cpu% <fc=#444b6a>│</fc> %memory% <fc=#444b6a>│</fc> %battery% <fc=#444b6a>│</fc> %date% "
-
-   -- Plugins
-   , commands        =
-        [ Run XMonadLog
-        , Run Cpu
-            [ "-t", "<fc=#7aa2f7> CPU:</fc> <total>%"
-            , "-L", "30"
-            , "-H", "70"
-            , "-l", "#9ece6a"
-            , "-n", "#e0af68"
-            , "-h", "#f7768e"
-            ] 10
-        , Run Memory
-            [ "-t", "<fc=#7aa2f7>󰍛 MEM:</fc> <usedratio>%"
-            , "-L", "30"
-            , "-H", "70"
-            , "-l", "#9ece6a"
-            , "-n", "#e0af68"
-            , "-h", "#f7768e"
-            ] 10
-        , Run Battery
-            [ "-t", "<fc=#7aa2f7>󱐋 BAT:</fc> <acstatus>"
-            , "-L", "20"
-            , "-H", "80"
-            , "-l", "#f7768e"
-            , "-n", "#e0af68"
-            , "-h", "#9ece6a"
-            , "--"
-            , "-o", "<left>% (<timeleft>)"
-            , "-O", "<fc=#e0af68>Charging</fc> <left>%"
-            , "-i", "<fc=#9ece6a>Charged</fc>"
-            ] 50
-        , Run Date "<fc=#ad8ee6> %a %b %_d %H:%M</fc>" "date" 10
-        ]
-   }
-#+end_src
-
-This config has Nerd Font icons, a bottom border, battery monitoring, and uses the full TokyoNight color palette with dynamic colors based on resource usage.
-
-Now if we reload xmonad with Mod+Shift+r, we should see our customized xmobar. Sweet.
-
-* Wallpaper
-Good news - we already set up the wallpaper in our configuration.nix! The line we added earlier:
-
-#+begin_src nix
-displayManager.sessionCommands = ''
-  xwallpaper --zoom ~/walls/wall1.png
-'';
-#+end_src
-
-This will automatically set your wallpaper on startup. But we still need to grab a wallpaper. Let's open firefox with super+d, type firefox, and head over to wallhaven.cc to pick one out.
-
-Let's grab this one and put it in ~/walls/wall1.png:
-
-#+begin_src sh
-mkdir -p ~/walls
-# download your wallpaper and move it here
-mv ~/Downloads/wallpaper.png ~/walls/wall1.png
-#+end_src
-
-If you want to test it without reloading X, you can run:
-
-#+begin_src sh
-xwallpaper --zoom ~/walls/wall1.png
-#+end_src
-
-And boom, there's our wallpaper.
-
-* Screenshot Script
-For screenshots, I'm using maim with xclip to copy directly to clipboard. In the xmonad config above, I already have it bound to Control+Print:
-
-#+begin_src haskell
-, ("C-<Print>", spawn "maim -s | xclip -selection clipboard -t image/png")
-#+end_src
-
-This lets you select an area with your mouse, and it copies the screenshot directly to your clipboard. Super convenient for pasting into Discord, Slack, or wherever.
-
-If you want to save screenshots to a file instead, you can create a script:
-
-#+begin_src sh
-mkdir -p ~/.local/bin
-vim ~/.local/bin/screenshot
-#+end_src
-
-Add this:
-
-#+begin_src sh
-#!/bin/sh
-# Screenshot script using maim
-maim -s ~/Pictures/screenshots/$(date +%Y-%m-%d_%H-%M-%S).png
-#+end_src
-
-Make it executable:
-
-#+begin_src sh
-chmod +x ~/.local/bin/screenshot
-#+end_src
-
-And you can add another keybind in your xmonad.hs if you want both options.
-
-* Customization and Tweaks
-So at this point, the world is really your oyster. Xmonad is written in Haskell, so if you know Haskell, you can literally do anything you want with this window manager. That's the beauty of it - your window manager IS your config file.
-
-In my config, I've already set up a bunch of stuff:
-
-The TokyoNight color scheme with that nice magenta focused border, 3 pixel gaps all around (matching my dwm setup), and I'm using st as my terminal because it's fast and minimal.
-
-For layouts, I've got ResizableTall, Mirror ResizableTall, Full, and Spiral. You can jump between them with:
-- Super+t for tiled
-- Super+f or Super+m for fullscreen
-- Super+c for spiral
-- Super+Shift+Enter to cycle through all layouts
-
-For gaps, I have some really nice keybinds:
-- Super+a toggles gaps on/off
-- Super+z increases gap size
-- Super+x decreases gap size
-- Super+Shift+a resets gaps back to 3 pixels
-
-Window rules are set up so different apps automatically go to specific workspaces:
-- Browsers (Chrome, Brave) go to workspace 2
-- Firefox goes to workspace 3
-- Slack goes to 4
-- Discord goes to 5
-- Kdenlive goes to 8
-
-Here are my essential keybinds:
-
-| Keybind | Action |
-|---------|--------|
-| Super+Enter | Launch terminal (st) |
-| Super+d | Launch rofi application launcher |
-| Super+r | Launch dmenu |
-| Super+l | Lock screen with slock |
-| Super+q | Close focused window |
-| Super+j | Focus next window |
-| Super+k | Focus previous window |
-| Super+Tab | Focus next window |
-| Super+h | Expand master area |
-| Super+g | Shrink master area |
-| Super+i | Increase number of windows in master |
-| Super+p | Decrease number of windows in master |
-| Super+t | Switch to Tall layout |
-| Super+f | Switch to Full layout |
-| Super+c | Switch to Spiral layout |
-| Super+Shift+Enter | Cycle to next layout |
-| Super+n | Cycle to next layout |
-| Super+Shift+Space | Toggle floating for focused window |
-| Super+z | Increase gap size |
-| Super+x | Decrease gap size |
-| Super+a | Toggle gaps on/off |
-| Super+Shift+a | Reset gaps to default (3px) |
-| Super+Shift+r | Recompile and restart xmonad |
-| Super+Space [1-9] | Keychord: Jump to workspace 1-9 |
-| Super+Space f | Keychord: Launch Firefox |
-| Super+[1-9] | Switch to workspace 1-9 |
-| Super+Shift+[1-9] | Move window to workspace 1-9 |
-| Ctrl+Print | Screenshot (select area to clipboard) |
-| XF86AudioRaiseVolume | Increase volume by 3% |
-| XF86AudioLowerVolume | Decrease volume by 3% |
-| XF86AudioMute | Toggle mute |
-
-I've put together the full xmonad config above with all my customizations, the TokyoNight colors, and all my keybinds. If you want even more customization ideas, check out the xmonad documentation - it's honestly one of the best-documented window managers out there.
-
-* Final Thoughts
-
-You're now ready to use XMonad as an honest X11 window manager.
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [[https://youtube.com/@tony-btw][YouTube]], or my website here: [[https://www.tonybtw.com][tony,btw]]
-
-You can support me here: [[https://ko-fi.com/tonybtw][kofi]]
diff --git a/content/posts/my-first-post.md b/content/posts/my-first-post.md
deleted file mode 100644
index 4e89bac..0000000
--- a/content/posts/my-first-post.md
+++ /dev/null
@@ -1,797 +0,0 @@
----
-title: "Hyprland on Arch — Minimal Setup Guide"
-author: ["Tony", "btw"]
-draft: false
-showTableOfContents: true
-image: "/img/hyprland-header.png"
----
-
-## Intro {#intro}
-
-What's up guys, my name is Tony, and today, I'm going to give you a quick and painless guide
-on installing Hyprland on Arch linux.
-
-Hyprland is a dynamic window manager and wayland compositor that is highly customizable, and it
-emphasizes aesthetics, functionality, and extensibility.
-
-We're going to be using Arch linux today, but hyprland is available on most distrobutions, so if you
-are a NixOS user, or Gentoo, or even Debian, check out the wiki for installation instructions, but other
-than that, the customization aspect of this guide will still apply to you.
-
-At the end of this guide, you will no longer be using x11, and you will be able to fully
-customize your own build of hyprland on your own hardware.
-
-
-## Install Arch Linux {#install-arch-linux}
-
--   basic stuff
--   pacstrap everything
-
-The first thing I'm going to do is install a fresh Arch linux, and since today's guide is not about
-how to install Arch linux, I'm going to speed through that process and catch you guys at the login
-screen. If you want help installing arch linux, check out my Arch Linux tutorial.
-
-[Arch Linux Tutorial](https://youtu.be/oeDbo-HRaZo)
-
-
-## Install required tools for hyprland {#install-required-tools-for-hyprland}
-
-Alright, so we're staring at a very minimal arch build, we only installed base, base-devel, linux, linux-firmware, and sof-firmware.
-That's all you need to get started, and if you are an arch user, you can start basically anywhere as long as you've installed these
-basic packages, and got a bootloader up and running.
-
-So lets start by installing all of the required packages for today's setup. The beatiful thing about starting on a fresh install
-like this is that, you guys get to see the most minimal setup as possible in terms of packages. So let's grab all the hyprland
-tools.
-
-The 'hyprland' package actually comes with a lot on Arch linux. It comes with the wayland compositor among other things. Let's grab that,
-xorg-xwayland (just in case we need to use xwayland utils), and hyprpaper (a minimal hyprland wallpaper tool)
-
-[Hyprland Arch Wiki Page](https://archlinux.org/packages/extra/x86_64/hyprland/)
-
-For other packages, I'm going to be using vim today to edit all the files, you can feel free to use your text editor of choice.
-We need wofi (an application launcher for wayland), foot (a terminal emulator in wayland), waybar (the powerbar that we'll be using today),
-dolphin (a file manager that works in wayland), and firefox. Let's also grab git for version controlling.
-
-Lastly, we want a nerd font to render some of the icons here, so lets grab \`ttf-jetbrains-mono-nerd\`
-
-And that's basically it. We really don't need much, and if we need anything else along the way, we can just grab it from pacman.
-
--   hyprland
--   vim
--   git
--   foot
--   waybar
--   firefox
--   wofi
--   kitty (hyprland default terminal)
--   dolphin
--   jetbrains mono nerd
-
-<!--listend-->
-
-```sh
-sudo pacman -S hyprland xorg-xwayland hyprpaper
-sudo pacman -S vim wofi git foot waybar firefox dolphin
-sudo pacman -S ttf-jetbrains-mono-nerd
-```
-
-
-## Create config file {#create-config-file}
-
-Let's create the directory for the hyprland config file here, and copy the template config file into it. This is important because we're using foot
-instead of kitty, we have to do this before launching hyprland.
-
-```sh
-mkdir -p ~/.config/hypr; cp /usr/share/hypr/hyprland.conf ~/.config/hypr/
-```
-
-Edit this file, swap kitty with foot.
-
-```hyprlang
-$terminal = foot;
-```
-
-
-## Load hyprland {#load-hyprland}
-
-We're ready to launch hyprland, and we can do so easily by just typing hyprland.
-
-```sh
-hyprland
-```
-
-From inside of hyprland, we'll open a terminal with super Q
-and lets immediately edit the monitors block:
-
-Since my monitor is 1920x1080, I'll set that in my hyprland config. Also, we'll change this last 'auto' flag to 1.0.
-This is the scale flag, and auto will set it to 1.5.
-
-```text
-monitor=,1920x1080,auto,1.0
-```
-
-You can display what monitor we have with:
-
-```sh
-hyprctl monitors
-```
-
-
-## Foot config {#foot-config}
-
-Now lets jump into our foot config to quickly make our terminal readable
-lets set this up,
-
-```sh
-mkdir .config/foot
-vim .config/foot/foot.ini
-```
-
-```ini
-font=JetBrainsMono NF:size=16
-pad=8x8 center-when-maximized-and-fullscreen
-```
-
-And we're going to go with a tokyonight theme for todays rice, so lets check this website out for tokyonight ports. I'll leave a link
-to this site below the subscribe button of this video.
-
-[Tokyo Night Theme Site](https://wixdaq.github.io/Tokyo-Night-Website/ports.html)
-
-Let's navigate to 'foot', and copy this colors block, and add it to our foot.ini file.
-
-```ini
-[colors]
-foreground=c0caf5
-background=1a1b26
-
-## Normal/regular colors (color palette 0-7)
-regular0=15161E  # black
-regular1=f7768e  # red
-regular2=9ece6a  # green
-regular3=e0af68  # yellow
-regular4=7aa2f7  # blue
-regular5=bb9af7  # magenta
-regular6=7dcfff  # cyan
-regular7=a9b1d6  # white
-
-## Bright colors (color palette 8-15)
-bright0=414868   # bright black
-bright1=f7768e   # bright red
-bright2=9ece6a   # bright green
-bright3=e0af68   # bright yellow
-bright4=7aa2f7   # bright blue
-bright5=bb9af7   # bright magenta
-bright6=7dcfff   # bright cyan
-bright7=c0caf5   # bright white
-
-## dimmed colors (see foot.ini(5) man page)
-dim0=ff9e64
-dim1=db4b4b
-
-alpha=0.9
-```
-
-Alright that looks great. Let's jump into the next step
-
-
-## Hyprland and Waybar {#hyprland-and-waybar}
-
-When we modify hyprlands config file, it automatically refreshes hyprland on save, which is convenient.
-lets jump back into the hyprland.conf file and change a few things for QoL
-
-We're gonna use waybar today, and in order to quickly reload that, we can use one line command here:
-Also, to add it to start when we load hyprland, lets add it to exec-once.
-
-```cfg
-$reload_waybar = pkill waybar; waybar &
-exec-once = waybar &
-```
-
-And we scroll down here and ensure our reload waybar script is binded:
-
-```cfg
-bind = $mainMod, R, exec, $reload_waybar
-```
-
-While we're in the binding section, lets clean up some of these binds. I like Q for quit, Enter for
-terminal, and D for $menu (which is wofi)
-
-```cfg
-bind = $mainMod, Return, exec, $terminal
-bind = $mainMod, Q, killactive,
-bind = $mainMod, D, exec, $menu
-```
-
-Now that these are good to go, lets do one or two more huge qol updates:
-
-```cfg
-input {
-    # xset r rate 200 35
-    # This allows your key repeat rate set to 200ms delay, 35 repeats per second
-    repeat_rate = 35
-    repeat_delay = 200
-}
-
-cursor {
-    # this ensures your mouse cursor doesn't glitch out
-    inactive_timeout = 30
-    no_hardware_cursors = true
-}
-```
-
-Alright, we should be good to go for now and move on to the next step.
-
-
-## Waybar {#waybar}
-
-Now that Waybar is binded to super R, lets go ahead and load it once with super R.
-Let's customize this by opening up the config file:
-Lets copy over the default waybar config, since its loading a null config file now.
-To ensure we can edit it, we need to change ownership of the file from root to tony. (use your username here)
-
-```bash
-sudo cp -R /etc/xdg/waybar ~/.config/waybar
-sudo chown -R tony:tony .config/waybar
-vim .config/waybar/.
-```
-
-So this has 2 parts to it, style.css, and config.jsconc. let's start with config.jsonc, thats where all the
-widgets, and workspace stuff lives.
-
-At the top of this file we see layer, position, etc. If you are a bottom bar user, you can swap this to bottom, and it would look like this:
-We're gonna put the bar on the top today, and build it out from there.
-
-
-### Config.jsonc {#config-dot-jsonc}
-
-
-#### Left Modules {#left-modules}
-
-So we see in config.jsonc, there are a bunch of modules loaded on the left side.
-
-```json
-"modules-left": [
-    "sway/workspaces",
-    "sway/mode",
-    "sway/scratchpad",
-    "custom/media"
-],
-```
-
-We can delete the bottom 3 of these, they aren't needed. We only want the workspaces module on the left for now
-and since we're not using sway, we're using hyprland, lets just change sway to hyprland. Sway is an i3 clone for
-wayland. Will be a video on that in the future.
-
-```json
-"modules-left": [
-    "hyprland/workspaces",
-],
-```
-
-So this module exists, but its not defined in our file, lets go down to where the sway/workspaces module was defined.
-Luckily, these modules use the same syntax, so all we need to do is switch sway to hyprland here too.
-
-```json
-"hyprland/workspaces": {
-    "disable-scroll": true,
-    "all-outputs": true,
-    "warp-on-scroll": false,
-    "format": "{name}: {icon}",
-    "format-icons": {
-        "1": "",
-        "2": "",
-        "3": "",
-        "4": "",
-        "5": "",
-        "urgent": "",
-        "focused": "",
-        "default": ""
-    }
-},
-```
-
-So lets just uncomment this block, and change 'sway' to 'hyprland'.
-Lets save this file, and reload waybar with that super R keybind.
-
-And now we see this workpace module on the left side. Beautiful. Let's clean this up a little bit.
-
-These Icons are customizable, similar to my dwm config, where if you know whats going on that workspace
-at all times, you can use a font awesome or nerd font icon for that application, and throw it on that
-workspace number. For us today, we're going to just go with the classic 1,2,3,4 ... so lets delete this block
-here, and change this to just {name}
-
-```json
-"hyprland/workspaces": {
-    "disable-scroll": true,
-    "all-outputs": true,
-    "warp-on-scroll": false,
-    "format": "{name}",
-},
-```
-
-We can reload this again with super R, and there we go. much better already.
-
-Also, we'll add persistent-workspaces, so that all the numbers show even if they aren't active.
-
-```json
-    "persistent-workspaces": {
-        "*": 9,
-    }
-```
-
-One more thing for now, lets add the window module that displays what is open in your current window.
-lets just put it on the left side for now
-
-And let's define this module here, and add 2 attributes to it:
-max-length, and separate-outputs: false
-Max length is just making the max length 40 characters, so it doesn't impede on the right side that we'll setup next.
-Separate-outputs: This is for those of you with multiple monitors, it will show the window thats focused on all monitors
-instead of showing it on a per monitor basis.
-
-```json
-"modules-left": [
-    "hyprland/workspaces",
-    "hyprland/window"
-],
-
-"hyprland/window": {
-    "max-length": 40,
-    "separate-outputs": false
-},
-```
-
-Let's work on some of these right-side modules.
-
-
-#### Center Module {#center-module}
-
-Lets leave this empty for now. It's easier to handle spacing imo if we just do left and right side modules.
-
-```json
-"modules-center": [],
-```
-
-
-#### Right Modules {#right-modules}
-
-Lets start by deleting a lot of these modules. most of them aren't needed, and we are going for a semi-minimal
-config today. Remember, that you can take this information from this tutorial, and really make your bar custom for
-your own setup.
-
-```json
-"modules-right": [
-    "mpd",
-    "idle_inhibitor",
-    "pulseaudio",
-    "network",
-    "power-profiles-daemon",
-    "cpu",
-    "memory",
-    "temperature",
-    "backlight",
-    "keyboard-state",
-    "sway/language",
-    "battery",
-    "battery#bat2",
-    "clock",
-    "tray",
-    "custom/power"
-],
-```
-
-Let's trim this down to just this for now: we can remove all of these, lets remove temperature
-, lets get backlight, keyboard-state, language out of here. if you're on a laptop, keep batery. otherwise, get rid of it.
-lets keep clock, and keep tray. we'll add some in here as well, but this is good for now.
-
-```json
-"modules-right": [
-    "network",
-    "cpu",
-    "memory",
-    // "battery",
-    "clock",
-    "tray"
-],
-```
-
-Let's reload this with super R, and there we go. super minimal config for now. lets add 1 or 2 custom modules here, and then move onto
-the styling.
-
-Let's make this network widget super minimal.
-
-```json
-"network": {
-    "format": "Online",
-    "format-disconnected": "Disconnected ()"
-},
-```
-
-Let's change the CPU widget to something more clean:
-
-```json
-"cpu": {
-    "format": "CPU: {usage}%",
-    "tooltip": false
-},
-```
-
-Same thing for RAM:
-
-```json
-"memory": {
-    "format": "Mem: {used}GiB"
-},
-```
-
-Let's add a disk widget, and this is inspired by DT's xmonad widgets a little bit, which i've been interested in for my qtile setup.
-
-Interval so that it doesnt run every 1 seconds (the default value)
-
-```json
-"disk": {
-    "interval": 60,
-    "path": "/",
-    "format": "Disk: {free}",
-},
-```
-
-And let's add "disk" to the right modules array:
-
-```json
-"modules-right": [
-    "cpu",
-    "memory",
-    "disk",
-    "battery",
-    "clock",
-    "tray"
-],
-```
-
-Heres the battery modifications: (for those of you with laptops, this should be included)
-
-```json
-"battery": {
-    "states": {
-        "good": 80,
-        "warning": 30,
-        "critical": 15
-    },
-    "format": "Bat: {capacity}% {icon} {time}",
-    "format-alt": "Bat: {capacity}%",
-    "format-time": "{H}:{M}",
-    "format-icons": ["", "", "", "", ""]
-},
-```
-
-And lets add a simple separator module as follows:
-
-```json
-"custom/sep": {
-    "format": "|",
-    "interval": 0,
-    "tooltip": false
-},
-```
-
-Now lets add this separator in between all of our widgets. it will look weird for now, but we'll fix the styling after.
-
-```json
-"modules-left": [
-    "hyprland/workspaces",
-    "custom/sep",
-    "hyprland/window",
-    "custom/sep"
-],
-"modules-center": [
-],
-
-"modules-right": [
-    "custom/sep",
-    "network",
-    "custom/sep",
-    "cpu",
-    "custom/sep",
-    "memory",
-    "custom/sep",
-    "disk",
-    "custom/sep",
-    "clock",
-    "custom/sep",
-    "tray"
-],
-```
-
-And thats it for the modules, we can move into the styles of these now.
-
-
-### Styles {#styles}
-
-The first thing we want to do is have our colors match the tokyonight aesthetic, so lets define these colors at the top of the file. Note, you can just copy and
-paste these from my github repo.
-
-[Github Repo](https://github.com/tonybanters/hyprland-btw)
-
-```css
-@define-color bg    #1a1b26;
-@define-color fg    #a9b1d6;
-@define-color blk   #32344a;
-@define-color red   #f7768e;
-@define-color grn   #9ece6a;
-@define-color ylw   #e0af68;
-@define-color blu   #7aa2f7;
-@define-color mag   #ad8ee6;
-@define-color cyn   #0db9d7;
-@define-color brblk #444b6a;
-@define-color wht   #ffffff;
-```
-
-Alright, now we see the global styles with '\*', lets add some options here.
-
-```css
-* {
-    font-family: "JetBrainsMono Nerd Font", monospace;
-    font-size: 16px;
-    font-weight: bold;
-}
-```
-
-We're just changing the font to Jetbrains mono, and we are making it bold, and increasing the zie a little bit so its readable.
-
-Now for the actual window on waybar, lets change some stuff here:
-
-```css
-window#waybar {
-  background: @bg;
-  color: @fg;
-}
-```
-
-Let's get rid of the border, and get rid of the transition propertys for now. Keep it minimal,
-since we added those variables at the top for the colors, its going to make our lives much easier when setting up these styles.
-
-And yea, this is already looking much better as far as usability, and stylistically speaking. Let's keep going.
-
-Lets handle the behaviour of the workspace toggles, so that the colors of the workspaces that have applications running on them
-are all the same, but there is a visual indicator of the active workspace.
-
-```css
-#workspaces button {
-    padding: 0 6px;
-    color: @cyn;
-    background: transparent;
-    border-bottom: 3px solid @bg;
-}
-#workspaces button.active {
-    color: @cyn;
-    border-bottom: 3px solid @mag;
-}
-#workspaces button.empty {
-    color: @wht;
-}
-#workspaces button.empty.active {
-    color: @cyn;
-    border-bottom: 3px solid @mag;
-}
-```
-
-So this basically says that if the workspace is active, it will be visually indicated with the purple underline. if it
-is not active, but not empty, it will still be cyan, but not be underlined. Waybar has a weird issue where when you swap
-to a new workspace, and dont open an application on it yet, its technically empty, and active. so we will cover for that case here
-as well. Feel free to copy and paste this from my config file.
-
-Let's clean up this file now. I think we can delete pretty much everything except this massive block that just adds padding to every
-widget here.
-
-We're going to add custom separators here, so lets add that to this list, and add the css for it now, so when we jump back into the json file
-we can already have it styled
-
-```css
-#clock,
-#custom-sep,
-#battery,
-#cpu,
-#memory,
-#disk,
-#network,
-#tray {
-    padding: 0 8px;
-    color: @white;
-}
-
-#custom-sep {
-    color: @brblk;
-}
-```
-
-This tells waybar to show a white font for all the text on all these widgets by default, and
-also tells the separator to use this special black font, which will add later.
-
-Let's quickly go through these right side widgets, and make them more minimal.
-I like the underline style here, feel free to tinker with the colors on your setup, but im going for the
-more minimal tokyonight style.
-
-```css
-#clock {
-    color: @cyn;
-    border-bottom: 4px solid @cyn;
-}
-
-#battery {
-    color: @mag;
-    border-bottom: 4px solid @mag;
-}
-
-#disk {
-    color: @ylw;
-    border-bottom: 4px solid @ylw;
-}
-
-#memory {
-    color: @mag;
-    border-bottom: 4px solid @mag;
-}
-
-#cpu {
-    color: @grn;
-    border-bottom: 4px solid @grn;
-}
-
-#network {
-    color: @blu;
-    border-bottom: 4px solid @blu;
-}
-```
-
-Alright, thats enough css for one day... This bar is looking really good. Feel free to customize it even further from here.
-Let's setup wofi, add a wallpaper, and get this show on the road.
-
-
-## Wallpaper {#wallpaper}
-
-First thing we need to do is get a wallpaper.. so lets head over to firefox and grab this one i picked out for this rice, its on my github.
-Let's save this into a folder in the home directory called walls, and save it is wall1.png
-
-Now let's create a hyprpaper.conf file in the hypr directory like so:
-
-vim .config/hypr/hyprpaper.conf
-
-```cfg
-preload = ~/walls/wall1.jpg
-wallpaper = ,~/walls/wall1.jpg
-```
-
-Now in our hyprland.conf, lets turn on hyprpaper like so:
-
-```nil
-exec-once waybar & hyprpaper
-```
-
-I'll run this in a terminal here but it will now always launch when we start hyprland. And there we go. Awesome
-Last thing to do is get a proper config for wofi.
-
-
-## Wofi {#wofi}
-
-For this wofi config, we'll grab it from that same website of tokyonight configs, but I modified it slightly as follows:
-
-```sh
-mkdir .config/wofi
-vim .config/wofi/config
-```
-
-```nil
-# mode & placement
-show=drun
-location=top
-width=700
-lines=8
-columns=2
-dynamic_lines=false
-
-# icons
-allow_images=true
-image_size=36
-
-# search & UX
-matching=fuzzy
-insensitive=true
-hide_scroll=false
-prompt=
-
-# terminal
-term=foot
-
-# keybinds (vim-ish)
-key_up=Ctrl-k
-key_down=Ctrl-j
-key_left=Ctrl-h
-key_right=Ctrl-l
-key_submit=Return
-key_forward=Tab
-key_backward=Shift-ISO_Left_Tab
-
-# stylesheet
-style=/home/tony/.config/wofi/style.css
-```
-
-And to make that stylesheet, its right here in the style.css file of that config,
-
-so lets make this file:
-
-```sh
-vim ~/.config/wofi/style.css
-```
-
-```css
-* {
-    font-family: "JetBrainsMono Nerd Font", monospace;
-    font-size: 16px;
-    font-weight: bold;
-}
-
-window {
-    margin: 0px;
-    border: 2px solid #414868;
-    border-radius: 5px;
-    background-color: #24283b;
-    font-family: monospace;
-    font-size: 12px;
-}
-
-#input {
-    margin: 5px;
-    border: 1px solid #24283b;
-    color: #c0caf5;
-    background-color: #24283b;
-}
-
-#input image {
-    color: #c0caf5;
-}
-
-#inner-box {
-    margin: 5px;
-    border: none;
-    background-color: #24283b;
-}
-
-#outer-box {
-    margin: 5px;
-    border: none;
-    background-color: #24283b;
-}
-
-#scroll {
-    margin: 0px;
-    border: none;
-}
-
-#text {
-    margin: 5px;
-    border: none;
-    color: #c0caf5;
-}
-
-#entry:selected {
-    background-color: #414868;
-    font-weight: normal;
-}
-
-#text:selected {
-    background-color: #414868;
-    font-weight: normal;
-}
-```
-
-And this system is looking pretty good. We got our waybar all setup, our widgets, we have our foot terminal looking good, our wallpaper, and our wofi config.
-This is just the beginning of hyprland, but this should be a great source for you to start customizing your own personal setup.
-
-
-## Final Thoughts {#final-thoughts}
-
-Thanks so much for checking out this tutorial. If you got value from it, and you want to find more tutorials like this, check out
-my youtube channel here: [YouTube](https://youtube.com/@tony-btw), or my website here: [tony,btw](https://www.tonybtw.com)
-
-You can support me here: [kofi](https://ko-fi.com/tonybtw)
diff --git a/content/support/index.md b/content/support/index.md
deleted file mode 100644
index fa9da22..0000000
--- a/content/support/index.md
+++ /dev/null
@@ -1,6 +0,0 @@
----
-title: Support
-url: /support/
-layout: support
----
-
diff --git a/content/tutorial/dwm/dwm.png b/content/tutorial/dwm/dwm.png
deleted file mode 100755
index fc040e2..0000000
Binary files a/content/tutorial/dwm/dwm.png and /dev/null differ
diff --git a/content/tutorial/neovim/index.md b/content/tutorial/neovim/index.md
index 501ddf8..1b49414 100644
--- a/content/tutorial/neovim/index.md
+++ b/content/tutorial/neovim/index.md
@@ -1,12 +1,12 @@
-+++
-title = "Neovim on Linux — Complete IDE Tutorial"
-author = ["Tony", "btw"]
-description = "A quick and painless guide on installing and configuring Neovim, and how to use it as your full daily driver IDE, btw."
-date = 2025-05-10
-draft = false
-image = "/img/neovim.png"
-showTableOfContents = true
-+++
+---
+title: "Neovim on Linux — Complete IDE Tutorial"
+author: ["Tony", "btw"]
+description: "A quick and painless guide on installing and configuring Neovim, and how to use it as your full daily driver IDE, btw."
+date: 2025-05-10
+draft: false
+image: "/img/neovim.png"
+showTableOfContents: true
+---
 
 ## Intro {#intro}
 
diff --git a/flake.nix b/flake.nix
index 053cfc8..7df8c71 100644
--- a/flake.nix
+++ b/flake.nix
@@ -1,38 +1,44 @@
 {
-  description = "Dev shell for this tonybtw.com";
+  description = "Dev shell and builder for tonybtw.com (Makefile + pandoc)";
 
   inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
 
-  outputs = { nixpkgs, ... }:
+  outputs = { self, nixpkgs, ... }:
     let
       systems = [ "x86_64-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin" ];
       foreach = f: builtins.listToAttrs (map (system: { name = system; value = f system; }) systems);
+      toolsFor = pkgs: [
+        pkgs.gnumake pkgs.pandoc pkgs.coreutils pkgs.gnused pkgs.gawk
+        pkgs.findutils pkgs.python3 pkgs.bash
+      ];
     in
     {
-      devShells = foreach (system:
-        let
-          pkgs = import nixpkgs { inherit system; };
-          common_pkgs = [ pkgs.hugo ];
-        in
+      packages = foreach (system:
+        let pkgs = import nixpkgs { inherit system; }; in
         {
-          default = pkgs.mkShell {
-            packages = common_pkgs;
-            shellHook = ''
-              export PS1="(tonybtw-dev) $PS1"
-              echo "Hugo dev shell ready."
-              hugo version
+          default = pkgs.stdenvNoCC.mkDerivation {
+            name = "tonybtw.com";
+            src = ./.;
+            nativeBuildInputs = toolsFor pkgs;
+            buildPhase = "make site";
+            installPhase = ''
+              mkdir -p $out
+              cp -r public/. $out/
             '';
           };
-          serve = pkgs.mkShell {
-            packages = common_pkgs;
+        });
+
+      devShells = foreach (system:
+        let pkgs = import nixpkgs { inherit system; }; in
+        {
+          default = pkgs.mkShell {
+            packages = toolsFor pkgs ++ [ pkgs.woff2 ];
             shellHook = ''
               export PS1="(tonybtw-dev) $PS1"
-              echo "Hugo dev shell ready."
-              hugo serve
+              echo "build:  make"
+              echo "serve:  make serve   (http://localhost:1313)"
             '';
           };
-        }
-      );
+        });
     };
 }
-
diff --git a/gen.sh b/gen.sh
new file mode 100755
index 0000000..c3d212a
--- /dev/null
+++ b/gen.sh
@@ -0,0 +1,152 @@
+#!/usr/bin/env bash
+set -eu
+
+TPL=template.html
+OUT=public
+YT="https://www.youtube.com/@tony-btw"
+GH="https://github.com/tonybanters"
+
+fm()     { awk 'NR==1&&$0=="---"{f=1;next} f&&$0=="---"{exit} f' "$1"; }
+field()  { printf '%s\n' "$1" | sed -n "s/^$2: *//p" | head -1 | sed 's/^"//; s/"$//'; }
+tagsof() { printf '%s\n' "$1" | sed -n 's/^tags: *//p' | head -1 | tr -d '[]"' | tr ',' ' '; }
+esc()    { printf '%s' "$1" | sed 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g'; }
+fdate()  { date -d "$1" +"%B %-d, %Y" 2>/dev/null || printf '%s' "$1"; }
+tslug()  { printf '%s' "$1" | tr 'A-Z' 'a-z' | sed 's/[^a-z0-9]\{1,\}/-/g; s/^-//; s/-$//'; }
+
+render() { # out title section buffer showtitle(0|1) ; body on stdin
+  out=$1; title=$2; sec=$3; buf=$4; show=$5; extra=""
+  [ "$show" = 1 ] && extra="-M showtitle=true"
+  mkdir -p "$(dirname "$out")"
+  pandoc --template="$TPL" -s -M title="$title" -M section="$sec" -M buffer="$buf" $extra -o "$out"
+}
+
+tut_sorted() {
+  for f in content/tutorial/*/index.md; do
+    b=$(fm "$f"); printf '%s\t%s\n' "$(field "$b" date)" "$(basename "$(dirname "$f")")"
+  done | sort -r
+}
+comm_sorted() {
+  for f in content/community/*/index.md; do
+    b=$(fm "$f"); printf '%s\t%s\n' "$(field "$b" date)" "$(basename "$(dirname "$f")")"
+  done | sort -r
+}
+
+tut_card() {
+  f="content/tutorial/$1/index.md"; b=$(fm "$f")
+  img=$(field "$b" image); t=$(esc "$(field "$b" title)")
+  d=$(fdate "$(field "$b" date)"); desc=$(esc "$(field "$b" description)")
+  cat <<EOF
+<div class="tutorial-card">
+  <a href="/tutorial/$1/"><img class="tutorial-card-image" src="$img" alt="$t" loading="lazy"></a>
+  <div class="tutorial-card-title"><a href="/tutorial/$1/">$t</a></div>
+  <div class="tutorial-card-date">$d</div>
+  <div class="tutorial-card-description">$desc</div>
+</div>
+EOF
+}
+
+comm_card() {
+  f="content/community/$1/index.md"; b=$(fm "$f")
+  t=$(esc "$(field "$b" title)"); d=$(fdate "$(field "$b" date)")
+  au=$(esc "$(field "$b" author)"); desc=$(esc "$(field "$b" description)")
+  tags=""
+  for tg in $(tagsof "$b"); do
+    tags="$tags<a class=\"ctag\" href=\"/tags/$(tslug "$tg")/\">$(esc "$tg")</a> "
+  done
+  cat <<EOF
+<div class="tutorial-card">
+  <div class="tutorial-card-title"><a href="/community/$1/">$t</a></div>
+  <div class="tutorial-card-date">by $au &middot; $d</div>
+  <div class="tutorial-card-description">$desc</div>
+  <div class="card-tags">$tags</div>
+</div>
+EOF
+}
+
+# ---------- home ----------
+{
+  cat <<EOF
+<section class="hero-section" style="padding:2rem 1rem;text-align:center;">
+<h1 style="font-size:2.5rem;font-weight:800;margin-bottom:1rem;">Creating <span style="color:var(--cyn);">Quick and Painless</span> Linux Tutorials</h1>
+<p style="font-size:1.2rem;max-width:700px;margin:0 auto 2rem auto;">My name is Tony, and I encourage you all to visit the command line and learn how to maneuver the CLI. Installing Linux distributions, window managers, text editors, and more will help you grow not only as a developer, but as a computer enthusiast.</p>
+<div style="margin-top:1.5rem;">
+<a href="$YT" class="btn-primary">YouTube Channel</a>
+<a href="/support/" class="btn-outline" style="margin-left:1rem;">Support!</a>
+<a href="$GH" class="btn-outline-secondary" style="margin-left:1rem;">Github</a>
+</div>
+</section>
+<section style="margin-bottom:4rem;">
+<h2 style="text-align:center;font-size:1.8rem;">Recent Tutorials</h2>
+<p style="text-align:center;margin-bottom:2rem;">Stay tuned for new videos and writeups!</p>
+<div class="recent-tutorials-grid">
+EOF
+  tut_sorted | head -3 | while IFS="$(printf '\t')" read -r d s; do tut_card "$s"; done
+  cat <<EOF
+</div>
+<div style="text-align:center;margin-top:2rem;"><a href="/tutorial/" class="btn-primary">Explore All Tutorials</a></div>
+</section>
+EOF
+} | render "$OUT/index.html" "Tony, btw." home index 0
+
+# ---------- tutorial list ----------
+{
+  echo '<div class="tutorial-grid">'
+  tut_sorted | while IFS="$(printf '\t')" read -r d s; do tut_card "$s"; done
+  echo '</div>'
+} | render "$OUT/tutorial/index.html" "Tutorials" tutorial index 1
+
+# ---------- community list ----------
+{
+  echo '<div class="tutorial-grid">'
+  comm_sorted | while IFS="$(printf '\t')" read -r d s; do comm_card "$s"; done
+  echo '</div>'
+} | render "$OUT/community/index.html" "Community" community index 1
+
+# ---------- support ----------
+{
+  cat <<EOF
+<div class="recent-tutorials-grid" style="margin-top:2rem;">
+<div class="tutorial-card"><div class="tutorial-card-title">Subscribe on YouTube</div>
+<div class="tutorial-card-description">Support the channel by subscribing &mdash; it's free and helps spread the word.</div>
+<p style="margin-top:1rem;"><a class="btn-primary" href="$YT">Go to YouTube</a></p></div>
+<div class="tutorial-card"><div class="tutorial-card-title">Donate via Square</div>
+<div class="tutorial-card-description">Help keep the content flowing. Every contribution makes a difference.</div>
+<p style="margin-top:1rem;"><a class="btn-outline" href="https://square.link/u/tC3glUCo">Donate via Square</a></p></div>
+<div class="tutorial-card"><div class="tutorial-card-title">Support on Ko-Fi</div>
+<div class="tutorial-card-description">Prefer Ko-Fi? Buy me a coffee and support future videos directly.</div>
+<p style="margin-top:1rem;"><a class="btn-outline-secondary" href="https://ko-fi.com/tonybtw">Go to Ko-Fi</a></p></div>
+</div>
+EOF
+} | render "$OUT/support/index.html" "Support the Channel" support index 1
+
+# ---------- tags ----------
+tagdir=$(mktemp -d)
+for f in content/tutorial/*/index.md; do
+  b=$(fm "$f"); s=$(basename "$(dirname "$f")")
+  for tg in $(tagsof "$b"); do ts=$(tslug "$tg"); echo "tutorial:$s" >> "$tagdir/$ts"; echo "$tg" > "$tagdir/$ts.name"; done
+done
+for f in content/community/*/index.md; do
+  b=$(fm "$f"); s=$(basename "$(dirname "$f")")
+  for tg in $(tagsof "$b"); do ts=$(tslug "$tg"); echo "community:$s" >> "$tagdir/$ts"; echo "$tg" > "$tagdir/$ts.name"; done
+done
+
+index_body=$(mktemp)
+echo '<div class="card-tags" style="font-size:1rem;">' > "$index_body"
+for tf in "$tagdir"/*; do
+  case "$tf" in *.name) continue;; esac
+  ts=$(basename "$tf"); name=$(cat "$tagdir/$ts.name"); n=$(wc -l < "$tf")
+  printf '<a class="ctag" href="/tags/%s/">%s (%s)</a>\n' "$ts" "$(esc "$name")" "$n" >> "$index_body"
+  {
+    echo '<div class="tutorial-grid">'
+    while IFS= read -r entry; do
+      type=${entry%%:*}; sl=${entry#*:}
+      [ "$type" = tutorial ] && tut_card "$sl" || comm_card "$sl"
+    done < "$tf"
+    echo '</div>'
+  } | render "$OUT/tags/$ts/index.html" "#$name" tags "$ts.org" 1
+done
+echo '</div>' >> "$index_body"
+render "$OUT/tags/index.html" "Tags" tags index 1 < "$index_body"
+rm -rf "$tagdir" "$index_body"
+
+echo "generated home, lists, support, tags"
diff --git a/hugo.toml b/hugo.toml
deleted file mode 100644
index 0f244ed..0000000
--- a/hugo.toml
+++ /dev/null
@@ -1,15 +0,0 @@
-baseURL = 'https://example.org/'
-languageCode = 'en-us'
-title = 'Tony, btw.'
-buildFuture = true
-
-[markup.highlight]
-  # style = "rose-pine"      
-  # style = "tokyonight-moon"      
-  # style = "tokyonight-storm"      
-  # style = "tokyonight-night"      
-  style = "catppuccin-mocha"      
-  # style = "catppuccin-frappe"
-  # style = "catppuccin-macchiato"
-  # style = "rose-pine-moon"      
-  noClasses = true       # uses inline styles (easy, no CSS setup)
diff --git a/layouts/_default/single.html b/layouts/_default/single.html
deleted file mode 100644
index 7dc8032..0000000
--- a/layouts/_default/single.html
+++ /dev/null
@@ -1,59 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <meta name="author" content="Tony, btw." />
-    <link rel="icon" type="image/png" href="/img/favicon.png" />
-    <link rel="stylesheet" href="/css/code.css" />
-    <link rel="stylesheet" href="/css/site.css" />
-    <title>{{ .Title }}</title>
-  </head>
-  <body>
-
-    {{ partial "header.html" . }}
-
-    <main class="container">
-      <div class="row" style="display: flex; align-items: flex-start; gap: 2rem;">
-
-        <!-- Main Content -->
-        <div class="column" style="flex: 1;">
-          <article class="site-post">
-            <h1 class="site-post-title center">{{ .Title }}</h1>
-            {{ with .Params.date }}<p class="site-post-meta center">{{ . }}</p>{{ end }}
-
-            {{ with .Params.image }}
-              <div class="post-hero">
-                <img src="{{ . | relURL }}" alt="{{ $.Title }}" loading="lazy" />
-              </div>
-            {{ end }}
-
-            {{ if .Params.video }}
-            <div class="video">
-              <iframe src="https://www.youtube.com/embed/{{ .Params.video }}" allowfullscreen></iframe>
-            </div>
-            {{ end }}
-
-            <div id="content" class="mb-10">
-              {{ .Content }}
-            </div>
-          </article>
-        </div>
-
-        <!-- Sidebar TOC -->
-        {{ if gt (len .TableOfContents) 80 }}
-        <aside class="content-panel" style="flex: 0 0 250px; max-width: 250px; position: sticky; top: 100px; align-self: flex-start;">
-          <div class="pb-3">
-            <strong class="text-xl">Table of Contents</strong>
-          </div>
-          <div id="tableOfContentContainer" style="max-height: calc(100vh - 8rem); overflow-y: auto;">
-            {{ .TableOfContents }}
-          </div>
-        </aside>
-        {{ end }}
-
-      </div>
-    </main>
-  </body>
-</html>
-
diff --git a/layouts/community/list.html b/layouts/community/list.html
deleted file mode 100644
index e8365b4..0000000
--- a/layouts/community/list.html
+++ /dev/null
@@ -1,51 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8" />
-  <link rel="icon" type="image/png" href="/img/favicon.png" />
-  <meta name="viewport" content="width=device-width, initial-scale=1" />
-  <title>{{ .Title }}</title>
-  <link rel="stylesheet" href="/css/site.css" />
-</head>
-<body>
-
-  {{ partial "header.html" . }}
-  <main class="container">
-    <h1 class="site-post-title center" style="margin-bottom: 2rem;">Community</h1>
-
-    <div class="tutorial-grid">
-      {{ $paginator := .Paginate .Pages }}
-      {{ range $page := $paginator.Pages }}
-        <div class="tutorial-card">
-          <!-- No image on cards for community -->
-          <h4 class="tutorial-card-title" style="margin-top:0;">
-            <a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a>
-          </h4>
-          {{ with $page.Params.author }}
-            <p class="tutorial-card-author" style="margin:.15rem 0; color:#666;">By {{ . }}</p>
-          {{ end }}
-          <p class="tutorial-card-date">{{ $page.Date.Format "January 2, 2006" }}</p>
-          {{ with $page.Description }}
-            <p class="tutorial-card-description">{{ . }}</p>
-          {{ end }}
-        {{ with $page.Params.logo }}
-        <div style="position:relative; width: 0; height: 0">
-            <div class="tutorial-card-logo" style="position:absolute; left: 300px; bottom: 40px;">
-              <img src="{{ . | relURL }}" alt="{{ $page.Title }} logo" style="max-width: 100px; max-height: 64px;">
-            </div>
-        </div>
-
-          {{ end }}
-        </div>
-      {{ end }}
-    </div>
-
-    {{ if gt $paginator.TotalPages 1 }}
-      <div style="margin-top: 2rem; text-align: center;">
-        {{ template "_internal/pagination.html" . }}
-      </div>
-    {{ end }}
-  </main>
-</body>
-</html>
-
diff --git a/layouts/community/single.html b/layouts/community/single.html
deleted file mode 100644
index 9da485f..0000000
--- a/layouts/community/single.html
+++ /dev/null
@@ -1,93 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <meta
-      name="viewport"
-      content="width=device-width, initial-scale=1"
-    />
-    <meta
-      name="author"
-      content="{{ with .Params.author }}{{ . }}{{ else }}Tony, btw.{{ end }}"
-    />
-    <link rel="icon" type="image/png" href="/img/favicon.png" />
-    <!-- <link rel="stylesheet" href="/css/code.css" /> -->
-    <link rel="stylesheet" href="/css/site.css" />
-    <title>{{ .Title }}</title>
-  </head>
-  <body>
-
-    {{ partial "header.html" . }}
-
-    <main class="container">
-      <style>
-        p img {
-          display: block;
-          max-width: 80rem;
-          width: 100%;
-          height: auto;
-          margin: 1rem auto;
-          border-radius: 8px;
-        }
-      </style>
-      <div class="row" style="display: flex; align-items: flex-start; gap: 2rem;">
-
-        <!-- Main Content -->
-        <div class="column" style="flex: 1;">
-          <article class="site-post">
-            <h1 class="site-post-title center">{{ .Title }}</h1>
-
-            <p class="site-post-meta center">
-              {{ with .Params.author }}By {{ . }} · {{ end }}
-              {{ (.Date).Format "01/02/2006" }}
-            </p>
-
-            {{/* Pick screenshot/hero image from multiple possible params:
-                 1) .Params.images[0]
-                 2) .Params.image
-                 3) .Params.screenshot
-            */}}
-            {{ $img := "" }}
-            {{ with .Params.images }}{{ if gt (len .) 0 }}{{ $img = index . 0 }}{{ end }}{{ end }}
-            {{ if and (eq $img "") .Params.image }}{{ $img = .Params.image }}{{ end }}
-            {{ if and (eq $img "") .Params.screenshot }}{{ $img = .Params.screenshot }}{{ end }}
-
-            {{ with $img }}
-              <div class="post-hero">
-                <img src="{{ . | relURL }}" alt="{{ $.Title }}" loading="lazy" />
-              </div>
-            {{ end }}
-
-            {{ if .Params.video }}
-              <div class="video">
-                <iframe
-                  src="https://www.youtube.com/embed/{{ .Params.video }}"
-                  allowfullscreen
-                ></iframe>
-              </div>
-            {{ end }}
-
-            <div id="content" class="mb-10">
-              {{ .Content }}
-            </div>
-          </article>
-        </div>
-
-        <!-- Sidebar TOC -->
-        {{ if gt (len .TableOfContents) 80 }}
-          <aside class="content-panel"
-                 style="flex: 0 0 250px; max-width: 250px; position: sticky; top: 100px; align-self: flex-start;">
-            <div class="pb-3">
-              <strong class="text-xl">Table of Contents</strong>
-            </div>
-            <div id="tableOfContentContainer" style="max-height: calc(100vh - 8rem); overflow-y: auto;">
-              {{ .TableOfContents }}
-            </div>
-          </aside>
-        {{ end }}
-
-      </div>
-    </main>
-  </body>
-</html>
-
diff --git a/layouts/index.html b/layouts/index.html
deleted file mode 100644
index 2aad654..0000000
--- a/layouts/index.html
+++ /dev/null
@@ -1,76 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="UTF-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <link rel="icon" type="image/png" href="/img/favicon.png" />
-    <title>{{ .Site.Title }}</title>
-    <link rel="stylesheet" href="/css/site.css" />
-  </head>
-  <body>
-
-    {{ partial "header.html" . }}
-
-    <main class="container">
-
-      <!-- Hero Section -->
-      <section class="hero-section" style="padding: 2rem 1rem; text-align: center;">
-        <h1 style="font-size: 2.5rem; font-weight: 800; margin-bottom: 1rem;">
-          Creating <span style="color: var(--cyn);">Quick and Painless</span> Linux Tutorials
-        </h1>
-        <p style="font-size: 1.2rem; max-width: 700px; margin: 0 auto 2rem auto;">
-          My name is Tony, and I encourage you all to visit the command line and learn how to maneuver the CLI.
-          Installing Linux distributions, window managers, text editors, and more will help you grow not only as a developer, but as a computer enthusiast.
-        </p>
-        <div style="margin-top: 1.5rem;">
-          <a href="https://www.youtube.com/@tony-btw" target="_blank" class="btn-primary">YouTube Channel</a>
-          <a href="/support/" class="btn-outline" style="margin-left: 1rem; margin-top: 1rem;">Support!</a>
-          <a href="https://www.github.com/tonybanters" class="btn-outline-secondary" style="margin-left: 1rem; margin-top: 1rem;">Github</a>
-        </div>
-      </section>
-
-      <!-- Tutorials Section -->
-      <section style="margin-bottom: 4rem;">
-        <h2 style="font-size: 1.8rem; font-weight: bold; text-align: center; margin-bottom: 1rem;">
-          Recent Tutorials
-        </h2>
-        <p style="text-align: center; margin-bottom: 2rem;">
-          Stay tuned for new videos and writeups!
-        </p>
-
-<div class="recent-tutorials-grid">
-  {{ $recent := first 3 (where site.RegularPages.ByDate.Reverse "Section" "tutorial") }}
-  {{ range $recent }}
-    {{ $page := . }}
-    <div class="tutorial-card">
-      {{ with $page.Params.image }}
-      <a href="{{ $page.RelPermalink }}">
-        <img
-          src="{{ . }}"
-          alt="{{ $page.Title }}"
-          class="tutorial-card-image"
-          loading="lazy"
-        />
-      </a>
-      {{ end }}
-
-      <h4 class="tutorial-card-title">
-        <a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a>
-      </h4>
-      <p class="tutorial-card-date">{{ $page.Date.Format "January 2, 2006" }}</p>
-      <p class="tutorial-card-description">{{ $page.Description }}</p>
-    </div>
-  {{ else }}
-    <p style="text-align: center; color: var(--tokyonight-comment);">No tutorials yet. Coming soon!</p>
-  {{ end }}
-</div>
-
-        <div style="text-align: center; margin-top: 2rem;">
-          <a href="/tutorial/" class="btn-primary">Explore All Tutorials</a>
-        </div>
-      </section>
-
-    </main>
-  </body>
-</html>
-
diff --git a/layouts/partials/header.html b/layouts/partials/header.html
deleted file mode 100644
index ac096c2..0000000
--- a/layouts/partials/header.html
+++ /dev/null
@@ -1,232 +0,0 @@
-<header class="site-header sticky z-30">
-  <div class="site-masthead">
-      <nav class="navbar container">
-        <!-- Logo -->
-        <div class="nav-logo">
-          <a class="navbar-brand" href="/">Tony, btw.</a>
-        </div>
-
-        <!-- Hamburger Toggler -->
-        <button id="nav-toggler" class="nav-toggle" aria-label="Open Mobile Menu">
-          <svg viewBox="0 0 20 20" class="hamburger-icon" fill="currentColor">
-            <path d="M0 3h20v2H0V3z m0 6h20v2H0V9z m0 6h20v2H0V0z"></path>
-          </svg>
-        </button>
-
-        <!-- Desktop Nav -->
-        <ul id="nav-menu" class="nav-menu">
-          <!-- <li class="nav-item"><a class="nav-link" href="/">Home</a></li> -->
-          <li class="nav-item"><a class="nav-link" href="/support/">Support</a></li>
-          <li class="nav-item"><a class="nav-link" href="/tutorial/">Tutorials</a></li>
-          <li class="nav-item"><a class="nav-link" href="/community/">Community</a></li>
-            <div class="nav-right">
-              <a href="https://discord.gg/CXAz6m4sWE" class="discord-desktop-btn" target="_blank" rel="noopener">
-                <!-- 💬 Join Discord -->
-                Join Discord
-              </a>
-            </div>
-        </ul>
-
-      </nav>
-    </div>
-</header>
-
-<!-- Mobile Nav -->
-<div id="mobile-nav-panel" class="mobile-nav hidden">
-  <ul class="mobile-nav-list">
-    <li><a class="mobile-nav-link" href="/">Home</a></li>
-    <li><a class="mobile-nav-link" href="/support/">Support</a></li>
-    <li><a class="mobile-nav-link" href="/tutorial/">Tutorials</a></li>
-    <li><a class="mobile-nav-link" href="/community/">Community</a></li>
-    <li class="mobile-nav-link">
-      <a href="https://discord.gg/CXAz6m4sWE" target="_blank" rel="noopener">Join Discord</a>
-    </li>
-  </ul>
-</div>
-
-<!-- Discord Desktop -->
-
-<style>
-
-.navbar {
-  display: flex;
-  justify-content: space-between;
-  align-items: flex-end; /* <--- this aligns logo + nav to bottom */
-  padding: 1rem 0;
-}
-
-.nav-logo {
-  font-size: 1.75rem;
-  font-weight: bold;
-  margin: 0;
-  padding: 0;
-  line-height: 1;
-}
-
-.navbar-brand {
-  text-decoration: none;
-  color: white;
-}
-
-.nav-menu {
-  display: flex;
-  align-items: flex-end; /* ensure nav links align with logo */
-  gap: 1rem;
-  list-style: none;
-  margin: 0;
-  padding: 0;
-}
-
-.navbar {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-  flex-wrap: wrap;
-}
-
-.nav-logo .navbar-brand {
-  font-size: 1.6rem;
-  font-weight: bold;
-  background: linear-gradient(to right, #7aa2f7, #ad8ee6);
-  -webkit-background-clip: text;
-  -webkit-text-fill-color: transparent;
-  text-decoration: none;
-}
-
-.nav-menu {
-  display: none;
-  flex-direction: row;
-  list-style: none;
-  gap: 2rem;
-  padding-left: 0;
-}
-
-.nav-item {
-  display: inline-block;
-}
-
-.nav-link {
-  text-decoration: none;
-  color: #c0caf5;
-  padding: 0.5rem 1rem;
-}
-
-.nav-link:hover {
-  color: #7aa2f7;
-}
-
-.nav-toggle {
-  display: inline-block;
-  background: none;
-  border: none;
-  cursor: pointer;
-}
-
-.hamburger-icon {
-  width: 24px;
-  height: 24px;
-  color: #c0caf5;
-}
-
-.nav-right {
-  display: flex;
-  align-items: center;
-  gap: 1rem;
-}
-
-.theme-switcher {
-  background: none;
-  border: none;
-  cursor: pointer;
-}
-
-.discord-btn {
-  background-color: #7aa2f7;
-  color: #1a1b26;
-  padding: 0.4rem 0.8rem;
-  border-radius: 4px;
-  text-decoration: none;
-  font-weight: bold;
-  display: inline-flex;
-  align-items: center;
-  gap: 0.5rem;
-}
-
-.discord-btn:hover {
-  background-color: #5e8eff;
-}
-
-/* Mobile nav panel */
-.mobile-nav {
-  background-color: #1a1b26;
-  padding: 1rem;
-}
-
-.mobile-nav-list {
-  list-style: none;
-  padding-left: 0;
-}
-
-.mobile-nav-link {
-  display: block;
-  padding: 0.5rem 0;
-  color: #c0caf5;
-  text-decoration: none;
-  border-bottom: 1px solid #292d3e;
-}
-
-.mobile-nav-link:hover {
-  color: #7aa2f7;
-}
-
-.hidden {
-  display: none !important;
-}
-
-/* Mobile only */
-@media (max-width: 768px) {
-  .nav-logo {
-    padding-left: 1rem; 
-  }
-  .nav-toggle {
-    padding-right: 1rem; 
-  }
-}
-
-/* Show desktop nav at large screens */
-@media screen and (min-width: 1024px) {
-  .nav-menu {
-    display: flex;
-  }
-
-  .nav-toggle {
-    display: none;
-  }
-
-  .mobile-nav {
-    display: none !important;
-  }
-}
-</style>
-
-<script>
-  const navToggler = document.getElementById('nav-toggler');
-  const mobileNav = document.getElementById('mobile-nav-panel');
-  navToggler?.addEventListener('click', () => {
-    mobileNav?.classList.toggle('hidden');
-  });
-
-  const themeSwitcherBtn = document.getElementById('theme-switcher-btn');
-  const applyTheme = (theme) => {
-    document.documentElement.classList.toggle('dark', theme === 'dark');
-  };
-  const toggleTheme = () => {
-    const isDark = document.documentElement.classList.toggle('dark');
-    localStorage.setItem('theme', isDark ? 'dark' : 'light');
-  };
-  const initialTheme = localStorage.getItem('theme') || (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light');
-  applyTheme(initialTheme);
-  document.addEventListener('DOMContentLoaded', () => {
-    themeSwitcherBtn?.addEventListener('click', toggleTheme);
-  });
-</script>
diff --git a/layouts/support.html b/layouts/support.html
deleted file mode 100644
index db1f27a..0000000
--- a/layouts/support.html
+++ /dev/null
@@ -1,52 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <meta name="author" content="Tony, btw." />
-    <link rel="icon" type="image/png" href="/img/favicon.png" />
-    <link rel="stylesheet" href="/css/code.css" />
-    <link rel="stylesheet" href="/css/site.css" />
-    <title>Support Tony</title>
-  </head>
-  <body>
-    {{ partial "header.html" . }}
-
-    <main class="container">
-      <section style="padding: 4rem 1rem; max-width: 960px; margin: 0 auto;">
-        <h1 style="text-align: center; font-size: 2rem; margin-bottom: 1rem;">
-          Support the Channel
-        </h1>
-        <p style="text-align: center; color: #a9b1d6; margin-bottom: 2rem;">
-          If you get value from the videos and tutorials, here are a few ways to contribute and help me keep creating.
-        </p>
-        <div style="
-            display: grid;
-            grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
-            gap: 2rem;
-            justify-content: center;
-            margin: 2rem 0;
-        ">
-          <div style="flex: 1 1 260px; border: 1px solid #7aa2f7; border-radius: 8px; padding: 1rem;">
-            <h3 style="margin-top: 0;">Subscribe on YouTube</h3>
-            <p>Support the channel by subscribing — it's free and helps spread the word. New tutorials frequently.</p>
-            <p><a href="https://www.youtube.com/@tony-btw" target="_blank">Go to YouTube</a></p>
-          </div>
-
-          <div style="flex: 1 1 260px; border: 1px solid #7aa2f7; border-radius: 8px; padding: 1rem;">
-            <h3 style="margin-top: 0;">Donate via PayPal</h3>
-            <p>Help keep the content flowing by donating through Square/PayPal. Every contribution makes a difference.</p>
-            <p><a href="https://square.link/u/tC3glUCo" target="_blank">Donate via Square</a></p>
-          </div>
-
-          <div style="flex: 1 1 260px; border: 1px solid #7aa2f7; border-radius: 8px; padding: 1rem;">
-            <h3 style="margin-top: 0;">Support on Ko-Fi</h3>
-            <p>Prefer Ko-Fi? You can buy me a coffee and support future videos directly. Thanks for your kindness.</p>
-            <p><a href="https://ko-fi.com/tonybtw" target="_blank">Go to Ko-Fi</a></p>
-          </div>
-        </div>
-      </section>
-
-    </main>
-  </body>
-</html>
diff --git a/layouts/tutorial/list.html b/layouts/tutorial/list.html
deleted file mode 100644
index 767120b..0000000
--- a/layouts/tutorial/list.html
+++ /dev/null
@@ -1,46 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-  <meta charset="UTF-8" />
-  <link rel="icon" type="image/png" href="/img/favicon.png" />
-  <meta name="viewport" content="width=device-width, initial-scale=1" />
-  <title>{{ .Title }}</title>
-  <link rel="stylesheet" href="/css/site.css" />
-</head>
-<body>
-
-  {{ partial "header.html" . }}
-<main class="container">
-  <h1 class="site-post-title center" style="margin-bottom: 2rem;">Tutorials</h1>
-
-<div class="tutorial-grid">
-  {{ $paginator := .Paginate .Pages }}
-  {{ range $page := $paginator.Pages }}
-  <div class="tutorial-card">
-    {{ with $page.Params.image }}
-    <a href="{{ $page.RelPermalink }}">
-      <img
-        src="{{ . }}"
-        alt="{{ $page.Title }}"
-        class="tutorial-card-image"
-        loading="lazy"
-      />
-    </a>
-    {{ end }}
-    <h4 class="tutorial-card-title">
-      <a href="{{ $page.RelPermalink }}">{{ $page.Title }}</a>
-    </h4>
-    <p class="tutorial-card-date">{{ $page.Date.Format "January 2, 2006" }}</p>
-    <p class="tutorial-card-description">{{ $page.Description }}</p>
-  </div>
-  {{ end }}
-</div>
-
-  {{ if gt $paginator.TotalPages 1 }}
-  <div style="margin-top: 2rem; text-align: center;">
-    {{ template "_internal/pagination.html" . }}
-  </div>
-  {{ end }}
-</main>
-</body>
-</html>
diff --git a/layouts/tutorial/single.html b/layouts/tutorial/single.html
deleted file mode 100644
index 1d65e4d..0000000
--- a/layouts/tutorial/single.html
+++ /dev/null
@@ -1,62 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-  <head>
-    <meta charset="utf-8" />
-    <meta name="viewport" content="width=device-width, initial-scale=1" />
-    <meta name="author" content="Tony, btw." />
-    <link rel="icon" type="image/png" href="/img/favicon.png" />
-    <!-- <link rel="stylesheet" href="/css/code.css" /> -->
-    <link rel="stylesheet" href="/css/site.css" />
-    <title>{{ .Title }}</title>
-  </head>
-  <body>
-
-    {{ partial "header.html" . }}
-
-    <main class="container">
-      <div class="row" style="display: flex; align-items: flex-start; gap: 2rem;">
-
-        <!-- Main Content -->
-        <div class="column" style="flex: 1;">
-          <article class="site-post">
-            <h1 class="site-post-title center">{{ .Title }}</h1>
-            {{ with .Params.date }}
-              <p class="site-post-meta center">{{ time.Format "01/02/2006" . }}</p>
-            {{ end }}
-
-
-            {{ with .Params.image }}
-              <div class="post-hero">
-                <img src="{{ . | relURL }}" alt="{{ $.Title }}" loading="lazy" />
-              </div>
-            {{ end }}
-
-            {{ if .Params.video }}
-            <div class="video">
-              <iframe src="https://www.youtube.com/embed/{{ .Params.video }}" allowfullscreen></iframe>
-            </div>
-            {{ end }}
-
-            <div id="content" class="mb-10">
-              {{ .Content }}
-            </div>
-          </article>
-        </div>
-
-        <!-- Sidebar TOC -->
-        {{ if gt (len .TableOfContents) 80 }}
-        <aside class="content-panel" style="flex: 0 0 250px; max-width: 250px; position: sticky; top: 100px; align-self: flex-start;">
-          <div class="pb-3">
-            <strong class="text-xl">Table of Contents</strong>
-          </div>
-          <div id="tableOfContentContainer" style="max-height: calc(100vh - 8rem); overflow-y: auto;">
-            {{ .TableOfContents }}
-          </div>
-        </aside>
-        {{ end }}
-
-      </div>
-    </main>
-  </body>
-</html>
-
diff --git a/readme.org b/readme.org
index 020a9a9..44d8b26 100644
--- a/readme.org
+++ b/readme.org
@@ -1,112 +1,55 @@
 #+TITLE: tonybtw.com
 
 * About
-This is the source for [[https://tonybtw.com][tonybtw.com]], a Hugo-based static site.  
-The repository includes a =flake.nix= so you can get a reproducible Hugo environment with Nix.
-* Contributing
-There is a =/community/= section where people can share Linux tutorials, tips, or rices.
-
-1. Copy =example.md= from =content/community/= and rename it to your own article, e.g. =my-guide.md=.
-2. Edit the front matter and body to fit your content. Keep the same structure for consistency.
-   - Minimal front matter example:
-     #+BEGIN_SRC yaml
-     ---
-     title: "My Cool Setup"
-     author: "Your Name"
-     date: 2025-09-15
-     description: "A short blurb about your contribution."
-     image: "/img/community/your-name/screenshot.png"
-     ---
-     #+END_SRC
-3. Place any screenshots in your own folder under =static/img/community/<your-name>=.
-   - Example: =static/img/community/alice/my-screenshot.png=
-   - In your Markdown, reference them as =/img/community/alice/my-screenshot.png=.
-4. Submit a pull request with your Markdown file and images.
-
-This way, everyone’s contributions stay organized and easy to render.
+Source for [[https://tonybtw.com][tonybtw.com]], a static site built from Markdown with a
+=Makefile= and [[https://pandoc.org][pandoc]]. No Hugo, no framework, no npm. The look matches
+[[https://forums.tonybtw.com][forums.tonybtw.com]]: Tokyo Night colours, Iosevka, and the vim-style modeline
+along the bottom.
+
+* Layout
+- =content/= — Markdown sources (the source of truth).
+  =tutorial/<slug>/index.md= and =community/<slug>/index.md=.
+- =template.html= — the one pandoc HTML template (nav + article + modeline).
+- =gen.sh= — builds the derived pages (home, section lists, tag pages, support)
+  from front matter, through the same template.
+- =assets/= — =css/site.css=, =fonts/= (subset Iosevka woff2), =img/=, =.well-known/=.
+- =Makefile= — =content/**/*.md= -> =public/**/*.html= via pandoc, then =gen.sh=,
+  then copies =assets/=.
+- =public/= — build output (git-ignored).
 
 * Requirements
-- [[https://nixos.org/download.html][Nix]] installed  
-- Flakes enabled (=nix-command flakes=)
+- [[https://nixos.org/download.html][Nix]] with flakes enabled. The dev shell provides pandoc, make, python3.
 
 * Usage
-Clone the repo and enter the development shell:
-
-#+BEGIN_SRC sh
-git clone https://github.com/tonybanters/tonybtw.com
-cd tonybtw.com
+#+begin_src sh
 nix develop
-#+END_SRC
-
-Inside the shell, run Hugo:
-
-#+BEGIN_SRC sh
-hugo serve
-#+END_SRC
-
-This starts the development server at http://localhost:1313.
-
-* Alternate dev shell
-If you prefer =nix= to start the server automatically:
-
-#+BEGIN_SRC sh
-nix develop .#serve
-#+END_SRC
-
-This launches =hugo serve= right away.
-
-* Building for production
-To generate the static site in =public/=:
-
-#+BEGIN_SRC sh
-nix develop --command hugo
-#+END_SRC
-
-* Installing Nix and enabling flakes
-** NixOS
-1. On NixOS, Nix is already installed.  
-2. Enable flakes system-wide by adding to =/etc/nixos/configuration.nix= (or wherever your configuarion.nix is defined):  
-   #+BEGIN_EXAMPLE
-   experimental-features = nix-command flakes
-   #+END_EXAMPLE
-3. Rebuild your system if you use flakes for your config, or just restart shells for it to take effect.
-
-** Arch Linux
-1. Install Nix from the official repos:
-   #+BEGIN_SRC sh
-   sudo pacman -S nix
-   #+END_SRC
-2. Enable the Nix daemon:
-   #+BEGIN_SRC sh
-   sudo systemctl enable --now nix-daemon.service
-   #+END_SRC
-3. Add flake support to =~/.config/nix/nix.conf=:
-   #+BEGIN_EXAMPLE
-   experimental-features = nix-command flakes
-   #+END_EXAMPLE
-
-** Gentoo
-1. Enable the overlay and emerge Nix:
-   #+BEGIN_SRC sh
-   sudo emerge --ask app-misc/nix
-   #+END_SRC
-2. Enable the Nix daemon:
-   #+BEGIN_SRC sh
-   sudo rc-update add nix-daemon default
-   sudo rc-service nix-daemon start
-   #+END_SRC
-3. Add flake support to =~/.config/nix/nix.conf=:
-   #+BEGIN_EXAMPLE
-   experimental-features = nix-command flakes
-   #+END_EXAMPLE
-
-** macOS
-1. Install Nix using the official script (don’t use Homebrew):
-   #+BEGIN_SRC sh
-   curl -L https://nixos.org/nix/install | sh
-   #+END_SRC
-2. Enable flakes by editing =~/.config/nix/nix.conf= and adding:
-   #+BEGIN_EXAMPLE
-   experimental-features = nix-command flakes
-   #+END_EXAMPLE
-
+make            # builds ./public
+make serve      # builds, then serves ./public at http://localhost:1313
+#+end_src
+
+Reproducible build without a dev shell:
+#+begin_src sh
+nix build       # result -> ./result
+#+end_src
+
+* Writing a tutorial
+Create =content/tutorial/<slug>/index.md= with YAML front matter, then the body:
+#+begin_src yaml
+---
+title: "My Tutorial"
+date: 2026-01-01
+description: "One-line blurb used on cards and meta tags."
+image: "/img/my-tutorial.png"
+video: "https://www.youtube.com/watch?v=XXXXXXXXXXX"   # optional video hero
+---
+#+end_src
+The heading structure (=##=, =###=) becomes the sidebar table of contents. Put
+the card thumbnail (16:9) in =assets/img/=.
+
+* Contributing (community)
+1. Copy an existing post to =content/community/<your-slug>/index.md=.
+2. Front matter: =title=, =date=, =author=, and =tags: ["a", "b"]=
+   (tags become =/tags/= pages).
+3. Put screenshots under =assets/img/community/<your-name>/= and reference them
+   in the body as =![alt](/img/community/you/shot.png)=.
+4. Submit a pull request with your =index.md= and images.
diff --git a/static/css/code.css b/static/css/code.css
deleted file mode 100644
index 6938300..0000000
--- a/static/css/code.css
+++ /dev/null
@@ -1,1057 +0,0 @@
-body {
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-ansi-color-black {
-  /* ansi-color-black */
-  color: #292d3e;
-  background-color: #292d3e;
-}
-.org-ansi-color-blue {
-  /* ansi-color-blue */
-  color: #82aaff;
-  background-color: #82aaff;
-}
-.org-ansi-color-bright-black {
-  /* ansi-color-bright-black */
-  color: #1c1f2b;
-  background-color: #232635;
-}
-.org-ansi-color-bright-blue {
-  /* ansi-color-bright-blue */
-  color: #94b6ff;
-  background-color: #94b6ff;
-}
-.org-ansi-color-bright-cyan {
-  /* ansi-color-bright-cyan */
-  color: #9ae2ff;
-  background-color: #9ae2ff;
-}
-.org-ansi-color-bright-green {
-  /* ansi-color-bright-green */
-  color: #cbeb9e;
-  background-color: #cbeb9e;
-}
-.org-ansi-color-bright-magenta {
-  /* ansi-color-bright-magenta */
-  color: #cfa2ed;
-  background-color: #cfa2ed;
-}
-.org-ansi-color-bright-red {
-  /* ansi-color-bright-red */
-  color: #ff6c85;
-  background-color: #ff6c85;
-}
-.org-ansi-color-bright-white {
-  /* ansi-color-bright-white */
-  color: #a6accd;
-  background-color: #a6accd;
-}
-.org-ansi-color-bright-yellow {
-  /* ansi-color-bright-yellow */
-  color: #ffd281;
-  background-color: #ffd281;
-}
-.org-ansi-color-cyan {
-  /* ansi-color-cyan */
-  color: #89ddff;
-  background-color: #89ddff;
-}
-.org-ansi-color-faint {
-}
-.org-ansi-color-fast-blink {
-}
-.org-ansi-color-green {
-  /* ansi-color-green */
-  color: #c3e88d;
-  background-color: #c3e88d;
-}
-.org-ansi-color-inverse {
-}
-.org-ansi-color-magenta {
-  /* ansi-color-magenta */
-  color: #c792ea;
-  background-color: #c792ea;
-}
-.org-ansi-color-red {
-  /* ansi-color-red */
-  color: #ff5370;
-  background-color: #ff5370;
-}
-.org-ansi-color-slow-blink {
-}
-.org-ansi-color-white {
-  /* ansi-color-white */
-  color: #eeffff;
-  background-color: #eeffff;
-}
-.org-ansi-color-yellow {
-  /* ansi-color-yellow */
-  color: #ffcb6b;
-  background-color: #ffcb6b;
-}
-.org-bold {
-  /* bold */
-  font-weight: bold;
-}
-.org-border {
-}
-.org-buffer-menu-buffer {
-  /* buffer-menu-buffer */
-  font-weight: bold;
-}
-.org-builtin {
-  /* font-lock-builtin-face */
-  color: #82aaff;
-}
-.org-button {
-  /* button */
-  color: #c792ea;
-  font-weight: bold;
-  text-decoration: underline;
-}
-.org-calendar-month-header {
-  /* calendar-month-header */
-  color: #82aaff;
-}
-.org-calendar-today {
-  /* calendar-today */
-  text-decoration: underline;
-}
-.org-calendar-weekday-header {
-  /* calendar-weekday-header */
-  color: #f78c6c;
-}
-.org-calendar-weekend-header {
-  /* calendar-weekend-header */
-  color: #676e95;
-}
-.org-center {
-    margin: auto;
-    width: 50%;
-    text-align: center;
-}
-.org-child-frame-border {
-}
-.org-comint-highlight-input {
-  /* comint-highlight-input */
-  font-weight: bold;
-}
-.org-comint-highlight-prompt {
-  /* comint-highlight-prompt */
-  color: #c792ea;
-}
-.org-comment {
-  /* font-lock-comment-face */
-  color: #676e95;
-}
-.org-comment-delimiter {
-  /* font-lock-comment-delimiter-face */
-  color: #676e95;
-}
-.org-completions-common-part {
-  /* completions-common-part */
-  color: #add8e6;
-}
-.org-completions-first-difference {
-  /* completions-first-difference */
-  font-weight: bold;
-}
-.org-completions-group-separator {
-  /* completions-group-separator */
-  color: #676e95;
-  text-decoration: line-through;
-}
-.org-completions-group-title {
-  /* completions-group-title */
-  color: #676e95;
-  font-style: italic;
-}
-.org-constant {
-  /* font-lock-constant-face */
-  color: #f78c6c;
-}
-.org-cursor {
-  /* cursor */
-  background-color: #c792ea;
-}
-.org-diary {
-  /* diary */
-  color: #ffff00;
-}
-.org-doc {
-  /* font-lock-doc-face */
-  color: #8d92af;
-}
-.org-doc-markup {
-  /* font-lock-doc-markup-face */
-  color: #f78c6c;
-}
-.org-eldoc-highlight-function-argument {
-  /* eldoc-highlight-function-argument */
-  font-weight: bold;
-}
-.org-elisp-shorthand-font-lock {
-  /* elisp-shorthand-font-lock-face */
-  color: #00ffff;
-}
-.org-error {
-  /* error */
-  color: #ff5370;
-}
-.org-escape-glyph {
-  /* escape-glyph */
-  color: #89ddff;
-}
-.org-file-name-shadow {
-  /* file-name-shadow */
-  color: #676e95;
-}
-.org-fill-column-indicator {
-  /* fill-column-indicator */
-  color: #676e95;
-}
-.org-fixed-pitch {
-}
-.org-fixed-pitch-serif {
-}
-.org-fringe {
-  /* fringe */
-  color: #4e5579;
-  background-color: #292d3e;
-}
-.org-function-name {
-  /* font-lock-function-name-face */
-  color: #82aaff;
-}
-.org-glyphless-char {
-  /* glyphless-char */
-  font-size: 60%;
-}
-.org-header-line {
-  /* header-line */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-header-line-highlight {
-  /* header-line-highlight */
-  color: #1c1f2b;
-  background-color: #c792ea;
-}
-.org-help-argument-name {
-  /* help-argument-name */
-  font-style: italic;
-}
-.org-help-for-help-header {
-  /* help-for-help-header */
-  font-size: 126%;
-}
-.org-help-key-binding {
-  /* help-key-binding */
-  color: #add8e6;
-  background-color: #303030;
-}
-.org-highlight {
-  /* highlight */
-  color: #1c1f2b;
-  background-color: #c792ea;
-}
-.org-holiday {
-  /* holiday */
-  background-color: #8b4513;
-}
-.org-homoglyph {
-  /* homoglyph */
-  color: #00ffff;
-}
-.org-internal-border {
-}
-.org-isearch {
-  /* isearch */
-  color: #eeffff;
-  background-color: #4e5579;
-  font-weight: bold;
-}
-.org-isearch-fail {
-  /* isearch-fail */
-  color: #1c1f2b;
-  background-color: #ff5370;
-  font-weight: bold;
-}
-.org-isearch-group-1 {
-  /* isearch-group-1 */
-  color: #8b2323;
-  background-color: #ff82ab;
-}
-.org-isearch-group-2 {
-  /* isearch-group-2 */
-  color: #8b2323;
-  background-color: #cd6889;
-}
-.org-italic {
-  /* italic */
-  font-style: italic;
-}
-.org-keyword {
-  /* font-lock-keyword-face */
-  color: #89ddff;
-}
-.org-lazy-highlight {
-  /* lazy-highlight */
-  color: #eeffff;
-  background-color: #4e5579;
-  font-weight: bold;
-}
-.org-line-number {
-  /* line-number */
-  color: #676e95;
-  background-color: #292d3e;
-}
-.org-line-number-major-tick {
-  /* line-number-major-tick */
-  background-color: #bfbfbf;
-  font-weight: bold;
-}
-.org-line-number-minor-tick {
-  /* line-number-minor-tick */
-  background-color: #8c8c8c;
-  font-weight: bold;
-}
-.org-link {
-  /* link */
-  color: #c792ea;
-  font-weight: bold;
-  text-decoration: underline;
-}
-.org-link-visited {
-  /* link-visited */
-  color: #ee82ee;
-  font-weight: bold;
-  text-decoration: underline;
-}
-.org-match {
-  /* match */
-  color: #c3e88d;
-  background-color: #1c1f2b;
-  font-weight: bold;
-}
-.org-menu {
-}
-.org-minibuffer-prompt {
-  /* minibuffer-prompt */
-  color: #c792ea;
-}
-.org-mode-line {
-  /* mode-line */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-mode-line-buffer-id {
-  /* mode-line-buffer-id */
-  font-weight: bold;
-}
-.org-mode-line-emphasis {
-  /* mode-line-emphasis */
-  color: #c792ea;
-}
-.org-mode-line-highlight {
-  /* mode-line-highlight */
-  color: #1c1f2b;
-  background-color: #c792ea;
-}
-.org-mode-line-inactive {
-  /* mode-line-inactive */
-  color: #676e95;
-  background-color: #282c3d;
-}
-.org-mouse {
-}
-.org-mouse-drag-and-drop-region {
-  /* mouse-drag-and-drop-region */
-  background-color: #3c435e;
-}
-.org-negation-char {
-  /* font-lock-negation-char-face */
-  color: #89ddff;
-  font-weight: bold;
-}
-.org-next-error {
-  /* next-error */
-  background-color: #3c435e;
-}
-.org-next-error-message {
-  /* next-error-message */
-  color: #1c1f2b;
-  background-color: #c792ea;
-}
-.org-nobreak-hyphen {
-  /* nobreak-hyphen */
-  color: #00ffff;
-}
-.org-nobreak-space {
-  /* nobreak-space */
-  color: #89ddff;
-  text-decoration: underline;
-}
-.org-org-agenda-calendar-event {
-  /* org-agenda-calendar-event */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-org-agenda-calendar-sexp {
-  /* org-agenda-calendar-sexp */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-org-agenda-clocking {
-  /* org-agenda-clocking */
-  background-color: #3a4664;
-}
-.org-org-agenda-column-dateline {
-  /* org-agenda-column-dateline */
-  background-color: #4d4d4d;
-}
-.org-org-agenda-current-time {
-  /* org-agenda-current-time */
-  color: #676e95;
-}
-.org-org-agenda-date {
-  /* org-agenda-date */
-  color: #bb80b3;
-}
-.org-org-agenda-date-today {
-  /* org-agenda-date-today */
-  color: #d6b2d1;
-}
-.org-org-agenda-date-weekend {
-  /* org-agenda-date-weekend */
-  color: #704c6b;
-}
-.org-org-agenda-date-weekend-today {
-  /* org-agenda-date-weekend-today */
-  color: #d6b2d1;
-}
-.org-org-agenda-diary {
-  /* org-agenda-diary */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-org-agenda-dimmed-todo {
-  /* org-agenda-dimmed-todo-face */
-  color: #676e95;
-}
-.org-org-agenda-done {
-  /* org-agenda-done */
-  color: #676e95;
-  font-weight: bold;
-}
-.org-org-agenda-filter-category {
-  /* org-agenda-filter-category */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-org-agenda-filter-effort {
-  /* org-agenda-filter-effort */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-org-agenda-filter-regexp {
-  /* org-agenda-filter-regexp */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-org-agenda-filter-tags {
-  /* org-agenda-filter-tags */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-org-agenda-restriction-lock {
-  /* org-agenda-restriction-lock */
-  background-color: #1c1c1c;
-}
-.org-org-agenda-structure {
-  /* org-agenda-structure */
-  color: #eeffff;
-}
-.org-org-agenda-structure-secondary {
-  /* org-agenda-structure-secondary */
-  color: #eeffff;
-}
-.org-org-archived {
-  /* org-archived */
-  color: #8d92af;
-}
-.org-org-block {
-  /* org-block */
-  background-color: #232635;
-}
-.org-org-block-begin-line {
-  /* org-block-begin-line */
-  color: #676e95;
-  background-color: #232635;
-}
-.org-org-block-end-line {
-  /* org-block-end-line */
-  color: #676e95;
-  background-color: #232635;
-}
-.org-org-checkbox {
-  /* org-checkbox */
-  color: #c3e88d;
-  font-weight: bold;
-}
-.org-org-checkbox-statistics-done {
-  /* org-checkbox-statistics-done */
-  color: #676e95;
-  font-weight: bold;
-}
-.org-org-checkbox-statistics-todo {
-  /* org-checkbox-statistics-todo */
-  color: #c3e88d;
-  font-weight: bold;
-}
-.org-org-cite {
-  /* org-cite */
-  color: #55c0b8;
-}
-.org-org-cite-key {
-  /* org-cite-key */
-  color: #88d4d0;
-  text-decoration: underline;
-}
-.org-org-clock-overlay {
-  /* org-clock-overlay */
-  color: #ffffff;
-  background-color: #4a708b;
-}
-.org-org-code {
-  /* org-code */
-  color: #f78c6c;
-  background-color: #232635;
-}
-.org-org-column {
-  /* org-column */
-  background-color: #4d4d4d;
-}
-.org-org-column-title {
-  /* org-column-title */
-  background-color: #4d4d4d;
-  font-weight: bold;
-  text-decoration: underline;
-}
-.org-org-date {
-  /* org-date */
-  color: #ffcb6b;
-}
-.org-org-date-selected {
-  /* org-date-selected */
-  color: #ffc0cb;
-}
-.org-org-default {
-}
-.org-org-dispatcher-highlight {
-  /* org-dispatcher-highlight */
-  color: #ffd700;
-  background-color: #333333;
-  font-weight: bold;
-}
-.org-org-document-info {
-  /* org-document-info */
-  color: #82aaff;
-}
-.org-org-document-info-keyword {
-  /* org-document-info-keyword */
-  color: #676e95;
-}
-.org-org-document-title {
-  /* org-document-title */
-  color: #82aaff;
-  font-weight: bold;
-}
-.org-org-done {
-  /* org-done */
-  color: #676e95;
-  font-weight: bold;
-}
-.org-org-drawer {
-  /* org-drawer */
-  color: #676e95;
-}
-.org-org-ellipsis {
-  /* org-ellipsis */
-  color: #676e95;
-}
-.org-org-footnote {
-  /* org-footnote */
-  color: #f78c6c;
-}
-.org-org-formula {
-  /* org-formula */
-  color: #89ddff;
-}
-.org-org-headline-done {
-  /* org-headline-done */
-  color: #676e95;
-}
-.org-org-headline-todo {
-  /* org-headline-todo */
-  color: #eea9b8;
-}
-.org-org-hide {
-  /* org-hide */
-  color: #292d3e;
-}
-.org-org-imminent-deadline {
-  /* org-imminent-deadline */
-  color: #ffcb6b;
-}
-.org-org-inline-src-block {
-  /* org-inline-src-block */
-  background-color: #232635;
-}
-.org-org-latex-and-related {
-  /* org-latex-and-related */
-  color: #a6accd;
-  font-weight: bold;
-}
-.org-org-level-1 {
-  /* org-level-1 */
-  color: #82aaff;
-  font-weight: bold;
-}
-.org-org-level-2 {
-  /* org-level-2 */
-  color: #c792ea;
-  font-weight: bold;
-}
-.org-org-level-3 {
-  /* org-level-3 */
-  color: #bb80b3;
-  font-weight: bold;
-}
-.org-org-level-4 {
-  /* org-level-4 */
-  color: #a1bfff;
-  font-weight: bold;
-}
-.org-org-level-5 {
-  /* org-level-5 */
-  color: #d5adef;
-  font-weight: bold;
-}
-.org-org-level-6 {
-  /* org-level-6 */
-  color: #c0d4ff;
-  font-weight: bold;
-}
-.org-org-level-7 {
-  /* org-level-7 */
-  color: #e3c8f4;
-  font-weight: bold;
-}
-.org-org-level-8 {
-  /* org-level-8 */
-  color: #e6eeff;
-  font-weight: bold;
-}
-.org-org-link {
-  /* org-link */
-  color: #c792ea;
-  font-weight: bold;
-  text-decoration: underline;
-}
-.org-org-list-dt {
-  /* org-list-dt */
-  color: #c792ea;
-}
-.org-org-macro {
-  /* org-macro */
-  color: #a6accd;
-  font-weight: bold;
-}
-.org-org-meta-line {
-  /* org-meta-line */
-  color: #8d92af;
-}
-.org-org-mode-line-clock {
-  /* org-mode-line-clock */
-  color: #a6accd;
-  background-color: #232635;
-}
-.org-org-mode-line-clock-overrun {
-  /* org-mode-line-clock-overrun */
-  color: #a6accd;
-  background-color: #ff0000;
-}
-.org-org-priority {
-  /* org-priority */
-  color: #ff5370;
-}
-.org-org-property-value {
-  /* org-property-value */
-  color: #8d92af;
-}
-.org-org-quote {
-  /* org-quote */
-  background-color: #232635;
-  font-style: italic;
-}
-.org-org-scheduled {
-  /* org-scheduled */
-  color: #eeffff;
-}
-.org-org-scheduled-previously {
-  /* org-scheduled-previously */
-  color: #a6accd;
-}
-.org-org-scheduled-today {
-  /* org-scheduled-today */
-  color: #717cb4;
-}
-.org-org-sexp-date {
-  /* org-sexp-date */
-  color: #eeffff;
-}
-.org-org-special-keyword {
-  /* org-special-keyword */
-  color: #8d92af;
-}
-.org-org-table {
-  /* org-table */
-  color: #bb80b3;
-}
-.org-org-table-header {
-  /* org-table-header */
-  color: #000000;
-  background-color: #d3d3d3;
-}
-.org-org-tag {
-  /* org-tag */
-  color: #8d92af;
-}
-.org-org-tag-group {
-  /* org-tag-group */
-  color: #8d92af;
-}
-.org-org-target {
-  /* org-target */
-  text-decoration: underline;
-}
-.org-org-time-grid {
-  /* org-time-grid */
-  color: #676e95;
-}
-.org-org-todo {
-  /* org-todo */
-  color: #c3e88d;
-  font-weight: bold;
-}
-.org-org-upcoming-deadline {
-  /* org-upcoming-deadline */
-  color: #c6d5d8;
-}
-.org-org-upcoming-distant-deadline {
-  /* org-upcoming-distant-deadline */
-  color: #8b969e;
-}
-.org-org-verbatim {
-  /* org-verbatim */
-  color: #c3e88d;
-}
-.org-org-verse {
-  /* org-verse */
-  background-color: #232635;
-}
-.org-org-warning {
-  /* org-warning */
-  color: #ffcb6b;
-}
-.org-outline-1 {
-  /* outline-1 */
-  color: #82aaff;
-  font-weight: bold;
-}
-.org-outline-2 {
-  /* outline-2 */
-  color: #c792ea;
-  font-weight: bold;
-}
-.org-outline-3 {
-  /* outline-3 */
-  color: #bb80b3;
-  font-weight: bold;
-}
-.org-outline-4 {
-  /* outline-4 */
-  color: #a1bfff;
-  font-weight: bold;
-}
-.org-outline-5 {
-  /* outline-5 */
-  color: #d5adef;
-  font-weight: bold;
-}
-.org-outline-6 {
-  /* outline-6 */
-  color: #c0d4ff;
-  font-weight: bold;
-}
-.org-outline-7 {
-  /* outline-7 */
-  color: #e3c8f4;
-  font-weight: bold;
-}
-.org-outline-8 {
-  /* outline-8 */
-  color: #e6eeff;
-  font-weight: bold;
-}
-.org-preprocessor {
-  /* font-lock-preprocessor-face */
-  color: #89ddff;
-  font-weight: bold;
-}
-.org-query-replace {
-  /* query-replace */
-  color: #eeffff;
-  background-color: #4e5579;
-  font-weight: bold;
-}
-.org-read-multiple-choice {
-  /* read-multiple-choice-face */
-  font-weight: bold;
-  text-decoration: underline;
-}
-.org-regexp-grouping-backslash {
-  /* font-lock-regexp-grouping-backslash */
-  color: #89ddff;
-  font-weight: bold;
-}
-.org-regexp-grouping-construct {
-  /* font-lock-regexp-grouping-construct */
-  color: #89ddff;
-  font-weight: bold;
-}
-.org-region {
-  /* region */
-  background-color: #3c435e;
-}
-.org-scroll-bar {
-  /* scroll-bar */
-  color: #ffffff;
-}
-.org-secondary-selection {
-  /* secondary-selection */
-  background-color: #676e95;
-}
-.org-separator-line {
-  /* separator-line */
-  background-color: #505050;
-  font-size: 10%;
-}
-.org-shadow {
-  /* shadow */
-  color: #676e95;
-}
-.org-show-paren-match {
-  /* show-paren-match */
-  color: #ff5370;
-  background-color: #1c1f2b;
-}
-.org-show-paren-match-expression {
-  /* show-paren-match-expression */
-  color: #ff5370;
-  background-color: #1c1f2b;
-}
-.org-show-paren-mismatch {
-  /* show-paren-mismatch */
-  color: #1c1f2b;
-  background-color: #ff5370;
-}
-.org-string {
-  /* font-lock-string-face */
-  color: #c3e88d;
-}
-.org-success {
-  /* success */
-  color: #c3e88d;
-}
-.org-tab-bar {
-  /* tab-bar */
-  color: #242837;
-  background-color: #242837;
-}
-.org-tab-bar-tab {
-  /* tab-bar-tab */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-tab-bar-tab-group-current {
-  /* tab-bar-tab-group-current */
-  color: #eeffff;
-  background-color: #292d3e;
-  font-weight: bold;
-}
-.org-tab-bar-tab-inactive {
-  /* tab-bar-tab-inactive */
-  color: #bfc7d5;
-  background-color: #242837;
-}
-.org-tab-line {
-  /* tab-line */
-  color: #242837;
-  background-color: #242837;
-}
-.org-tab-line-close-highlight {
-  /* tab-line-close-highlight */
-  color: #c792ea;
-}
-.org-tab-line-highlight {
-  /* tab-line-highlight */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-tab-line-tab {
-  /* tab-line-tab */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-tab-line-tab-current {
-  /* tab-line-tab-current */
-  color: #eeffff;
-  background-color: #292d3e;
-}
-.org-tab-line-tab-group {
-  /* tab-line-tab-group */
-  color: #242837;
-  background-color: #242837;
-}
-.org-tab-line-tab-inactive {
-  /* tab-line-tab-inactive */
-  color: #bfc7d5;
-  background-color: #242837;
-}
-.org-tab-line-tab-inactive-alternate {
-  /* tab-line-tab-inactive-alternate */
-  color: #bfc7d5;
-  background-color: #242837;
-}
-.org-tab-line-tab-modified {
-  /* tab-line-tab-modified */
-  color: #8d92af;
-}
-.org-tab-line-tab-special {
-  /* tab-line-tab-special */
-  font-style: italic;
-}
-.org-table-cell {
-  /* table-cell */
-  color: #e5e5e5;
-  background-color: #0000ff;
-}
-.org-tabulated-list-fake-header {
-  /* tabulated-list-fake-header */
-  font-weight: bold;
-  text-decoration: underline;
-  text-decoration: overline;
-}
-.org-tool-bar {
-  /* tool-bar */
-  color: #000000;
-  background-color: #bfbfbf;
-}
-.org-tooltip {
-  /* tooltip */
-  color: #eeffff;
-  background-color: #1c202c;
-}
-.org-trailing-whitespace {
-  /* trailing-whitespace */
-  background-color: #ff5370;
-}
-.org-tty-menu-disabled {
-  /* tty-menu-disabled-face */
-  color: #d3d3d3;
-  background-color: #0000ff;
-}
-.org-tty-menu-enabled {
-  /* tty-menu-enabled-face */
-  color: #ffff00;
-  background-color: #0000ff;
-  font-weight: bold;
-}
-.org-tty-menu-selected {
-  /* tty-menu-selected-face */
-  background-color: #ff0000;
-}
-.org-type {
-  /* font-lock-type-face */
-  color: #c792ea;
-}
-.org-underline {
-  /* underline */
-  text-decoration: underline;
-}
-.org-variable-name {
-  /* font-lock-variable-name-face */
-  color: #ffcb6b;
-}
-.org-variable-pitch {
-}
-.org-vc-conflict-state {
-}
-.org-vc-edited-state {
-}
-.org-vc-locally-added-state {
-}
-.org-vc-locked-state {
-}
-.org-vc-missing-state {
-}
-.org-vc-needs-update-state {
-}
-.org-vc-removed-state {
-}
-.org-vc-state-base {
-}
-.org-vc-up-to-date-state {
-}
-.org-vertical-border {
-  /* vertical-border */
-  color: #232635;
-  background-color: #232635;
-}
-.org-warning {
-  /* warning */
-  color: #ffcb6b;
-}
-.org-warning-1 {
-  /* font-lock-warning-face */
-  color: #ffcb6b;
-}
-.org-window-divider {
-  /* window-divider */
-  color: #232635;
-  background-color: #232635;
-}
-.org-window-divider-first-pixel {
-  /* window-divider-first-pixel */
-  color: #232635;
-  background-color: #232635;
-}
-.org-window-divider-last-pixel {
-  /* window-divider-last-pixel */
-  color: #232635;
-  background-color: #232635;
-}
-
-a {
-  color: inherit;
-  background-color: inherit;
-  font: inherit;
-  text-decoration: inherit;
-}
-a:hover {
-  text-decoration: underline;
-}
-
diff --git a/static/fonts/JetBrainsMonoNerdFont-Regular.ttf b/static/fonts/JetBrainsMonoNerdFont-Regular.ttf
deleted file mode 100644
index 235a07a..0000000
Binary files a/static/fonts/JetBrainsMonoNerdFont-Regular.ttf and /dev/null differ
diff --git a/static/fonts/Jost-500-Medium.ttf b/static/fonts/Jost-500-Medium.ttf
deleted file mode 100644
index d9d548f..0000000
Binary files a/static/fonts/Jost-500-Medium.ttf and /dev/null differ
diff --git a/static/img/castle-bg.png b/static/img/castle-bg.png
deleted file mode 100644
index db1fbbf..0000000
Binary files a/static/img/castle-bg.png and /dev/null differ
diff --git a/static/img/community/argos/gif1.gif b/static/img/community/argos/gif1.gif
deleted file mode 100644
index f819fa1..0000000
Binary files a/static/img/community/argos/gif1.gif and /dev/null differ
diff --git a/static/img/community/argos/gif2.gif b/static/img/community/argos/gif2.gif
deleted file mode 100644
index 6c8057d..0000000
Binary files a/static/img/community/argos/gif2.gif and /dev/null differ
diff --git a/static/img/community/argos/gif3.gif b/static/img/community/argos/gif3.gif
deleted file mode 100644
index 47418f6..0000000
Binary files a/static/img/community/argos/gif3.gif and /dev/null differ
diff --git a/static/img/community/argos/gif4.gif b/static/img/community/argos/gif4.gif
deleted file mode 100644
index f1435f6..0000000
Binary files a/static/img/community/argos/gif4.gif and /dev/null differ
diff --git a/static/img/community/argos/mango-logo.png b/static/img/community/argos/mango-logo.png
deleted file mode 100644
index 3bb4d65..0000000
Binary files a/static/img/community/argos/mango-logo.png and /dev/null differ
diff --git a/static/img/community/argos/scrshot1.png b/static/img/community/argos/scrshot1.png
deleted file mode 100644
index e5f4553..0000000
Binary files a/static/img/community/argos/scrshot1.png and /dev/null differ
diff --git a/static/img/community/emacs-guide/emacs-1.png b/static/img/community/emacs-guide/emacs-1.png
deleted file mode 100644
index 8ffd8f6..0000000
Binary files a/static/img/community/emacs-guide/emacs-1.png and /dev/null differ
diff --git a/static/img/community/emzy/nix-search-tv-showcase.png b/static/img/community/emzy/nix-search-tv-showcase.png
deleted file mode 100644
index 33f7d7a..0000000
Binary files a/static/img/community/emzy/nix-search-tv-showcase.png and /dev/null differ
diff --git a/static/img/community/nullsector-dev/bspwm.png b/static/img/community/nullsector-dev/bspwm.png
deleted file mode 100644
index 560f15f..0000000
Binary files a/static/img/community/nullsector-dev/bspwm.png and /dev/null differ
diff --git a/static/img/community/nullsector-dev/bspwmss.png b/static/img/community/nullsector-dev/bspwmss.png
deleted file mode 100644
index 376cca9..0000000
Binary files a/static/img/community/nullsector-dev/bspwmss.png and /dev/null differ
diff --git a/static/img/community/nullsector-dev/freebsd.png b/static/img/community/nullsector-dev/freebsd.png
deleted file mode 100644
index c3dcc69..0000000
Binary files a/static/img/community/nullsector-dev/freebsd.png and /dev/null differ
diff --git a/static/img/community/your-name/dwm-rice.png b/static/img/community/your-name/dwm-rice.png
deleted file mode 100644
index 15d311e..0000000
Binary files a/static/img/community/your-name/dwm-rice.png and /dev/null differ
diff --git a/static/img/community/zakky/qtile.png b/static/img/community/zakky/qtile.png
deleted file mode 100644
index b213d01..0000000
Binary files a/static/img/community/zakky/qtile.png and /dev/null differ
diff --git a/static/img/dwl.png b/static/img/dwl.png
deleted file mode 100644
index 2354e65..0000000
Binary files a/static/img/dwl.png and /dev/null differ
diff --git a/static/img/dwm.png b/static/img/dwm.png
deleted file mode 100755
index fc040e2..0000000
Binary files a/static/img/dwm.png and /dev/null differ
diff --git a/static/img/favicon.png b/static/img/favicon.png
deleted file mode 100644
index 5ba7616..0000000
Binary files a/static/img/favicon.png and /dev/null differ
diff --git a/static/img/forrest-1-bg.png b/static/img/forrest-1-bg.png
deleted file mode 100644
index 55994a4..0000000
Binary files a/static/img/forrest-1-bg.png and /dev/null differ
diff --git a/static/img/forrest-2-bg.png b/static/img/forrest-2-bg.png
deleted file mode 100644
index 74de735..0000000
Binary files a/static/img/forrest-2-bg.png and /dev/null differ
diff --git a/static/img/header_bg.png b/static/img/header_bg.png
deleted file mode 100644
index f43d2b9..0000000
Binary files a/static/img/header_bg.png and /dev/null differ
diff --git a/static/img/hyprland-2.png b/static/img/hyprland-2.png
deleted file mode 100644
index 428da68..0000000
Binary files a/static/img/hyprland-2.png and /dev/null differ
diff --git a/static/img/hyprland-header.png b/static/img/hyprland-header.png
deleted file mode 100644
index 60c686d..0000000
Binary files a/static/img/hyprland-header.png and /dev/null differ
diff --git a/static/img/hyprland.png b/static/img/hyprland.png
deleted file mode 100644
index be956a6..0000000
Binary files a/static/img/hyprland.png and /dev/null differ
diff --git a/static/img/lfs.png b/static/img/lfs.png
deleted file mode 100644
index 4940cb2..0000000
Binary files a/static/img/lfs.png and /dev/null differ
diff --git a/static/img/mangowc.png b/static/img/mangowc.png
deleted file mode 100644
index 1effb42..0000000
Binary files a/static/img/mangowc.png and /dev/null differ
diff --git a/static/img/mountain-3-bg.png b/static/img/mountain-3-bg.png
deleted file mode 100644
index 0d56aed..0000000
Binary files a/static/img/mountain-3-bg.png and /dev/null differ
diff --git a/static/img/mountain-as-is-bg.png b/static/img/mountain-as-is-bg.png
deleted file mode 100644
index 4ebde7d..0000000
Binary files a/static/img/mountain-as-is-bg.png and /dev/null differ
diff --git a/static/img/mountain-bg.png b/static/img/mountain-bg.png
deleted file mode 100644
index aa2ebff..0000000
Binary files a/static/img/mountain-bg.png and /dev/null differ
diff --git a/static/img/neovim.png b/static/img/neovim.png
deleted file mode 100755
index 34b5bf9..0000000
Binary files a/static/img/neovim.png and /dev/null differ
diff --git a/static/img/niri.png b/static/img/niri.png
deleted file mode 100644
index dfd08ec..0000000
Binary files a/static/img/niri.png and /dev/null differ
diff --git a/static/img/nixos-from-scratch.png b/static/img/nixos-from-scratch.png
deleted file mode 100644
index 7b8a933..0000000
Binary files a/static/img/nixos-from-scratch.png and /dev/null differ
diff --git a/static/img/nixos-hyprland.png b/static/img/nixos-hyprland.png
deleted file mode 100644
index b0ca92a..0000000
Binary files a/static/img/nixos-hyprland.png and /dev/null differ
diff --git a/static/img/quickshell.png b/static/img/quickshell.png
deleted file mode 100644
index b16a7f9..0000000
Binary files a/static/img/quickshell.png and /dev/null differ
diff --git a/static/img/samarkand-bg.png b/static/img/samarkand-bg.png
deleted file mode 100644
index c9e8949..0000000
Binary files a/static/img/samarkand-bg.png and /dev/null differ
diff --git a/static/img/suckless-nixos.png b/static/img/suckless-nixos.png
deleted file mode 100644
index 74e9925..0000000
Binary files a/static/img/suckless-nixos.png and /dev/null differ
diff --git a/static/img/tmux.png b/static/img/tmux.png
deleted file mode 100755
index 4660df1..0000000
Binary files a/static/img/tmux.png and /dev/null differ
diff --git a/static/img/vim.png b/static/img/vim.png
deleted file mode 100755
index 0868b62..0000000
Binary files a/static/img/vim.png and /dev/null differ
diff --git a/static/img/wall1.png b/static/img/wall1.png
deleted file mode 100644
index 9474333..0000000
Binary files a/static/img/wall1.png and /dev/null differ
diff --git a/static/img/xmonad.png b/static/img/xmonad.png
deleted file mode 100644
index 8bdd7fd..0000000
Binary files a/static/img/xmonad.png and /dev/null differ
diff --git a/template.html b/template.html
new file mode 100644
index 0000000..6f72170
--- /dev/null
+++ b/template.html
@@ -0,0 +1,67 @@
+<!doctype html>
+<html lang="en">
+<head>
+<meta charset="utf-8">
+<meta name="viewport" content="width=device-width, initial-scale=1">
+<title>$title$</title>
+$if(description)$<meta name="description" content="$description$">$endif$
+<link rel="icon" type="image/png" href="/img/favicon.png">
+<link rel="preload" as="font" type="font/woff2" href="/fonts/iosevka-Regular.woff2" crossorigin>
+<link rel="stylesheet" href="/css/site.css">
+</head>
+<body>
+<header class="site-header"><div class="site-masthead">
+<nav class="navbar">
+  <a class="navbar-brand" href="/">Tony, btw.</a>
+  <input type="checkbox" id="nav-toggle" class="nav-toggle-cb" hidden>
+  <label for="nav-toggle" class="nav-toggle" aria-label="Toggle menu">&#9776;</label>
+  <ul class="nav-menu">
+    <li><a href="/tutorial/">tutorials</a></li>
+    <li><a href="/community/">community</a></li>
+    <li><a href="/support/">support</a></li>
+    <li><a class="discord" href="https://discord.gg/nXZwDb8HB5">discord</a></li>
+  </ul>
+</nav>
+</div></header>
+
+<main class="container">
+<div class="row">
+<div class="column">
+<article class="site-post">
+$if(showtitle)$<h1 class="site-post-title">$title$</h1>$endif$
+$if(metaline)$<p class="site-post-meta">$metaline$</p>$endif$
+$if(ytid)$<div class="video"><iframe src="https://www.youtube.com/embed/$ytid$" allowfullscreen></iframe></div>$endif$
+$if(image)$<div class="post-hero"><img src="$image$" alt="$title$"></div>$endif$
+<div id="content">
+$body$
+</div>
+</article>
+</div>
+$if(toc)$
+<aside class="content-panel">
+<span class="toc-label">Table of Contents</span>
+<div id="tableOfContentContainer">
+$table-of-contents$
+</div>
+</aside>
+$endif$
+</div>
+</main>
+
+<footer class="modeline"><div class="ml-row">
+<span class="ml-a ml-mode">NORMAL</span>
+<span class="ml-sep ml-fwd sep-a-b"></span>
+<span class="ml-b">&#xe0a0; main</span>
+<span class="ml-sep ml-fwd sep-b-c"></span>
+<span class="ml-c">$if(buffer)$$buffer$$else$index$endif$</span>
+<span class="ml-sep ml-fwd sep-c-bar"></span>
+<span class="ml-fill"></span>
+<span class="ml-sep ml-bwd sep-bar-c"></span>
+<span class="ml-c">utf-8</span>
+<span class="ml-sep ml-bwd sep-c-b"></span>
+<span class="ml-b">$if(section)$$section$$else$home$endif$</span>
+<span class="ml-sep ml-bwd sep-b-a"></span>
+<span class="ml-a">Top</span>
+</div></footer>
+</body>
+</html>