diff --git a/content/treehouse/changelog.tree b/content/treehouse/changelog.tree
index 34add9e..a4c7087 100644
--- a/content/treehouse/changelog.tree
+++ b/content/treehouse/changelog.tree
@@ -1,5 +1,81 @@
%% title = "what's going on inside the house? (a changelog)"
+% id = "01J3NX4F6Z0JWN0E4B3DJMTAFH"
+- **revision 10:** I am speed
+
+ % id = "01J3NX4F6Z0WB2RN4GHTVFNRGB"
+ + the treehouse now caches most static assets, so that they don't have to be redownloaded.
+ especially that very large font, which I should probably optimize now that I think about it!
+
+ % id = "01J3NX4F6ZMB691JYM61RHP4ZN"
+ - there are some minor exceptions to this, which include:
+
+ % id = "01J3NX4F6Z59655NYTS3QTA9EQ"
+ + pages themselves. we cannot cache those at all. well, maybe in release mode, for like 10 seconds, which defeats the point.
+
+ % id = "01J3NX4F6Z5J3PYZPBESR30CD8"
+ - we can only cache those assets which are guaranteed not to change given their URL.
+
+ caching on the treehouse is performed by means of a `?cache` query parameter which contains a truncated BLAKE3 sum of the cached file's contents.
+ that way we can tell the browser to redownload the asset by changing out the hash.
+
+ this is impossible to do for pages, because they may change at any point in time.
+
+ % id = "01J3NX4F6ZBQVY66EZB5TY8R7Q"
+ - I tend to update the treehouse very often - including post-deploy, if I fuck something up - so if I enable caching for e.g. an hour, and people visit the broken version, they're then stuck with a broken version for an hour.
+ seriously, timed caching is not a good solution for incremental website updates.
+
+ % id = "01J3NX4F6ZXB360N1XXGN58964"
+ - except for `/sandbox` maybe, because that tends to be fetched in short bursts... I'll think about it.
+
+ % id = "01J3NX4F6ZJE0JT8XY49DH52RX"
+ - linked branches. it's hard and not worth it for the few extra kilobytes saved - for snappiness it would be much better to prefetch branch content when the user hovers over a branch.
+
+ % id = "01J3NX4F6ZVA8PCQNMGMW2DDFB"
+ - not sure what to do about mobile devices, because they don't have a hover state.
+
+ % id = "01J3NX4F6ZASD2FCKKNKWZCJWB"
+ - more images now have proper `width="" height=""` attributes, which should help eliminate layout shift when loading pages.
+
+ % id = "01J3NX4F6Z5MZQ57ZTWHZZJZ7G"
+ + the treehouse is now powered by Djot, not Markdown! took me an evening or two to rewrite everything to the new markup, but I think it'll be worth it.
+ I can already see some pretty big clarity wins.
+
+ % id = "01J3NX4F6Z0KWMDDMBCYGB836M"
+ - my favorite feature so far is that you can add custom attributes to anything.
+ like this, for example:
+
+ ``````djot
+ {:program=haku}
+ ```haku
+ (- 100 35)
+ ```
+ ``````
+
+ % id = "01J3NX4F6ZGK01W6060BXTWJMJ"
+ - and have you noticed that there's a code block inside this code block? you can't do that in Markdown!
+
+ `````````djot
+ ``````djot
+ {:program=haku}
+ ```haku
+ (- 100 35)
+ ```
+ ``````
+ `````````
+
+ % id = "01J3NX4F6ZS93FTJ71YK2CASN7"
+ - literate programming blocks are now correctly rendered with JavaScript disabled, thanks to me rewriting the HTML renderer in the Djot transition.
+
+ % id = "01J3NX4F6ZDFZJX77DCZZJ8KKK"
+ + I also took the liberty to add some highlighting to missing emojis.
+ meaning they now stick out like a sore thumb :sore_thumb: to nag me about adding them in (or pulling them in from other branches. hello :verified: :TODO: :DONE: how have you been)
+
+ % id = "01J3NX4F6ZY6M6RAA2DVP7TAJ4"
+ - yeah yeah we all know how [ad blindness][] works, this is totally not gonna push me to do this isn't it
+
+ [ad blindness]: https://en.wikipedia.org/wiki/Banner_blindness
+
% id = "01J09K0B6JGYBJVVZ07QFXB0FM"
- **revision 9:** summer cleaning
diff --git a/content/treehouse/issues.tree b/content/treehouse/issues.tree
index 4d3d0d9..aecb07f 100644
--- a/content/treehouse/issues.tree
+++ b/content/treehouse/issues.tree
@@ -76,7 +76,7 @@
reparsing JS and HTML every single time cannot be fast
% id = "01J093FGZFGBDJ5QPHSZW9NVB5"
- + :TODO: :l_content: [page:programming/projects] needs the rest of my projects
+ + :TODO: :l_content: [page:programming/projects][] needs the rest of my projects
% id = "01J0VN48BR5XZSHC0D6Q3DRG8P"
- I haven't had the motivation (or a reason) to talk about my projects there yet so yeah.
@@ -91,7 +91,7 @@
- arguably the current `_tree.hbs` template is not that large, but it's not exactly small either
% id = "01J093FGZFMA8RWXA3QTMFX4A0"
- + :TODO: :l_content: [page:programming/blog/lvalues] C compiler that desugars lvalue operations
+ + :TODO: :l_content: [page:programming/blog/lvalues][] C compiler that desugars lvalue operations
% id = "01J093FGZFDYYGHEQJ63AQ7HKX"
- it would be nice if we had a way of letting the user explore the idea in more detail
@@ -131,7 +131,7 @@
+ :TODO: :l_feat: implement [Webmentions](https://indieweb.org/Webmention)
% id = "01J093FGZFJZ191RSZFVSND6QE"
- + :TODO: :l_content: [page:programming/blog/tairu] has a [leftover TODO][branch:01HPD4XQPW8HE7681P7H686X4N]
+ + :TODO: :l_content: [page:programming/blog/tairu][] has a [leftover TODO][branch:01HPD4XQPW8HE7681P7H686X4N]
% id = "01J093FGZF5PEM6EWCDEKSX8S0"
+ :TODO: :l_feat: :l_sandbox: do not load iframes that are out of viewport
@@ -152,10 +152,10 @@
- add a `https://dev.liquidex.house` that will let me push changes for friends to see without breaking shit on the main branch
% id = "01J093FGZF4400EAJYJGT2FFJJ"
- + :TODO: :l_sandbox: sandbox: Delete key does not work
+ + :TODO: :l_sandbox: sandbox: `Delete`{=html} key does not work
% id = "01J094P8H34NSZDWC067ENAX3T"
- - I managed to get the Backspace key to work fine in Firefox, but Delete still needs some work.
+ - I managed to get the `Backspace`{=html} key to work fine in Firefox, but `Delete`{=html} still needs some work.
% id = "01J093FGZF2K8Y2S8JY61GBWHR"
+ :TODO: :l_feat: :l_a11y: keyboard navigation
@@ -164,20 +164,20 @@
- it should be possible to navigate the tree using your keyboard:
% id = "01J094P8H3HJCADRWQNGBWMR36"
- - ↑ ↓ - choose branch
+ - `↑`{=html} `↓`{=html} - choose branch
% id = "01J094P8H3B44DBXCY0N6AFG9D"
- - ← - collapse
+ - `←`{=html} - collapse
% id = "01J094P8H30JBKYJPT01M0C68T"
- - → - expand
+ - `→`{=html} - expand
% id = "01J094P8H3MTV093F4Z0AMSJQ9"
- - these shortcuts overwrite browser functionality so it should probably only be enabled if the user starts pushing Tab to focus elements.
+ - these shortcuts overwrite browser functionality so it should probably only be enabled if the user starts pushing `Tab`{=html} to focus elements.
% id = "01J094P8H368794MNW65W074A0"
- this will probably also require us to add proper `tabindex`es to elements, which isn't currently done;
- the Tab navigation experience is a hodgepodge, focusing on various elements that don't exactly make much sense.
+ the `Tab`{=html} navigation experience is a hodgepodge, focusing on various elements that don't exactly make much sense.
% id = "01J093FGZFJB7BB1YNJX32MXCG"
+ :TODO: :l_feat: allow the user to "zoom into" a branch