diff --git a/Gemfile b/Gemfile
index a474ef8..3789a8e 100644
--- a/Gemfile
+++ b/Gemfile
@@ -4,6 +4,7 @@ gem "jekyll", "~> 4.3"
gem "htmlbeautifier"
gem "fastimage"
gem "ferrum", "~> 0.18"
+gem "nokogiri", "~> 1.19"
group :jekyll_plugins do
gem "jekyll-sitemap"
diff --git a/Gemfile.lock b/Gemfile.lock
index 386de41..f9cfc24 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -98,9 +98,30 @@ GEM
rb-inotify (~> 0.9, >= 0.9.10)
logger (1.7.0)
mercenary (0.4.0)
+ mini_portile2 (2.8.9)
+ nokogiri (1.19.4)
+ mini_portile2 (~> 2.8.2)
+ racc (~> 1.4)
+ nokogiri (1.19.4-aarch64-linux-gnu)
+ racc (~> 1.4)
+ nokogiri (1.19.4-aarch64-linux-musl)
+ racc (~> 1.4)
+ nokogiri (1.19.4-arm-linux-gnu)
+ racc (~> 1.4)
+ nokogiri (1.19.4-arm-linux-musl)
+ racc (~> 1.4)
+ nokogiri (1.19.4-arm64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.19.4-x86_64-darwin)
+ racc (~> 1.4)
+ nokogiri (1.19.4-x86_64-linux-gnu)
+ racc (~> 1.4)
+ nokogiri (1.19.4-x86_64-linux-musl)
+ racc (~> 1.4)
pathutil (0.16.2)
forwardable-extended (~> 2.6)
public_suffix (7.0.2)
+ racc (1.8.1)
rake (13.3.1)
rb-fsevent (0.11.2)
rb-inotify (0.11.1)
@@ -175,6 +196,7 @@ DEPENDENCIES
htmlbeautifier
jekyll (~> 4.3)
jekyll-sitemap
+ nokogiri (~> 1.19)
BUNDLED WITH
2.7.2
diff --git a/README.md b/README.md
index 643c434..37aec73 100644
--- a/README.md
+++ b/README.md
@@ -2,31 +2,18 @@
Personal portfolio and blog built with [Jekyll](https://jekyllrb.com/).
-## Setup
+## Development
-```sh
-bundle install
-npm install
-```
-
-## Run
-
-```sh
-bin/run
-```
-
-Builds the site and its article PDFs, then serves the result without rebuilding it.
-Visit `localhost:4000` to view the site. Additional arguments are passed to
-`jekyll serve`.
-
-## Build
+Requires Ruby/Bundler, Node.js 22+, and Chrome 131+.
```sh
-bin/build
+bundle install
+bin/run # build and serve at localhost:4000
+bin/build # build the site and article PDFs
```
-Builds the site and generates a PDF for each blog article with Chrome 131 or newer.
-Math is rendered to inline SVG with MathJax during the build, so Node.js 22 or newer is required.
+Both commands install npm dependencies. `bin/run` does not rebuild on changes;
+restart it to refresh. Arguments go to `jekyll serve` or `jekyll build`, respectively.
Set `BROWSER_PATH` if Chrome or Chromium is installed in a nonstandard location.
## License
diff --git a/_config.yml b/_config.yml
index 91fe842..93c8855 100644
--- a/_config.yml
+++ b/_config.yml
@@ -58,3 +58,4 @@ exclude:
- package.json
- bin/
- design.md
+ - tmp/
diff --git a/_layouts/base.html b/_layouts/base.html
index 8c45fa5..3caa4de 100644
--- a/_layouts/base.html
+++ b/_layouts/base.html
@@ -227,8 +227,26 @@
.article-toc li:not([data-level="2"]) { padding-left: 1em; }
.toc-teaser { display: block; margin-left: 1em; }
}
- @media print { .article-toc { display: none !important; } }
{% endif %}
+ @media print {
+ .article-toc { display: none; }
+ }
+
+ {% assign has_glossary = content | has_glossary %}
+ {% if has_glossary %}
+ /* Glossary */
+ .glossary-term { all: unset; text-decoration: underline dotted; cursor: pointer; }
+ .glossary-term:focus-visible { outline: auto; }
+ .article-glossary { margin: 2em 0; }
+ .article-glossary dt { margin-top: 1em; }
+ .article-glossary dt, .glossary-popup dt { font-weight: bold; }
+ .article-glossary dd, .glossary-popup dd { margin: .25em 0 0; }
+ .glossary-popup { max-width: min(30ch, calc(100vw - 3em)); padding: .75em; }
+ @supports (position-area: bottom) {
+ .glossary-popup { inset: auto; margin: .5em; position-area: bottom; position-try-fallbacks: flip-block; }
+ }
+ {% endif %}
+
@media (prefers-color-scheme: dark) {
html { color-scheme: dark; background: #000; }
body { background: #000; color: #fff; }
diff --git a/_layouts/post.html b/_layouts/post.html
index 3cea47c..920e382 100644
--- a/_layouts/post.html
+++ b/_layouts/post.html
@@ -21,4 +21,6 @@
{{ page.title }}
-{{ content }}
+
+ {{ content }}
+
diff --git a/_plugins/glossary.rb b/_plugins/glossary.rb
new file mode 100644
index 0000000..8775d53
--- /dev/null
+++ b/_plugins/glossary.rb
@@ -0,0 +1,168 @@
+require "cgi"
+require "nokogiri"
+require "set"
+
+# Post/thread front matter holds small selections for tech-blog readers familiar
+# with everyday computing and basic proof vocabulary. Select unfamiliar concepts
+# needed for the piece; use canonical singular labels, precise aliases, and brief
+# reminders. Keep essential explanations in the prose.
+module ArticleGlossary
+ EXCLUDED_TAGS = %w[a button code pre script style textarea select summary h1 h2 h3 h4 h5 h6 svg math mjx-container video audio].freeze
+ EXCLUDED_CLASSES = %w[footnotes article-glossary no-glossary].freeze
+
+ module_function
+
+ def normalize(form)
+ form.downcase.gsub(/[\s\p{Pd}]+/, " ").strip
+ end
+
+ # Case and ordinary spelling variations belong in matching, not YAML aliases.
+ # Irregular plurals and alternate names remain explicit aliases.
+ def matching_forms(form)
+ [form, form.gsub(/(?<=[a-z])(?=[A-Z])/, " ")].map { |value| normalize(value) }.uniq.flat_map do |value|
+ plural = if form.match?(/\b[A-Z][A-Z0-9]+\z/)
+ "#{value}s"
+ elsif value.match?(/[^aeiou]y\z/)
+ value.sub(/y\z/, "ies")
+ elsif value.match?(/(?:s|x|z|ch|sh)\z/)
+ "#{value}es"
+ else
+ "#{value}s"
+ end
+ [value, plural]
+ end.uniq
+ end
+
+ def excluded?(node, root)
+ node.ancestors.take_while { |ancestor| ancestor != root }.any? do |ancestor|
+ EXCLUDED_TAGS.include?(ancestor.name) ||
+ (ancestor["class"].to_s.split & EXCLUDED_CLASSES).any?
+ end
+ end
+
+ def annotate(root, terms, prefix)
+ return if terms.empty?
+
+ forms = {}
+ terms.each_with_index do |term, index|
+ [term.fetch("term"), *term.fetch("aliases", [])].each do |form|
+ matching_forms(form).each do |normalized|
+ if forms.key?(normalized) && forms[normalized] != index
+ raise Jekyll::Errors::FatalException, "Ambiguous glossary form: #{form}"
+ end
+ forms[normalized] = index
+ end
+ end
+ end
+ alternatives = forms.keys.sort_by { |form| -form.length }.map { |form| Regexp.escape(form).gsub("\\ ", "[\\s\\p{Pd}]+") }
+ pattern = Regexp.new("(?#{CGI.escapeHTML(term.fetch("term"))}
+ #{CGI.escapeHTML(term.fetch("definition"))}
+ HTML
+ end.join
+ popovers = terms.each_with_index.map do |term, index|
+ <<~HTML
+
+ HTML
+ end.join
+
+ <<~HTML
+
+ Glossary (#{terms.length})
+ #{items}
+
+ #{popovers}
+ HTML
+ end
+
+ def render(page)
+ return unless page.output&.include?("data-glossary-source")
+
+ site = page.site
+ document = Nokogiri::HTML5.parse(page.output)
+ changed = false
+ document.css("[data-glossary-source]").each do |root|
+ source = root["data-glossary-source"]
+ root.remove_attribute("data-glossary-source")
+ doc = site.documents.find { |item| item.relative_path == source }
+ glossary = doc&.data&.fetch("glossary", nil)
+ next unless glossary&.any?
+
+ terms = glossary.map do |label, term|
+ if term.fetch("definition").strip.empty?
+ raise Jekyll::Errors::FatalException, "Missing glossary definition: #{label} in #{source}"
+ end
+ { "term" => label, **term }
+ end
+
+ prefix = "glossary-#{File.basename(source, '.md')}"
+ annotate(root, terms, prefix)
+ root.add_child(Nokogiri::HTML5.fragment(glossary_html(terms, prefix)))
+ changed = true
+ end
+ return unless changed
+
+ page.output = document.to_html(preserve_newline: true)
+ end
+end
+
+module ArticleGlossaryFilter
+ def has_glossary(html)
+ return false unless html.include?("data-glossary-source")
+
+ site = @context.registers[:site]
+ Nokogiri::HTML5.fragment(html).css("[data-glossary-source]").any? do |root|
+ doc = site.documents.find { |item| item.relative_path == root["data-glossary-source"] }
+ doc&.data&.fetch("glossary", nil)&.any?
+ end
+ end
+end
+
+Liquid::Template.register_filter(ArticleGlossaryFilter)
+
+# Low priority runs after BuildTimeMath, keeping equations outside text matching.
+# RSS and raw Markdown retain the prose.
+Jekyll::Hooks.register [:documents, :pages], :post_render, priority: :low do |page|
+ ArticleGlossary.render(page)
+end
diff --git a/_plugins/threads_defaults.rb b/_plugins/threads_defaults.rb
index bf8ba4b..6c391d7 100644
--- a/_plugins/threads_defaults.rb
+++ b/_plugins/threads_defaults.rb
@@ -1,9 +1,16 @@
require "time"
+# Set the filename date before Jekyll sorts front-matter documents. Explicit
+# front-matter dates replace this default when the document is read.
+Jekyll::Hooks.register :threads, :post_init do |doc|
+ filename_date = doc.basename_without_ext[/\A\d{4}-\d{2}-\d{2}/]
+ doc.data["date"] ||= Time.parse(filename_date) if filename_date
+end
+
# Threads entries need no front matter. Jekyll reads front-matter-less files
-# as static files, so promote them to documents first; then date defaults to
-# the YYYY-MM-DD filename prefix and title to that date in site.date_format.
-# Front matter, when present, overrides both. Jekyll pre-fills title with a
+# as static files, so promote them to documents before setting title defaults.
+# The date defaults to the YYYY-MM-DD filename prefix and the title to that
+# date in site.date_format. Front matter overrides both. Jekyll pre-fills title with a
# titleized slug ("2026 06 08"), so a title still matching that is treated
# as absent.
Jekyll::Hooks.register :site, :post_read do |site|
@@ -17,9 +24,6 @@
collection.files.clear
collection.docs.each do |doc|
- filename_date = doc.basename_without_ext[/\A\d{4}-\d{2}-\d{2}/]
- doc.data["date"] ||= Time.parse(filename_date) if filename_date
-
auto_title = Jekyll::Utils.titleize_slug(doc.basename_without_ext)
if doc.data["title"].nil? || doc.data["title"] == auto_title
doc.data["title"] = doc.data["date"].strftime(site.config["date_format"])
diff --git a/_posts/2024-03-07-bevy-multiplayer.md b/_posts/2024-03-07-bevy-multiplayer.md
index 2cc6fc7..9e23344 100644
--- a/_posts/2024-03-07-bevy-multiplayer.md
+++ b/_posts/2024-03-07-bevy-multiplayer.md
@@ -2,6 +2,30 @@
title: "Multiplayer with Bevy and Renet"
description: "A comprehensive guide to building multiplayer games in Rust using the Bevy game engine and Renet networking library. Learn about Entity-Component-System architecture, client-server synchronization, input handling strategies, and practical implementation of real-time multiplayer features. Perfect for developers wanting to explore game development beyond traditional web technologies."
tags: ["rust", "bevy", "multiplayer", "game"]
+# Distinguish ECS data and behavior, then explain the channel guarantees used for synchronization.
+glossary:
+ ECS:
+ definition: 'Entity-component-system: an architecture where entities identify objects, components hold data, and systems operate on that data.'
+ aliases: [entity component system]
+ ECS component:
+ definition: Data attached to an entity, describing an attribute such as position or marking a role such as player.
+ aliases: [component]
+ ECS system:
+ definition: A scheduled function operating on components and resources; its declared data access lets Bevy safely parallelize compatible systems.
+ aliases: [bevy system]
+ ECS resource:
+ definition: One value per type stored in the ECS world, shared across systems without belonging to an individual entity.
+ data synchronization:
+ definition: Keeping copies of shared state consistent across a server and its clients by exchanging updates.
+ aliases: [synchronization, synchronizing, synchronising]
+ binary message encoding:
+ definition: Representing structured data as bytes for transmission or storage.
+ reliable ordered channel:
+ definition: Retransmits lost messages until acknowledged and delivers them in send order. A missing message delays later ones, suiting joins and departures that must arrive intact.
+ aliases: [reliableordered]
+ unreliable channel:
+ definition: Sends without retransmission or ordering guarantees. Fresh position updates can replace lost ones without waiting, but receivers must reject stale updates arriving late.
+ aliases: [unreliable]
---
Here at Renuo, we specialize in web technologies such as Ruby on Rails, React, Angular, and Spring. One of our core company values is continuous learning: we love exploring new technologies even beyond our usual scope of expertise.
@@ -54,11 +78,13 @@ The [ECS](https://en.wikipedia.org/wiki/Entity_component_system) (Entity Compone
1. **Entities:** Unique identifiers of a group of components (A u32 wrapper in bevy).
2. **Components:** Modular data pieces that represent specific Entity attributes. (A struct that derives the Component macro in bevy)
-3. **System:** Logic that operates on entities and their components. (A struct that derives the Resource macro in bevy)
+3. **ECS system:** A scheduled function that operates on entities, components, and shared resources.
+
+An **ECS resource** is shared data stored once per type in the world, such as the server's `PlayerLobby`; it is a struct that derives `Resource` in Bevy.
### Systems in Bevy
-Systems in Bevy are functions that take various parameters such as queries, EventReaders, assets, and resources and apply logic to them.
+ECS systems in Bevy are functions that take various parameters such as queries, EventReaders, assets, and resources and apply logic to them.
One powerful feature of Bevy systems is the Query interface. It allows you to fetch specific data for entities in your project. For instance, if no entity is found, the `single_mut()` function will raise an error. Multiple queries are possible as long as entities do not overlap.
@@ -200,8 +226,8 @@ cargo run --bin client
To integrate `bevy_renet` into the bevy project, I followed the [Bevy Renet documentation](https://github.com/lucaspoffo/renet/blob/master/bevy_renet/README.md). In my setup, I used these two default channels:
-- **Unreliable:** Used for sending and receiving messages for player attribute synchronization. (We don't care about every state change, we can pick the last one)
-- **ReliableOrdered:** Used for sending and receiving messages for player actions such as joining and leaving.
+- **Unreliable:** Used for player attribute synchronization. Messages are not retransmitted and may arrive out of order. A newer position can replace a lost update without waiting; sequence numbers let a receiver reject older updates that arrive late. The examples below omit that check.
+- **ReliableOrdered:** Used for player actions such as joining and leaving. Lost messages are retransmitted, and messages are delivered in send order. Later messages wait for missing earlier ones, so this channel preserves events at the cost of extra delay during loss.
## Synchronising player positions
diff --git a/_posts/2024-04-14-tmux.md b/_posts/2024-04-14-tmux.md
index 4d2ddd3..cfef110 100644
--- a/_posts/2024-04-14-tmux.md
+++ b/_posts/2024-04-14-tmux.md
@@ -3,6 +3,25 @@ title: "Supercharge Your Tmux Setup"
description: "Transform your terminal workflow with these two game-changing tmux configurations: automatic pane resizing and intelligent dimming of inactive panes. Learn how to use tmux hooks and commands to create a seamless, modern terminal multiplexer experience that rivals integrated solutions like iTerm2 and Warp. Includes practical examples, configuration snippets, and tips for optimizing your development environment."
tags: ["tmux", "terminal"]
preload_image: "/assets/blog/tmux-no-autoresize-poster.webp"
+# A small glossary would distinguish the terminal interface, its subdivisions, and event-driven
+# configuration.
+glossary:
+ terminal multiplexer:
+ definition: A program that manages multiple terminal sessions, windows, and panes within one terminal interface.
+ terminal emulator:
+ definition: An application that displays terminal output and passes keyboard input to programs such as a shell.
+ pane:
+ definition: A region of a terminal multiplexer window displaying its own terminal session.
+ prefix:
+ definition: A key combination telling tmux to interpret the next key as a command.
+ hook:
+ definition: A command configured to run automatically when a particular event occurs.
+ tmux window:
+ definition: A tmux container holding one or more panes within a session, separate from the terminal emulator's window.
+ aliases: [window]
+ tmux layout:
+ definition: The arrangement and relative sizes of panes within a tmux window.
+ aliases: [layout]
---
Tmux is a terminal multiplexer. It is a tool for managing multiple shells inside a single terminal window. It is integrated into most modern terminal emulators like Iterm2 or Warp. In this blog article, I will show you two simple configurations that drastically improved my tmux experience.
diff --git a/_posts/2024-08-03-hotwire-outside-rails.md b/_posts/2024-08-03-hotwire-outside-rails.md
index 8084f9e..3a8eb61 100644
--- a/_posts/2024-08-03-hotwire-outside-rails.md
+++ b/_posts/2024-08-03-hotwire-outside-rails.md
@@ -2,6 +2,28 @@
title: "Hotwire Outside of Rails"
description: "Discover how to implement Hotwire's Turbo Streams and Stimulus in a BunJS application, proving that reactive web development isn't exclusive to Rails. Learn to build real-time chat functionality using WebSockets, Turbo Streams for DOM updates, and Stimulus controllers for interactive behavior. A practical guide that demonstrates the versatility of Hotwire technologies beyond the Ruby ecosystem."
tags: ["bunjs", "hotwire", "websockets"]
+# Persistent connections, messaging patterns, and HTML update mechanisms explain the
+# unfamiliar parts of the stack.
+glossary:
+ WebSocket:
+ definition: A protocol maintaining an open connection so client and server can send messages in either direction.
+ publish–subscribe pattern:
+ definition: The publish-subscribe (pub/sub) pattern lets multiple senders publish to a shared topic received by multiple subscribers.
+ aliases: [multiple publisher - multiple subscriber pattern, pub/sub]
+ Turbo stream:
+ definition: An HTML message describing a page change, such as appending or replacing an element, which Turbo applies.
+ Stimulus controller:
+ definition: A JavaScript class attached to HTML elements through data attributes to handle events and add behavior.
+ HTML over the wire:
+ definition: Sending server-rendered HTML to update a browser interface instead of transmitting data for client-side templating.
+ broadcast:
+ definition: Sending the same message to all connected clients or subscribers.
+ aliases: [broadcasting, broadcasted]
+ pub/sub topic:
+ definition: A named message channel that publishers send to and subscribers listen to.
+ aliases: [topic]
+ data attribute:
+ definition: An HTML attribute prefixed with data- that stores custom values for scripts.
---

diff --git a/_posts/2025-02-28-exploring-rust.md b/_posts/2025-02-28-exploring-rust.md
index 0ecf064..86cbae7 100644
--- a/_posts/2025-02-28-exploring-rust.md
+++ b/_posts/2025-02-28-exploring-rust.md
@@ -2,6 +2,35 @@
title: "Exploring Rust as a Rubyist"
description: "A deep dive into learning Rust as a Ruby developer, exploring the journey of building a voxel game engine with Bevy. From understanding the borrow checker to discovering the power of composition over inheritance, feature flags, and macros. Learn about the trade-offs between Ruby's simplicity and Rust's performance, memory safety, and compile-time guarantees."
tags: ["rust", "gamedev"]
+# Rust and game development introduce concepts that a Ruby reader may not already know.
+glossary:
+ voxel:
+ definition: A volume element representing a cell in three-dimensional space, analogous to a pixel in an image.
+ meshing:
+ definition: Generating vertices and faces that represent a surface for rendering.
+ ECS:
+ definition: 'Entity-component-system: an architecture where entities identify objects, components hold data, and systems operate on that data.'
+ aliases: [entity component system]
+ feature flag:
+ definition: A Cargo configuration switch including or excluding selected Rust functionality at compile time.
+ composition over inheritance:
+ definition: Building types by combining contained objects rather than inheriting behavior through a class hierarchy.
+ trait:
+ definition: A Rust interface specifying behavior that implementing types must provide.
+ macro:
+ definition: A rule or procedure that generates code during compilation.
+ borrow checker:
+ definition: Rust's compile-time analysis that checks references obey ownership and borrowing rules.
+ zero-cost abstraction:
+ definition: An abstraction that adds no runtime overhead compared with equivalent code written without it.
+ metaprogramming:
+ definition: Writing code that generates, inspects, or modifies other code or program structures.
+ struct:
+ definition: A Rust type grouping fields into a single value, with named, positional, or no fields.
+ data race:
+ definition: Concurrent memory accesses from multiple threads, at least one writing and one non-atomic, without adequate synchronization.
+ language server:
+ definition: A program providing editor features such as completion, diagnostics, and refactoring through a shared protocol.
---
At Renuo, we love Ruby. It's simple, elegant, and powerful. But let's be honest, Ruby isn't the fastest language out there.
diff --git a/_posts/2025-08-08-local-zsh.md b/_posts/2025-08-08-local-zsh.md
index 4944b6f..b0289b1 100644
--- a/_posts/2025-08-08-local-zsh.md
+++ b/_posts/2025-08-08-local-zsh.md
@@ -2,6 +2,14 @@
title: "Local zsh"
description: "A short article about zshrc"
tags: ["zsh", "productivity"]
+# Only a small selection is needed; understanding aliases and sourcing is enough to follow
+# the setup.
+glossary:
+ alias:
+ definition: A shell name that expands into other command text.
+ source:
+ definition: Execute a shell file in the current shell, making its aliases, functions, and variables available there.
+ aliases: [sourcing]
---
Different projects often have different setups.
diff --git a/_posts/2025-08-12-hackts-design.md b/_posts/2025-08-12-hackts-design.md
index 86027d4..1f44442 100644
--- a/_posts/2025-08-12-hackts-design.md
+++ b/_posts/2025-08-12-hackts-design.md
@@ -2,6 +2,24 @@
title: "Custom Figma Design Challenges"
description: "How unique spacing and alignment in Figma designs create difficulties in Rails, and why a visual layout editor could help."
tags: ["rails", "css", "sass", "figma", "gui-editor"]
+# Layout vocabulary explains the implementation difficulty and the tradeoffs discussed.
+glossary:
+ box model:
+ definition: CSS's description of an element as content surrounded by padding, a border, and margins.
+ flexbox:
+ definition: A CSS layout system arranging items along a main axis, with controls for alignment, spacing, and wrapping.
+ grid:
+ definition: A CSS layout system placing elements in rows and columns with control over tracks and gaps.
+ inline style:
+ definition: CSS declarations written directly in an HTML element's style attribute.
+ SVG:
+ definition: 'Scalable Vector Graphics: an image format describing shapes and text as vectors, allowing scaling without pixelation.'
+ responsiveness:
+ definition: A layout's ability to adapt to different viewport sizes while keeping content usable and readable.
+ utility class:
+ definition: A reusable CSS class that applies one focused styling rule, such as spacing or text alignment.
+ accessibility:
+ definition: Designing interfaces so people with disabilities can perceive, understand, navigate, and use them.
---
While building the [hackts.ch](https://hackts.ch) site, I encountered layout issues that I did not anticipate. The design came from a highly customised Figma file with precise alignments, irregular shapes and spacing patterns.
diff --git a/_posts/2026-03-28-map-reduce-myself.md b/_posts/2026-03-28-map-reduce-myself.md
index 73ba928..e0150e7 100644
--- a/_posts/2026-03-28-map-reduce-myself.md
+++ b/_posts/2026-03-28-map-reduce-myself.md
@@ -2,6 +2,23 @@
title: "Map-Reducing Myself"
description: "312 conversations with Claude, compressed to 15 words."
tags: ["ai", "reflection", "data"]
+# Language-model limits and information theory explain the summarization pipeline and its
+# compression tradeoffs.
+glossary:
+ chunking:
+ definition: Splitting text into smaller parts that can each be processed within a model's input limit.
+ context window:
+ definition: The maximum number of tokens a language model can handle as input and output together in one request.
+ token:
+ definition: A text unit processed by a language model, such as a word, word fragment, or punctuation mark.
+ Kolmogorov complexity:
+ definition: The length of the shortest program producing a given output, relative to a chosen universal computing system.
+ precondition and postcondition:
+ definition: A condition required before an operation runs, or guaranteed after it completes successfully.
+ aliases: [pre/postcondition]
+ data normalization:
+ definition: Transforming data into a consistent representation for processing or comparison.
+ aliases: [normalized, normalised]
---
I talk to Claude every day. It writes code with me, reviews my PRs, debugs my specs, validates my homework. At 3am it is the thing I talk to when I am still awake and thinking about something I cannot put into words yet. Over six months that added up to 312 conversations and 21MB of JSON.
diff --git a/_posts/2026-03-30-a-optimized-language.md b/_posts/2026-03-30-a-optimized-language.md
index 4aab3fc..4639511 100644
--- a/_posts/2026-03-30-a-optimized-language.md
+++ b/_posts/2026-03-30-a-optimized-language.md
@@ -3,6 +3,39 @@ title: "Compressed Language"
description: "English is bloated, math is dense, and the best language for talking to AI sits somewhere in between."
tags: ["language", "compression", "ai", "communication"]
math: true
+# Specialized language, information theory, and database vocabulary carry the compression
+# argument. Relational algebra and Typoglycaemia intentionally remain glossary-only
+# because their occurrences are in headings and links.
+glossary:
+ formal notation:
+ definition: Symbols and rules with explicitly defined meanings, as in mathematics or diagramming languages.
+ logographic writing:
+ definition: Using written signs to represent words or meaningful units rather than individual speech sounds.
+ aliases: [logographic]
+ relational algebra:
+ definition: A formal language for operations on relations, including selecting rows, projecting columns, and joining relations.
+ bag semantics:
+ definition: Treating a collection as a multiset, allowing duplicate values.
+ typoglycaemia:
+ definition: An informal name for recognizing words with scrambled internal letters, aided by context and familiar word structure.
+ Shannon entropy:
+ definition: The average information per outcome in a probability distribution, measuring its uncertainty.
+ redundancy:
+ definition: Predictable or repeated information that can be omitted while preserving the intended message.
+ lossy compression:
+ definition: Discarding information during compression or encoding, preventing exact reconstruction of the original.
+ aliases: [lossy]
+ set semantics:
+ definition: Treating a collection as a set, where each distinct value appears at most once.
+ aliases: [set-based]
+ UML composition:
+ definition: A UML whole-part association with exclusive ownership, shown by a filled diamond, whose parts are deleted with their whole.
+ aliases: [composition]
+ UML aggregation:
+ definition: A UML whole-part association shown by a hollow diamond, with grouping semantics defined by the model.
+ aliases: [aggregation]
+ shared context:
+ definition: Knowledge, conventions, and assumptions shared by participants, allowing messages to leave some meaning implicit.
---
I communicate with AI in broken English and it works perfectly. I drop vowels, ignore spelling, skip grammar, and the meaning arrives intact. Why?
diff --git a/_posts/2026-04-27-multi-user-brew.md b/_posts/2026-04-27-multi-user-brew.md
index 747a50e..33d4712 100644
--- a/_posts/2026-04-27-multi-user-brew.md
+++ b/_posts/2026-04-27-multi-user-brew.md
@@ -2,6 +2,34 @@
title: "How the Homebrew Multi-User Rabbit Hole Bricked My Mac"
description: "A deep dive into multi-user setups on macOS, why Homebrew falls apart in them, and how I ended up reluctantly switching to MacPorts after bricking my laptop."
tags: ["macos", "homebrew", "macports", "workflow"]
+# Unix permissions and package manager vocabulary are necessary to understand why the
+# approaches failed.
+glossary:
+ prefix:
+ definition: The base directory where a package manager installs its files, such as /opt/homebrew.
+ umask:
+ definition: A Unix mask that removes selected permission bits when files or directories are created.
+ group-write permission:
+ definition: Permissions allowing a file's owning group to modify it, or create and remove entries in a directory.
+ aliases: [group-write bit]
+ bottle:
+ definition: A prebuilt Homebrew package that can be installed without compiling from source.
+ formula:
+ definition: A Homebrew package definition describing how to obtain, build, and install software.
+ aliases: [formulae]
+ cask:
+ definition: A Homebrew package definition for installing software distributed as ready-made macOS applications or installers.
+ System Integrity Protection:
+ definition: A macOS security mechanism restricting changes to protected system locations and processes, including actions by root.
+ launchd:
+ definition: macOS's service manager for starting, stopping, and supervising background processes.
+ MacPorts port:
+ definition: A MacPorts package definition describing software sources, dependencies, and installation steps.
+ aliases: [port]
+ daemon:
+ definition: A background process that provides a service without an interactive user interface.
+ kernel extension:
+ definition: A loadable module that adds functionality, such as hardware drivers, to an operating system's kernel.
---
I work part-time at Renuo as a software engineer and study Computer Science part-time at ZHAW. Most weeks mix client codebases, coursework, and personal projects on the same laptop, with the same tools: Neovim with lazygit and delta, iTerm2, Raycast, Setapp, hotkeys, window management. The setup should feel the same regardless of which one I am working on.
diff --git a/_posts/2026-05-27-system-prompts-for-humans.md b/_posts/2026-05-27-system-prompts-for-humans.md
index 06e3037..7b05bce 100644
--- a/_posts/2026-05-27-system-prompts-for-humans.md
+++ b/_posts/2026-05-27-system-prompts-for-humans.md
@@ -2,6 +2,38 @@
title: "System Prompts For Humans"
description: "If LLMs get communication instructions, maybe humans should too."
tags: ["communication", "ai", "culture", "protocol"]
+# Language-model instructions and one pole from each Culture Map axis connect the
+# AI analogy to human conversations.
+glossary:
+ LLM:
+ definition: 'Large language model: a text-trained model that generates and transforms language using the context it receives.'
+ system prompt:
+ definition: Instructions supplied to a language model to establish behavior and constraints across an interaction.
+ low context:
+ definition: A communication style expressing meaning directly in the message, with little reliance on shared background or implicit cues.
+ asynchronous communication:
+ definition: Communication where participants send and respond at different times without needing to be present together.
+ aliases: [async communication]
+ direct feedback:
+ definition: An evaluation style that states criticism explicitly and clearly.
+ principles-first persuasion:
+ definition: A persuasion style that presents general principles or theory before drawing conclusions and applying them to examples.
+ aliases: [principles first]
+ egalitarian leadership:
+ definition: A leadership style that minimizes status differences and encourages participation regardless of rank.
+ aliases: [egalitarian]
+ consensual decision-making:
+ definition: A decision-making style that seeks broad agreement among participants before committing to a choice.
+ aliases: [consensual]
+ task-based trust:
+ definition: A trust-building style where confidence develops through reliable work and demonstrated competence.
+ aliases: [task based]
+ confrontational disagreement:
+ definition: A disagreement style that treats open debate and challenge as normal parts of productive discussion.
+ aliases: [confrontational]
+ flexible scheduling:
+ definition: A scheduling style that adapts plans and timing as circumstances change.
+ aliases: [flexible time]
---
I have recently been thinking a lot about human to LLM and human to human communication.
diff --git a/_posts/2026-09-05-comparing-six-and-seven-from-scratch.md b/_posts/2026-09-05-comparing-six-and-seven-from-scratch.md
index 6aadbe6..079d495 100644
--- a/_posts/2026-09-05-comparing-six-and-seven-from-scratch.md
+++ b/_posts/2026-09-05-comparing-six-and-seven-from-scratch.md
@@ -3,6 +3,35 @@ title: "Comparing 6 and 7 from Scratch"
description: "Proving that any two natural numbers compare, from an inductive definition of the naturals and two axioms for addition, in Lean."
tags: ["theoretical mathematics", "first principles"]
math: true
+# Lean-specific concepts and easily confused proof terms merit reminders; the article
+# explains the remaining logic and arithmetic.
+glossary:
+ elaboration:
+ definition: Lean's translation of source notation into fully specified terms, inferring information such as implicit arguments and types.
+ aliases: [elaborates]
+ opaque:
+ definition: A Lean constant whose defining expression the kernel cannot unfold when checking definitional equality.
+ reducible:
+ definition: A Lean definition marked for automatic unfolding by the elaborator and tactics.
+ unfolding:
+ definition: Replacing a defined name with its defining expression.
+ aliases: [unfold, unfolded]
+ definitionally equal:
+ definition: Equal by the type system's computation and reduction rules, without a separate equality proof.
+ aliases: [definitional reductions]
+ proof term:
+ definition: A formal expression representing a proof, whose type is the statement being proved.
+ proof state:
+ definition: The hypotheses currently available and the goals still to be proved.
+ tactic:
+ definition: A command that builds a Lean proof by transforming goals and available hypotheses.
+ witness:
+ definition: An object supplied to establish that an existential statement holds.
+ induction schema:
+ definition: A family of axioms asserting induction separately for each formula expressing a property of natural numbers.
+ first-order theory:
+ definition: A collection of axioms in a language whose quantifiers range over individual objects.
+ aliases: [first-order arithmetic]
---
paper proofs have no compiler. i went looking for one and found Lean, by way of the [Natural Number Game](https://adam.math.hhu.de/#/g/leanprover-community/nng4), which builds the naturals from nothing and makes you prove your way back out. [^nng] i finished it end of june and wanted to write up what the last level actually took.
diff --git a/_posts/2026-09-06-shape-of-logic.md b/_posts/2026-09-06-shape-of-logic.md
index d634781..d7f70d2 100644
--- a/_posts/2026-09-06-shape-of-logic.md
+++ b/_posts/2026-09-06-shape-of-logic.md
@@ -3,6 +3,48 @@ title: "Shape of Logic"
description: "Notation shows you one row of a truth table. A picture shows you all 65,536."
tags: ["logic", "visualization", "hardware", "art"]
math: true
+# Strong candidate; interpreting the images requires bit-level arithmetic and circuit
+# terminology.
+glossary:
+ truth table:
+ definition: A table of results for all input combinations, visualized here as pixels representing pairs of integer inputs.
+ bitwise operator:
+ definition: An operation acting independently on corresponding bit positions, such as AND, OR, or XOR.
+ NAND:
+ definition: 'NOT AND: a logical operation returning zero only when both input bits are one.'
+ nibble:
+ definition: A group of four bits, representing one of sixteen possible values.
+ carry:
+ definition: A value passed to a higher digit position when addition exceeds what the current position can represent.
+ signed overflow:
+ definition: An arithmetic result outside the range representable by the chosen signed integer width.
+ two's complement:
+ definition: A signed integer representation in which the highest bit has negative weight.
+ MSB:
+ definition: 'Most significant bit: the highest-weight unsigned binary digit, serving as the sign bit in two''s complement.'
+ aliases: [most significant bit]
+ multiplexer:
+ definition: A circuit selecting one of several inputs using control bits.
+ ALU:
+ definition: 'Arithmetic logic unit: the part of a processor that performs arithmetic and logical operations on data.'
+ combinational divider:
+ definition: A division circuit computing the result directly from its inputs without sequential clocked steps.
+ fragment shader:
+ definition: A GPU program computing output values, such as color, for fragments during rendering.
+ restoring divider:
+ definition: A divider that shifts and subtracts, restoring the previous partial remainder whenever a subtraction produces a negative result.
+ sequential logic:
+ definition: Digital logic whose outputs depend on current inputs and stored state.
+ propagation depth:
+ definition: The maximum number of successive logic stages a signal traverses from a circuit's inputs to its outputs.
+ modular arithmetic:
+ definition: Arithmetic that identifies numbers with the same remainder after division by a fixed modulus.
+ aliases: [addition mod 256, mod]
+ truncating integer division:
+ definition: Integer division that discards the fractional part of the quotient, rounding toward zero.
+ aliases: [truncating division, truncating]
+ self-similarity:
+ definition: A pattern's resemblance to itself at different scales.
---
an 8-bit operator takes two bytes and returns one. its truth table has $256 \times 256 = 65{,}536$ rows, which is few enough to put every one of them on screen at the same time.
diff --git a/_threads/2026-04-10.md b/_threads/2026-04-10.md
index d897fbb..a382e12 100644
--- a/_threads/2026-04-10.md
+++ b/_threads/2026-04-10.md
@@ -1,3 +1,10 @@
+---
+# One brief hint can explain the philosophical term without turning a personal reflection
+# into a reference page.
+glossary:
+ nihilism:
+ definition: Philosophical views denying objective foundations for meaning, moral value, or knowledge; which foundation is denied distinguishes different forms.
+---
_decided to introduce threads alongside blog articles to make space for more frequent thoughts_
physically sick today, in real pain.
diff --git a/_threads/2026-04-21.md b/_threads/2026-04-21.md
index 62c7267..d86c19b 100644
--- a/_threads/2026-04-21.md
+++ b/_threads/2026-04-21.md
@@ -1,3 +1,34 @@
+---
+# Derivative and multivariable calculus terminology is central to the notation comparison.
+glossary:
+ derivative:
+ definition: A function's instantaneous rate of change with respect to a variable, defined by a limit of difference quotients.
+ higher-order derivative:
+ definition: A derivative of a derivative; successive time derivatives of position describe velocity, acceleration, jerk, and further rates of change.
+ discretization:
+ definition: Replacing a continuous problem with a representation on discrete points or time steps for numerical computation.
+ partial derivative:
+ definition: A function's rate of change when one input variable varies while the others remain fixed.
+ Jacobian matrix:
+ definition: The matrix of first partial derivatives, with output components in rows and input variables in columns.
+ aliases: [jacobi matrix]
+ comma derivative:
+ definition: An indexed notation where a comma followed by an index denotes partial differentiation with respect to that coordinate.
+ lifetime:
+ definition: The region where a Rust reference is valid; annotations express relationships between references so borrowed data remains accessible.
+ numerical integration:
+ definition: Approximating an integral or evolving a differential equation using discrete computational steps.
+ jerk:
+ definition: 'The third time derivative of position: how quickly acceleration changes.'
+ snap:
+ definition: 'The fourth time derivative of position: how quickly jerk changes.'
+ crackle:
+ definition: 'An informal name for the fifth time derivative of position: how quickly snap changes.'
+ pop:
+ definition: 'An informal name for the sixth time derivative of position: how quickly crackle changes.'
+ type annotation:
+ definition: An explicit declaration of a value or parameter’s type, recording constraints the compiler checks.
+---
learned the formal names for derivative notations today.
- Newton: $\dot{x}$, $\ddot{x}$, $\dddot{x}$, $\ddddot{x}$
diff --git a/_threads/2026-05-10.md b/_threads/2026-05-10.md
index a38b086..fc50814 100644
--- a/_threads/2026-05-10.md
+++ b/_threads/2026-05-10.md
@@ -1,3 +1,25 @@
+---
+# Radioisotope power and evolutionary biology supply the specialist vocabulary used in the
+# analogy.
+glossary:
+ RTG:
+ definition: 'Radioisotope thermoelectric generator: a device converting radioactive decay heat into electricity using thermoelectric materials.'
+ aliases: [radioisotope thermoelectric generator]
+ plutonium-238 decay:
+ definition: Plutonium-238 emits alpha particles as it transforms into uranium-234, releasing heat that can power an RTG.
+ mutation:
+ definition: A DNA sequence change; mutations passed to offspring supply heritable variation on which natural selection can act.
+ selective pressure:
+ definition: An environmental factor favoring some heritable traits, changing their frequency through differences in survival and reproduction across generations.
+ DNA repair:
+ definition: Cellular mechanisms that detect DNA damage and restore its structure or sequence, reducing errors that could become mutations.
+ directed evolution:
+ definition: Repeated laboratory cycles of generating heritable variation, selecting a desired trait, and using selected variants for the next cycle.
+ genome:
+ definition: The complete set of genetic material in an organism, including genes and sequences that regulate their activity.
+ radiation resistance:
+ definition: The ability to remain viable under radiation exposure, supported by mechanisms such as DNA repair and protection against cellular damage.
+---
Been thinking about RTGs again (radioisotope thermoelectric generators) after a long tangent that started with how things cool in the vacuum of space.
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.
diff --git a/_threads/2026-05-11-afternoon.md b/_threads/2026-05-11-afternoon.md
index 068f31a..29a89cf 100644
--- a/_threads/2026-05-11-afternoon.md
+++ b/_threads/2026-05-11-afternoon.md
@@ -1,6 +1,18 @@
---
title: "11.05.2026 (afternoon)"
date: 2026-05-11 15:00
+# RFC conventions and the encoding analogy need brief reminders; the quoted passage
+# already explains MUST and SHOULD.
+glossary:
+ RFC:
+ definition: 'Request for Comments: a document in the series publishing Internet technical specifications and related material.'
+ token:
+ definition: A unit of text; language models split messages into tokens that may represent words, word fragments, or punctuation.
+ encoding:
+ definition: Expressing information as symbols according to shared conventions; decoding reconstructs meaning by applying those conventions in context.
+ aliases: [encode/decode]
+ hedge:
+ definition: A word or phrase that softens a claim or request, signaling uncertainty, qualification, or reduced commitment.
---
(yes this entry contains filler, are you yet frustrated by it?)
diff --git a/_threads/2026-05-11-morning.md b/_threads/2026-05-11-morning.md
index f7cb462..fa7a90f 100644
--- a/_threads/2026-05-11-morning.md
+++ b/_threads/2026-05-11-morning.md
@@ -1,6 +1,11 @@
---
title: "11.05.2026 (morning)"
date: 2026-05-11 09:00
+# Sentence types are familiar; orthography names the writing conventions the proposal
+# would change.
+glossary:
+ orthography:
+ definition: A language’s writing conventions, including spelling, capitalization, punctuation, and how written marks organize sentences.
---
most modern languages signal sentence type at the end.
declarative, imperative, interrogative, exclamatory.
diff --git a/_threads/2026-05-12.md b/_threads/2026-05-12.md
index 9154157..d9fa815 100644
--- a/_threads/2026-05-12.md
+++ b/_threads/2026-05-12.md
@@ -1,3 +1,31 @@
+---
+# Naming unfamiliar rhetorical devices is the point of this entry; readers benefit from
+# concise definitions beside the labels.
+glossary:
+ anthropomorphism:
+ definition: Attributing human traits or intentions to nonhuman beings or systems, as when a compiler is described as angry.
+ aliases: [anthropomorphized]
+ trope:
+ definition: A figure of speech that shifts words from their literal meaning, such as metaphor or metonymy.
+ metonymy:
+ definition: Referring to something by a closely associated name, such as "the White House" for the US administration.
+ synecdoche:
+ definition: Referring to a whole by a part, or vice versa, such as "boots on the ground" for soldiers.
+ personification:
+ definition: A rhetorical device making a nonhuman thing act like a person, such as describing the wind as whispering.
+ reification:
+ definition: Treating an abstraction as an independently existing thing, as when “the market” appears to decide or act.
+ chiasmus:
+ definition: An A-B / B-A reversal of corresponding elements in phrases; repeating the same words in reverse is antimetabole.
+ conceptual metaphor:
+ definition: Understanding one domain through another, such as describing software states using human emotions and relationships.
+ irony:
+ definition: A contrast between literal expression and intended meaning, or between an expected outcome and what actually happens.
+ hyperbole:
+ definition: Deliberate exaggeration used for emphasis rather than a literal claim.
+ litotes:
+ definition: Understatement formed by denying the opposite, such as “not bad” to mean good.
+---
looked into autism traits today to understand people better.
namely how perception of marketing and manipulation is affected by rational neurodivergence which made me stumble on the word "anthropomorphism":
diff --git a/_threads/2026-05-19.md b/_threads/2026-05-19.md
index 4d9ff72..2c36f7d 100644
--- a/_threads/2026-05-19.md
+++ b/_threads/2026-05-19.md
@@ -1,3 +1,35 @@
+---
+# Chess tactics and endgame vocabulary would otherwise exclude readers new to the game.
+glossary:
+ blitz:
+ definition: Fast chess, commonly three or five minutes per player; an increment adds a few seconds after each move.
+ Elo:
+ definition: A rating system updating relative playing strength from results compared with expected scores against each opponent’s rating.
+ pin:
+ definition: A chess attack constraining a piece because moving it would expose a more valuable target behind it.
+ skewer:
+ definition: A chess attack on a valuable piece that exposes a piece behind it when it moves.
+ hanging piece:
+ definition: A piece that can be captured without sufficient protection or compensation.
+ passed pawn:
+ definition: A pawn with no opposing pawn ahead on its file or an adjacent file.
+ prophylaxis:
+ definition: In chess, anticipating and preventing the opponent's threats.
+ opposition:
+ definition: Kings facing across one square; the side able to make the other king move first can gain entry.
+ square rule:
+ definition: A geometric shortcut using an imaginary square to determine whether a king can catch an advancing passed pawn.
+ material:
+ definition: The pieces and pawns each side has, assessed by their approximate values when comparing captures or exchanges.
+ principle of two weaknesses:
+ definition: Creating a second target far from the first forces a defender to divide attention and may overload their pieces.
+ Lucena position:
+ definition: A winning rook-and-pawn versus rook setup where the stronger side builds a rook shield against checks to promote.
+ aliases: [lucena]
+ Philidor position:
+ definition: 'A drawing rook-and-pawn versus rook setup: the defender blocks the king on the sixth rank, then checks from behind.'
+ aliases: [philidor]
+---
started playing chess myself again after watching god-tier play of hikaru, levi, magnus ; thought i understood chess by watching. tried blitz and brutally realized i didn't.
150-300 elo. accuracy below 50%. one game i even managed a 35 material disatvantage because i wasn't paying attention.
diff --git a/_threads/2026-06-02.md b/_threads/2026-06-02.md
index f3388e0..8d03771 100644
--- a/_threads/2026-06-02.md
+++ b/_threads/2026-06-02.md
@@ -1,3 +1,35 @@
+---
+# The argument depends on distinguishing types of approximation and financial quantities;
+# standard terms should remain separate from the proposed notation.
+glossary:
+ NPV:
+ definition: 'Net present value: the sum of discounted expected cash inflows and outflows, including the initial investment.'
+ discount factor:
+ definition: A multiplier converting a future cashflow into its value at an earlier reference date.
+ present value:
+ definition: The value assigned today to a future cashflow using a chosen discount rate.
+ aliases: [barwert, barwerte]
+ floating point:
+ definition: A finite-precision representation of numbers using a significand and an exponent.
+ numerical error:
+ definition: The difference introduced by numerical computation or approximation, including discretization, truncation, or rounding.
+ model error:
+ definition: The difference between a model's description or predictions and the reality it represents.
+ general relativity:
+ definition: Einstein's theory of gravity relating spacetime geometry to matter and energy.
+ cash flow:
+ definition: Money entering or leaving an investment over time; timing and sign determine how each amount contributes to present value.
+ aliases: [cashflow]
+ rounding:
+ definition: Replacing a number with a nearby representable value at a chosen precision, usually introducing a small representation error.
+ aliases: [rounded]
+ measurement uncertainty:
+ definition: A parameter describing the spread of values reasonably attributable to a measured quantity, based on available information.
+ spacetime curvature:
+ definition: The geometric bending of spacetime described by general relativity; freely falling objects follow paths determined by that geometry.
+ perihelion:
+ definition: The point in an orbit where an object is closest to the Sun.
+---
exam prep:
investment accounting ; cashflow, npv, discount factors, present values.
diff --git a/_threads/2026-06-08.md b/_threads/2026-06-08.md
index 962c027..07638a9 100644
--- a/_threads/2026-06-08.md
+++ b/_threads/2026-06-08.md
@@ -1,3 +1,38 @@
+---
+# Name delegation and internationalized domain security explain why visually similar names
+# can identify different sites.
+glossary:
+ top-level domain:
+ definition: A domain label directly below the DNS root, such as com, ch, or zip.
+ aliases: [tld, gtld]
+ delegation:
+ definition: Assigning DNS authority over a child zone to its name servers, referenced by NS records in the parent zone.
+ aliases: [delegated]
+ namespace:
+ definition: A set of names and the rules governing what they identify.
+ internationalized domain name:
+ definition: A domain name supporting non-ASCII characters, with encoded DNS labels marked by the IDNA ACE prefix xn--.
+ aliases: [idn]
+ homograph attack:
+ definition: A deception using visually confusable characters in a domain name to impersonate another site, despite distinct underlying code points.
+ code point:
+ definition: A numeric identifier for a position in Unicode's character space.
+ Punycode:
+ definition: An encoding mapping Unicode strings to ASCII; IDNA uses it inside domain labels marked with the separate xn-- prefix.
+ mixed-script label:
+ definition: A domain label combining writing systems, such as Latin letters with a visually similar Cyrillic character.
+ aliases: [mixed-script]
+ whole-script confusable:
+ definition: A label written entirely in one script whose characters resemble a name written in another script.
+ aliases: [whole-script]
+ SIM swapping:
+ definition: Taking control of a victim’s phone number by transferring it to an attacker-controlled SIM, enabling interception of SMS codes.
+ MIME sniffing:
+ definition: Inferring content type from its bytes rather than trusting its declared type, influencing how a browser interprets it.
+ XSS:
+ definition: 'Cross-site scripting: attacker-controlled content executing as script in another site’s browser context.'
+ aliases: [cross-site scripting]
+---
while studying DNS for exam prep, i ended up browsing the list of all top-level domains:
diff --git a/bin/pdf.css b/bin/pdf.css
index 546eee1..a5f98d6 100644
--- a/bin/pdf.css
+++ b/bin/pdf.css
@@ -48,8 +48,16 @@
header[role="banner"],
footer[role="contentinfo"],
+ .article-toc,
nav[aria-label="Post navigation"] { display: none; }
+ /* Glossary */
+ .glossary-popup { display: none !important; }
+ .glossary-term { text-decoration: none; }
+ .article-glossary summary { font-weight: bold; break-after: avoid; }
+ .article-glossary dt { break-after: avoid; }
+ .article-glossary dd { break-inside: avoid; }
+
main a { color: #000; text-decoration: underline; }
h1, h2, h3, h4, h5, h6,
p:has(> strong:only-child) { break-after: avoid; break-inside: avoid; }
@@ -58,7 +66,9 @@
/* Compact lists can use the last few lines without splitting an item. */
main > ul,
- main > ol {
+ main > ol,
+ .article-body > ul,
+ .article-body > ol {
margin-block: .35em .8em;
line-height: 1.3;
}
diff --git a/pages/threads.md b/pages/threads.md
index 3b17242..dad2281 100644
--- a/pages/threads.md
+++ b/pages/threads.md
@@ -24,7 +24,9 @@ Conversations, thoughts, half-ideas, things I am starting to explore.
{: data-toc-teaser="{{ teaser | escape }}" }
{::nomarkdown}
+
{{ entry.content }}
+
{:/nomarkdown}
{% assign slug = entry.title | replace: ".", "" | slugify %}