Skip to content

Commit e51e566

Browse files
cb341claude
andauthored
Convert threads to a collection (#20)
* Convert threads to a collection One file per entry in _threads/; /threads/ and the RSS feed loop over site.threads instead of string-splitting one big markdown page. Replaces the threads_feedback.rb plugin (the page emits feedback links itself) and adds a month-grouped TOC with entry teasers. Heading anchors and feed GUIDs are unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * End TOC teasers with ellipsis Trailing sentence punctuation is stripped first so truncation never renders as '....'. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Default thread entry date and title from filename threads_defaults.rb derives date from the YYYY-MM-DD filename prefix and title from the date; front matter overrides both (the three suffixed 11.05 entries keep theirs). Plain entries need no front matter. Also shrinks the TOC styling to two rules. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> * Drop front matter from thread entries entirely Jekyll reads front-matter-less collection files as static files; threads_defaults.rb now promotes them to documents before applying the filename-derived date/title defaults. A new entry is just a markdown file named YYYY-MM-DD.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent b4091ec commit e51e566

17 files changed

Lines changed: 958 additions & 944 deletions

_config.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ collections:
1313
output: true
1414
permalink: /gallery/:slug/
1515
sort_by: order
16+
threads:
17+
output: false
18+
sort_by: date
1619

1720
defaults:
1821
- scope:

_plugins/threads_defaults.rb

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
require "time"
2+
3+
# Threads entries need no front matter. Jekyll reads front-matter-less files
4+
# as static files, so promote them to documents first; then date defaults to
5+
# the YYYY-MM-DD filename prefix and title to that date in site.date_format.
6+
# Front matter, when present, overrides both. Jekyll pre-fills title with a
7+
# titleized slug ("2026 06 08"), so a title still matching that is treated
8+
# as absent.
9+
Jekyll::Hooks.register :site, :post_read do |site|
10+
collection = site.collections["threads"]
11+
12+
collection.files.each do |file|
13+
doc = Jekyll::Document.new(file.path, site: site, collection: collection)
14+
doc.read
15+
collection.docs << doc
16+
end
17+
collection.files.clear
18+
19+
collection.docs.each do |doc|
20+
filename_date = doc.basename_without_ext[/\A\d{4}-\d{2}-\d{2}/]
21+
doc.data["date"] ||= Time.parse(filename_date) if filename_date
22+
23+
auto_title = Jekyll::Utils.titleize_slug(doc.basename_without_ext)
24+
if doc.data["title"].nil? || doc.data["title"] == auto_title
25+
doc.data["title"] = doc.data["date"].strftime(site.config["date_format"])
26+
end
27+
end
28+
end

_plugins/threads_feedback.rb

Lines changed: 0 additions & 19 deletions
This file was deleted.

_threads/2026-04-10.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
_decided to introduce threads alongside blog articles to make space for more frequent thoughts_
2+
3+
physically sick today, in real pain.
4+
5+
seems like my physical health has finally caught up to my mental health. having both hit at once made me question things harder than usual.
6+
7+
dug a bit into philosophers this week, mainly Socrates, Nietzsche, Singer. first time actually engaging with them. these are rough impressions, not (yet) positions.
8+
9+
### Thoughts
10+
11+
* starting to think knowledge might be one of the more honest ways to spend time
12+
* been looking into nihilism for a while now, still seems like one of the more honest ways to look at things
13+
* found [this breakdown](https://www.thecollector.com/nietzsche-most-famous-quotes/) of Nietzsche's quotes by Luke Dunne surprisingly clear and useful
14+
also came across:
15+
> "We should consider every day lost on which we have not danced at least once."
16+
17+
and kind of want to lean into that direction as a counterbalance
18+
* it seems to me that a lot of society runs on noise that does not lead anywhere
19+
* came across the idea that ignorance might be something people actively stay in, not just fall into
20+
* reading into the idea that what we call evil might often be miscalculation or lack of understanding rather than intent
21+
* Singer: the idea that charity is not generosity but something closer to duty, and that most excuses for not helping might just be comfort
22+
* the void is real. i've looked at it. it looked back. It's scary. but it also seems to be the only thing that is not fake. I am trying to accept it but it's difficult.
23+
* starting to suspect that being disliked by people who are comfortable might mean you are challenging something
24+
25+
still figuring things out. no conclusions just yet...

_threads/2026-04-21.md

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
learned the formal names for derivative notations today.
2+
3+
- Newton: $\dot{x}$, $\ddot{x}$, $\dddot{x}$, $\ddddot{x}$
4+
- Lagrange: $f'$, $f''$, $f'''$, $f^{(4)}$
5+
- Leibniz: $\frac{df}{dx}$, $\frac{d^2f}{dx^2}$, $\frac{d^3f}{dx^3}$, $\frac{d^4f}{dx^4}$
6+
7+
I hate Leibniz. it is so many tokens. Newton says the same thing with a single dot. why would anyone pick the bulky one?
8+
9+
also stumbled on the [wikipage](https://en.wikipedia.org/wiki/Fourth,_fifth,_and_sixth_derivatives_of_position) for higher-order derivatives of position. soo...
10+
11+
position → velocity → acceleration → jerk → snap → crackle → pop?
12+
13+
these sound so silly :P I can't imagine using them in a real paper, but they are fun to say.
14+
15+
and the latex for Newton dots is delightful. `dot` for one, `ddot` for two d'ots, `dddot` for three d'ots, `ddddot` for four. love it. but the dots in a row get boring for higher orders. why not play with the arrangement? (I mean there's probably a plethera of reasons why we don't, but it's fun to think about it anyway)
16+
17+
$$
18+
\dot{x}
19+
\quad \ddot{x}
20+
\quad \dddot{x}
21+
\quad \ddddot{x}
22+
23+
\quad \text{vs.}
24+
25+
\quad \dot{x}
26+
\quad \ddot{x}
27+
\quad \overset{\begin{smallmatrix} \cdot \\ \cdot \,\, \cdot \end{smallmatrix}}{x}
28+
\quad \overset{\substack{\cdot \kern{1.4pt} \cdot \\[-0.2ex] \cdot \kern{1.4pt} \cdot}}{x}
29+
$$
30+
31+
but then I started thinking about it.
32+
33+
each notation shows up in a different place. the spring mass equation uses Newton: $m\ddot{x} = -kx$. clean with no ambiguity and time being the only variable that matters. Lagrange shows up in textbooks and pure math, $f'(x)$ when there's nothing to disambiguate. I really like the scalability as you can fall back to $f^{(n)}$ when you have more than three derivatives, which is a nice perk.
34+
35+
Leibniz dominates numerical integration and anything with multiple variables. $\frac{dx}{dt} \approx \frac{\Delta x}{\Delta t}$ almost writes the discretization for you.
36+
37+
and then partial derivatives: $\frac{\partial f}{\partial x}$, $\frac{\partial^2 f}{\partial x \partial y}$. Newton and Lagrange can't express this cleanly at all. the moment you have $f(x, y)$, a dot or a prime stops being enough. you need to name the variable you're differentiating against whereas Leibniz was built for it.
38+
39+
but it's super verbose. look at _this_ Jacobi matrix:
40+
41+
$$Df = \begin{bmatrix}
42+
\frac{\partial f_1}{\partial x} & \frac{\partial f_1}{\partial y} & \frac{\partial f_1}{\partial z} & \frac{\partial f_1}{\partial w} & \frac{\partial f_1}{\partial v} \\
43+
\frac{\partial f_2}{\partial x} & \frac{\partial f_2}{\partial y} & \frac{\partial f_2}{\partial z} & \frac{\partial f_2}{\partial w} & \frac{\partial f_2}{\partial v} \\
44+
\frac{\partial f_3}{\partial x} & \frac{\partial f_3}{\partial y} & \frac{\partial f_3}{\partial z} & \frac{\partial f_3}{\partial w} & \frac{\partial f_3}{\partial v} \\
45+
\frac{\partial f_4}{\partial x} & \frac{\partial f_4}{\partial y} & \frac{\partial f_4}{\partial z} & \frac{\partial f_4}{\partial w} & \frac{\partial f_4}{\partial v} \\
46+
\frac{\partial f_5}{\partial x} & \frac{\partial f_5}{\partial y} & \frac{\partial f_5}{\partial z} & \frac{\partial f_5}{\partial w} & \frac{\partial f_5}{\partial v}
47+
\end{bmatrix}$$
48+
49+
painful to write on a chalkboard. found out there's [a shorthand](https://en.wikibooks.org/wiki/General_Relativity/Coordinate_systems_and_the_comma_derivative) called the comma derivative where $f_{i,j} \equiv \frac{\partial f_i}{\partial x_j}$, but replacing variable names with numbers loses readability. i don't like numbers that much, they're harder to parse.
50+
51+
so here's a proposal: output component as a superscript, input variable as a subscript. $f^{(1)}_x \equiv \frac{\partial f_1}{\partial x}$. parentheses around the superscript so it doesn't get read as an exponent. it reads "derive this, this much, by that."
52+
53+
$$Df = \begin{bmatrix}
54+
f^{(1)}_x & f^{(1)}_y & f^{(1)}_z & f^{(1)}_w & f^{(1)}_v \\
55+
f^{(2)}_x & f^{(2)}_y & f^{(2)}_z & f^{(2)}_w & f^{(2)}_v \\
56+
f^{(3)}_x & f^{(3)}_y & f^{(3)}_z & f^{(3)}_w & f^{(3)}_v \\
57+
f^{(4)}_x & f^{(4)}_y & f^{(4)}_z & f^{(4)}_w & f^{(4)}_v \\
58+
f^{(5)}_x & f^{(5)}_y & f^{(5)}_z & f^{(5)}_w & f^{(5)}_v
59+
\end{bmatrix}$$
60+
61+
row index goes up, column index goes down. names stay and the $\frac{\partial}{\partial}$ shenanigins disappear. it's like an extension of the Lagrange notation. probably already exists somewhere and I just haven't seen it. I think it is super cool :3
62+
63+
same thing shows up in code:
64+
65+
```ruby
66+
class Person
67+
attr_accessor :age, :name, :created_at, :email, :company_id, :start_date, :gender
68+
end
69+
```
70+
71+
```rust
72+
struct Person<'a> {
73+
age: u32,
74+
name: &'a str,
75+
created_at: DateTime<Utc>,
76+
email: String,
77+
company_id: u64,
78+
start_date: NaiveDate,
79+
gender: Arc<RwLock<Box<dyn Spectrum + Send + Sync + 'a>>>,
80+
}
81+
```
82+
83+
Ruby assumes you can apply common sense. `age` is years. `name` is a string. `created_at` is a timestamp. you don't need a type annotation to tell you that, the word already did. Rust spells it out anyway. `u32` not `i32`, not `u64`. `&'a str` not `String` _and_ now you need a lifetime too, something Ruby doesn't even have a concept for. feels a bit wasteful on a higher level, until you hit something like `gender`, where the name alone genuinely doesn't tell you the shape, and suddenly you're writing `Arc<RwLock<Box<dyn Spectrum + Send + Sync + 'a>>>`. or when you actually care about memory and don't just rely blindly on an interpreter to do the right thing.
84+
85+
the bulk is the information. Newton's dots assume time. Lagrange's primes assume you already know. Leibniz assumes nothing.
86+
87+
still...
88+
89+
_how many other defaults am i using that look wasteful until i see what they're doing?_

_threads/2026-04-23.md

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
setting up nctl for local dev today and misread "goreleaser" as "gore leaser". couldn't unsee it after.
2+
3+
started noticing it everywhere:
4+
5+
- postgres / post gres
6+
- github / git hub
7+
- linkedin / linked in
8+
- dropbox / drop box
9+
- therapist / the rapist
10+
- nowhere / now here
11+
12+
the letters don't change. so what does?
13+
14+
why did i read it one way the first hundred times and another way today? was the second reading always there, waiting? if so, what decides which one i get? and if two readings sit in the same letters, how many am i missing in everything else i read?

_threads/2026-05-04.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
been thinking a lot about AI and software engineering.
2+
3+
not sure what software engineering even is anymore.
4+
work has felt...
5+
empty lately ; mostly prompting agents. describing what should exist instead of building it. it works. things get done. but it doesn't feel like *doing*.
6+
7+
had a discussion at work where we compared it to brewing beer.
8+
9+
you can buy beer. or you can brew it yourself.
10+
the process is the point.
11+
12+
but with code it's different.
13+
14+
you don't just buy it. you don't even have to make it.
15+
you can just… ask for it.
16+
17+
you can't prompt a beer into existence.
18+
you still have to go through the process.
19+
20+
with code, the process is optional.
21+
22+
---
23+
24+
if i can describe a system and have it built, what part of it is mine?
25+
if i don't write the code, do i still understand it?
26+
27+
and if i *do* write it, am i just choosing the slower path on purpose?
28+
29+
do i even need to understand it at all, if an AI can take the entire project, code, docs, discussions, git history, and pinpoint what matters?
30+
31+
---
32+
33+
AI can read everything. suggest fixes. propose optimizations.
34+
so what is left for me to do?
35+
36+
is it enough to say "make it faster"?
37+
but what does "faster" even mean?
38+
39+
---
40+
41+
I tried reducing engineering into a loop:
42+
something feels slow → measure → fix → measure again
43+
44+
measure what?
45+
fix based on which assumption?
46+
what if the assumption is wrong?
47+
48+
---
49+
50+
AI gives answers. often good ones.
51+
52+
but what is an answer worth if it hasn't been tested?
53+
54+
if correctness only appears after something is run and observed,
55+
is engineering just the act of confronting reality?
56+
57+
---
58+
59+
i still like writing code.
60+
61+
not sure why _exactly_.
62+
63+
maybe because it feels like real work?
64+
maybe because it forces me to understand things?
65+
maybe because i have more control over the process?
66+
maybe because it is the actual act of creation, not just the idea of it?
67+
maybe because it allows me to prove to myself that i understand something, not just claim it?
68+
maybe because it feels like a craft, something that requires skill and practice to get better at? But so does prompting, no? Why does it feel so different?
69+
70+
**if i remove that, what is left?**

_threads/2026-05-10.md

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
Been thinking about RTGs again (radioisotope thermoelectric generators) after a long tangent that started with how things cool in the vacuum of space.
2+
3+
They’re basically nuclear batteries that produce steady heat from plutonium-238 decay for decades. In space they’re elegant. On Earth they’re mostly avoided. But the radiation they emit is interesting in a darker way.
4+
5+
Radiation brute-forces mutations. It increases the error rate in DNA copying. Most of those errors are harmful or neutral. A tiny fraction might be beneficial. Under extreme selective pressure (fire, radiation, starvation, etc.), the few survivors can carry traits that look like accelerated evolution, namely radiation resistance, fire resistance, better DNA repair, darker pigmentation, etc.
6+
7+
So theoretically: set an area on fire repeatedly while exposing it to controlled radiation and you might sculpt organisms that are extremely hardy to both. Like lab-directed evolution but on a landscape scale. Chernobyl’s Red Forest + later wildfires already did a messy version of this experiment.
8+
9+
It feels like the ultimate "move fast and break things" approach to biology. Flood the system with noise and variation, kill almost everything, and see what’s left standing. Evolution by catastrophe.
10+
11+
Reminds me of the AI conversation. We can now brute-force code into existence by describing it. No need for the slow, careful craft. Is that better? Or are we just trading understanding for speed and volume?
12+
13+
Same question here: does flooding the genome with mutations and extreme selection actually accelerate meaningful progress? Or does it mostly create suffering and dead ends with a few hardened survivors?
14+
15+
Nature already does this slowly with fire, volcanoes, solar radiation. We could do it faster. The question is whether we should, and what we lose in the process.
16+
Most mutations are bad. Most attempts fail. The “forward” leaps are rare and expensive.
17+
18+
Still...
19+
the black Chernobyl frogs are real. They happened in ~30 years.
20+
21+
Curious what other traits we could force if we tried.

_threads/2026-05-11-afternoon.md

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
---
2+
title: "11.05.2026 (afternoon)"
3+
date: 2026-05-11 15:00
4+
---
5+
(yes this entry contains filler, are you yet frustrated by it?)
6+
7+
recently discovered the RFC writing style for the internet.
8+
[RFC 2119](https://datatracker.ietf.org/doc/html/rfc2119) defines a handful of keywords meant to remove ambiguity from specifications:
9+
10+
> 1. MUST This word, or the terms "REQUIRED" or "SHALL", mean that the
11+
> definition is an absolute requirement of the specification.
12+
>
13+
> 2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the
14+
> definition is an absolute prohibition of the specification.
15+
>
16+
> 3. SHOULD This word, or the adjective "RECOMMENDED", mean that there
17+
> may exist valid reasons in particular circumstances to ignore a
18+
> particular item, but the full implications must be understood and
19+
> carefully weighed before choosing a different course.
20+
> 4. ...
21+
22+
we SHOULD apply this to everyday language.
23+
24+
daily language is mostly filler. greetings burn tokens.
25+
when both sides agree the goal is to exchange information, not feelings, email is high friction for no reason.
26+
27+
on a different note:
28+
can we make it socially acceptable to write emails in a colder, denser way?
29+
30+
**BEFORE**
31+
>
32+
> Guten Abend zusammen!
33+
>
34+
> Wir haben eine Reservation für die Drachenhöhle am Freitag, 08.05.2026.
35+
> Ursprünglich hatten wir mit etwa 18 Personen geplant, aber es sieht nun so aus, dass wir am Ende etwa 8 Personen sein werden. Da fragen wir uns, ob ein Wechsel zur Hobbithöhle Sinn machen würde. Für eine kleinere Gruppe wäre das wahrscheinlich die gemütlichere Atmosphäre.
36+
>
37+
> Falls das noch möglich ist, würden wir uns sehr freuen. Ansonsten kommen wir natürlich auch gerne in die Drachenhöhle :)
38+
>
39+
> Vielen Dank und freundliche Grüsse
40+
>
41+
> Dani Bengl (it/its)
42+
43+
intention is buried. greeting, setup, filler, hedge, thanks. politeness at the cost of signal.
44+
45+
what i actually wanted to say:
46+
47+
**AFTER**
48+
>
49+
> Reservation Fr. 08.05.2026, Drachenhöhle.
50+
> Teilnehmer: 18→8.
51+
> Wechsel zu Hobbithöhle möglich?
52+
>
53+
> Dani Bengl (it/its)
54+
55+
the organizers will extract that core from my original anyway.
56+
then they formulate their own core ("room available, will move", or "possible but maybe keep the bigger room"), pad it with filler, send.
57+
i receive, scan, decode, repeat.
58+
59+
why can't human ↔ human communication skip the encode/decode step?
60+
61+
maybe it can. open the channel with a header:
62+
63+
> the following message is optimized for density. no impoliteness implied.
64+
> <message>
65+
66+
and inside, reduce vocabulary for load-bearing words. MUST, MUST NOT, SHOULD, MAY. capitalized as in the RFC.
67+
68+
builds on top of [a-optimized-language](https://cb341.dev/blog/a-optimized-language/), section "Why I prefer talking to an LLM over humans".
69+
70+
i'll try it. either non-engineers read me as cold and heartless, or they appreciate the efficiency.

_threads/2026-05-11-midnight.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
---
2+
title: "11.05.2026 (midnight)"
3+
date: 2026-05-11 00:00
4+
---
5+
caught myself asking Claude to move a file for me today.
6+
not debug something. not explain something. move a file.
7+
8+
the strange part wasn't that it worked. it was how little resistance i felt.
9+
my first instinct was delegation.
10+
11+
used to think understanding came from doing things directly.
12+
staying with the problem long enough for it to shape you a little.
13+
14+
now i can skip most of that.
15+
describe the outcome. wait a few seconds. approve the result.
16+
17+
it works. sometimes better than i would have done myself.
18+
but something about it feels deeply lonely.
19+
20+
like the distance between thought and reality is collapsing, and with it the need for me to exist anywhere in the middle.
21+
22+
not sure what remains once the process becomes optional.

0 commit comments

Comments
 (0)