diff --git a/content/music.tree b/content/music.tree
index 97353f1..6be95ef 100644
--- a/content/music.tree
+++ b/content/music.tree
@@ -10,7 +10,7 @@
 % id = "01J8YY31QJQJYW1TTYSHKB2AV1"
 - :folder: *blog*
 
-    % content.link = "music/reviews/aphex-twin/blue-calx"
+    % content.link = "music/blue-calx"
       id = "01JCY18RY6B6CTC3H8ME0FRZXC"
     + :page: Blue Calx
 
@@ -19,26 +19,26 @@
     + :page: the curious case of Amon Tobin's Creatures
 
     % id = "01J8ZKEPGF9HDMRK2ERNM23FE2"
-      content.link = "music/reviews/opn/i-dont-love-me-anymore"
+      content.link = "music/i-dont-love-me-anymore"
     + :page: I Don't Love Me Anymore
 
     % id = "01J73BSW850Z2SDVM832FB60QT"
       content.link = "music/brainz"
     + :page: the ListenBrainz dataset
 
-    % content.link = "music/reviews/telefon-tel-aviv/map-of-what-is-effortless"
+    % content.link = "music/map-of-what-is-effortless"
       id = "01H9R1NKBBFTWT6FT2MVWHETR6"
     + :page: Telefon Tel Aviv - Map of What Is Effortless
 
-    % content.link = "music/reviews/radiohead/a-moon-shaped-pool"
+    % content.link = "music/a-moon-shaped-pool"
       id = "01H9JB094CA55NT8QR1AYNXDBT"
     + :page: Radiohead - A Moon Shaped Pool
     
-    % content.link = "music/reviews/aphex-twin/syro"
+    % content.link = "music/syro"
       id = "01H9DQNG9APD9BSDTP3N3QQFG3"
     + :page: Aphex Twin - Syro
 
-    % content.link = "music/reviews/radiohead/ok-computer"
+    % content.link = "music/ok-computer"
       id = "01H969NN1ADGRWRQTT2NE5TJZ1"
     + :page: Radiohead - OK Computer
 
diff --git a/content/music/reviews/radiohead/a-moon-shaped-pool.tree b/content/music/a-moon-shaped-pool.tree
similarity index 100%
rename from content/music/reviews/radiohead/a-moon-shaped-pool.tree
rename to content/music/a-moon-shaped-pool.tree
diff --git a/content/music/reviews/aphex-twin/blue-calx.tree b/content/music/blue-calx.tree
similarity index 100%
rename from content/music/reviews/aphex-twin/blue-calx.tree
rename to content/music/blue-calx.tree
diff --git a/content/music/reviews/opn/i-dont-love-me-anymore.tree b/content/music/i-dont-love-me-anymore.tree
similarity index 100%
rename from content/music/reviews/opn/i-dont-love-me-anymore.tree
rename to content/music/i-dont-love-me-anymore.tree
diff --git a/content/music/reviews/telefon-tel-aviv/map-of-what-is-effortless.tree b/content/music/map-of-what-is-effortless.tree
similarity index 100%
rename from content/music/reviews/telefon-tel-aviv/map-of-what-is-effortless.tree
rename to content/music/map-of-what-is-effortless.tree
diff --git a/content/music/reviews/radiohead/ok-computer.tree b/content/music/ok-computer.tree
similarity index 100%
rename from content/music/reviews/radiohead/ok-computer.tree
rename to content/music/ok-computer.tree
diff --git a/content/music/reviews/aphex-twin/syro.tree b/content/music/syro.tree
similarity index 100%
rename from content/music/reviews/aphex-twin/syro.tree
rename to content/music/syro.tree
diff --git a/content/programming.tree b/content/programming.tree
index 417893e..edbfd36 100644
--- a/content/programming.tree
+++ b/content/programming.tree
@@ -9,43 +9,43 @@
 % id = "01HPD4XQQ5GPQ20C6BPA8G670F"
 - :folder: *blog*
 
-    % content.link = "programming/blog/aoc"
+    % content.link = "programming/aoc"
       id = "01JDZKMPHT02WJBF2TC5YBWGMB"
     + :page: Advent of Code feels
 
-    % content.link = "programming/blog/vfs"
+    % content.link = "programming/vfs"
       id = "01JDJJHCGTAJ78K8WRXV00ZEJC"
     + :page: composable virtual file systems
 
-    % content.link = "programming/blog/cstring-starts-with"
+    % content.link = "programming/cstring-starts-with"
       id = "01JCGAM56KS2C6D4XZ1MRATXH4"
     + :page: prefix matches with C strings
 
-    % content.link = "programming/blog/buildsome"
+    % content.link = "programming/buildsome"
       id = "01J7BYKQHZKYQ969T3PH3V8HF1"
     + :page: not quite buildless
 
-    % content.link = "programming/blog/haku"
+    % content.link = "programming/haku"
       id = "01J4J4PAXRWZDP9PAZNGCQ9S3D"
     + :page: haku - writing a little programming language for fun
 
-    % content.link = "programming/blog/lvalues"
+    % content.link = "programming/lvalues"
       id = "01HY5R1ZW0M0Y5KQ1E8F0Q73ZT"
     + :page: places, or what is up with `*x` not always meaning the same thing
 
-    % content.link = "programming/blog/systems"
+    % content.link = "programming/systems"
       id = "01J0PBKY1AAPGXG6NSRDTMV48F"
     + :page: systems are just a bunch of code
 
-    % content.link = "programming/blog/or-types"
+    % content.link = "programming/or-types"
       id = "01HTWN4XB2YMF3615BE8V6Y76A"
     + :page: OR-types
 
-    % content.link = "programming/blog/tairu"
+    % content.link = "programming/tairu"
       id = "01HPD4XQQ5WM0APCAX014HM43V"
     + :page: tairu - an interactive exploration of 2D autotiling techniques
 
-    % content.link = "about-treehouse"
+    % content.link = "programming/about-treehouse"
       id = "01H89RFHCQ1YB7CXBBR6NDDAC1"
       redirect_from = ["about-treehouse"]
     + :page: about the treehouse
@@ -53,22 +53,22 @@
 % id = "01HRG2RJCNKT9JJJVQ8WVRC9CA"
 - :folder: *languages*
 
-    % content.link = "programming/languages/cxx"
+    % content.link = "programming/cxx"
       id = "programming/languages/cxx"
     + :folder: C++
 
-    % content.link = "programming/languages/javascript"
+    % content.link = "programming/javascript"
       id = "programming/languages/javascript"
     + :page: JavaScript
 
-    % content.link = "programming/languages/lua"
+    % content.link = "programming/lua"
       id = "programming/languages/lua"
     + :page: Lua
 
 % id = "01HRG2RJCN8J42NK0KWD3SBSJA"
 - :folder: *technologies*
 
-    % content.link = "programming/technologies/unreal-engine"
+    % content.link = "programming/unreal-engine"
       id = "programming/technologies/unreal-engine"
     + :folder: Unreal Engine
 
diff --git a/content/about-treehouse.tree b/content/programming/about-treehouse.tree
similarity index 99%
rename from content/about-treehouse.tree
rename to content/programming/about-treehouse.tree
index 06c76a9..93f3a21 100644
--- a/content/about-treehouse.tree
+++ b/content/programming/about-treehouse.tree
@@ -27,7 +27,7 @@
     % id = "01H8VWEFHZA94G0DNPD79YV535"
     + …
 
-        % content.link = "about-treehouse/emoji"
+        % content.link = "treehouse/emoji"
           id = "01H8VWEFHZ7Z71WJ347WFMC9YT"
         + by the way did you know this website has custom emojis? and quite a lot of them, too
 
@@ -53,7 +53,7 @@
                 + _where?_
 
                     % id = "01H89RFHCQW4NN6PW6V6RFCVH3"
-                      content.link = "about-treehouse/the-end-is-never"
+                      content.link = "the-end-is-never"
                     + _*WHERE???*_
 
         % id = "01H89RFHCQPAMNSN81SRVH2TZ5"
diff --git a/content/programming/blog/aoc.tree b/content/programming/aoc.tree
similarity index 100%
rename from content/programming/blog/aoc.tree
rename to content/programming/aoc.tree
diff --git a/content/programming/blog/nix.tree b/content/programming/blog/nix.tree
deleted file mode 100644
index 840b529..0000000
--- a/content/programming/blog/nix.tree
+++ /dev/null
@@ -1,88 +0,0 @@
-%% title = "derive me some Nix"
-
-% id = "01J31356Q1A4Z54F3G7THB1C81"
-- chances are you've heard about Nix or NixOS from somewhere and would like to learn more about it.
-
-    % id = "01J31356Q1AQE7ZBE2P7FG03G4"
-    - if that is the case, welcome to the club!
-    we're pretty much in the same bucket.
-    I literally just started using Nix a couple days ago, and I found the documentation *really* unclear.
-    so here's my shot at a more pedagogical approach.
-
-    % id = "01J31356Q1N80MYK77MP3BMJ1E"
-    - if that's not the case - Nix is a package manager and system configuration language.
-    basically, you specify how you want your system to look using config files stored in one place, and Nix _derives_ the system from that config file for you!
-
-        % id = "01J31356Q13VHG7EN0Q24A6GSM"
-        - I emphasized the word _derives_, because _derivation_ is the fundamental operation of Nix the package manager.
-        your entire config is specified declaratively, and the entire folder structure and all configuration files are _derived_ from that config.
-        but we'll get to that shortly.
-
-% id = "01J31356Q1G1X5X9Q7BPDT41R5"
-- people seem to be excited about Nix for many reasons.
-I'm excited because it helps me achieve *online independence.*
-
-    % id = "01J31356Q12T9Z1WE300PD7J79"
-    - did you know that since last weekend (since this was written) this website runs on NixOS?
-
-    % id = "01J31356Q1KM0TT28D4PHZTAR9"
-    - being able to take your VPS's configuration elsewhere and let Nix cook your system up automatically is extremely cool.
-    it's something that's always frustrated me with how Linux software is configured -
-    lots of little configuration files scattered across `/etc` and sometimes other directories, which ends up being extremely hard to replicate if you ever want to switch server providers.
-
-        % id = "01J31356Q1D0SJPJB1V4MYPNX9"
-        - *and* your system config will end up identical to the one you had before!
-        isn't that awesome?
-
-% id = "01J31356Q1BNSAF75KDE4PN2PJ"
-- word of warning though: I wouldn't recommend running NixOS on a home PC.
-
-    % id = "01J31356Q1C13GSD9KSXETWW1B"
-    - I use :btw: on my home PC for a very simple reason.
-    it's just _really darn simple_ to change anything about my system.
-
-        % id = "01J31356Q1JZ13FY2XAVVKAN97"
-        - need to install a new package? `pacman -S`.
-
-        % id = "01J31356Q1VJ0HFQYVS1AE7CZB"
-        - need to edit system config?
-        well first of all no you don't, because other than fundamental config you change during installation, we both know Arch works pretty much works out of the box on your PC,
-        but even if you _do_ end up needing to change some config for a workaround, it's generally only because you need a _workaround_ - which may not be needed by the time you reinstall your system.
-
-            % id = "01J31356Q162ACZG4S6M9YNQX2"
-            - and reinstall your OS pretty rarely.
-
-            % id = "01J31356Q1ZXDA6QX5P978FTPS"
-            - most of your _important_ configuration is stored in `$HOME` y'know, and that's easy to keep between reinstalls - you have a separate `/home` partition after all.
-
-    % id = "01J31356Q1KYMMG64D3TNXH3C5"
-    - :btw: is also Really Darn Fast.
-    I can't say that about NixOS.
-    the package manager is excruciatingly slow to update your system config.
-    the initial install took _really_ long for how barebones of a system I specified in my config.
-
-% id = "01J31356Q1CA21R7GM9MXGQ7Q4"
-- let's derive us a system! as I mentioned before, everything in Nix is achieved by means of _derivations_.
-
-    % id = "01J31356Q191D3J645CT75YFEJ"
-    - from a programming perspective, a derivation is simply a function `options -> path`, where `options` is an attribute set specifying how the output `path` should be derived.
-
-        % id = "01J31356Q1PRWPYD0EGGY1ZK3W"
-        - and that's *it*.
-
-    % id = "01J31356Q1445NB18CNBE91CZP"
-    - suppose you'd like to download a file from the Internet.
-    that's what the `pkgs.fetchurl` function is for.
-
-    ```nix
-    # This expression results in a path to the downloaded file.
-    pkgs.fetchurl {
-        url = "https://liquidex.house";
-        # As long as you fill in the hash, which I don't know...
-        # Nix will tell you what it should be though!
-        hash = "";
-    }
-    ```
-
-% id = "01J31356Q1HEW2HCTG27BDFJM2"
-- but where does `pkgs` even come from?
diff --git a/content/programming/blog/buildsome.tree b/content/programming/buildsome.tree
similarity index 100%
rename from content/programming/blog/buildsome.tree
rename to content/programming/buildsome.tree
diff --git a/content/programming/blog/cstring-starts-with.tree b/content/programming/cstring-starts-with.tree
similarity index 100%
rename from content/programming/blog/cstring-starts-with.tree
rename to content/programming/cstring-starts-with.tree
diff --git a/content/programming/languages/cxx.tree b/content/programming/cxx.tree
similarity index 76%
rename from content/programming/languages/cxx.tree
rename to content/programming/cxx.tree
index a835be5..20e8f42 100644
--- a/content/programming/languages/cxx.tree
+++ b/content/programming/cxx.tree
@@ -3,11 +3,11 @@
 % id = "01H9R1KJESR2F420HE67HW4AVR"
 - notes and design lessons from the best programming language of all time that everyone loves (not really)
 
-% content.link = "programming/languages/cxx/access-modifiers-as-labels"
+% content.link = "programming/cxx/access-modifiers-as-labels"
   redirect_from = ["programming/cxx/access-modifiers-as-labels"]
   id = "01H9R1KJESGGM35KT8ANEA2B9Q"
 + :page: access modifiers as labels (`private:`, `protected:`, and `public:`)
 
-% content.link = "programming/languages/cxx/shared-unique-ptr-deleter"
+% content.link = "programming/cxx/shared-unique-ptr-deleter"
   id = "01J0VN48AZYH6KJGK7PSKN0PCA"
 + :page: freeing C memory automatically using `std::unique_ptr` and `std::shared_ptr`
diff --git a/content/programming/languages/cxx/access-modifiers-as-labels.tree b/content/programming/cxx/access-modifiers-as-labels.tree
similarity index 100%
rename from content/programming/languages/cxx/access-modifiers-as-labels.tree
rename to content/programming/cxx/access-modifiers-as-labels.tree
diff --git a/content/programming/languages/cxx/shared-unique-ptr-deleter.tree b/content/programming/cxx/shared-unique-ptr-deleter.tree
similarity index 100%
rename from content/programming/languages/cxx/shared-unique-ptr-deleter.tree
rename to content/programming/cxx/shared-unique-ptr-deleter.tree
diff --git a/content/programming/blog/haku.tree b/content/programming/haku.tree
similarity index 100%
rename from content/programming/blog/haku.tree
rename to content/programming/haku.tree
diff --git a/content/programming/languages/javascript.tree b/content/programming/javascript.tree
similarity index 100%
rename from content/programming/languages/javascript.tree
rename to content/programming/javascript.tree
diff --git a/content/programming/languages/lua.tree b/content/programming/lua.tree
similarity index 100%
rename from content/programming/languages/lua.tree
rename to content/programming/lua.tree
diff --git a/content/programming/blog/lvalues.tree b/content/programming/lvalues.tree
similarity index 100%
rename from content/programming/blog/lvalues.tree
rename to content/programming/lvalues.tree
diff --git a/content/programming/blog/or-types.tree b/content/programming/or-types.tree
similarity index 100%
rename from content/programming/blog/or-types.tree
rename to content/programming/or-types.tree
diff --git a/content/programming/blog/systems.tree b/content/programming/systems.tree
similarity index 100%
rename from content/programming/blog/systems.tree
rename to content/programming/systems.tree
diff --git a/content/programming/blog/tairu.tree b/content/programming/tairu.tree
similarity index 100%
rename from content/programming/blog/tairu.tree
rename to content/programming/tairu.tree
diff --git a/content/programming/blog/try-is-not-the-only-option.tree b/content/programming/try-is-not-the-only-option.tree
similarity index 100%
rename from content/programming/blog/try-is-not-the-only-option.tree
rename to content/programming/try-is-not-the-only-option.tree
diff --git a/content/programming/technologies/unreal-engine.tree b/content/programming/unreal-engine.tree
similarity index 69%
rename from content/programming/technologies/unreal-engine.tree
rename to content/programming/unreal-engine.tree
index f994a30..bc3ab92 100644
--- a/content/programming/technologies/unreal-engine.tree
+++ b/content/programming/unreal-engine.tree
@@ -9,18 +9,18 @@
         % id = "01H8YGXP0ZWG6X3PB6GWSGKAT0"
         - both the fun and the good, and that which ruins my mood
 
-% id = "programming/technologies/unreal-engine/blueprint"
-  content.link = "programming/technologies/unreal-engine/blueprint"
+% id = "programming/unreal-engine/blueprint"
+  content.link = "programming/unreal-engine/blueprint"
 + :page: thoughts on Blueprint
 
 % id = "01HP1FESY5WVJG4X80AZ4ZBX5D"
 - :folder: random but cool things
 
-    % content.link = "programming/technologies/unreal-engine/generated-body"
+    % content.link = "programming/unreal-engine/generated-body"
       id = "01HV1DGFHP6GB268MDGGDXMR12"
     + :page: how does `GENERATED_BODY()` work exactly?
 
-    % content.link = "programming/technologies/unreal-engine/fixes"
+    % content.link = "programming/unreal-engine/fixes"
       id = "01HP1FESY5ZS6YTZXA8QTT5V1Z"
     + :page: data validation quick fixes
 
diff --git a/content/programming/technologies/unreal-engine/blueprint.tree b/content/programming/unreal-engine/blueprint.tree
similarity index 100%
rename from content/programming/technologies/unreal-engine/blueprint.tree
rename to content/programming/unreal-engine/blueprint.tree
diff --git a/content/programming/technologies/unreal-engine/fixes.tree b/content/programming/unreal-engine/fixes.tree
similarity index 100%
rename from content/programming/technologies/unreal-engine/fixes.tree
rename to content/programming/unreal-engine/fixes.tree
diff --git a/content/programming/technologies/unreal-engine/generated-body.tree b/content/programming/unreal-engine/generated-body.tree
similarity index 100%
rename from content/programming/technologies/unreal-engine/generated-body.tree
rename to content/programming/unreal-engine/generated-body.tree
diff --git a/content/programming/blog/vfs.tree b/content/programming/vfs.tree
similarity index 100%
rename from content/programming/blog/vfs.tree
rename to content/programming/vfs.tree
diff --git a/content/about-treehouse/the-end-is-never.tree b/content/the-end-is-never.tree
similarity index 80%
rename from content/about-treehouse/the-end-is-never.tree
rename to content/the-end-is-never.tree
index c38b66a..076fd42 100644
--- a/content/about-treehouse/the-end-is-never.tree
+++ b/content/the-end-is-never.tree
@@ -1,6 +1,6 @@
 %% title = "the end is never the end is never the end is never the end is never the end is never the end is never the end is never the end is never the end"
 
-% content.link = "about-treehouse/the-end-is-never"
+% content.link = "the-end-is-never"
   do_not_persist = true
   id = "the-end-is-never"
 + …
diff --git a/content/treehouse.tree b/content/treehouse.tree
index 990fd76..db8af6a 100644
--- a/content/treehouse.tree
+++ b/content/treehouse.tree
@@ -7,6 +7,10 @@
   content.link = "treehouse/changelog"
 + #### :folder: what's going on inside the house?
 
+% id = "treehouse/emoji"
+  content.link = "treehouse/emoji"
++ #### :folder: emoji index
+
 % id = "treehouse/issues"
 - #### :folder: [issue tracker][def:treehouse/issues]
 
diff --git a/content/about-treehouse/emoji.tree b/content/treehouse/emoji.tree
similarity index 100%
rename from content/about-treehouse/emoji.tree
rename to content/treehouse/emoji.tree
diff --git a/treehouse.toml b/treehouse.toml
index ee66c0b..34ec8f3 100644
--- a/treehouse.toml
+++ b/treehouse.toml
@@ -79,9 +79,36 @@ tags = [
     "haku",
 ]
 
-[redirects.page]
-"programming/cxx" = "programming/languages/cxx"
-"programming/unreal-engine" = "programming/technologies/unreal-engine"
+[redirects.path]
+
+# 2025-01-14 flattening
+"about-treehouse" = "programming/about-treehouse"
+"about-treehouse/emoji" = "treehouse/emoji"
+"about-treehouse/the-end-is-never" = "the-end-is-never"
+"music/reviews/aphex-twin/blue-calx" = "music/blue-calx"
+"music/reviews/aphex-twin/syro" = "music/syro"
+"music/reviews/opn/i-dont-love-me-anymore" = "music/i-dont-love-me-anymore"
+"music/reviews/radiohead/a-moon-shaped-pool" = "music/a-moon-shaped-pool"
+"music/reviews/radiohead/ok-computer" = "music/ok-computer"
+"music/reviews/telefon-tel-aviv/map-of-what-is-effortless" = "music/map-of-what-is-effortless"
+"programming/blog/aoc" = "programming/aoc"
+"programming/blog/buildsome" = "programming/buildsome"
+"programming/blog/cstring-starts-with" = "programming/cstring-starts-with"
+"programming/blog/haku" = "programming/haku"
+"programming/blog/lvalues" = "programming/lvalues"
+"programming/blog/nix" = "programming/nix"
+"programming/blog/or-types" = "programming/or-types"
+"programming/blog/systems" = "programming/systems"
+"programming/blog/tairu" = "programming/tairu"
+"programming/blog/try-is-not-the-only-option" = "programming/try-is-not-the-only-option"
+"programming/blog/vfs" = "programming/vfs"
+"programming/languages/cxx" = "programming/cxx"
+"programming/languages/javascript" = "programming/javascript"
+"programming/languages/lua" = "programming/lua"
+"programming/technologies/unreal-engine" = "programming/unreal-engine"
+"programming/technologies/unreal-engine/blueprint" = "programming/unreal-engine/blueprint"
+"programming/technologies/unreal-engine/fixes" = "programming/unreal-engine/fixes"
+"programming/technologies/unreal-engine/generated-body" = "programming/unreal-engine/generated-body"
 
 [emoji]