Thursday, September 3, 2026

Social-media post arguing that everyday technology increasingly requires apps, accounts, network connections, passwords and subscriptions

I ran across this the other day. I get it. The ubiquitous interconnection of everything is exhausting. The holy principle of “frictionlessness” is just a facade. Whatever has no friction just makes it easier to get to the next layer of the thing. Ultimately it usually makes things worse because there’s more to do. Self-checkout is easy until the kiosk starts complaining about a bag. A bag - what have we come to?

Like the author, I’m no Luddite. But I’m exhausted.

Maybe I need a tech holiday. Or a tech sabbath.

Part of the disquiet that I feel around ubiquitous tech is the constant feeling like I’m contributing to a political and economic system that I don’t even remotely support. There’s a constant nagging feeling that my tech purchases - hardware, software, subscriptions - are supporting a system that is deeply unjust.

I can’t stand that in order to win Trump’s exceptions to tariffs on electronic goods coming to the U.S. from China, that the Apple CEO felt compelled to bring some bespoke 24K gold doodad/tribute to the Oval Office. And I’m supporting that through my purchases?

I can’t stand that I support complicit companies through my purchases because it makes me complicit as well. I despise Apple and Google for their ludicrous decision to change the names of the Gulf of Mexico and Lake Ontario to satisfy the whims of a petulant superannuated toddler.


Made a couple changes to the site today:

  • Removed Google Fonts dependencies. We serve typefaces locally instead.
  • Changed the syntax highlighting style to kanagawa-wave. I’m plus/minus on it. It may be short-lived. It’s just that the light theme syntax highlighting was a little too light.
  • Removed dependency on Hugo gist shortcode by moving code into the posts themselves.

fancy_quote shortcode for Hugo for fancier quotes

The fancy quote shortcode displaying highlighted passages from James C. Scott

I often include quotations in blog posts, but a plain Markdown blockquote does not give much control over the presentation and attribution. I wanted a reusable component that would keep the quote, author, source and publication year visually consistent without requiring me to reproduce the same HTML in every post.

The result is a fancy_quote shortcode, which adds large typographic quotation marks, centres the source and author beneath the quotation, and allows one or more passages to be highlighted with a simple ==highlighted text== notation.

Features

  • The quotation can be written between the shortcode’s opening and closing tags or supplied through a text parameter.
  • author, source and year are optional named parameters.
  • Any number of ranges can be highlighted.
  • Highlighted passages use the semantic HTML <mark> element rather than a purely decorative <span>.
  • Highlights can wrap across lines without losing their padding.
  • Existing quotations without highlights continue to render normally.
  • The appearance is controlled entirely by CSS and can be adapted to any theme.

Hugo version

The shortcode requires Hugo 0.16 or newer. The limiting feature is replaceRE, which converts the highlight delimiters into <mark> elements and was added in the Hugo 0.16 release. The other pieces use the standard shortcode .Get and .Inner methods and the long-established safeHTML alias for safe.HTML.

I developed and tested this version with Hugo 0.165.0. It does not require Hugo Extended, JavaScript, or any external library.

The shortcode

Create layouts/shortcodes/fancy_quote.html in the root of the Hugo project:

{{ $year := .Get "year" }}
{{ $text := .Get "text" | default .Inner }}
{{ $author := .Get "author" }}
{{ $source := .Get "source" }}
{{ $text = replaceRE `==([^=]+?)==` `<mark class="quote-highlight">$1</mark>` $text }}

<div class="fancy-quote">
  <p class="quote-text">{{ $text | safeHTML }}</p>

  {{ if or $source $year }}
  <div class="quote-meta">
    {{ if $source }}
    <span class="quote-source">{{ $source }}</span>
    {{ end }}
    {{ if $year }}
    <span class="quote-year">({{ $year }})</span>
    {{ end }}
  </div>
  {{ end }}

  {{ if $author }}
  <div class="quote-author">{{ $author }}</div>
  {{ end }}
</div>

The regular expression looks for text enclosed by pairs of equals signs. Each match is replaced by a <mark class="quote-highlight"> element. Piping the result through safeHTML prevents Hugo from escaping the generated element.

safeHTML should be used only with content that I control. If quotation text comes from an untrusted visitor, CMS user, or external feed, it should be sanitised rather than passed through this shortcode unchanged.

The CSS

Here is the complete stylesheet:

.fancy-quote {
  font-family: "Georgia", "Times New Roman", serif;
  line-height: 1.6;
  max-width: 100%;
}

.quote-text {
  position: relative;
  text-align: justify;
  margin-bottom: 1rem;
  padding: 0.2rem 2.4rem 0.35rem;
  font-size: 1.05rem;
}

.quote-text::before,
.quote-text::after {
  position: absolute;
  color: #999;
  font-size: 2.75rem;
  font-weight: bold;
  line-height: 1;
}

.quote-text::before {
  content: "“";
  top: -0.15rem;
  left: 0.8rem;
}

.quote-text::after {
  content: "”";
  right: 0;
  bottom: -0.8rem;
}

.quote-highlight {
  color: inherit;
  background-color: #fff0a6;
  padding: 0.05em 0.12em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

.quote-meta {
  display: flex;
  justify-content: center;
  align-items: baseline;
  gap: 0.25em;
  text-align: center;
  line-height: 1.3;
}

.quote-year {
  font-style: normal;
  font-size: 1.25rem;
  white-space: nowrap;
}

.quote-source {
  font-style: italic;
  font-size: 1.25rem;
}

.quote-author {
  display: block;
  text-align: center;
  margin-top: 0.25rem;
  margin-left: auto;
  margin-right: auto;
  font-size: 1.1rem;
}

The stylesheet can be saved as static/css/fancy-quote.css and included in the site’s <head>:

<link rel="stylesheet" href="/css/fancy-quote.css">

Sites already using Hugo Pipes can instead keep the file under assets/css and add it to their existing CSS bundle.

Using the shortcode

A complete quotation looks like this:

{{< fancy_quote
  author="James C. Scott"
  source="Two Cheers for Anarchism"
  year="2012" >}}
The point is simply that ==huge disparities in wealth, property, and status make a mockery of freedom.== A second range can be ==highlighted independently==.
{{< /fancy_quote >}}

The highlight markers are optional. Without them, the entire quotation is displayed in the same style:

{{< fancy_quote author="Ursula K. Le Guin" >}}
The creative adult is the child who survived.
{{< /fancy_quote >}}

For a short quotation, the text can be supplied as a parameter and the closing tag omitted:

{{< fancy_quote
  text="The creative adult is the child who survived."
  author="Ursula K. Le Guin"
>}}

Optional adaptations

The shortcode parameters are independent. A quote can have an author but no source, a source and year but no author, or no attribution at all. The highlighting feature is also entirely optional.

The CSS is deliberately uncomplicated. The highlight colour can be changed through background-color, and the font, quotation-mark size, spacing and attribution alignment can all be altered without touching the shortcode. A dark theme might override the highlight colour inside its existing dark-mode media query:

@media (prefers-color-scheme: dark) {
  .quote-highlight {
    background-color: #665500;
  }
}

The shortcode intentionally treats its inner text as text with optional highlight markers, rather than running it through the Markdown renderer. That keeps its output predictable. If links, emphasis or other Markdown inside quotations become necessary, the rendering step could be extended with Hugo’s Page.RenderString method, with suitable care around generated and untrusted HTML.

For my purposes, this provides a small, readable content syntax while keeping all of the presentational machinery in one reusable place. If you have any difficulties, suggestions for improvements, please contact me via my contact page

Wednesday, September 2, 2026

The point is simply that huge disparities in wealth, property, and status make a mockery of freedom. The consolidation of wealth and power over the past forty years in the United States, mimicked more recently in many states in the Global South following neoliberal policies, has created a situation that the anarchists foresaw. Cumulative inequalities in access to political influence via sheer economic muscle, huge (statelike) oligopolies, media control, campaign contributions, the shaping of legislation (right down to designated loopholes), redistricting, access to legal knowledge, and the like have allowed elections and legislation to serve largely to amplify existing inequalities. It is hard to see any plausible way in which such self-reinforcing inequalities could be reduced through existing institutions... Democratic institutions have, to a great extent, become commodities themselves, offered up for auction to the highest bidder.

Saturday, August 29, 2026

The last strand of anarchist thought I definitely wish to distance myself from is the sort of libertarianism that tolerates (or even encourages) great differences in wealth, property, and status. Freedom and (small “d”) democracy are, in conditions of rampant inequality, a cruel sham as Bakunin understood. There is no authentic freedom where huge differences make voluntary agreements or exchanges nothing more than legalized plunder.

Two Cheers for Anarchism (2012)
James C. Scott

Freedom without socialism is privilege and injustice, and socialism without freedom is slavery and brutality.

A better user experience when a Firefox extension loads a new tab custom page

N.B. This workaround is for macOS, using Keyboard Maestro. I have not tried equivalents elsewhere. On Windows, AutoHotkey can bind a hotkey, send Ctrl+T, select and clear the address bar, then Escape. On Linux, AutoKey is the usual analogue; under Wayland you may need something like ydotool. The Firefox new-tab focus behaviour itself is not macOS-specific.

In the previous post I described Slinky, a self-hosted start page, and mentioned that I use the New Tab Override extension so Firefox opens it on every new tab. That works, but the default behaviour is a little ugly.

Slinky: A self-hosted start page

A colorful, retro-style graphic illustration of a circular slinky coil featuring red, yellow, and teal segments on a cream background.

One of the browser conveniences that I appreciate is ready access to commonly used links, presented in a neat and categorized way. Every time I create a new tab, I just want to see those links. There are of course many browser extensions that present a page when the user opens a new tab. Mozilla has its own default ad-ridden page on Firefox. For my part, I don’t want news, weather, “trending stories,” or ads. I just want my curated links. That’s why I created Slinky.

Donald Trump’s pseudo-principles of adult behaviour

I’ll admit to being a pushover for lists of pithy advice for living. One that I return to frequently are those compiled by John Perry Barlow.

In 1977, John Perry Barlow wrote a list of twenty-five principles of adult behaviour.

Reading through these principles in the midst of the self-serving, self-enriching careless chaos that Donald Trump has wreaked on the world, I decided to write a parallel set of principles as Trump himself might do. I give you - by way of contrast - Donald Trump’s Principles of Adult Behaviour.

Thursday, August 13, 2026

Zygmunt Bauman on the anxiety of modernity:

“there is always a suspicion … that one is living a lie or a mistake; that something crucially important has been overlooked, missed, neglected, left untried and unexplored; that a vital obligation to one’s own authentic self has not been met, or that some chances of unknown happiness completely different from any happiness experienced before have not been taken up in time and are bound to be lost forever.” — Zygmunt Bauman, Liquid Love: On the Frailty of Human Bonds (2003)

Updated: ARINC 424 parser & explainer

Yesterday I posted about a small utility that parses and explains ARINC 424 records. I have updated it.

For each field, the tool now cites the specific tables in the ARINC 424 specification that describe that field. The field-content explanations are also more detailed, so you can spend less time flipping between the parsed output and the printed standard. Here is an example for an Airport SID/STAR/Approach primary record:

This is still a work in progress. Not all record types are supported yet; I am filling those in as I need them.

A small utility to parse and explain ARINC 424 records

N.B. An enhanced version is now available, with specification table references and more detailed field explanations. 2026-08-03.

The ARINC 424 specification is the universally accepted standard for encoding aeronautical navigation data. Databases that follow it store that data in fixed-length, 132-character records. I created a utility that parses a single ARINC 424 record and prints the fields along with column numbers and plain-language explanations. The Python arinc424 module does the heavy lifting; I provide a wrapper around it, plus the logic that maps fields to the column numbers used in the official specification.