diff --git a/.ignore b/.ignore new file mode 100644 index 0000000..36923d2 --- /dev/null +++ b/.ignore @@ -0,0 +1,3 @@ +*.png +*.jpg +*.webp diff --git a/Cargo.lock b/Cargo.lock index e89722b..2fc72a7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -540,17 +540,6 @@ dependencies = [ "crypto-common", ] -[[package]] -name = "displaydoc" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "either" version = "1.13.0" @@ -684,19 +673,6 @@ version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" -[[package]] -name = "git2" -version = "0.19.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b903b73e45dc0c6c596f2d37eccece7c1c8bb6e4407b001096387c63d0d93724" -dependencies = [ - "bitflags 2.6.0", - "libc", - "libgit2-sys", - "log", - "url", -] - [[package]] name = "glob" version = "0.3.2" @@ -855,145 +831,6 @@ dependencies = [ "cc", ] -[[package]] -name = "icu_collections" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locid" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_locid_transform" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_locid_transform_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_locid_transform_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e" - -[[package]] -name = "icu_normalizer" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "utf16_iter", - "utf8_iter", - "write16", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516" - -[[package]] -name = "icu_properties" -version = "1.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" -dependencies = [ - "displaydoc", - "icu_collections", - "icu_locid_transform", - "icu_properties_data", - "icu_provider", - "tinystr", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569" - -[[package]] -name = "icu_provider" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9" -dependencies = [ - "displaydoc", - "icu_locid", - "icu_provider_macros", - "stable_deref_trait", - "tinystr", - "writeable", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_provider_macros" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "idna" -version = "1.0.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "image" version = "0.25.5" @@ -1134,18 +971,6 @@ dependencies = [ "cc", ] -[[package]] -name = "libgit2-sys" -version = "0.17.0+1.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10472326a8a6477c3c20a64547b0059e4b0d086869eee31e6d7da728a8eb7224" -dependencies = [ - "cc", - "libc", - "libz-sys", - "pkg-config", -] - [[package]] name = "libwebp-sys" version = "0.9.6" @@ -1156,24 +981,6 @@ dependencies = [ "glob", ] -[[package]] -name = "libz-sys" -version = "1.1.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d16453e800a8cf6dd2fc3eb4bc99b786a9b90c663b8559a5b1a041bf89e472" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - -[[package]] -name = "litemap" -version = "0.7.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" - [[package]] name = "lock_api" version = "0.4.12" @@ -1851,12 +1658,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "stable_deref_trait" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" - [[package]] name = "strsim" version = "0.11.1" @@ -1886,17 +1687,6 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" -[[package]] -name = "synstructure" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "system-deps" version = "6.2.2" @@ -1986,16 +1776,6 @@ dependencies = [ "weezl", ] -[[package]] -name = "tinystr" -version = "0.7.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tokio" version = "1.41.1" @@ -2186,7 +1966,6 @@ dependencies = [ "clap", "codespan-reporting", "dashmap", - "git2", "handlebars", "image", "indexmap", @@ -2242,29 +2021,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7dd6e30e90baa6f72411720665d41d89b9a3d039dc45b8faea1ddd07f617f6af" -[[package]] -name = "url" -version = "2.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", -] - -[[package]] -name = "utf16_iter" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" - -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "utf8parse" version = "0.2.2" @@ -2288,12 +2044,6 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" -[[package]] -name = "vcpkg" -version = "0.2.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" - [[package]] name = "version-compare" version = "0.2.0" @@ -2533,48 +2283,12 @@ dependencies = [ "memchr", ] -[[package]] -name = "write16" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" - -[[package]] -name = "writeable" -version = "0.5.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51" - [[package]] name = "xmlparser" version = "0.13.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" -[[package]] -name = "yoke" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" -dependencies = [ - "serde", - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - [[package]] name = "zerocopy" version = "0.7.35" @@ -2596,49 +2310,6 @@ dependencies = [ "syn", ] -[[package]] -name = "zerofrom" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808" -dependencies = [ - "proc-macro2", - "quote", - "syn", - "synstructure", -] - -[[package]] -name = "zerovec" -version = "0.10.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.10.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "zune-core" version = "0.4.12" diff --git a/Cargo.toml b/Cargo.toml index 97f0b1b..bb379f1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "treehouse" version = "0.1.0" -edition = "2021" +edition = "2024" [dependencies] anyhow = "1.0.75" @@ -13,7 +13,6 @@ chrono = { version = "0.4.35", features = ["serde"] } clap = { version = "4.3.22", features = ["derive"] } codespan-reporting = "0.11.1" dashmap = "6.1.0" -git2 = { version = "0.19.0", default-features = false, features = ["vendored-libgit2"] } handlebars = "4.3.7" image = "0.25.5" indexmap = { version = "2.2.6", features = ["serde"] } @@ -31,7 +30,7 @@ tracing-chrome = "0.7.2" tracing-subscriber = { version = "0.3.18", features = ["env-filter"] } ulid = "1.0.0" webp = "0.3.0" -xmlparser = "0.13.6" +xmlparser = "0.13.6" # for parsing SVG [profile.dev] package.webp.opt-level = 3 diff --git a/content/_treehouse/404.dj b/content/_treehouse/404.dj new file mode 100644 index 0000000..861ef4e --- /dev/null +++ b/content/_treehouse/404.dj @@ -0,0 +1,11 @@ +title = "404" + ++++ + +Seems like what you're looking for isn't here.\ +Perhaps you pasted in an invalid URL, perhaps it has been removed.\ +Perhaps it was never written in the first place. + +Care to [go back to the index][page:index]? + +~Please feel free to report this if you think you've found a bug.~ diff --git a/content/about/v2.tree b/content/about/v2.tree index f943e3b..5608c58 100644 --- a/content/about/v2.tree +++ b/content/about/v2.tree @@ -1,5 +1,11 @@ -%% title = "who that! (about me)" +%% id = "b?01J0KRPMV7SS48B64BFCJZK7VQ" +title = "who that! (about me) (version 2)" visibility = "Private" +tags = ["all", "meow"] + +- *NOTE: This is an old "about me" page. +It is no longer being updated. +Refer to [page:index][] instead!* % id = "01J09B2BZXJ989S2SGWBNZ397C" + my name's *riki!* diff --git a/content/code-blocks.dj b/content/code-blocks.dj index ec4f93a..8df125e 100644 --- a/content/code-blocks.dj +++ b/content/code-blocks.dj @@ -1,4 +1,6 @@ title = "Iterating on design for code blocks" +id = "b?01K39ZH9DSF8Q13V47V42HNM3B" +tags = ["all", "design"] +++ diff --git a/content/design/animations.tree b/content/design/animations.tree index 668616a..e5e1049 100644 --- a/content/design/animations.tree +++ b/content/design/animations.tree @@ -1,4 +1,6 @@ -%% title = "animations & perception of sluggishness" +%% id = "b?01JEPCD4EPZJ2ACJX9J15ZBFSG" +title = "animations & perception of sluggishness" +tags = ["all", "design"] % id = "01JEPBVCJXC6NBJZ90JBHNYKGR" - there's a thing I always do with my computing devices: I make the animations faster than default. @@ -8,7 +10,7 @@ I have my Transition animation, Window animation, and Animator duration scales set to .5x. % id = "01JEPBVCJXMC2Q0ZDE64YT991T" - + on GNOME, you can do that by installing [Just Perfection](https://extensions.gnome.org/extension/3843/just-perfection/). + + on GNOME, you can do that by installing [Just Perfection](https://extensions.gnome.org/extension/3843/just-perfection/). % id = "01JEPBVCJXYWY1Q5372NBJREXD" - here's where in the config panel you can find the relevant setting, as of writing this: @@ -46,7 +48,7 @@ I can move my mouse around quite quickly, and the quicker something appears in m % id = "01JEPBVCJXJ87A3KDJM4MK2JJ7" - looking at the statistics they managed to collect, I score pretty well in terms of reaction time, and pretty average in terms of aiming speed. - + % id = "01JEPBVCJXJTZYE51PVYEDG0DV" - take these with a grain of salt though, because they do not correlate these stats with anything (e.g. demographics), and the aim trainer is apparently "new." diff --git a/content/design/digital-textures.tree b/content/design/digital-textures.tree index 28704b9..cec7279 100644 --- a/content/design/digital-textures.tree +++ b/content/design/digital-textures.tree @@ -1,4 +1,6 @@ -%% title = "on digital textures" +%% id = "b?01HQ8KV8T8GRCVFDJ3EP6QE163" +title = "on digital textures" +tags = ["all", "design"] % id = "01HQ8JHZ5NP1K7PHW4MJQS65ND" - this is not about textures in the graphics programming sort of way. this is about textures in the _you can feel it under your fingers_ way diff --git a/content/design/for-the-free-soul.tree b/content/design/for-the-free-soul.tree index 67c4814..d02e9cb 100644 --- a/content/design/for-the-free-soul.tree +++ b/content/design/for-the-free-soul.tree @@ -1,4 +1,6 @@ -%% title = "design for the free soul" +%% id = "b?01JG6Y6JNRQA4SSK3TEZ0RRTEB" +title = "design for the free soul" +tags = ["all", "design", "shower"] % id = "01JG6Y2YWD4JF34E64W1GK583J" - as I'm writing this, I'm sitting in the passenger seat of a car, with my girlfriend driving us home. @@ -10,7 +12,7 @@ % id = "01JG6Y2YWDWR5A66J4JD4WV1J1" - a thought surfaces in my head... "_this car is built like a frickin' Evangelion._" - + % id = "01JG6Y2YWDPANQNMJ749RSN0YE" - armoured to shield you from the elements, protect you from crashes, and provide a comfortable driving experience. diff --git a/content/design/freehouse.tree b/content/design/freehouse.tree index 716a1aa..5eec38a 100644 --- a/content/design/freehouse.tree +++ b/content/design/freehouse.tree @@ -1,4 +1,6 @@ -%% title = "idea: freeing the hobby corners" +%% id = "b?01JHGYTZN196N51ZBS4MZGHJ73" +title = "idea: freeing the hobby corners" +tags = ["all", "design", "treehouse"] % id = "01JHGX51XQMBYYQ5VCV427N169" - also known as, _freehouse_. diff --git a/content/design/sidebars.tree b/content/design/sidebars.tree index 9d5511c..219a224 100644 --- a/content/design/sidebars.tree +++ b/content/design/sidebars.tree @@ -1,4 +1,6 @@ -%% title = "maybe don't use sidebars on your website" +%% id = "b?01HR9ZTS8RS4VJNJYSNRQYSKHZ" +title = "maybe don't use sidebars on your website" +tags = ["all", "design"] % id = "01HR9ZTS6PHTK6VRBF7S0M6MZ7" - imagine if this page had a distracting bunch of text to the right of regular content. or even worse, advertisements. diff --git a/content/design/touch-panels.tree b/content/design/touch-panels.tree index b40567d..6f8f34e 100644 --- a/content/design/touch-panels.tree +++ b/content/design/touch-panels.tree @@ -1,4 +1,6 @@ -%% title = "touch panels" +%% id = "b?01JE75N3B0Y9H53TMJJV7MJY9V" +title = "touch panels" +tags = ["all", "design"] % id = "01JE246DXAKY4V4S49576JG0P9" - 2024\. it seems like you can't go on without devices that have capacitive touch panels. @@ -63,7 +65,7 @@ % id = "01JE246DXAETP3Z6G2K31QD1XG" - instead of something obvious, here's what happens: - + % id = "01JE246DXAZ1DC9PCCX2ESRCVZ" - _when the time left is `0:00` (or when the timer's unset)_, pushing `+` sets the timer to `10:00`, _but_ you can also push `-` to set the timer to `5:00`. @@ -83,7 +85,7 @@ % id = "01JE246DXA13DS8VSC73B64RYN" + at best I need 30 seconds, but that is still very sporadic... - + % id = "01JE246DXAQKRC5Q0SD0HTSTAP" - [sencha][] leaves can be infused up to about three times before the taste starts to diminish. my first brew is 1 minute, the second is 1 minute 30 seconds, and the third is 2 minutes. @@ -152,7 +154,7 @@ % id = "01JE27CBDAWT5RBPVCHWTR30CA" - now this one I totally get why it _should_ be a touch panel---which doesn't make it any less annoying, but yeah. - + % id = "01JE27CBDA8X2FW6CG59WNJXQM" - UX-wise it's much better to be able to place your cutting board on any part of the surface, _provided it's dry of course_, than having to avoid any buttons annoyingly protruding out its top. diff --git a/content/doc.dj b/content/doc.dj new file mode 100644 index 0000000..52c09e8 --- /dev/null +++ b/content/doc.dj @@ -0,0 +1,14 @@ +title = "Document ID" +id = "doc?2025-08-24-doc" + ++++ + +If you've stumbled upon this page, this means you followed the URL stored in the `` field inside an Atom feed ``. + +I can't blame you. +It _is_ a URL after all. + +But the post you're looking for isn't here, as the `https://liquidex.house/doc` namespace is reserved for document IDs, and does not resolve to actual documents. +If your feed reader led you here, it is broken, because ``s are *not meant to be followed.* + +To read a post, follow the `` link instead! diff --git a/content/fmt.dj b/content/fmt.dj index c11a0a4..76cc6ae 100644 --- a/content/fmt.dj +++ b/content/fmt.dj @@ -1,4 +1,6 @@ title = "A string formatting library in 65 lines of C++" +id = "b?01K39HT2MW0JWTP5MNH1CHGV2Y" +tags = ["all", "programming", "cxx"] +++ diff --git a/content/furry.dj b/content/furry.dj index ccc76b3..2aca585 100644 --- a/content/furry.dj +++ b/content/furry.dj @@ -1,4 +1,6 @@ title = "furry! —w—" +id = "b?01K05F3E3DN1PY9ZWN98ZE5HVV" +tags = ["all", "shower"] +++ diff --git a/content/furry/v1.tree b/content/furry/v1.tree index 31b5e1e..5128743 100644 --- a/content/furry/v1.tree +++ b/content/furry/v1.tree @@ -1,4 +1,6 @@ -%% title = "furry! —w—" +%% id = "b?01JCGVBXW42S8G91SGAKYCQZE1" +title = "furry! —w— (version 1)" +tags = ["all", "shower"] % id = "01JCGVBXW35X3965J2MJQH1AFY" - I like fur! @@ -78,7 +80,7 @@ it's really pleasant to the touch. % id = "01JCGVBXW3GB041DMXFCWGQK23" - but the customisation options are just so boooring! everybody looks pretty much the same. - + % id = "01JCGVBXW3XQJBGZEJXSW7SET1" + you get to customise your shape and color of your hair, but not the size and placement of your ears, or the level and color of your floof? @@ -127,7 +129,7 @@ it's really pleasant to the touch. % id = "01JCGVBXW3JBY0MSFMKYF2H2WQ" - why _of course_ furries are not harmful you dumbass! what even made you think that? - + % id = "01JCGVBXW3XMBF58FSAX1BH6TB" - maybe it's time to swim out of there before the pressure crushes you? diff --git a/content/games/minecraft-zen.tree b/content/games/minecraft-zen.tree index 8062476..c1c4dd3 100644 --- a/content/games/minecraft-zen.tree +++ b/content/games/minecraft-zen.tree @@ -1,4 +1,6 @@ -%% title = "reflections on Minecraft" +%% id = "b?01JGSNTVGFX416HFWKFYKR9HZM" +title = "reflections on Minecraft" +tags = ["all", "games"] % id = "01JGRJPSTR8SPPTVCGCP26YGF7" - Minecraft has been with me for around 14 years by now; a majority of my life! I first started playing around beta `1.3_01`. @@ -91,7 +93,7 @@ % id = "01JGSC4K515MSY1K9Z2AJXNJER" - I mean, coming across 3 End Portals and seeing the portal room is glitched is kind of funny, but... - + it also feels like a bit of an ass move once you know the full story, doesn't it. % id = "01JGRJPSTRNMYAKWT96Q2N2JCM" @@ -231,7 +233,7 @@ % id = "01JGSA36C2RPJ1HYF8RTF2M5N4" - there needs to be a non-tool item next to the axe, so that you can break leaves without using up your axe's durability. that's food, because hunger in this game is a bitch. - + % id = "01JGSMFMQVCF8FHMX18DQG22R4" - I opted for items on _both_ sides, because I like the fact that I can scroll either up _or_ down to put away my axe, and it works equally well. @@ -389,7 +391,7 @@ % id = "01JGRNC1F4946XGCASYXSNVC4M" - #### graffiti (31 December) - + on New Year's Eve, we built _this_ with [ezioleq][def:person/ezioleq]: ![the boykisser on a map][pic:01JGRW9M3E0YNBY0SN6YT1PN0N] @@ -416,30 +418,30 @@ ![][pic:01JGSDKAQ870V71XV9SSNE50R8] obviously, there's one in my bedroom. - + ![][pic:01JGSDKWCET10GM0FD5M751VRH] there's one on the train station... the sign reads "SOUTH CENTRE." - + ![][pic:01JGSDMD581MF4MRTAWG376FGY] on the tree in the town square. - + ![][pic:01JGSDN6XF8QWGEKSR4A944SXK] on the ceiling in Olek's bedroom. - + ![][pic:01JGSDNRT56D1AC8W4CKT5HDFP] in a friend's house. though, it seems like his is Australian. - + ![][pic:01JGSDP9RBJ6B47TVGGBKPB306] in someone's house. must be Australian too. - + ![][pic:01JGSDPTY3Z0HW5V9DQNDWQR1W] in another someone's house. - + ![][pic:01JGSDR74AQ4MKGC5J23KVTT9C] in the walls of the [gord](https://en.wikipedia.org/wiki/Gord_%28archaeology%29) at the spawn. - + ![][pic:01JGSDRMYSBRZMAMHBAJ2QV4N0] and on my treehouse, of course. @@ -447,13 +449,13 @@ % id = "01JGRNC1F44MMXE1ZP8X1C7HPJ" - #### billboard (2 January) - + the last thing I built was this. ![a huge billboard over the whole town saying COMES][pic:01JGRXJWQH689TJ4HXT00TTJ6G] whoever knows what this is a reference to, congratulations! - + myself, I hold no regrets. % id = "01JGRNC1F479Y7MNFR41ESGG7J" @@ -502,9 +504,9 @@ - ![a powered rail loop connected to an upwards slope, with a lever that opens the loop. there are a bunch of signs around it.][pic:01JGSFCQBDN6V47SE8SC7WRMAN] > POLISH BRANCH of CERN - accelerator - + > PARTICLE ACCELERATOR - + > HADRON COLLIDER > ACCELERATION DOESN'T KILL YOU\ diff --git a/content/h.dj b/content/h.dj index ec530d3..6f0c3c0 100644 --- a/content/h.dj +++ b/content/h.dj @@ -1,4 +1,6 @@ title = "header files are cool, actually" +id = "b?01K1Y3G5N1KGCN1E9B36QTYMSZ" +tags = ["all", "programming", "c", "cxx"] +++ diff --git a/content/index.dj b/content/index.dj index 0c8120f..45f389d 100644 --- a/content/index.dj +++ b/content/index.dj @@ -1,5 +1,5 @@ title = "riki's house" -include_feed = { name = "new", title = "Blog" } +include_feed = { tag = "all", title = "Blog" } +++ diff --git a/content/music/a-moon-shaped-pool.tree b/content/music/a-moon-shaped-pool.tree index 5a386d5..90f3ffe 100644 --- a/content/music/a-moon-shaped-pool.tree +++ b/content/music/a-moon-shaped-pool.tree @@ -1,4 +1,6 @@ -%% title = "Radiohead - A Moon Shaped Pool" +%% id = "b?01H9JB094CHQHEYEBKBCHFFCKG" +title = "Radiohead - A Moon Shaped Pool" +tags = ["all", "music"] % id = "01H9JB094C60Q6DR1E7SME7Y0N" - buy: [Bandcamp](https://radiohead.bandcamp.com/album/a-moon-shaped-pool) diff --git a/content/music/blue-calx.tree b/content/music/blue-calx.tree index d715550..e07c37d 100644 --- a/content/music/blue-calx.tree +++ b/content/music/blue-calx.tree @@ -1,4 +1,6 @@ -%% title = "Aphex Twin - Blue Calx" +%% id = "b?01JCY18RY6D3CXHQ0JQ56BZH60" +title = "Aphex Twin - Blue Calx" +tags = ["all", "music"] % id = "01JCY18RY6T32XGTM21T6581Z5" - overcoming [fear of the unknown][page:philosophy/fear-of-the-unknown], episode 1. diff --git a/content/music/brainz.tree b/content/music/brainz.tree index ef7efce..a819fba 100644 --- a/content/music/brainz.tree +++ b/content/music/brainz.tree @@ -1,4 +1,6 @@ -%% title = "the ListenBrainz data set" +%% id = "b?01J73BSWA15KHTQ21T0S14NZW0" +title = "the ListenBrainz data set" +tags = ["all", "programming", "music"] % id = "01J73BSW7VS69RQ84XWRAEYEHV" - I've been using [ListenBrainz](https://listenbrainz.org) as my primary way of keeping track of my listens for a couple years now---I diff --git a/content/music/creatures.tree b/content/music/creatures.tree index 38e5b6f..c8b0263 100644 --- a/content/music/creatures.tree +++ b/content/music/creatures.tree @@ -1,4 +1,6 @@ -%% title = "the curious case of Amon Tobin's Creatures" +%% id = "b?01JBAGZAZ30K443QYPK0XBNZWM" +title = "the curious case of Amon Tobin's Creatures" +tags = ["all", "music"] % id = "01JBAGT450TPYYB0W5Q3RB017W" - I bought Amon Tobin's [Bricolage](https://amontobin.bandcamp.com/album/bricolage) way back in September last year, but only today noticed that my copy seemed to be... corrupted? diff --git a/content/music/dubio.tree b/content/music/dubio.tree index 249cd64..7b0d4b1 100644 --- a/content/music/dubio.tree +++ b/content/music/dubio.tree @@ -1,4 +1,6 @@ -%% title = "Kettel - Dubio" +%% id = "b?01JQYKYRF2RRY2DEV2Z8MSYJ4F" +title = "Kettel - Dubio" +tags = ["all", "music"] % id = "01JQYKNE7YW4VEQQZ9P3ZQEHRC" - as _Dubio_ opens with its title track, I am taken into the mountains. diff --git a/content/music/flacks.tree b/content/music/flacks.tree index 4a6655d..98462fe 100644 --- a/content/music/flacks.tree +++ b/content/music/flacks.tree @@ -1,11 +1,13 @@ -%% title = "The Flashbulb - Flacks / aBliss" +%% id = "b?01JHXVRT2HR6TXC2V9JG2XTZVB" +title = "The Flashbulb - Flacks / aBliss" +tags = ["all", "music"] % id = "01JHXV738MT1DF4T4DQWJ16PED" - walking in the mountains, you see flags waving in the distance... % id = "01JHXV738M04MAFAY7XTQKSX9R" - you take in the majesty of the rocky landscape around you. - + % id = "01JHXVEPM9NHMFJND9GRPRQ89R" - the difficulty of the hike makes your heart pound. diff --git a/content/music/i-dont-love-me-anymore.tree b/content/music/i-dont-love-me-anymore.tree index 7d64312..b1266de 100644 --- a/content/music/i-dont-love-me-anymore.tree +++ b/content/music/i-dont-love-me-anymore.tree @@ -1,4 +1,6 @@ -%% title = "Oneohtrix Point Never - I Don't Love Me Anymore" +%% id = "b?01J8ZP2EG9TM8320R9E3K1GQEC" +title = "Oneohtrix Point Never - I Don't Love Me Anymore" +tags = ["all", "music"] % id = "01J8ZKEB7JNVWZY0CDR7Y3HRA6" + a track from Oneohtrix Point Never's _Magic Oneohtrix Point Never_. [bandcamp link](https://oneohtrixpointnever.bandcamp.com/album/magic-oneohtrix-point-never) @@ -7,7 +9,7 @@ - by the way I'm listening to Magic OPN right now as I'm writing this. _Tales from the Trash Stratum_ just started playing and *(once again)* - + I thought I'd gotten a notification on Discord. I swear to fucking God, this shit gets me every time. xD diff --git a/content/music/map-of-what-is-effortless.tree b/content/music/map-of-what-is-effortless.tree index a507f15..967cbe2 100644 --- a/content/music/map-of-what-is-effortless.tree +++ b/content/music/map-of-what-is-effortless.tree @@ -1,4 +1,6 @@ -%% title = "Telefon Tel Aviv - Map of What Is Effortless" +%% id = "b?01H9R1NKBB7NCQM8GJ3907P7F7" +title = "Telefon Tel Aviv - Map of What Is Effortless" +tags = ["all", "music"] % id = "01H9R1NKBBVMRYPK024ED8P1CH" - buy: [Bandcamp](https://telefon-tel-aviv.bandcamp.com/album/map-of-what-is-effortless) diff --git a/content/music/ok-computer.tree b/content/music/ok-computer.tree index 6f2bbc4..82a6a46 100644 --- a/content/music/ok-computer.tree +++ b/content/music/ok-computer.tree @@ -1,4 +1,6 @@ -%% title = "Radiohead - OK Computer" +%% id = "b?01H969NN1ACXG26T2NHCM7BHYY" +title = "Radiohead - OK Computer" +tags = ["all", "music"] % id = "01H969NN1ACMHAYB8QX7SNCVJC" - buy: [Bandcamp](https://radiohead.bandcamp.com/album/ok-computer) diff --git a/content/music/syro.tree b/content/music/syro.tree index 8bab46d..f415527 100644 --- a/content/music/syro.tree +++ b/content/music/syro.tree @@ -1,4 +1,6 @@ -%% title = "Aphex Twin - Syro" +%% id = "b?01H9DQNG9ARCX91Z15MWTB0A6B" +title = "Aphex Twin - Syro" +tags = ["all", "music"] % id = "01H9DQNG9AYRET7KY8SBXFCH98" - buy: [Bandcamp](https://aphextwin.bandcamp.com/album/syro) diff --git a/content/music/tilt-shift-ablaze.tree b/content/music/tilt-shift-ablaze.tree index 01d6897..bc832ff 100644 --- a/content/music/tilt-shift-ablaze.tree +++ b/content/music/tilt-shift-ablaze.tree @@ -1,4 +1,6 @@ -%% title = "Floating Points - Tilt Shift / Ablaze" +%% id = "b?01JK5SN2ZBDZTFZ27J3KNT4SQV" +title = "Floating Points - Tilt Shift / Ablaze" +tags = ["all", "music"] % id = "01JK5SN2WBQ1Y4SR1BQGSKRAKG" - the two last tracks on Floating Points's latest album, [_Cascade_](https://floatingpoints.bandcamp.com/album/cascade). diff --git a/content/page-tags.dj b/content/page-tags.dj new file mode 100644 index 0000000..eff88fd --- /dev/null +++ b/content/page-tags.dj @@ -0,0 +1,148 @@ +title = "Tagging pages" +id = "doc?20250826-page-tags" +tags = ["all", "design", "treehouse"] +updated = "2025-08-26T19:20:00+02:00" + ++++ + +The vision of the [freehouse][page:design/freehouse] has been fulfilled. +Hobby corners are no more, say welcome to... tags! + +Public pages on the website are now _tagged_, meaning that each page has a set of categories assigned to it. + +I've been working on it for the past few days, and I really like the result! + +--- + +I have to give a disclaimer: *this change could've broken my blog in your feed reader!* + +If that's the case, I am terribly sorry for the havoc caused.\ +I tried to keep the breaking changes to a minimum, but I can't predict everything. + +--- + +You might say to me, "But riki, isn't this what blogs do _by default_? +Why did it take considerable engineering effort to get to this?" + +To which I can respond that sometimes, learning something valuable takes a few failed attempts. + +I originally set out with the goal of this blog being a bit non-standard. +This is what the whole nesting tree format was about. +I thought it would be super cool and ultra flexible any time I wanted to make some major changes to the website's structure. + +Originally, I set out with a design for "hobby corners," where each of my hobbies was a foldable section in the tree. + +- Programming + + - Article 1 + - Article 2 + +- Design + + - Article 1 + - Article 2 + +- Music + + - ... + +- Philosophy (shower thoughts) + +The reality is, that design never underwent any changes. +The website has largely stayed the same, and the supposedly flexible structure of the tree has resulted in me _falling into one obvious spot_ rather than experimenting. + +And when I _was_ seeing the design's deficiencies, I could never alter them, because turns out laying out your webpage like that actually makes it _very rigid_! + +Trust me, there's nothing more flexible than blocks of text. + +{style="max-width: 90%; text-align: right; padding-top: 4lh"} +I mean, look at this.\ +Would you be able to do something like this with a tree? + +{style="text-align: center; padding-bottom: 4lh"} +I fear not. + +So I settled on a more standard blog-like structure for the 2nd iteration. +But the old system remained, including [the old `new` page][page:treehouse/new.tree], which already implemented an idea of _feeds_ for transforming the tree into [an Atom feed](/feed/all.atom). + +When I transitioned the blog to its 2nd iteration, I used that old feed system to show a post list on the home page. +That system supported assigning tags to entries, which were available as `` tags in the generated Atom feed. +I showed those tags in the home page feed too, so that you could see what categories a post belongs to. +There was no way to filter through tags, though. + +By my own stupidity, I also made it impossible to Ctrl+F for `#tagname` by inserting the hash tag `#` via `::before` in CSS. + +--- + +After the 2nd iteration, which got rid of hobby corners, I really wanted to bring them back. +I really liked the idea of having a "front page" for each subcategory of posts, where I could give further context on a hobby, opinions on a technology, or an overview of a project. + +So with today's update, I revamped the tags a bit. + +I made each tag have [its][page:tag/programming] [own][page:tag/design] [home][page:tag/music] [page][page:tag/shower]. +You can browse them all [here][page:tag]. +There's also a special tag `#all`, for posts listed on the [home page][page:index]. + +Doing this required reworking the feed system a bit. + +I abandoned the idea of generating a feed from a tree file. +Each page now defines tags and an ID for the Atom feed on its own. + +```djot +title = "A tagging system for pages" +id = "doc?20250826-page-tags" +tags = ["all", "treehouse"] +updated = "2025-08-26T19:20:00+02:00" + ++++ + +The vision of the [freehouse][page:design/freehouse] has been fulfilled. +Hobby corners are no more, welcome to... tags! +``` + +The `tags` field is used to assign the page to different tags. +There's also `updated` for sorting pages in a tag chronologically. + +Then, each document is allowed to display a feed next to itself. +This is my replacement for a special-case system for generating a list of posts. + +```djot +title = "#programming" +include_feed = { tag = "programming", title = "Pages" } + ++++ + +Honestly my favourite thing to do. +I've been programming for over 10 years now, and there's no sign of it stopping. +``` + +The feed is generated by listing all pages under a tag, and sorting them from newest to oldest. + +Each page in the feed lists all the (other) tags it belongs to. +Clicking on a tag will take you to its corresponding `tag/{tagname}` page, which in all cases is literally just an ordinary document reusing that `include_feed` mechanism. + +(I actually devised this `include_feed` mechanism for the home page, just now it's rewritten to use tags instead of feed pages.) + +On wide enough displays, that feed is shown as a [sidebar][page:design/sidebars], which is why I only ever inflict it upon you on main pages for tags. +I wouldn't want you to get distracted with it while reading a full post. + +But having those main pages serving as descriptions for tags honestly feels great. +It feels to me like it will make the whole system more interesting for the readers of the blog. +Combine this with the fact that I intend to follow the [Lobsters philosophy](https://lobste.rs/about#tagging) of not adding too many tags, to make them feel _really meaningful_, rather than "just another blogger's meaningless attempt at grouping their posts." + +I've seen lots of bloggers fall into the trap of defining tags too soon ahead of time, and ending up with lots of tags that only ever have one post in them. +I'd like to avoid that by only adding tags once there are a few posts which can't be better categorised into something else. + +--- + +I know this post is a bit all over the place. +But I really wanted to share it, because I think it's a cool lesson in humility. + +I wanted to create a brilliant system with an infinitely nesting tree. +It turned out too complicated, so I reverted to something more ordinary: a blog with tags. + +But at the same time, I saw space for improvement in that ordinary system: making tags feel more meaningful through a small set of them with long descriptions. + +Sometimes the simplest systems are, in fact, the coolest. + +There's a reason why so many people implement them, after all. diff --git a/content/philosophy/fear-of-the-unknown.tree b/content/philosophy/fear-of-the-unknown.tree index e2512da..83c463c 100644 --- a/content/philosophy/fear-of-the-unknown.tree +++ b/content/philosophy/fear-of-the-unknown.tree @@ -1,4 +1,6 @@ -%% title = "fear of the unknown" +%% id = "b?01JCGVBXW39D0GJTZY53A25TXT" +title = "fear of the unknown" +tags = ["all", "shower"] % id = "01JCGVBXW41374C1TEEYH8245B" + no matter how long you live, you will always live in fear. diff --git a/content/philosophy/hedonic-treadmill.tree b/content/philosophy/hedonic-treadmill.tree index 8d08074..3596cac 100644 --- a/content/philosophy/hedonic-treadmill.tree +++ b/content/philosophy/hedonic-treadmill.tree @@ -1,4 +1,6 @@ -%% title = "hedonic treadmill" +%% id = "b?01HFYZKREV93QY3K7KNNFSW90H" +title = "hedonic treadmill" +tags = ["all", "shower"] % id = "01HFYZKREVV2CX1GYJQ18BJS78" - a concept that's incredibly useful in keeping it cool diff --git a/content/philosophy/i-build-things.tree b/content/philosophy/i-build-things.tree index 8a147b4..bc43013 100644 --- a/content/philosophy/i-build-things.tree +++ b/content/philosophy/i-build-things.tree @@ -1,4 +1,6 @@ -%% title = '"I build things"' +%% id = "b?01JBAK3T1ZSSTHRN6TTSXXBAKK" +title = '"I build things"' +tags = ["all", "shower"] % id = "01JBAK3T1ZMTJS5A9Z5VFFQR0V" - aka how to sound like the most boring software developer ever. diff --git a/content/philosophy/in-wisdom-you-become-old.tree b/content/philosophy/in-wisdom-you-become-old.tree index 82be44f..1c4ae1b 100644 --- a/content/philosophy/in-wisdom-you-become-old.tree +++ b/content/philosophy/in-wisdom-you-become-old.tree @@ -1,4 +1,6 @@ -%% title = "in wisdom you become old" +%% id = "b?01J1Q8SBGFYKDATVF85XYWMSV2" +title = "in wisdom you become old" +tags = ["all", "shower"] % id = "01J1Q8SBGFNS3ZSSA1QXN83SMH" + this is kind of weird, but recently I have noticed I no longer keep up with slang diff --git a/content/philosophy/light-streaks.tree b/content/philosophy/light-streaks.tree index 7369e71..c214822 100644 --- a/content/philosophy/light-streaks.tree +++ b/content/philosophy/light-streaks.tree @@ -1,4 +1,6 @@ -%% title = "my weird stim: writing with light streaks" +%% id = "b?01JG55SF4FRRF9RDW9KMYHAECF" +title = "my weird stim: writing with light streaks" +tags = ["all", "shower"] % id = "01JG55KYCYD0CHXQ582XTAHMP6" - a long time ago my brain built up a [stim][] that it likes to perform when bored: I draw words with my eyes. diff --git a/content/philosophy/nicknames.tree b/content/philosophy/nicknames.tree index 6c4b001..da077c5 100644 --- a/content/philosophy/nicknames.tree +++ b/content/philosophy/nicknames.tree @@ -1,4 +1,6 @@ -%% title = "on nicknames" +%% id = "b?01JBWHXTMKYRW5XXDJG9VQNF5E" +title = "on nicknames" +tags = ["all", "shower"] % id = "01JBWHXTMKTDGDBATFM9H27KZK" - my given name is Gabriel. @@ -148,7 +150,7 @@ sharing your real data online when you're a kid sounds like a _baaad_ idea. % id = "01JBWHXTMK9QAJGHHM9VRQ02M3" - also, while it supposedly helped me protect me as a kid, it also caused _so much_ unnecessary self-hate. - + % id = "01JBWHXTMK4SMAMG4W61E02ZSV" - it instilled [a fear of seeing pictures of myself](https://www.youtube.com/watch?v=aNKrcwOG-SE){.secret}. diff --git a/content/philosophy/responsibility.tree b/content/philosophy/responsibility.tree index a19bf8e..28f0e49 100644 --- a/content/philosophy/responsibility.tree +++ b/content/philosophy/responsibility.tree @@ -1,11 +1,13 @@ -%% title = "on responsibility & conformity" +%% id = "b?01JDJ0RH4DJCNS7TPCRZHRPSRF" +title = "on responsibility & conformity" +tags = ["all", "shower"] % id = "01JDJ0RH4DTY60R2Y0Y3J9FH0W" - most of us probably can't imagine holding a company talk on a tech conference while wearing a fursuit. % id = "01JDJ0RH4DBDP937C7CB2CY5EP" - I had this revelation today that it would be extremely funny if I did something like that, only for the thought of harsh reality to come knocking at my door. - + % id = "01JDJ0RH4DVMQ6T3H7EQY86QCD" - if you're giving a presentation on behalf of your company, you are _representing_ the company, so any clownage you pull will have negative consequences on the company's [PR]{title="public relations"}. @@ -57,7 +59,7 @@ what's wrong with speaking in a fluffy suit on a tech conference? % id = "01JDJ0RH4DRQW5XR9N7M7QZXCV" - there are cases where you _have_ to stay serious, where [life's on the line](https://www.youtube.com/watch?v=1QNoygm8bEY){.secret title="And therefur riki did not stay serious and did his usual secret music link shenaniganry, including a furry joke in this very sentence you're reading right now. Splendid."} and some could _fucking die or get permanently hurt_. - + % id = "01JDJ0RH4D6FT1Y7M7XGBXM83A" - but since our species's inception, we as humans have become more than just hunter-gatherers. we partake in _culture_. diff --git a/content/philosophy/riki.tree b/content/philosophy/riki.tree index 35843a0..9ecf9fc 100644 --- a/content/philosophy/riki.tree +++ b/content/philosophy/riki.tree @@ -1,4 +1,6 @@ -%% title = "nickname change!" +%% id = "b?01JGXQ5E8DHAEYFTHG0RB86VNE" +title = "nickname change!" +tags = ["all", "meow", "shower"] % id = "01JGXMY094E9AGM67T7EXAW25Z" - I'm changing my nickname from liquidex to *riki*! diff --git a/content/philosophy/shut-up.tree b/content/philosophy/shut-up.tree index b7c1dcd..56c7da3 100644 --- a/content/philosophy/shut-up.tree +++ b/content/philosophy/shut-up.tree @@ -1,4 +1,6 @@ -%% title = "just shut up sometimes" +%% id = "b?01HREVZNAH3PMMN29C6HNFQ7P9" +title = "just shut up sometimes" +tags = ["all", "shower"] % id = "01HREVZNAH8XFRMVB9G58TPV8R" - I just caught myself writing a few paragraphs long comment on [Lobsters](https://lobste.rs) without really understanding what the author of the comment meant in the broader context of the discussion, diff --git a/content/programming/aoc.tree b/content/programming/aoc.tree index 1a7447c..89a796f 100644 --- a/content/programming/aoc.tree +++ b/content/programming/aoc.tree @@ -1,4 +1,6 @@ -%% title = "Advent of Code feels" +%% id = "b?01JDZKAP3KT4AD36F6HPJTEM4Z" +title = "Advent of Code feels" +tags = ["all", "programming", "shower"] % id = "01JDZKMFQZS2VVNQ3R9WDS81TS" - I wonder if I'm the only one who can never get into [Advent of Code](https://adventofcode.com). @@ -35,7 +37,7 @@ there is always something to work on. % id = "01JDZKMFQZP2723GMYB2HMJFR2" - I like to build my software to solve real world problems---mostly my own, but I like to imagine it could one day become useful for someone else, too. - + % id = "01JDZKMFQZWF0F0G6822298N5Z" - egoistic altruism, y'know. it's why all the code I write outside of work is open source. diff --git a/content/programming/buildsome.tree b/content/programming/buildsome.tree index 8cc5581..36d9de0 100644 --- a/content/programming/buildsome.tree +++ b/content/programming/buildsome.tree @@ -1,4 +1,6 @@ -%% title = "not quite buildless" +%% id = "b?01J7C1KBZ58BR21AVFA1PMWV68" +title = "not quite buildless" +tags = ["all", "programming", "treehouse"] % id = "01J7BYKQGYPF50050K67N2MP1G" - ...buildsome? @@ -56,7 +58,7 @@ enjoy! % id = "01J7BYKQGY7QEAN677Q9AT4T0V" - I'll put _probably_ the most interesting bit right at the start. the treehouse is _not quite_ buildless. - + % id = "01J7BYKQGYRV6TKEACZ0DXNDG4" - one might even call it... buildsome? I mean, it's not quite buildful, and definitely not buildless...? @@ -147,7 +149,7 @@ enjoy! % id = "01J7BYKQGY0PR13G71PK163976" - if I _wanted_ to implement incremental builds, I feel like the dependency tracking would get pretty hellish pretty quickly. - + % id = "01J7BYKQGY75XN1HBVZ110D16P" - say a `.tree` file uses the `include_static` template directive to include some file into itself. now in addition to compiling the `.tree` file when it changes, I'd also need to recompile the `.tree` file when that `include`d`_static` file changes too---and that sort of dependency tracking is ripe for bugs as the codebase grows more complex! @@ -223,7 +225,7 @@ enjoy! % id = "01J7EMBKN42WH0BKXKDQ020F8M" - you can also provide source maps to transfer optimal minified sources by default, and let your browser's DevTools display your original sources to the user upon their request. - + % id = "01J7EMJYX91P3RE3PEBM2M3MR1" - the important part is that having _some_ form of readable sources _right on your page_ is really nice! @@ -237,7 +239,7 @@ enjoy! - the reason is that I don't want to waste time testing my website separately on release mode, so having it behave differently in subtle ways means more bugs! % id = "01J7BYKQGY6KJ6ZZX4EREEAB79" - - there are only two parts of the treehouse that behaves differently between debug and release mode. + - there are only two parts of the treehouse that behaves differently between debug and release mode. % id = "01J7BYKQGYB4G0J7TZQCF4X7W6" - generation speed, and... @@ -316,7 +318,7 @@ enjoy! async fn back_up() -> String { "".into() - } + } ``` % id = "01J7BYKQGYDY8E84BEM5V7MMGB" @@ -333,7 +335,7 @@ enjoy! % id = "01J7BYKQGYVS4CZGVC4ZHGJ7KF" - also, `tower-livereload` also has a couple disadvantages compared to the solution I've shown here. - + % id = "01J7BYKQGY3P95RM10ZZGRP2Y3" - it's slow, because it only polls the server's `/back-up` endpoint every second, which increases reload latency. I've bumped that up to polling every 100ms in my script, because I don't like slow. @@ -377,7 +379,7 @@ enjoy! % id = "01J7BYKQGYM9HD00VY2BVEZPZ0" - _customized built-in elements_, which extend _any_ built-in element. - these are applied using the `is=""` attribute on a base built-in element, like `
  • `. + these are applied using the `is=""` attribute on a base built-in element, like `
  • `. % id = "01J7BYKQGY90D6C0KF9CFSMF1A" - unfortunately customized built-in elements are practically useless, because Safari doesn't implement them, [and doesn't even plan to do so](https://github.com/WICG/webcomponents/issues/509#issuecomment-222860736)... @@ -408,7 +410,7 @@ enjoy! ``` and off we go! - + % id = "01J7BYKQGY6YE329DB9PMY8KNW" - I've found a couple useful idioms for working with custom elements. @@ -476,7 +478,7 @@ enjoy! % id = "01J7BYKQGYYBY9RDFJG8BP61QP" - and that's it! the actual value of the `?cache` parameter is never interpreted by anyone, anyhow. - it's only there so that whenever something _does_ change, we change the URL, and the browser thinks that "hey, that's a different asset! gotta download it." + it's only there so that whenever something _does_ change, we change the URL, and the browser thinks that "hey, that's a different asset! gotta download it." that way, the browser only ever downloads files that changed since your last visit. @@ -540,7 +542,7 @@ enjoy! % id = "01J7C16RSZ7NHE5N3KV57NGWT0" - okay cool we're getting somewhere, - + % id = "01J7C16RSZQPMABF0SBDH1RHA7" - "and then we could even cache that import map with a `?cache` parameter too---" @@ -589,10 +591,10 @@ enjoy! % id = "01J7BYKQGYMMCAKQX9S8JCTJW6" - as time went on though, I discovered another light markup language: [_Djot_](https://djot.net/), made by the same person who made Markdown, with _lots_ of lessons learned from his previous attempt. - + % id = "01J7BYKQGYQQP0YSWA1TEHRB9S" - I initially didn't wanna go through with it, because "_sigh_ am I really gonna have to rewrite my entire content to use Djot?" - + % id = "01J7BYKQGYSKJNTB7BGKTED4S0" + but then I did it anyways, because life's too short to have to deal with poorly designed markup languages :hat_smug: @@ -638,7 +640,7 @@ enjoy! % id = "01J7C16RSZAECM1G9CD57WX1M6" - I am pushing into a string, that literally cannot fail! (other than with an OOM, but that's a panic) - + % id = "01J7BYKQGYJMRC7DY7SNMAQ538" - the HTML generation code got cleaner, because the crate I'm using---[`jotdown`](https://lib.rs/crates/jotdown)---does not use a callback for filling in broken links. a pattern that's best known under the moniker "yeah, don't do that" in the Rust world. @@ -676,14 +678,14 @@ enjoy! % id = "01J7BYKQGYV3H2WX6VVSR9EFEF" - what's funny is that it dies dropping a `rustc-ice-YYYY-MM-DDTHH_MM_SS-NNNNN.txt` file into your current working directory, and combined with `cargo-watch` this has the super funny effect of generating tens of those files in the treehouse repo. - + % id = "01J7C16RT0H84KPGJMBK1QT84E" - I have forgotten to remove these before checking in at least once before. I don't think I ever ended up pushing that commit though, so I can't show you... [but you can see the ICE I have stored in my local Git history here](/static/text/rustc-ice-2024-07-20T21_00_23-69819.txt). % id = "01J7C16RT0R80J7KN516B06Q05" - an annoying side effect is that to fix this, I have to `^C` out of `cargo-watch`, run `cargo clean`, run `cargo-watch` again, and wait until the whole project compiles. - + % id = "01J7C16RT0XX4PZYRXAAV2M7P9" - at least it's a debug build... diff --git a/content/programming/cstring-starts-with.tree b/content/programming/cstring-starts-with.tree index 1965bee..8e519e7 100644 --- a/content/programming/cstring-starts-with.tree +++ b/content/programming/cstring-starts-with.tree @@ -1,4 +1,6 @@ -%% title = "prefix matches with C strings" +%% id = "b?01JCGAM553TJJCEJ96ADEWETQC" +title = "prefix matches with C strings" +tags = ["all", "programming", "c", "cxx"] % id = "01JCGAM55352EF247HZ358BAJ8" - one thing I realised while reading some code at work that worked with C strings: it's surprising how easy it is to match a prefix on a C string. diff --git a/content/programming/cxx-without-classes.tree b/content/programming/cxx-without-classes.tree index 43f08ed..2247598 100644 --- a/content/programming/cxx-without-classes.tree +++ b/content/programming/cxx-without-classes.tree @@ -1,4 +1,6 @@ -%% title = "C++ without Classes" +%% id = "b?01JN72M4EXSR6M120A6CW2D0X7" +title = "C++ without Classes" +tags = ["all", "programming", "cxx"] % id = "01JN6EFWCPWY65AQ27BGFDT2DV" - one thing I often see in people's code in C++ is putting _everything_ into a class. diff --git a/content/programming/cxx/access-modifiers-as-labels.tree b/content/programming/cxx/access-modifiers-as-labels.tree index 317339d..212714d 100644 --- a/content/programming/cxx/access-modifiers-as-labels.tree +++ b/content/programming/cxx/access-modifiers-as-labels.tree @@ -1,4 +1,6 @@ -%% title = "C++ syntactic pitfall: access modifiers as labels" +%% id = "b?01H9R1KJES6FC89NMC7J0FJT6P" +title = "C++ syntactic pitfall: access modifiers as labels" +tags = ["all", "programming", "cxx"] % id = "01H9R1KJES39Z6RBCKY4E71PYD" - although Java and C#'s approach to symbol privacy may be verbose, it has one great advantage: it is stateless. diff --git a/content/programming/cxx/shared-unique-ptr-deleter.tree b/content/programming/cxx/shared-unique-ptr-deleter.tree index a5fe4a9..c56ba44 100644 --- a/content/programming/cxx/shared-unique-ptr-deleter.tree +++ b/content/programming/cxx/shared-unique-ptr-deleter.tree @@ -1,4 +1,6 @@ -%% title = "freeing C memory automatically using `std::unique_ptr` and `std::shared_ptr`" +%% id = "b?01J0VNHPTRNC1HFXAQ790Y1EZB" +title = "freeing C memory automatically using `std::unique_ptr` and `std::shared_ptr`" +tags = ["all", "programming", "cxx"] % id = "01J0VN48B2E9WZ4QW0X69N2KB8" - say you need to interface with a C library such as SDL2 in your C++ code diff --git a/content/programming/haku.tree b/content/programming/haku.tree index 03ab55e..6a16d20 100644 --- a/content/programming/haku.tree +++ b/content/programming/haku.tree @@ -1,5 +1,7 @@ -%% title = "haku - writing a little programming language for fun" +%% id = "b?01J4J5N6WZQ03VTB3TZ51J7QZK" +title = "haku - writing a little programming language for fun" scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-programming.js"] +tags = ["all", "programming", "plt"] % id = "01J3K8A0D1774SFDPKDK5G9GPV" - I've had this idea on my mind as of late, of a little pure functional programming language that would run in your browser. @@ -85,7 +87,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program | identifier | 9 | 21 | `s-expression` | | ) | 21 | 22 | `)` | | end of file | 22 | 22 | | - + % id = "01J3K8A0D1GGQ292D4MQBCGHWC" - to lex the input into tokens, we'll need to know the input string (of course), and where we currently are in the string. @@ -185,7 +187,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program } } } - + printTokens(`()((()))`); ``` @@ -376,7 +378,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program lexer.advance(state); return "error"; - }; + }; ``` % id = "01J3K8A0D1DKA8YCBCJVZXXGR4" @@ -859,7 +861,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program ``` that's... the same string. - + % id = "01J3K8A0D1XP4FQB2HZR9GV5CJ" - let's try something more complicated, with comments and such. @@ -887,10 +889,10 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program % id = "01J3K8A0D10DRSP49WF8YH5WSH" - of course this is hardly the _prettiest_ printer in the world. - + % id = "01J3K8A0D1VCJ7TV6CN7M07N5J" - for one, it does not even preserve your comments. - + % id = "01J3K8A0D1K3M9223YM96PS68B" - it does not add indentation either, it just blindly dumps a minimal S-expression into the console. @@ -950,7 +952,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program % id = "01J3K8A0D1F4R8KPHETV9N08YP" - it's definitely not how I would write a parser nowadays. it's pretty similar, but the syntax tree structures are quite different - it doesn't use the [lazy parsing][branch:01J3K8A0D1FYBKJ6X2W17QAK3Z] trick I talked about before. - + % id = "01J3K8A0D178J6W49AFCE9HEQ6" - I mean, it's only a trick I learned last year! @@ -1008,7 +1010,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program ``` for now we'll leave it empty. - + % id = "01J3NVV2RX2T5K473GGY3K5VBX" - in the meantime, let's prepare a couple convenient little wrappers to run our code: @@ -1092,7 +1094,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program {:program=haku} ```javascript export const builtins = {}; - + treewalk.eval = (state, node) => { switch (node.kind) { case "integer": @@ -1862,7 +1864,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program {:program=haku} ```javascript - treewalk.eval = (state, node) => { + treewalk.eval = (state, node) => { switch (node.kind) { case "integer": let sourceString = state.input.substring(node.start, node.end); @@ -2032,7 +2034,7 @@ scripts = ["treehouse/vendor/codejar.js", "treehouse/components/literate-program throw new Error(`unhandled node kind: ${node.kind}`); } }; - + builtins.fn = (state, node) => { if (node.children.length != 3) throw new Error("an `fn` must have an argument list and a result expression"); diff --git a/content/programming/javascript.tree b/content/programming/javascript.tree index f089a65..79f2fd6 100644 --- a/content/programming/javascript.tree +++ b/content/programming/javascript.tree @@ -1,8 +1,10 @@ -%% title = "JavaScript is not as bad as people make it out to be" +%% id = "b?01J293BFEBT15W0Z3XF1HEFGZT" +title = "JavaScript is not as bad as people make it out to be" scripts = [ "treehouse/components/literate-programming.js", "treehouse/vendor/codejar.js", ] +tags = ["all", "programming", "javascript", "plt"] % id = "01J291S06DS12DCFTNKJ27BNSQ" - _ooh I'm sure this one is gonna be really controversial but here I go_ diff --git a/content/programming/lua.tree b/content/programming/lua.tree index c7fe886..fc36827 100644 --- a/content/programming/lua.tree +++ b/content/programming/lua.tree @@ -1,4 +1,6 @@ -%% title = "Lua - a scripting language you can like" +%% id = "b?01HRG3VN091V715A8T54QK5PVX" +title = "Lua - a scripting language you can like" +tags = ["all", "programming", "plt", "lua"] % id = "01HRG2RJC1BATZJSGSSSF1XNFZ" - TODO: this page could really use an interactive Lua interpreter. can we have that? diff --git a/content/programming/lua/classes.dj b/content/programming/lua/classes.dj index 565470e..a603f49 100644 --- a/content/programming/lua/classes.dj +++ b/content/programming/lua/classes.dj @@ -1,4 +1,6 @@ title = "Classes in Lua" +id = "b?01JKKQZRSG5ZRNH530D75E2660" +tags = ["all", "programming", "lua"] +++ diff --git a/content/programming/lua/classes.tree b/content/programming/lua/classes.tree index cf9dfc3..d746af1 100644 --- a/content/programming/lua/classes.tree +++ b/content/programming/lua/classes.tree @@ -301,7 +301,7 @@ local Player = Entity:inherit() ```lua local Cat = {} -- We still need to override __index, so that the metatable we set in our own constructor - -- has our overridden `speak()` method. + -- has our overridden `speak()` method. Cat.__index = Cat -- To be able to call `Animal` methods from `Cat`, we set it as its metatable. -- Remember that `Animal.__index == Animal`. @@ -380,7 +380,7 @@ local Player = Entity:inherit() -- insert below the `end` of `function Class:inherit()` -- By default, let's make the base `Class` impossible to instantiate. - -- This should catch bugs if a subclass forgets to override `initialize`. + -- This should catch bugs if a subclass forgets to override `initialize`. function Class:initialize() error("this class cannot be initialized") end @@ -462,7 +462,7 @@ local Player = Entity:inherit() % id = "01JKKQHG5DQW7G1HDWYGX4WEYC" - our class library implements a Ruby-style `Object:new(args)` function for constructing new instances of our class. - Python however, uses the syntax `Object(args)` for constructing instances of objects. + Python however, uses the syntax `Object(args)` for constructing instances of objects. can you think of a way to make our class library use the Python-style syntax? % id = "01JKKQHG5D7QN029A3F1B6SYC2" diff --git a/content/programming/lvalues.tree b/content/programming/lvalues.tree index 21f2bb8..e4bc2e5 100644 --- a/content/programming/lvalues.tree +++ b/content/programming/lvalues.tree @@ -1,4 +1,6 @@ -%% title = "places, or what is up with `*x` not always meaning the same thing in different contexts" +%% id = "b?01HY5R1ZW2PYZSSP2J2KAA23DA" +title = "places, or what is up with `*x` not always meaning the same thing in different contexts" +tags = ["all", "programming", "c", "cxx", "plt"] % id = "01HY5R1ZV9DD7BV0F66Y0DHAEA" - I recently got a question from my someone telling me they doesn't understand why `*x` does not read from the pointer `x` when on the left-hand side of an assignment. diff --git a/content/programming/new-tab.tree b/content/programming/new-tab.tree index 01b9e1f..fcbfcb8 100644 --- a/content/programming/new-tab.tree +++ b/content/programming/new-tab.tree @@ -1,4 +1,6 @@ -%% title = "on changing the Firefox New Tab, and software freedom" +%% id = "b?01JX0GYB1D4W3A6FRPBG738N4F" +title = "on changing the Firefox New Tab, and software freedom" +tags = ["all", "programming"] % id = "01JX0G5CN5H8S7S3M4619R112A" - the date is 4th of June, 2025. @@ -69,7 +71,7 @@ "chrome_settings_overrides": { "homepage": "index.html" } - } + } ``` % id = "01JX0G5CN5SSANM732FB8M6ZSV" diff --git a/content/programming/or-types.tree b/content/programming/or-types.tree index 1dbb283..3006fa4 100644 --- a/content/programming/or-types.tree +++ b/content/programming/or-types.tree @@ -1,4 +1,6 @@ -%% title = "OR-types" +%% id = "b?01HTWNETT2S5NSBF3QR4HYA7HN" +title = "OR-types" +tags = ["all", "programming", "plt"] % id = "01HTWN4XAD7C41X8XKRBFZMHJ8" - last night I couldn't fall asleep because I was thinking how sites like [Anilist](https://anilist.co) implement their tag-based search systems. diff --git a/content/programming/systems.tree b/content/programming/systems.tree index 0d6a3fd..3821944 100644 --- a/content/programming/systems.tree +++ b/content/programming/systems.tree @@ -1,4 +1,6 @@ -%% title = "systems are just a bunch of code" +%% id = "b?01HV1DGFHZ65GJVQRSREKR67J9" +title = "systems are just a bunch of code" +tags = ["all", "programming", "shower"] % id = "01HV1DGFGNV3DXD8A3CW2J4RZP" - often enough I see people scared to dive deep into the internals of their favorite technologies diff --git a/content/programming/tairu.tree b/content/programming/tairu.tree index 9828aec..e65e3e9 100644 --- a/content/programming/tairu.tree +++ b/content/programming/tairu.tree @@ -1,9 +1,11 @@ -%% title = "tairu - an interactive exploration of 2D autotiling techniques" +%% id = "b?01HQ6G30PTVT5H0Z04VVRHEZQF" +title = "tairu - an interactive exploration of 2D autotiling techniques" scripts = [ "treehouse/components/literate-programming.js", "treehouse/vendor/codejar.js", ] styles = ["page/tairu.css"] +tags = ["all", "programming", "graphics", "javascript"] % id = "01HPD4XQPWM8ECT2QM6AT9YRWB" - I remember since my early days doing programming, I've been interested in how games like Terraria handle automatically tiling their terrain. @@ -209,7 +211,7 @@ styles = ["page/tairu.css"] borderWidth: 4, }); ``` - + {:program=tairu :placeholder=01HQ49TJZFMK719KSE16SG3F7B} ```output ``` @@ -436,7 +438,7 @@ styles = ["page/tairu.css"] ``` {:program=tairu :placeholder=01HQ49X8Z57FNMN3E79FYF8CMG} - ```output + ```output ``` % id = "01HQ162WWA03JAGJYCT0DRZP24" @@ -461,7 +463,7 @@ styles = ["page/tairu.css"] ``` {:program=tairu :placeholder=01HQ49YDPQXYSAT5N6P241DG3C} - ```output + ```output ``` % id = "01HQ162WWAB0AYSPGB4AEVT03Z" @@ -490,7 +492,7 @@ styles = ["page/tairu.css"] ``` {:program=tairu :placeholder=01HQ49Z8JWR75D85DGHCB34K8E} - ```output + ```output ``` % id = "01HQ1K39AS4VDW7DVTAGQ03WFM" @@ -514,7 +516,7 @@ styles = ["page/tairu.css"] % classes.branch = "tileset-four-to-eight-demo" id = "01HQ1K39ASR81NWMW8Q0MF8QMP" - enhance! - + {% NOTE djot: I don't there's a way to achieve this in Djot alone %} ``` =html
      @@ -599,7 +601,7 @@ styles = ["page/tairu.css"] ``` {:program=tairu :placeholder=01HQ4A01MPE6JT5ZZFEN9S635W} - ```output + ```output ``` % id = "01HQ1K39AS7CRBZ67N1VVHCVME" @@ -953,7 +955,7 @@ styles = ["page/tairu.css"] ``` {:program=tairu :placeholder=01HQ4A11RRXEQ850598GFBJN0B} - ```output + ```output ``` % id = "01HQ1M84GSCXTPGVPXY840WCQ6" @@ -984,7 +986,7 @@ new TilesetTileEditor({ ``` {:program=tairu :placeholder=01HQ4A45WNAEJGCT2WDMQJHK14} -```output +```output ``` :nap: {{ config.user.canonical_url }} - {{ feed.updated }} + {{ updated }} {{ config.user.title }} {{ config.user.description }} @@ -29,17 +35,17 @@ {{ config.user.canonical_url }} - {{#each feed.entries}} + {{#each feed.entries as |entry|}} - {{ ../config.user.feed_id_prefix }}/b?{{ id }} + {{ ../config.user.feed_id_prefix }}/{{ id }} {{ updated }} {{ title }} - {{#each categories as |category|}} - + {{#each tags as |tag|}} + {{/each}} - {{ summary }} + {{/each}} diff --git a/template/components/_doc.hbs b/template/components/_doc.hbs index 0afa630..1a1310f 100644 --- a/template/components/_doc.hbs +++ b/template/components/_doc.hbs @@ -4,6 +4,11 @@ {{#if (ne page.tree_path 'index')}}

      {{ page.title }}

      + {{#if page.updated}} + + {{/if}} +
      {{/if}} diff --git a/template/components/_feed.hbs b/template/components/_feed.hbs index 780ef75..158014c 100644 --- a/template/components/_feed.hbs +++ b/template/components/_feed.hbs @@ -8,8 +8,8 @@
        - {{#each categories as |category|}} -
      • {{ category }}
      • + {{#each tags as |tag|}} +
      • #{{ tag }}
      • {{/each}}
      diff --git a/template/components/_head.hbs b/template/components/_head.hbs index bbed9c8..123d78f 100644 --- a/template/components/_head.hbs +++ b/template/components/_head.hbs @@ -72,6 +72,4 @@ clever to do while browser vendors figure that out, we'll just have to do a cach -{{#each feeds as |feed_name|}} - -{{/each}} + diff --git a/treehouse.toml b/treehouse.toml index c65d9a6..8867871 100644 --- a/treehouse.toml +++ b/treehouse.toml @@ -58,6 +58,8 @@ feed_id_prefix = "https://liquidex.house" [feed] tags = [ + "all", + # Hobby corners "meow", "programming", @@ -78,7 +80,6 @@ tags = [ # Projects "treehouse", - "haku", ] [redirects.path] @@ -115,6 +116,9 @@ tags = [ # 2025-07-15 furry v2 "philosophy/furry" = "furry" +# 2025-08-25 tags +"tag/all" = "index" + [emoji] [pics]