RSS.Style logo RSS/Atom Feed Analysis


Analysis of https://www.tbray.org/ongoing/ongoing.atom

Feed fetched in 386 ms.
Warning Content type is application/atom+xml, not text/xml.
Feed is 216,476 characters long.
Feed has an ETag of "3580a-64554ddf54a08".
Feed has a last modified date of Sun, 07 Dec 2025 04:11:03 GMT.
Warning This feed does not have a stylesheet.
This appears to be an Atom feed.
Feed title: ongoing by Tim Bray
Feed self link matches feed URL.
Feed has 19 items.
First item published on 2025-12-02T20:00:00.000Z
Last item published on 2025-07-21T19:00:00.000Z
Home page URL: https://www.tbray.org/ongoing/
Home page has feed discovery link in <head>.
Home page has a link to the feed in the <body>

Formatted XML
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xml:lang="en-us">
    <title>ongoing by Tim Bray</title>
    <link rel="hub" href="http://pubsubhubbub.appspot.com/"/>
    <id>https://www.tbray.org/ongoing/</id>
    <link href="https://www.tbray.org/ongoing/"/>
    <link rel="self" href="https://www.tbray.org/ongoing/ongoing.atom"/>
    <link rel="replies" thr:count="101" href="https://www.tbray.org/ongoing/comments.atom"/>
    <logo>rsslogo.jpg</logo>
    <icon>/favicon.ico</icon>
    <updated>2025-12-06T20:11:03-08:00</updated>
    <author>
        <name>Tim Bray</name>
    </author>
    <subtitle>ongoing fragmented essay by Tim Bray</subtitle>
    <rights>All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright</rights>
    <generator uri="/misc/Colophon">Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, and ImageMagick. Industrial-strength technology, baby.</generator>
    <entry>
        <title>Tracy Numbers</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/12/02/Bell-Combinatorics#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics</id>
        <published>2025-12-02T12:00:00-08:00</published>
        <updated>2025-12-06T11:03:30-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Music"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Music"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking     a class in Afro-Cuban rhythms from     <a href="https://drumming.ca">Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the     basics of Afro-Cuban are the     <a href="https://en.wikipedia.org/wiki/Bell_pattern">Bell Patterns</a>, which come straight out of Africa.     The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of     three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It     feels like it’s in four, particularly when played fast</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking
    a class in Afro-Cuban rhythms from
                    <a href="https://drumming.ca">Russell Shumsky</a>
                    , with whom I’ve studied West-African drumming for many years. Among the
    basics of Afro-Cuban are the
                    <a href="https://en.wikipedia.org/wiki/Bell_pattern">Bell Patterns</a>
                    , which come straight out of Africa.
    The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of
    three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It
    feels like it’s in four, particularly when played fast.
                </p>
                <p>Here’s the standard bell pattern in music notation. Instead of one 12/8 bar, I’ve broken it into four 3/8 chunks. Let’s call
    those “mini-measures”; I’ll use that or just “minis” in the rest of this piece.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern"/>
                <div class="caption">
                    <p>
                        <audio controls="controls" src="standard.m4a"></audio>
                    </p>
                </div>
                <p>Bell patterns are never played in isolation, but circularly on fast repeat, so the first note immediately follows
    the last.</p>
                <p>
                    In the sound sample, I’m playing a background beat on a conga, emphasizing the beginning of the 12/8 measures.
    The actual bell pattern is on the high “child” bell of a
                    <a href="https://en.wikipedia.org/wiki/Ewe_drumming#Gankogui">Gankoqui</a>
                    , an African dual-cowbell set.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/PXL_20251201_192632520.png" alt="Black cat considers a Gankoqui"/>
                <div class="caption">
                    <p>
                        <a href="/ongoing/When/202x/2021/02/22/Meet-Thorn">“þ” the cat</a>
                        was trying bell patterns but
    unfortunately
                        <br/>
                        cats can’t count as high as 12. Collar by
                        <a href="https://www.birdsbesafe.com">BirdsBeSafe.com</a>
                        .
                    </p>
                </div>
                <p>That’s my Gankoqui.
    I bought it off someone on Etsy who imports them from Ghana. 
    It came with that little thin stick that sounds nice, but sometimes I use a regular drumstick when things get loud.</p>
                <h2 id="p-1">The problem</h2>
                <p>Russell’s a good teacher and the standard pattern isn’t that tricky, but I just couldn’t get a grip on it.
    It’s a little harder than it looks what with cycling it really fast, and  then
    you’re playing it against complicated music with other instrumental voices. 
    I probably would have got there, but the lessons ran out of gas in the depths of Covid.</p>
                <h2 id="p-2">Introducing Tracy</h2>
                <p>
                    She was Russell’s long-time partner, a good person and good drummer too.  When you were struggling
    with a complex rhythm it was helpful to watch Tracy’s hands, because she was
                    <em>always</em>
                    on the beat.
                </p>
                <p>Tracy lived with stage four metastatic cancer for many years and braved endless awful rounds of therapy while remaining generally
    cheerful. She could be morbidly funny; I bought her congas (you can hear one behind the beat in the samples) when she had a
    storage-space problem.  She told me she was carefully planning her finances so she’d run out of money just before the cancer got
    her.</p>
                <p>I always enjoyed any time I spent with her. Then, a dozen years into her cancer
    journey, this last summer it got into her brain and it was pretty clear her end times were upon her.</p>
                <h2 id="p-3">The hospice</h2>
                <p>
                    Tracy’s last months were spent at
                    <a href="https://stjohnhospice.ca">St. John Hospice</a>
                    in Vancouver’s far west.  I can’t say enough
    good things about it. If you’re near Vancouver and your death becomes imminent, try to be there if you can’t be at home.
    It’s comfortable and the staff are expert and infinitely kind. The rules that apply at hospices
    are different from those at hospitals; for example, Tracy’s cat joined her in residency and had the run of the place.
                </p>
                <p>I (and other fans of Russell and Tracy) visited the hospice a few times. My last visit was just days before her death
    and, while she was fatigued and spaced-out, it was still Tracy.
    I wasn’t close enough to call her a friend, but I miss her.</p>
                <p>
                    We got to talking about Afro-Cuban music and I laughed at myself, saying how I never could get that damn bell pattern
    down. Said Russell: “Oh, you mean the standard 12/8 pattern? Tracy, let’s show him” and on the second try, they were doing it
    together, just voices,
                    <i>ta ta ta-ta, ta ta ta</i>
                    .
                </p>
                <p>Driving home from the hospice, I told myself that if Tracy could manage the bell pattern in her condition, I could bloody
    well learn it.  So I studied the details and used a metronome app and after a while
    I thought I had it down pretty well.</p>
                <h2 id="p-4">Sounds cool</h2>
                <p>I go to a weekly by-invitation African drum jam where I’m on the weaker end of the skill
    spectrum. The first time a 12/8 came along after I thought I’d learned the pattern,  I had to summon up courage
    and then I fluffed the first few bars. But after a while I 
    was grooving along and smiling and thinking the bell sounded pretty cool against the thunder of all the djembés and dununs.</p>
                <p>And, even played amateurishly, it does sound cool. Let’s have another look at the music.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern"/>
                <div class="caption">
                    <p>
                        <audio controls="controls" src="standard.m4a"></audio>
                    </p>
                </div>
                <p>West-African drumming often tries to achieve rhythmic tension, where a given note could fit in multiple ways and your
    ear is not 100% sure what’s going on. The standard pattern does this, twice.</p>
                <p>Remember, I said that 12/8 sounds like it’s
    “in four”, especially if you hit the first beat of each of the four mini-measures. But two of
    the four minis here go around the first note, weakening the 4/4 feel.
    Especially on that third mini; you can feel the beat slide by the missing “one”.</p>
                <p>Also, the last three notes are evenly spaced two beats
    apart, so six of them would fill the 12-beat pattern, suggesting that this might be in triple time, not 12/8.</p>
                <p>The effect, to my ears, is of the bell, higher-pitched than the drums, shifting against the rhythm, or even dancing
    across it.  At the drum jam, at almost any given moment it won’t be just drums, one or more people will have
    clave sticks or rattles or tambourines or cowbells weaving through the beat.</p>
                <h2 id="p-5">Mixing it up</h2>
                <p>After I felt confident playing the standard pattern, it still sounded cool, but I wanted to branch out, not just
    go around and around the same seven notes. So the first thing I did was start mixing in a few of these.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-1.png" alt="bell pattern variation"/>
                <div class="caption">
                    <p>
                        <audio controls="controls" src="5333.m4a"></audio>
                    </p>
                </div>
                <p>This repeats the second bar through the end of the phrase. In the sound sample I mix it up with the standard pattern.
    It’s got less rhythmic tension but on the other hand
    flows along smoothly with the drum thunder.  Also you don’t have to think at all, so you can enjoy listening to what the other
    people are playing.</p>
                <p>Then I got a little more ambitious and reshuffled:</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-2.png" alt="bell pattern variation"/>
                <div class="caption">
                    <p>
                        <audio controls="controls" src="5253.m4a"></audio>
                    </p>
                </div>
                <p>The mini-measures are the same as in the standard pattern, just in a different order.  Anyhow, this kind of thing is fun.</p>
                <h2 id="p-6">Combinatorics</h2>
                <p>Then one evening I was lying in bed, thoughts wandering, and wondered “How many bell patterns are there?”
    A little mental math showed that of course there are eight possible arrangements of tones
    in a 3-note mini-measure. Here they are:</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/8-measures.png" alt="Possible arrangements of notes in 3/8 time"/>
                <div class="caption">
                    <p>I’ll use the boxed numbers to identify the minis.</p>
                </div>
                <p>Why are the minis numbered in that order? Every computer programmer looking at this already knows, but for the rest of you: If the
    notes are ones and the rests are zeroes, they are the eight binary numbers between zero and seven inclusive.
    So each number’s binary bits show where the drumstrokes are. 
    By the way, numbers four through
    seven have a note on the one beat, zero through three don’t.</p>
                <p>Is it weird to have a zero i.e. silent mini? I don’t think so, sometimes spaces between the notes really matter.</p>
                <h2 id="p-7">Patterns</h2>
                <p>Anyhow, the original question was about the number of different bell patterns. Each has four
    mini-measures with 8 possible values. So the answer is 8 ⨉ 8 ⨉ 8 ⨉ 8, which is 4,096.</p>
                <p>And each of them can be identified by four little numbers, ranging from T0000 (I can hear the bandleader yelling “gimme zeroes
    for the sax break”) to T7777, a flurry of eighth notes that you might use in the big encore-number finish designed to leave the
    audience yelling as you walk off stage. The standard bell pattern is T5325; in binary “101 011 010 101” and the 1’s are drumstrokes.
    The first variation above is T5333 and the second is T5253.</p>
                <p>The “T” in front of each bell pattern number is for Tracy.</p>
                <p>
                    If you go look at the
                    <a href="https://en.wikipedia.org/wiki/Bell_pattern">Wikipedia Bell-pattern article</a>
                    , they emphasize that there are lots of
    different patterns. Now they all have numbers! The article
                    <a href="https://en.wikipedia.org/wiki/Bell_pattern#128_bell_patterns">makes special mention of</a>
                    T5124, T5221, and T5244.
                </p>
                <h2 id="p-8">But why, Tim?!</h2>
                <p>I’m a computer programmer with a Math degree, and an amateur musician.
    Anyone who thinks that these are disjoint disciplines is wrong.
    And, I think the notation is (on a very small scale) kind of pleasing.</p>
                <p>But the work has actually helped me.
    Now that I’ve considered each mini-measure and its personality. I find all of them sneaking into
    my Gankoqui excursions, which have gotten noticeably weirder, for example T5635.
    Nobody’s threatened to kick me out of the jam, so far.</p>
                <p>Also, this has given me a real appreciation of whoever it was that, probably thousands of years ago and certainly in Africa,
    picked the “standard” pattern as, well, standard. Because it’s great.</p>
                <h2 id="p-9">What’s missing?</h2>
                <p>
                    You may have noticed that Gankoquis have two bells and I’ve been ignoring that fact. Normally you’d play these patterns
    on the smaller “child” bell, but sometimes bringing the big parent bell in for a couple of strokes works 
    well.
                    <a href="https://www.youtube.com/watch?v=X2K0i8e6Ftc">Here’s an example</a>
                    (h/t Russell).
                </p>
                <p>
                    Also, this discussion has been limited to 3/8 minis in 12/8 measures. There’s another whole universe of 4/4 rhythms that
    also have bell patterns (but everything exists in the shadow of the
                    <a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave rhythm</a>
                    ).
    In that world a pattern has four measures, each of which can have sixteen possible values, so there are 65,536 different ones.
                </p>
                <p>
                    And I could repeat the numbers construction above for 4/4. But I’m not going to, because the rewards feel smaller. In my
    experience, 4/4 rhythms lope smoothly along and everyone knows where the one is even when there’s no note on it, so there’s less
    ambiguity to work with.
    Anyhow, any neophyte (like for example me) can play a pretty smooth bell line against 4/4; just start with
                    <a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave</a>
                    and add
    variations (or don’t) and you’ll be fine.
                </p>
                <h2 id="p-10">Useful?</h2>
                <p>These numbers are just elementary mathemusical fun. If anyone else wanted to use them that’d be a pleasant surprise.
    If “anyone else” is you, go ahead, but they have a name and you have to use it. These are called Tracy Numbers.</p>
                <h2 id="p-11">Colophon</h2>
                <p>
                    Music fragments by
                    <a href="https://www.mu.se/musescore-studio">MuseScore Studio</a>
                    . Sound samples facilitated by GarageBand, a Shure MV51, and PSB
    Alphas.
                </p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Fútbol Joy</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/23/Soccer-vs-Football#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football</id>
        <published>2025-11-23T12:00:00-08:00</published>
        <updated>2025-11-27T20:38:07-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Sports/Football"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Sports"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Football"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Sports/Soccer"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Soccer"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Last Saturday I had one of my peak 2025 experiences, at the     <a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">MLS semifinal</a>      between the <a href="https://www.whitecapsfc.com/">Vancouver Whitecaps FC</a> (hereinafter “Caps”) and     <a href="https://en.wikipedia.org/wiki/Los_Angeles_FC">Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”.     53,095 other fans were there with my son and I; we came     home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other  TV sports</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Last Saturday I had one of my peak 2025 experiences, at the
                    <a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">MLS semifinal</a>
                    between the
                    <a href="https://www.whitecapsfc.com/">Vancouver Whitecaps FC</a>
                    (hereinafter “Caps”) and
                    <a href="https://en.wikipedia.org/wiki/Los_Angeles_FC">Los Angeles FC</a>
                    (“LAFC”). Both those FC’s stand for “Fútbol Club”.
    53,095 other fans were there with my son and I; we came
    home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other  TV sports.
                </p>
                <p>
                    Earlier this year
                    <a href="/ongoing/When/202x/2025/05/04/Southsiders">I wrote about becoming a Caps fan</a>
                    . Anyone who enjoys this will probably
    like that piece too.
                </p>
                <p>Let’s set the scene with pictures.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_004124670.png" alt="Before the fútbol at the pub"/>
                <div class="caption">
                    <p>Supporters gather pre-game at a nearby Irish-flavored pub.</p>
                </div>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_011735082.png" alt="Parading from the pub to the match"/>
                <div class="caption">
                    <p>
                        Supporters march to the game.
                        <br/>
                        When you’re in a frivolous parade, everyone smiles
                        <br/>
                        at
    you, even the drivers hemmed in by paraders.
                    </p>
                </div>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_024033770.png" alt="Whitecaps tifo banner: fire that burns / blue melts gold"/>
                <div class="caption">
                    <p>
                        The banner is what’s called a
                        <a href="https://en.wikipedia.org/wiki/Tifo">tifo</a>
                        .
                        <br/>
                        I have to admit I failed to parse it.
                    </p>
                </div>
                <h2 id="p-5">The game</h2>
                <p>
                    It was 120 minutes of ridiculously over-the-top psychodrama. I was exhausted at the end.
    If you want a full retrospective, type “whitecaps lafc” into any Web search to get the particulars. Or
                    <a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">hit
    this</a>
                    . But here’s the short version:
                </p>
                <ol>
                    <li>
                        <p>
                            The Caps came out sharp and fast and had LAFC pretty well flummoxed through most of the first half, scoring two goals,
                            <a href="https://www.youtube.com/watch?v=9nEOw8ckWMA">one of which was a jaw-dropper</a>
                            .
      They also managed to contain LAFC’s superstar
                            <a href="https://en.wikipedia.org/wiki/Son_Heung-min">Son Heung-min</a>
                            .
                        </p>
                    </li>
                    <li>
                        <p>
                            In the second half, the visitors reconfigured and were much better. Son did the superstar thing and scored two goals,
                            <a href="https://www.youtube.com/watch?v=-L9N8pkrkSM">one another jaw-dropper</a>
                            , just as the game was ending, to tie things
      up.
                        </p>
                    </li>
                    <li>
                        <p>The Caps lost two players, one for fouls, one to injury, and were down two men through most of overtime. LAFC’s assault
      was relentless but the Caps held on, getting more than a little lucky.</p>
                    </li>
                    <li>
                        <p>So it went to a penalty-kick competition. Son, shockingly, missed; he was exhausted and limping. At the end of the
      day the Caps scored four out of five to LAFC’s three and got the win.</p>
                    </li>
                </ol>
                <p>Suffice it to say that the dramatic peak wasn’t
    any of the flashes of brilliance, but rather the errors that happen when people are at the limit of their endurance. Vancouver
    made one fewer, that’s all there was to it.</p>
                <h2 id="p-3">That sound</h2>
                <p>There’s not another like it on this planet. I mean tens of thousands of voices in a big stadium greeting a home goal.
    Fútbol specifically because its goals, compared to North American sports where points come in dozens, are
    such huge markers. The sound-pressure wavefront, coming from every direction, of all those inarticulate howls of joy,
    all in the same tiny fraction of a second, is a whole-body experience.</p>
                <h2 id="p-6">The side effect</h2>
                <p>I’ve long been a televised-sports fan; the only TV show that isn’t scripted and thus has real drama. But
    since getting mixed up in fútbol, I’ve sort of gone off the other sports I used to watch.  I had to think a bit to figure
    out why.</p>
                <p>
                    It’s the ads.  The football, basketball and hockey broadcasts screech to a halt
                    <a href="https://qz.com/150577/an-average-nfl-game-more-than-100-commercials-and-just-11-minutes-of-play">every ten or fewer
    minutes</a>
                    for a couple of minutes of advertising. Most of the ads are dumb, many are offensive, and the relentless
    addiction-promoting gambling pitches are both. On top of which there’s the bone-headed repetition; someone somewhere thinks
    I’m gonna lean toward this generic SUV as opposed to that one because of the 138th time they’ve run that commercial where hip young
    people with fulfilling lives are going to have sex because of its dashboard geometry and motorized hatchback.
    I mean, the other SUVs have that stuff too, but this one’s actors are more convincingly likely to be headed for bed?
                </p>
                <p>Being in the room with this shit makes me angry even though my mute-button skillz are sharp.
    The world being what it is, I really don’t need to be around something that angers me several times per hour.
    So, while when young I loved playing both football and basketball, and while the pro games are good entertainment, 
    my patience seems to be running out.</p>
                <p>Fútbol, on the other hand, has two fiftyish-minute chunks of continuous action, so you can sink into the flow of the
    game. The contrast, switching back and forth between that and the other North American sports, is stark.</p>
                <p>(Except for I’m mostly forgiving baseball because its natural rhythm is full of stops suitable for hot dogs and beer and
    admiring cute babies and T-shirts and discussions of etymology and epidemiology.  I mean, the ads are still mindless repetitive
    shit, we’re just more accustomed to switching attention away when nothing’s happening.)</p>
                <p>
                    And I’m not claiming that fútbol is more virtuous or less dirty than any other sport; after all, its global
    organizing body FIFA has repeatedly been exposed as
                    <a href="https://en.wikipedia.org/wiki/FIFA#Corruption">galactically corrupt</a>
                    . I’m just saying it offers a better
    experience.
                </p>
                <h2 id="p-9">Soccer?</h2>
                <p>That word is an awkward invention by nineteenth-century British toffs based on abbreviating “association”. I accept that on my
    continent “football” means gridiron, but people who enjoy “soccer” still say it so in print I offer “fútbol”, which is a
    typographically nice little cluster; please humor me.</p>
                <p>Anyhow, you might want to check out your local team; in North America, the prices are lower than the other sports, who could
    be against cheap happiness with fewer gambling ads?</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Long Links</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links"/>
        <link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/16/Long-Links#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links</id>
        <published>2025-11-16T12:00:00-08:00</published>
        <updated>2025-11-19T14:20:55-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the     choices will improve your day.  This time out it’s almost all politics, but that’s the way the world is.     And some of the politics aren’t American!</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the
    choices will improve your day.  This time out it’s almost all politics, but that’s the way the world is.
    And some of the politics aren’t American!</p>
                <p>
                    Some of these are paywalled, sorry.
    And the whole thing is kind of long so if you’re in a hurry, you might want to jump to the last section, entitled
                    <a href="#p-8">Wonderful things</a>
                    .
                </p>
                <h2 id="p-7">Social media</h2>
                <p>
                    Here’s a real treat. Perhaps the premiere example of a blog that’s grown happily from a one-man operation to a
    successful and sustainable small business would be
                    <a href="https://talkingpointsmemo.com">Talking Points Memo</a>
                    . It provides what I think is about the deepest
    carefully-reported coverage of the American progressive scene available anywhere. I’ve been a subscriber for years.
                </p>
                <p>
                    They’re celebrating their 25th anniversary and, to celebrate, have been working on a history of blogging:
                    <a href="https://talkingpointsmemo.com/tpm-25">Pivots, Trolls, &amp; Blogrolls</a>
                    .
    Contributors so far: Sarah Jaffe, Matt Pearce, Brian Beutler, Kylie Cheung, Megan Greenwell, David Weigel, Jon Allsop, Adam
    Mahoney, Julianne Escobedo Shepherd, Max Rivlin-Nadler, Bhaskar Sunkara, Hamilton Nolan, Ana Marie Cox, Marisa Kabas, Kelly
    Weill, Aurin Squire, Marcy Wheeler, Andrew Parsons, Jeet Heer, and Sarah Posner.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/TPM.png" alt="TPM 25th anniversary series"/>
                <p>It’s full of razor-sharp insights and nostalgic smiles. I think it’s paywalled? If so, and if you’ve got feels about 
    the blog form, it’d probably be worth your while to sign up for a month just to read this collection.</p>
                <p>
                    And thanks to Josh Marshall of
                    <cite>TPM</cite>
                    for putting it together all these years and especially for this particular
    mind candy.
                </p>
                <h2 id="p-4">Politics (US)</h2>
                <p>
                    The Trump administration is, generally speaking, strange.
    For a terrifying trip several standard deviations off the strange end of the strangeness,
    there’s
                    <a href="https://www.newyorker.com/magazine/2025/11/17/laura-loomers-endless-payback">Laura Loomer’s Endless Payback</a>
                    .
    At several points in my traversal of this piece I simply could not believe what I was reading. My guess is that it will
    regularly be cited by historians of the 23rd century, to add spice to their narrative.
                </p>
                <p>Many commentators on the right have been horrified at Zohran Mamdani’s New York victory, seeing him as the white-hot
    pointy end of the “woke mind virus”.  Well, what could be more woke, I ask, than the Department of Africana Studies at Bowdoin,
    a boutique liberal-arts college in Maine?</p>
                <p>
                    Mamdani was a student there, and now the former head of said department offers us
                    <a href="https://lithub.com/maybe-dont-talk-to-the-new-york-times-about-zohran-mamdani/">Maybe Don’t Talk to the New York
    Times About Zohran Mamdani</a>
                    . Peter Coviello is not a moderate but is a formidable writer: “The storied choice between
    socialism and barbarism was made exquisitely clear a good many years ago in the United States, and both major parties chose
    barbarism.” Despite that, it’s mostly written with a light touch, often amusing. Read it.
                </p>
                <h2 id="p-5">Politics (Other)</h2>
                <p>
                    It’s not in the news much, but China is facing colossal economic challenges.
                    <a href="https://www.nytimes.com/2025/09/23/opinion/china-economy-deflation-neijuan.html">Learn about “meijuan”</a>
                    (in English,
    “involution”) which might well put the nation on the path of deflation. That’s a path that, once an economy is on it, is very
    hard to get off; it took Japan decades.
                </p>
                <p>
                    While we’re looking at China… there used to be “Kremlinology”, a study of the entirely opaque workings of the top inner
    circles of the Soviet regime. In that spirit, here’s some
                    <a href="https://en.wikipedia.org/wiki/Great_Hall_of_the_People">人民大会堂</a>
                    -ology:
                    <a href="https://sinocism.com/p/forever-xi-jinping-perhaps-not">Forever Xi Jinping? Perhaps Not</a>
                    .
    I enjoyed it but have no idea if it’s, you know, correct. Nobody outside that inner circle does.
                </p>
                <p>
                    Now let’s jump seven time zones west, to France, where the redoubtable Thomas Piketty offers
                    <a href="https://thomaspiketty.wordpress.com/2025/11/11/le-pens-rn-has-become-the-party-of-billionaires/">Le Pen’s RN has
    become the party of billionaires</a>
                    . Unlike the Beijing piece, Piketty’s is (as usual for him) supported by concrete data and I tend
    to believe it.
                </p>
                <p>
                    Last stop: Gaza, waiting to find out if an externally-imposed and leaky ceasefire will hold, and whether there is a path
    from where they are to something better. As for “where they are”, here’s
                    <a href="https://www.nytimes.com/interactive/2025/10/08/opinion/gaza-strip-before-after.html">The Gaza I Knew Is
    Gone</a>
                    by Ghada Abdulfattah.  It describes life’s experience for the citizens of Gaza after all these endless
    months of brutality.
                </p>
                <h2 id="p-9">Politics (everywhere)</h2>
                <p>
                    Pope Leo’s
                    <a href="https://www.vatican.va/content/leo-xiv/en/apost_exhortations/documents/20251004-dilexi-te.html">Apostolic Exhortation
    Dilexi Te of the Holy Father Leo XIV To All Christians On Love For The Poor</a>
                    got a short-lived run in the headlines,
    accompanied by “But that’s… socialism!” pearl-clutching from Stage Right. It deserves a read. The first three-quarters or
    so are a trip through Church history, starting in Nazareth, aimed at showing that concern for the poor has always been central
    to the faith. Which is fine, but eventually the Pope gets concrete about the twenty-first century, and is convincing whether or
    not you believe in any gods.
                </p>
                <p>
                    The next section is about Tech and while
                    <a href="https://csrc.nist.gov/csrc/media/Presentations/2023/radical-cs/images-media/sess-1-rogaway-bcm-workshop-2023.pdf">Radical 
    CS</a>
                    is a presentation from “The Third NIST Workshop on Block Cipher Modes of Operation” it’s about politics, oh yes it is. We
    very much need more of this kind of thing.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/Radical-CS.png" alt="Suggestions for a radical CS"/>
                <h2 id="p-6">Tech</h2>
                <p>
                    A
                    <a href="https://infosec.exchange/@david_chisnall/115270162462304611">post from David Chisnall on Mastodon</a>
                    contains this
    gem: “Machine learning is
                    <em>amazing</em>
                    if … the value of a correct answer is much higher than the cost of an incorrect
    answer.”
    Which is one of those things that’s obviously true as soon as you hear it. The whole piece is good.
                </p>
                <p>
                    The churning debate around AI is full of arm-waving and relatively free of objective numerical data. So here’s Ed Zitron’s
                    <a href="https://www.wheresyoured.at/costs/">This Is How Much Anthropic and Cursor Spend On Amazon Web Services</a>
                    .
    And I ask: How do the people making these investments think they’re going to get their money back?
                </p>
                <p>
                    Speaking of things are obviously true:
                    <a href="https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software">TextEdit and the
    Relief of Simple Software</a>
                    . We could do so much better than we do, and in our hearts we know why we’re not, and it’s about
    money and power, not technology.
                </p>
                <p>
                    Bluesky has brought its AT Protocol to the IETF; let’s see what happens. Here are
                    <a href="https://www.ietf.org/archive/id/draft-newbold-at-architecture-00.html">Authenticated Transfer: Architecture
    Overview</a>
                    and
                    <a href="https://www.ietf.org/archive/id/draft-holmgren-at-repository-00.html">Authenticated Transfer Repository and
    Synchronization</a>
                    . The drafts have
                    <a href="https://github.com/bluesky-social/ietf-drafts">source-code repos</a>
                    .
                </p>
                <p>
                    Finally, here’s
                    <a href="https://spinel.coop">Spinel</a>
                    , which is trying to build a decentralized, transparent,
    and somewhat-democratic engineering resource for the Ruby and Rails platforms. This follows on a distinctly-stinky power play where
    people with money grabbed the steering wheel. Best of luck to Spinel.
                </p>
                <h2 id="p-10">Canadian health</h2>
                <p>
                    Canada has “single-payer” public healthcare that comes with your taxes, which in my experience works well, see
                    <a href="/ongoing/When/200x/2009/08/22/Alison">here</a>
                    and
                    <a href="/ongoing/When/202x/2025/07/09/Saskatchewan">here.</a>
                </p>
                <p>
                    This costs a lot of money, over $300B/year.
    Predictably, there are business types panting with eagerness to get their hands on some of that
    money. And they can; a lot of medical practices and clinics and labs are owned by private companies, apparently doing well while
    being restricted to billing the government for the standard fees. But what they
                    <em>really</em>
                    want is a two-tier system where
    they can directly charge rich people more for better care. It seems like every year someone thinks up a clever dodge to nibble
    away at the system. Fortunately, these people have, so far, ended up losing in the courts.
                </p>
                <p>
                    Here’s a news story:
                    <a href="https://macleans.ca/society/health/ai-could-save-canadas-health-care-system/">AI Could Save Canada’s Health-Care
    System</a>
                    . It’s actually pretty coherent and I found it plausible that this technology could maybe 
    improve, for example, the agonizingly slow emergency-room experience.
                </p>
                <p>
                    But then I got curious as to the business angle and tracked the source of the story down to a business called called
                    <a href="https://www.getmaple.ca">maple</a>
                    . Sure enough,
                    <a href="https://helpdesk.getmaple.ca/en/articles/5375023-fees-to-see-a-general-practitioner-on-maple">here they are</a>
                    trying to
    siphon off direct payments for access to doctors. I predict they’ll end up in court, and lose.
                </p>
                <p>
                    And then there’s the government of Alberta, run by hard-right dipshits who hate most aspects of being Canadian and loathe the
    proposition that government can provide good and efficient services. Thus:
                    <a href="https://www.cbc.ca/news/canada/calgary/alberta-paul-parks-mri-diagnostics-adriana-lagrange-9.6952189">Alberta
    government plans to allow residents to privately pay for any diagnostic or screening service</a>
                    . Feaugh. I hope this one ends
    up in court too.
                </p>
                <h2 id="p-12">Paying for Open Source</h2>
                <p>It is coming to the world’s attention that most of our tech infrastructure is radically dependent on
    open-source software maintenaned by a
    cadre of developers who are old, tired, and not getting paid for their work. I have direct experience with trying unsuccessfully
    to convince Big-Tech business leaders to invest in Open-Source maintenance and infrastructure. Here’s some of the coverage:</p>
                <ul>
                    <li>
                        <p>
                            In
                            <cite>The Register</cite>
                            :
                            <a href="https://www.theregister.com/2024/09/18/open_source_maintainers_underpaid/">Open source maintainers underpaid,
      swamped by security, going gray</a>
                            .
                        </p>
                    </li>
                    <li>
                        <p>
                            Open Source Security Foundation:
                            <a href="https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/">Open
      Infrastructure is Not Free: A Joint Statement on Sustainable Stewardship</a>
                            .
                        </p>
                    </li>
                    <li>
                        <p>
                            Nils Adermann:
                            <a href="https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/">A Call for Sustainable Open Source
      Infrastructure</a>
                            .
                        </p>
                    </li>
                    <li>
                        <p>Hackernoon: <a href="https://hackernoon.com/how-can-governments-pay-open-source-maintainers">How Can Governments Pay Open Source
      Maintainers?</a></p>
                    </li>
                    <li>
                        <p>
                            The New Stack:
                            <a href="https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/">FFmpeg to Google: Fund Us or Stop Sending
      Bugs</a>
                            .
                        </p>
                    </li>
                </ul>
                <p>Things obviously can’t go on as they are. The best path forward isn’t obvious to me, but we need to start finding it.</p>
                <h2 id="p-11">Economics and life</h2>
                <p>
                    Paul Krugman and Martin Wolf, two really smart guys who aren’t technologists,
                    <a href="https://paulkrugman.substack.com/p/talking-ai-with-martin-wolf">talk about the impact of AI</a>
                    . Technofeudalism is
    considered carefully.
    My favorite out-take
    is from Krugman: “[I] have come to the conclusion that anything that I want to believe about the prospects of AI and its
    economic effects, all I need to do is do a little searching, and I can find some expert who will tell me whatever it is I want to
    believe.” Even with that well-justified cynicism, there is deep stuff here.
                </p>
                <p>
                    I read Matt Levine’s newsletter almost every day; not only does it teach you things about how money makes the world go round,
    it entertains; his glee at some particularly juicy financial swindle or clever arbitrage maneuver will bring a smile to your
    face.
    In
                    <a href="https://newsletterhunt.com/emails/201930">Money Stuff: Quantum Bond Trading</a>
                    he addresses a deeper question: Does
    the Finance business actually benefit society? Obviously a subject worthy of attention, and he makes it amusing.
                </p>
                <h2 id="p-8">Wonderful things</h2>
                <p>
                    The dude who wrote
                    <a href="https://www.bikewanderer.com/on-the-road//packrafting-the-darien-gap">Paddling the Darien</a>
                    is clearly crazy, I guess it’d be more polite to say “insanely brave”. Anyhow, I think there are very few people who won’t be
    astonished at these pictures and stories
                </p>
                <p>
                    I’m not at all sure what
                    <a href="https://jonathanhoefler.com/inventions">A. Inventions</a>
                    , by Jonathan Hoefler,
    is, actually.  The link that I followed said that GenAI image generators were involved. I don’t care.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/calendars.png" alt="Alignment Calendars 1584–1811"/>
                <div class="caption">
                    <p>Alignment Calendars 1584–1811,<br/>from Jonathan Hoefler’s <cite>Inventions</cite>.</p>
                </div>
                <p>
                    Let’s end with music.  Here are two absolutely exquisite song performances, courtesy of YouTube. First,
                    <a href="https://www.youtube.com/watch?v=1qahZ-whM6o">Old Enough</a>
                    by the Raconteurs, Ricky Skaggs, and Ashley Monroe. The
    interplay of voices and strings is magical.  Then Billy Strings wiith his band and string players, doing
                    <a href="https://www.youtube.com/watch?v=ZCtQdALo9DI">Gild the Lily</a>
                    .  Just a lovely performance of a fine new song.
                </p>
                <p>That’s all, folks, see you next time.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Kendzior Case-Study</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study"/>
        <link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/13/Kendzior-Case-Study#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study</id>
        <published>2025-11-13T12:00:00-08:00</published>
        <updated>2025-11-14T10:55:57-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Social Media"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Social Media"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">There was recently a flurry of attention and dismay over     <a href="https://en.wikipedia.org/wiki/Sarah_Kendzior">Sarah Kendzior</a> having been suspended from Bluesky by its     moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In     particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    There was recently a flurry of attention and dismay over
                    <a href="https://en.wikipedia.org/wiki/Sarah_Kendzior">Sarah Kendzior</a>
                    having been suspended from Bluesky by its
    moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In
    particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there.
                </p>
                <h2 id="p-1">Disclosures</h2>
                <p>
                    I’m a fan of Ms Kendzior, for example check out her recent
                    <a href="https://sarahkendzior.substack.com/p/when-i-loved-new-York">When I Loved New York</a>
                    ; fine writing and incisive
    politics. I like the Bluesky experience and have warm feelings toward the team there, although my
                    <a href="https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate">long-term social media bet is on Mastodon</a>
                    .
                </p>
                <h2 id="p-2">Back story</h2>
                <p>
                    Back in early October, the
                    <cite>Wall Street Journal</cite>
                    published
                    <a href="https://www.wsj.com/arts-culture/music/can-we-finally-give-johnny-cash-his-due-58ab24c2">It’s Finally Time to Give
    Johnny Cash His Due</a>
                    , an appreciation for Johnny’s music that I totally agreed with. In particular I liked its praise for
                    <a href="https://en.wikipedia.org/wiki/American_IV:_The_Man_Comes_Around">American IV: The Man Comes Around</a>
                    which, recorded while
    he was more or less on his deathbed, is a masterpiece. It also said that, relative to other rockers, Johnny “can seem deeply
    uncool”.
                </p>
                <p>
                    Ms Kendzior, who is apparently also a Cash fan and furthermore thinks he’s cool, posted to Bluesky “I want to shoot
    the author of this article just to watch him die.”  Which is pretty funny, because one of Johnny’s most famous lyrics, from
                    <a href="https://en.wikipedia.org/wiki/Folsom_Prison_Blues">Folsom
    Prison Blues</a>
                    , was “I shot a man in Reno just to watch him die.” (Just so you know: In 1968 Johnny performed the song at a
    benefit concert for the prisoners at Folsom, and on the live record (which is good), there is a burst of applause from the
    audience after the “shot a man” lyric. It was apparently added in postproduction.)
                </p>
                <p>
                    Subsequently, per the
                    <a href="https://bsky.app/profile/safety.bsky.app/post/3m5hcx4n2hc2z">Bluesky Safety</a>
                    account ”The account owner of
    @sarahkendzior.bsky.social  was suspended for 72 hours for expressing a desire to shoot the author of an article.”
                </p>
                <p>There was an outburst of fury on Bluesky about the sudden vanishing of Ms Kendzior’s account, and the explanation
    quoted above didn’t seem to reduce the heat much.  Since I know nothing about the mechanisms used by Bluesky Safety, I’m
    not going to dive any deeper into the Bluesky story.</p>
                <h2 id="p-3">On Mastodon</h2>
                <p>
                    I do know quite a bit about Mastodon’s trust-and-safety mechanisms, having been a moderator on
                    <a href="https://cosocial.ca">CoSocial.ca</a>
                    for a couple of years now.  So I’m going to walk through how the same story might
    have unfolded on Mastodon, assuming Ms Kendzior had made the same post about the
                    <cite>WSJ</cite>
                    article. There are a bunch of
    forks in this story’s path, where it might have gone one way or another depending on the humans involved.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/report-menu.png" alt="Mastodon “Report” menu" class="inline"/>
                <h2 id="p-4">Reporting</h2>
                <p>The Mastodon process is very much human-driven. Anyone who saw Ms Kendzior’s post could pull up the per-post menu and hit the
    “Report” button. I’ve put a sample of what that looks like on the right, assuming someone wanted to report yours truly.</p>
                <p>
                    By the way, there are many independent Mastodon clients; some of them have “Report” screens that are way cooler than this. I
    use
                    <a href="https://phanpy.social">Phanpy</a>
                    , which has a hilarious little animation with an animated rubber stamp that
    leaves a red-ink “Spam” or whatever on the post you’re reporting.
                </p>
                <p>We’ll get into what happens with reports, but here’s the first fork in the road: Would the Kendzior post have been reported?
    I think there are three categories of people that are interesting. First, Kendzior fans who are hip to Johnny Cash, get the
    reference, snicker, and move on.  Second, followers who think “ouch, that could be misinterpreted”; they might throw a
    comment onto the post or just maybe report it. Third, Reply Guys who’ll jump at  any chance to take a vocal woman down; they’d
    gleefully report her en masse. There’s no way to predict what would have happened, but it wouldn’t be surprising if there were
    both categories of report, or either, or none.</p>
                <h2 id="p-5">Moderating</h2>
                <p>When you file a report, it goes both to the moderators of your instance and the of instance where it was posted (who oversee the poster’s account).
    I dug up a 2024 report someone filed against me to give a feeling for what
    the moderator experience is like.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/timbray-report.png" alt="Report filed against Tim Bray for “antisemitism”"/>
                <p>I think it’s reasonably self-explanatory. Note that the account that filed the report is not identified, but that the server
    it came from is.</p>
                <p>A lot of reports are just handled quickly by a single moderator and don’t take much thought: Bitcoin scammer or Bill Gates
    impersonator or someone with a swastika in their profile? Serious report, treated seriously.</p>
                <p>Others require some work. In the moderation screen, just below the part on display above, there’s space for moderators to
    discuss what to do.  (In this particular case they decided that criticism of political leadership wasn’t “antisemitism” and
    resolved the report with no action.)</p>
                <p>In the Kendzior case, what might the moderators have done? The answer, as usual, is “it depends”. If there were just one or
    two reports and they leaned on terminology like “bitch” and “woke”, quite possibly they would have been dismissed.</p>
                <p>If one or more reports were heartfelt expressions of revulsion or trauma at what seemed to be a hideous death threat, the
    moderators might well have decided to take action. Similarly if the reports were from people who’d got the reference and
    snickered but then decided that there really should have been a “just kidding” addendum.</p>
                <h2 id="p-6">Action</h2>
                <p>Here are the actions a moderator can take.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions.png" alt="Mastodon moderation action options"/>
                <p>If you select “Custom”, you get this:</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions-2.png" alt="More Mastodon moderation action optiosn"/>
                <p>Once again, I think these are self-explanatory. Before taking up the question of what might happen in the Kendzior case, I
    should grant that moderators are just people, and sometimes they’re the wrong people. There have been servers with a reputation
    for draconian moderation on posts that are even moderately controversial. They typically haven’t 
    done very well in terms of attracting and retaining members.</p>
                <p>OK, what might happen in the Kendzior case? I’m pretty sure there are servers out there where the post would just have been
    deleted. But my bet is on that “Send a warning” option. Where the warning might go something like “That
    post of yours really shook up some people who didn’t get the Folsom Prison Blues reference and you should really
    update it somehow to make it clear you’re not serious.”</p>
                <p>Typically, people who get that kind of moderation message take it seriously. If not, the moderator can just delete the post.
    And if the person makes it clear they’re not going to co-operate, that creates a serious risk that if you let them go on shaking
    people up, your server could get mass-defederated, which is the death penalty. So (after some discussion) they’d delete the
    account. Everyone has the right to free speech, but nobody has a right to an audience courtesy of our server.</p>
                <h2 id="p-7">Bottom line</h2>
                <p>It is very, very unlikely that in the Mastodon universe, Sarah Kendzior’s account would suddenly have globally vanished. It
    is quite likely that the shot-a-man post would have been edited appropriately, and possible that it would have just
    vanished.</p>
                <h2 id="p-8">Will it scale?</h2>
                <p>I think the possible outcomes I suggested above are, well, OK.  I think the process I’ve described is also OK. The
    question arises as to whether this will hold together as the Fediverse grows by orders of magnitude.</p>
                <p>I think so?  People are working hard on moderation tools. I think this could be an area where AI would help, by
    highlighting possible problems for moderators in the same way that it highlights spots-to-look-at today for radiologists. We’ll
    see.</p>
                <p>There are also a couple of background realities that we should be paying more attention to.  First, bad actors tend to
    cluster on bad servers, simply because non-bad servers take moderation seriously. The defederation scalpel needs to be kept
    sharp and kept nearby.</p>
                <p>
                    Secondly, I’m pretty convinced that the current open-enrollment policy adopted by many servers, where anyone can have an
    account just by asking for it, will eventually have to be phased out.  Even a tiny barrier to
    entry
                    <span class="dashes"> —</span>
                    a few words on why you want to join or, even better, a small
    payment
                    <span class="dashes"> —</span>
                    is going to reduce the frequency of troublemakers to an amazing degree.
                </p>
                <h2 id="p-9">Take-aways</h2>
                <p>Well, now you know how moderation works in the Fediverse.  You’ll have to make up your own mind about whether you like it.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Bye, Google Search</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind"/>
        <link rel="replies" thr:count="4" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind</id>
        <published>2025-11-01T12:00:00-07:00</published>
        <updated>2025-11-03T21:29:26-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Search"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Search"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Publishing"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Publishing"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online/De-Google"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="De-Google"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog     fragments using Google. No longer; I wired in     <a href="https://pagefind.app">Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,     I’ll wait before getting into the details</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog
    fragments using Google. No longer; I wired in
                    <a href="https://pagefind.app">Pagefind</a>
                    ; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,
    I’ll wait before getting into the details.
                </p>
                <h2 id="p-1">The problem</h2>
                <p>
                    Well, I mean, Google is
                    <em>definitely</em>
                    Part Of The Problem in advertising, surveillance, and Internet
    search. But the problem I’m talking about is that it just couldn’t find my pages, even 
    when I knew they were here and knew words that should find them.
                </p>
                <p>
                    Either it dropped the entries from the index or dropped a bunch of search terms.
    Don’t know and don’t care now.
                    <span class="o">ongoing</span>
                    is my outboard memory
    and I search it
                    <em>all the freaking time</em>
                    . This failure mode was making me crazy.
                </p>
                <h2 id="p-2">Pagefind</h2>
                <p>Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a
    waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user
    interface.</p>
                <h2 id="p-3">How it works</h2>
                <p>They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one
    composed of static files. And it is, but there’s more to it than that; read on.</p>
                <p>
                    First, you point a Node program at the root of your static-files tree and stand back. My tree has a bit over 5,000 files
    containing about 2½ million words, adding up to a bit over 20M of text. By default, it assumes you’re indexing HTML and includes
    all the text inside each page’s
                    <code>&lt;body></code>
                    element.
                </p>
                <p>
                    You have to provide a
                    <code>glob</code>
                    argument to match the files you want to index; in most cases, something like
                    <code>root/**/*.html</code>
                    would do the trick. Working this out was for me the hardest part because among other things my
    articles don’t end with
                    <code>.html</code>
                    ; maybe it’ll be helpful for some to
    note that what worked for
                    <span class="o">ongoing</span>
                    was:
                    <br/>
                    <code>When/???x/????/??/??/[a-zA-Z0-9]&lt;[\-_a-zA-Z0-9]:></code>
                </p>
                <p>This produced an index organized into about 11K files adding up to about 78M.  It includes a directory with one file per
    HTML page being searched.</p>
                <p>I’d assumed I’d have to wire this up to my Web server somehow, but no: It’s all done in the client by fetching little bits
    and pieces of the index using ordinary HTTP GETs.
    For example, I ran a search for the word “minimal”, which resulted in my browser fetching a total of seven files totaling
    about 140K. That’s what they mean by “static”; not just the data, but the index too.</p>
                <p>
                    Finally, I noticed a couple of WASM files, so I had to check out
                    <a href="https://github.com/Pagefind/pagefind">the source code</a>
                    and, sure enough, this is basically a Rust app. Again I’m
    impressed.  I hope that slick modern Rust/WASM code isn’t offended by me rubbing it up against this blog’s messy old
    Perl/Ruby/raw-JS/XML tangle.
                </p>
                <h2 id="p-9">Scalable?</h2>
                <p>
                    Interesting question. For the purposes of this blog, Pagefind is ideal. But, indexing my 2½ million words burned a solid
    minute of CPU on the feeble VPS that hosts
                    <span class="o">ongoing</span>
                    . I wonder if the elapsed time is linear in the data
    size, but it wouldn’t surprise me if it were worse. Furthermore, the index occupies more storage than the underlying data, which
    might be a problem for some.
                </p>
                <p>Also, what happens when I do a search while the indexing is in progress?  Just
    to be sure, I think I’ll wire it up to build the index in a new directory and switch indices as atomically as possible.</p>
                <p>Finally, I think that if you wanted to sustain a lot of searches per second, you’d really want to get behind a CDN, which would
    make all that static index fetching really fly.</p>
                <h2 id="p-4">Configuring</h2>
                <p>The default look-and-feel was mostly OK by me, but the changes I had to make did involve quality time with the inspector,
    figuring out the class and ID complexities and then iterating the CSS.</p>
                <p>
                    The one thing that in the rear-view seems unnecessary is that I had to add a
                    <code>data-pagefind-meta</code>
                    attribute to the
    element at the very bottom of the page where the date is to include it in the result list. There should be a way
    to do this without custom markup. John Siracusa filed a
                    <a href="https://github.com/Pagefind/pagefind/issues/974">related bug</a>
                    .
                </p>
                <h2 id="p-8">Deployment</h2>
                <p>There’s hardly any work. I’ll re-run the indexer every day with a crontab entry and it looks it should just take care of
    itself.</p>
                <h2 id="p-5">To do?</h2>
                <p>Well, I could beautify the output some more but I’m pretty happy with it after just a little work. I can customize the sort
    order, which I gather is in descending order of how significant Pagefind thinks the match is. There’s a temptation to sort it in
    reverse date order. Actually, apparently I can also influence the significance algorithm.  Anyhow I’ll run with mostly-defaults
    for now.</p>
                <h2 id="p-6">Search options</h2>
                <p>I notice that the software is pretty good at, and aggressive about, matching across verb forms and singular/plural and
    prefixes. Which I guess is what you want?  You can apparently defeat that by enclosing a word in quotes if you want it matched
    exactly. Works for phrases too. I wonder what other goodies are in there; couldn’t find any docs on that subject.</p>
                <p>Finally, there’s an excellent feature set I’ll never use; it’s smart about lots of languages. But alas, I write
    monolingually.</p>
                <h2 id="p-10">Shameful cleanup</h2>
                <p>Like I said, getting Pagefind installed and working was easy. Getting the CSS tuned up was a bit more effort. But I have to
    confess that I put hours and hours into hiding my dirty secrets.</p>
                <p>
                    You see,
                    <span class="o">ongoing</span>
                    contains way more
    writing than you or Google can see. It’s set up so I can “semi-publish” pieces; there but unlinked.  There was a whole lot of
    this kind of stuff: Photo albums from social events, pitches to employers about why they should hire various people
    including me, rants at
    employers for example about why Solaris should adopt the Linux userland (I was right) and why Android should include a Python
    SDK (I was right), and pieces that employer PR groups convinced me to bury. One of my minor regrets about no longer being
    employed is I no longer get to exercise my mad PR-group-wrangling skillz.
                </p>
                <p>
                    But when your search software is just walking the file tree, it doesn’t know what’s “published” and what’s not.  I ended up
    using my rusty shell muscles with
                    <code>xarg</code>
                    and
                    <code>sed</code>
                    and
                    <code>awk</code>
                    and even an
                    <code>ed(1)</code>
                    script. I think I got it all, but who knows, search hard enough and you might find something embarrassing. If you do, I’d sure
    appreciate an email.
                </p>
                <h2 id="p-7">Thanks!</h2>
                <p>To the folks who built this. Seems like a good thing.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Time to Migrate</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate"/>
        <link rel="replies" thr:count="6" type="application/xhtml+xml" href="/ongoing/When/202x/2025/11/03/Time-to-Migrate#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate</id>
        <published>2025-11-03T12:00:00-08:00</published>
        <updated>2025-11-03T12:00:00-08:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Business/Publishing"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Business"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Publishing"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean     any combination of “less useful”, “less safe”, or “less fun”.     This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to     go. Come join me.  Here’s why</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean
    any combination of “less useful”, “less safe”, or “less fun”.
    This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to
    go. Come join me.  Here’s why.</p>
                <h2 id="p-2">Defining terms</h2>
                <p>
                    In this post, by “Social media” I mean 
    “what Twitter used to be, back when it was good”. We should expect our social-media future to be
                    <em>at least</em>
                    as useful, safe, and fun as that baseline. (But we can do better!)
                </p>
                <p>
                    By “Mastodon” I mean the many servers, mostly running the
                    <a href="https://github.com/mastodon/mastodon">Mastodon software</a>
                    , that
    communicate using the
                    <a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub protocol</a>
                    . Now I’ll try to convince you to start using one of
    them.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/join-mastodon.png" alt="join-mastodon.org"/>
                <div class="caption">
                    <p>
                        Start at
                        <a href="https://joinmastodon.org">joinmastodon.org</a>
                    </p>
                </div>
                <h2 id="p-4">The simplest argument</h2>
                <p>Have you noticed that social-media products, in the long term, can’t seem to manage to stay fun and safe and useful? 
    I have.  But there’s one huge exception, a tool that’s been serving billions of us for
    decades, and works about as well as it ever did.  I’m talking about email.</p>
                <p>Why does email stay reasonably healthy? Because nobody owns it. Anyone on any server can communicate with anyone else on any
    other and it Just Works. Nobody can buy it and make it a vehicle for their politics. Nobody can crank up the ad density or
    make things worse to improve their profit margin.</p>
                <p>
                    Mastodon’s like email that way. Plus it does all the Post and Repost and Quote and Follow and Reply and Like and Block stuff that you’re
    used to, and there are thousands of servers and anyone can run one and nobody can own the whole thing.  It doesn’t have ads and it
    won’t. It’s dead easy to use and it’s fun and you should
                    <a href="https://joinmastodon.org">give it a try</a>
                    .
                </p>
                <p>
                    The rest of this essay goes into detail about why Mastodon is generally great and specifically better than the
    alternatives. But if that simple pitch sounded good, stop here,
                    <a href="https://joinmastodon.org/">go get an account</a>
                    and climb on board.
                </p>
                <!--
    <p>But first…</p>
    <h2 id='p-5'>Is social media worth saving?</h2>
    <p>I regularly read that it’s pernicious and evil, damaging the mental health of young people,
    and should be stamped out or foregone. I disagree. I think the problem is late-stage capitalism; every company that
    offers a social-media product is under relentless financial pressure to yield steadily-growing profits, going on forever.</p>
    <p>Since
    there’s a global limit to the number of customers that any service can attract, that means they have to suck more out of each
    user. Where by “suck more out of” I mean what social-media professionals call “increase engagement”.</p>
    <p>So, engagement is increased at literally any cost, notably including the
    <a href="https://erinkissane.com/meta-in-myanmar-part-i-the-setup">slaughter of the Rohingya</a>.</p>
    <p>I for one do <em>not</em> agree that there’s anything essentially pernicious about having networked online
    conversations. Once again, I appeal to email, which generally doesn’t exhibit the usual social-media pathologies.</p>
    <p>I’d even appeal to Twitter-that-was, when authoritative voices were
    talking about any subject from every angle, and when you could find out if you’d just felt an earthquake and be horrified or overjoyed
    about Maple Leafs playoff collapse. It was fun and useful and educational.</p>
    <p>So, Social Media? Yes. Centralized corporate social media? No.</p> 
    <p>Now, here are a bunch of great things about Mastodon, if that pitch above didn’t quite convince you to switch now.</p> -->
                <h2 id="p-18">Why now?</h2>
                <p>
                    Two things motivated me to post this piece now. First, this month is  my three-year anniversary of
                    <a href="/ongoing/When/202x/2022/11/26/Bye-Twitter">bailing out on Twitter</a>
                    in favor of Mastodon.
                </p>
                <p>Second is the release of Mastodon 4.5, which I think closes the last few important-missing-feature gaps.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/masto4-5.png" alt="Mastodon v4.5 announcement"/>
                <p>The software is improving rapidly, particularly in the last couple of releases. It’s got cool features you won’t find
    elsewhere, and there’s very little cool stuff from elsewhere that’s not here.  There was a time when newly-arrived people had
    confusing or unfriendly experiences, or missed features that were important to them.
    It looks to me like those days are over.</p>
                <h2 id="p-6">Migration</h2>
                <p>
                    Mastodon is many thousands of servers, and you can join the biggest,
                    <a href="https://mastodon.social/explore">mastodon.social</a>
                    , or
                    <a href="https://joinmastodon.org/servers">shop around for another</a>
                    . But here’s the magic thing: If you end up disliking the
    server you’re on, or find a better one, you can migrate and
                    <em>take your followers with you</em>
                    ! You can’t ever get locked
    in.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/serveres.png" alt="Choosing a Mastodon server"/>
                <div class="caption">
                    <p>The server-selection menu has lots of options.</p>
                </div>
                <p>This is probably Mastodon’s most important feature. It’s why no billionaire can buy it and no corporation can enshittify it.  As
    far as I know, Mastodon is the first widely-adopted social software ever to offer this.</p>
                <h2 id="p-7">Interaction</h2>
                <p>You hear it over and over: “I had &lt;a big number> of followers on Twitter and now I have &lt;a less-big number> on
    Mastodon, but I get so much more conversation and interaction when I post here.”</p>
                <p>One of the people you’ll hear that from is me.
    My follower count is less than half the 45K I had on Twitter-that-was, but I get immensely more intelligent, friendly
    interaction than I ever got there.  (And then sometimes I get told firmly that I’m wrong about this or that, but hey.)  It’s
    the best social-media experience I’ve ever had.</p>
                <p>Dunno about you, but conversation and interaction
    seem like a big deal to me.  One reason things are lively is…</p>
                <h2 id="p-8">Sex</h2>
                <p>Here’s an axiom: An ad-supported service can’t have sex-positive or explicit content. Advertisers simply won’t tolerate
    having their message appear beside NSFW images or Gay-Leatherman tales or exuberant trans-positivity. Mastodon
    can.</p>
                <p>Of course, you gotta be reasonable, posting anything actually illegal will get your ass perma-blocked and your account
    suspended. So will posting anything that’s NSFW etc without a “Content Warning”. That’s a built-in feature of Mastodon which
    puts a little warning (“#NSFW” and “#Lewd” are popular) above your post, which is tastefully blurred-out until whoever’s
    looking at it clicks on “Show content”.
    I use these all the time when 
    I post about #baseball or #fútbol because a lot of the geeks and greens who follow me are pointedly uninterested in sports.</p>
                <p>
                    (Oh, typing that in reminds me that you can subscribe to hashtags on Mastodon: Let’s see, I currently subscribe to, among
    others,
                    <a href="https://mastodon.social/search?q=%23Vancouver">#Vancouver</a>
                    ,
                    <a href="https://mastodon.social/search?q=%23Murderbot">#Murderbot</a>
                    , and
                    <a href="https://mastodon.social/search?q=%23Fujifilm">#Fujifilm</a>
                    .)
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/ivory.png" alt="The Ivory For Mastodon app for Apple platforms"/>
                <div class="caption">
                    <p>The “Ivory for Mastodon” app for Apple platforms,<br/>one of the many fine alternative clients.</p>
                </div>
                <h2 id="p-9">Moderation and defederation</h2>
                <p>Did I just mention, two paragraphs up, getting blocked? Mastodon isn’t free of griefers, but the tools to fight them are good
    and getting better.</p>
                <p>The good news is that each server moderates its own members. So there’s some variation
    of the standards from server to server, but less than you’d think. Since there are thousands of servers, there are
    thousands of moderators, which is a lot.</p>
                <p>If you act in a way that others find offensive, you’ll probably get blocked by the offended people and also reported; the
    report can come from any server and it’ll go to the moderators on yours. On a well-run server, those mods will have a look and
    if you’ve actually been bad, your post might get yanked and you might get warned, or in an extreme case, booted off.</p>
                <p>(I’ve been reported for saying unkind things about Bibi Netanyahu and for posting too many photos of my
    cats (no, really) but that kind of thing is cheerfully ignored by good moderation teams.)</p>
                <p>
                    Then there’s Mastodon’s nuclear weapon: Defederation.
    Suppose you’re prone to nasty bigotry in public and you get reported a lot and your server’s moderators
                    <em>don’t</em>
                    rein
    you in. Eventually, word will get around, and if things aren’t cleaned up, most servers will defederate yours, so that
                    <em>nobody</em>
                    on their server can see posts from anyone on yours. Your site is no longer part of the “Fediverse”; this is a powerful
    incentive for server owners to take moderation seriously.
                </p>
                <p>The effect of all this is that the haters and scammers and Nazis who show up get shuffled off-stage PDQ. Well,
    almost always; a couple of years ago a wave of incoming Black people had bad experiences with racist abuse. Ouch. But
    the good news is that recent Mastodon releases have been shutting prone-to-abuse channels
    down, so things are better than then and should continue to improve.</p>
                <h2 id="p-11">Links are good</h2>
                <p>
                    Corporate social-media services like to
                    <a href="https://talkingpointsmemo.com/tpm-25/how-elon-musks-changes-to-x-made-our-discourse-far-stupider">downrank posts with
    links</a>
                    .
    Which makes me want
    to scream, because my favorite thing to post is a link+reaction to something cool, and my favorite posts to read are too.
                </p>
                <p>On Mastodon, when you have a link in a post, the software automatically fetches a preview of whatever you linked to and uses
    it to decorate your link.
    I mean, it’s the damn Internet, it only got interesting to non-geeks when we figured out how to turn millions of servers
    into a great big honking searchable hypertext.</p>
                <h2 id="p-12">Search</h2>
                <p>Speaking of which, Mastodon search is pretty good these days. It’s become, just like this blog, part of my outboard
    memory, and I’m always typing things like “telephoto from:me has:media” into the search box. Fast enough, too.</p>
                <h2 id="p-13">Great clients</h2>
                <p>Another good thing about Mastodon is that there are lots of
    clients to choose from, mostly open-source. The best ones are miles ahead of Xitter and Threads and
    Bluesky and, really, anything.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/Screenshot_20251110-104045.png" alt="A post from Brian Krebs in the Tusky app"/>
                <div class="caption">
                    <p>Anniversary post in the Android “Tusky” app.</p>
                </div>
                <p>
                    There are official Web and mobile clients from the Mastodon team and they’re fine, especially for admin and moderation work.
    But iOS people should check out
                    <a href="https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/">Ivory</a>
                    , Androiders should look at
                    <a href="https://tusky.app">Tusky</a>
                    , and everyone should try
                    <a href="https://phanpy.social">Phanpy</a>
                    . I live in Phanpy on both my Mac and my Pixel
                    <span class="dashes"> —</span>
                    it’s a
    Web thing but installable as a PWA on both Android and iOS.
                </p>
                <p>
                    Commercial products, especially social-media services, have
                    <em>never</em>
                    been at peace with third-party clients.
    Twitter used to be, but then it stabbed those developers in the back. It’s easy to
    understand why; every product manager has it drilled into them that they
                    <em>must control the user experience</em>
                    . This ignores
    the ancient wisdom (I first heard it from
                    <a href="https://en.wikipedia.org/wiki/Bill_Joy">Bill Joy</a>
                    ) “Wherever you work, most of the smart people are somewhere else.”
                </p>
                <p>
                    Mastodon doesn’t have that kind of product manager, but it does have a
                    <a href="https://docs.joinmastodon.org/api/">fully-capable API</a>
                    , developed in the open and with no
    hidden or restricted features. Which means you’re going to get better clients.
                </p>
                <h2 id="p-14">Algorithms</h2>
                <p>The algorithms that commercial social-media services use to sort your feed have one goal only: Maximize engagement and thus
    revenue. They have no concern for quality or novelty, and have been widely condemned by people who think about this stuff. So
    much so that there’s a feeling that Algorithms Are Bad.</p>
                <p>Mastodon has an algorithm: Show the posts from the accounts you follow, latest first. It works pretty
    well. It also has “Trending” feeds of the most popular posts, hashtags, and links.  I hit those once a
    day or so to get a feeling for what’s going on in the world.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/trending.png" alt="Trending screen in PhanPy"/>
                <div class="caption">
                    <p>The “Trending” display in Phanpy.</p>
                </div>
                <p>I do think there’s room for improvement here; Bluesky has shown off the idea of pluggable feed-ranking algorithms, with many to
    choose from, and I like it. No reason in principle we couldn’t have the same thing on Mastodon.</p>
                <h2 id="p-15">Money</h2>
                <p>Every other social network has started with a big pot of money, whether from venture-capital investors (Twitter, Instagram) or
    from a Big Tech corporate parent (Google+, Threads).  The people who provided that money want it back, plus a whole lot more.
    Thus, the manic drive for “engagement” and growth at all costs. They need to build huge data centers and employ an elite
    operations team plus an even more elite marketing group.</p>
                <p>Mastodon, eh… a gaggle of nonprofits and co-ops and unincorporated affinity groups, financed by Patreon or low annual dues
    or Some Random Geek who enjoys running a server.</p>
                <p>Since nobody owns it, nobody can extract a profit from it. Which means that from the big-money point of view, it’s entirely
    non-investable. The goal isn’t for anybody to make money, it’s to be instructive and intense and fun. It’s run on the cheap.
    You know what they call systems that are cheap and diversified? Resilient. Sustainable. Long-lived.</p>
                <p>
                    Last year
                    <a href="https://www.tbray.org/ongoing/When/202x/2024/11/15/Not-Bluesky">I wrote</a>
                    : 
    “Think of the Fediverse not as just one organism, but a population of mammals, scurrying around the ankles of the bigger and
    richer alternatives. And when those alternatives enshittify or fall to earth, the Fediversians will still be there.” After
    “scurrying” I should have added “and evolving”.
                </p>
                <h2 id="p-19">What about Bluesky?</h2>
                <p>
                    I like the Bluesky people and their software, but I worry a lot about whether they’re really decentralized in practice, and
    even more about their financial future. I wrote up the details in
                    <a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">Why Not Bluesky</a>
                    .
                </p>
                <h2 id="p-16">Mastodon’s the only option</h2>
                <p>The only social-media option, I mean, that’s decentralized, not owned or controlled by anyone, and working well today as you
    read this. It’s intense and interactive and fun. Why settle for less?</p>
                <p>
                    <i>(Disclosure: I have no formal connections with the Mastodon organization, aside from being a low-level supporter on
    Patreon.)</i>
                </p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Grokipedia</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia"/>
        <link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/10/28/Grokipedia#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia</id>
        <published>2025-10-28T12:00:00-07:00</published>
        <updated>2025-10-29T21:09:53-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Publishing/Reference"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Publishing"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Reference"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I     succumbed to boredom and killed the tab. Thus my introduction to     <a href="https://en.wikipedia.org/wiki/Grokipedia">Grokipedia</a>. Here are early impressions</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I
    succumbed to boredom and killed the tab. Thus my introduction to
                    <a href="https://en.wikipedia.org/wiki/Grokipedia">Grokipedia</a>
                    . Here are early impressions.
                </p>
                <h2 id="p-1">On Bray</h2>
                <p>
                    My Grokipedia entry has over seven thousand words, compared to a mere 1,300 in
                    <a href="https://en.wikipedia.org/wiki/Tim_Bray">my Wikipedia article</a>
                    . It’s pretty clear how it was generated; an LLM, trained
    on who-knows-what but definitely including that Wikipedia article and this blog, was told to go nuts.
                </p>
                <p>Speaking as a leading but highly biased expert on the subject of T. Bray, here are the key take-aways:</p>
                <h2 id="p-2">(Overly) complete</h2>
                <p>It covers all the territory; there is no phase of my life’s activity that could possibly be encountered in combing the Web
    that is not exhaustively covered. In theory this should be good but in fact, who cares about the details of what I worked on
    at Sun Microsystems between 2004 and 2010? I suppose I should but, like I said, I couldn’t force myself to plod all the way
    through it.</p>
                <h2 id="p-3">Wrong</h2>
                <p>Every paragraph contains significant errors. Sometimes the text is explicitly self-contradictory on the face of it,
    sometimes the mistakes are subtle enough that only I would spot them.</p>
                <h2 id="p-4">Style</h2>
                <p>The writing has that LLM view-from-nowhere flat-affect semi-academic flavor. I don’t like it but the evidence suggests that
    some people do?</p>
                <h2 id="p-5">References</h2>
                <p>All the references are just URLs and at least some of them entirely fail to support the text. Here’s an example. In
    discussion of my expert-witness work for the FTC in their litigation against Meta concerning its acquisitions of Instagram and
    WhatsApp, Grokipedia says:</p>
                <blockquote>
                    <p>[Bray] opined that users' perceptions of response times in online services critically influence market
    dynamics.</p>
                </blockquote>
                <p>
                    It cites
                    <a href="https://www.ftc.gov/system/files/ftc_gov/pdf/FTCReplytoMetaResponse-CounterstatementofMaterialFacts.pdf">Federal
    Trade Commission’s Reply to Meta Platforms, Inc.’s Response to Federal Trade Commission’s Counterstatement of Material
    Facts</a>
                    (warning: 2,857-page PDF). Okay, that was one of the things I argued, but the 425 pages of court documents that I
    filed, and the references to my reporting in the monster document, make it clear that it was one tiny subset of the main
    argument.
                </p>
                <p>Anyhow, I (so that you won’t have to) spent a solid fifteen minutes spelunking back and forth through that FTC doc, looking
    for strings like “response time” and “latency” and so on. Maybe somewhere in those pages there’s support for the claim quoted
    above, but I couldn’t find it.</p>
                <h2 id="p-6">Useful?</h2>
                <p>
                    Wikipedia, in my mind, has two main purposes: A quick visit to find out the basics about some city or person or plant or
    whatever, or a deep-dive to find out what we
                    <em>really</em>
                    know about genetic linkages to autism or Bach’s relationship with
    Frederick the Great or whatever.
                </p>
                <p>At the moment, Grokipedia doesn’t really serve either purpose very well. But, after all, this is release 0.1, maybe we
    should give it a chance.</p>
                <p>Or, maybe not.</p>
                <h2 id="p-7">Woke/Anti-Woke</h2>
                <p>The whole point, one gathers, is to provide an antidote to Wikipedia’s alleged woke bias. So I dug into that. Let’s consider
    three examples of what I found.  First, from that same paragraph about the FTC opinion quoted above:</p>
                <blockquote>
                    <p>
                        While Bray and aligned progressives contend that such dominance stifles innovation by enabling predatory acquisitions and
      reduced rivalry—evidenced by fewer startup exits in concentrated sectors—counterarguments highlight that Big Tech's scale has
      fueled empirical gains, with these firms investing over $240 billion in U.S. R&amp;D in 2024 (more than a quarter of national
      totals) and driving AI, cloud, and patent surges.[
                        <a href="https://www.tbray.org/ongoing/When/202x/2020/06/08/Anti-monopoly">128</a>
                        ]
      [
                        <a href="https://www.intereconomics.eu/contents/year/2025/number/2/article/big-tech-and-the-us-digital-military-industrial-complex.html">131</a>
                        ] Six tech industries alone accounted for
      over one-third of 
      U.S. GDP growth from 2012–2021, comprising about 9% of the 
      economy and sustaining 9.3 million jobs amid falling consumer prices and rapid technological diffusion.
      [
                        <a href="https://itif.org/publications/2023/05/30/six-tech-industries-accounted-for-more-than-one-third-of-gdp-growth-in-the-last-decade/">132]</a>
                        [
                        <a href="https://jamesmadison.org/the-united-states-is-the-leader-of-the-digital-revolution-pro-tech-policies-are-key/">133</a>
                        ]
      Right-leaning economists often defend consumer welfare metrics and market self-correction, warning that forced divestitures
      risk eroding the efficiencies and investment incentives that have propelled sector productivity above 6% annual growth in key
      areas like durable manufacturing tech.
      [
                        <a href="https://itif.org/publications/2025/09/19/five-persistent-myths-about-big-tech/">134</a>
                        ]
      [
                        <a href="https://www.nber.org/digest/oct01/technology-and-productivity-growth?page=1&amp;perPage=50">135</a>
                        ]
                    </p>
                </blockquote>
                <p>
                    I’ve linked the numbered citations to the indicated URLs. Maybe visit one or two of them and see what you think? Four are
    to articles arguing, basically, that monopolies must be OK because the companies accused of it are growing really fast and
    driving the economy. They seem mostly to be from right-wing think-tanks but I guess that’s what those think-tanks are for.  One
    of them, #131,
                    <cite>Big Tech and the US Digital-Military-Industrial Complex</cite>
                    , I think isn’t helpful to the argument at
    all. But still, it’s broadly doing what they advertise: Pushing back against “woke” positions, in this case the position that
    monopolization is bad.
                </p>
                <p>I looked at a couple of other examples.  For example, this is from the header of the Greta Thunberg article:</p>
                <blockquote>
                    <p>While credited with elevating youth engagement on environmental issues, Thunberg's promotion of urgent, existential climate
      threats has drawn scrutiny for diverging from nuanced empirical assessments of climate risks and adaptation capacities, as
      well as for extending her activism into broader political arenas such as anti-capitalist and geopolitical protests.[5][6]</p>
                </blockquote>
                <p>Somehow I feel no urge to click on those citation links.</p>
                <p>
                    If Ms Thunberg is out there on the “woke” end of the spectrum, let’s flit over to the other end, namely the entry for
    J.D. Vance, on the subject of his book
                    <cite>Hillbilly Elegy</cite>
                    .
                </p>
                <blockquote>
                    <p>
                        Critics from progressive outlets, including Sarah Smarsh in her 2018 book
                        <cite>Heartland</cite>
                        , faulted the memoir for
      overemphasizing personal and cultural failings at the expense of structural economic policies, arguing it perpetuated
      stereotypes of rural whites as self-sabotaging.[71] These objections, often rooted in institutional analyses from academia and
      media, overlooked data on behavioral patterns like opioid dependency rates—peaking at 21.5 deaths per 100,000 in Appalachia
      around 2016—that aligned with Vance's observations of "deaths of despair" precursors.[72]
                    </p>
                </blockquote>
                <p>
                    I read and enjoyed
                    <cite>Heartland</cite>
                    but the citation is to a
                    <cite>New Yorker</cite>
                    article that doesn’t mention
    Smarsh. As for the second sentence… my first reaction as I trudged through its many clauses, was “life’s too short”.
    But seriously, opioid-death statistics weaken the hypothesis about structural economic issues? Don’t get it.
                </p>
                <h2 id="p-8">Take-away</h2>
                <p>
                    Wikipedia is,
                    <a href="/ongoing/When/202x/2024/06/15/Wikipedia-Pain">to quote myself</a>
                    , the encyclopedia that “anyone who’s willing to
    provide citations can edit”.
    Grokipedia is “the encyclopedia that Elon Musk’s LLM can edit, with sketchy citations and no progressive argument left
    un-attacked.”
                </p>
                <p>So I guess it’s Working As Intended?</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Recent Music</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/10/15/Current-Music"/>
        <link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/10/15/Current-Music#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/10/15/Current-Music</id>
        <published>2025-10-15T12:00:00-07:00</published>
        <updated>2025-10-16T13:50:12-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Music"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Music"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">There are musical seasons where I re-listen to the old faves, the kind of stuff you can read about in my     <a href="/ongoing/What/Song%20of%20the%20Day/">half-year of “Song of the Day” essays</a> from 2018. This autumn I find myself     listening to new music by living people.  Here’s some of it</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    There are musical seasons where I re-listen to the old faves, the kind of stuff you can read about in my
                    <a href="/ongoing/What/Song%20of%20the%20Day/">half-year of “Song of the Day” essays</a>
                    from 2018. This autumn I find myself
    listening to new music by living people.  Here’s some of it.
                </p>
                <p>
                    The musical influx is directly related to my
                    <a href="/ongoing/When/202x/2025/06/22/Qobuz-and-Others">adoption of Qobuz</a>
                    , whose weekly editors’-picks are always worth a look
    and have led me to more than half of the tunes in this post.  Qobuz, like me, still believes in the album as a useful unit of
    music and thus I’ll cover a few of those.  And live-performance YouTubes of course.
    You’ll spot a pattern: A lot of this stuff is African or African-adjacent with Euro angles and jazz flavors.
                </p>
                <h2 id="p-2">Ghana Downtown</h2>
                <p>
                    The
                    <a href="https://soundwayrecords.com/artists/kwashibu-area-band?lang=en_GB">Kwashibu Area Band</a>
                    , founded in Accra, have been
    around for a few years and played in a few styles, sometimes as
                    <a href="https://en.wikipedia.org/wiki/Pat_Thomas_(Ghanaian_musician)">Pat Thomas’</a>
                    band.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Kwashibu-Love-Warrior.png" alt="Title of Love Warrior’s Anthem by Kwashibu Area Band"/>
                <p>
                    What happened was, Qobuz offered up
    their recent
                    <a href="https://kwashibu.bandcamp.com/album/love-warrior-s-anthem">Love Warrior’s Anthem</a>
                    and there isn’t a weak spot on
    it. Their record label says something about mixing
                    <a href="https://en.wikipedia.org/wiki/Highlife">Highlife</a>
                    and jazz; OK I guess. 
    Here’s
                    <a href="https://www.youtube.com/@KwashibuAreaBand">their YouTube channel</a>
                    but it doesn’t seem to have anything live from the
    Love-Warrior material. It isn’t often that I listen to an entire album end-to-end more than once.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/The-New-Eves.png" alt="The New Eves"/>
                <div class="caption">
                    <p>Posted to Flickr by p_a_h, licensed under the  Creative Commons Attribution 4.0 International license.</p>
                </div>
                <h2 id="p-1">Loud Rude Brits</h2>
                <p>
                    <a href="https://en.wikipedia.org/wiki/The_New_Eves">The New Eves</a>
                    are from Brighton and Wikipedia calls them “folk punk”
    which is weird because yeah, they’re loud and rude, but a lot of 
    the instrumental sound is cello/violin/flute. Anyhow, check out
                    <a href="https://www.youtube.com/watch?v=l9Q9ge6j_O4&amp;list=RDl9Q9ge6j_O4&amp;start_radio=1">Mother</a>
                    .
    I listened to most of their recent LP
                    <cite>The New Eve Is Rising</cite>
                    while driving around town and that’s really a lot of
    good and very intense music.
                </p>
                <h2 id="p-3">Rwanda Sings With Strings</h2>
                <p>
                    That’s the title of the latest from “The Good Ones”, here it is
                    <a href="https://thegoodonesband.bandcamp.com/album/rwanda-sings-with-strings">on BandCamp</a>
                    . Adrien Kazigira and Janvier
    Havugimana are described as a “folk duo”; the songs are two-voice harmonies backed with swinging acoustic guitars. This record is
    just like the title says:  They set up in a hotel room with a couple of string players and recorded these songs in a single take
    with no written music and no overdubs.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Good-Ones.png" alt="Cover of Rwanda Sings With Strings by The Good Ones"/>
                <p>
                    It’s awfully sweet stuff and while none of the lyrics are in English, they offer translations of the song titles, which
    include
                    <cite>One Red Sunday, You Lied &amp; Tried to Steal My Land</cite>
                    ,
                    <cite>In the Hills of Nyarusange They Talk Too
    Much</cite>
                    , and
                    <cite>You Were Given a Dowry, But Abandoned Me</cite>
                    . This music does so much with so little.
                </p>
                <h2 id="p-4">Rapper Piano</h2>
                <p>
                    <a href="https://alfamist.co.uk">Alfa Mist</a>
                    was a rapper who went to music school and learned to play keyboards as an adult.
    The music’s straight-ahead Jazz but he still raps a bit here and there, it blends in nicely. If you get a chance to listen to an
    interview with him you should, if only for his voice; he’s from South London and of Ugandan heritage, which results in an
    accent like nothing I’ve ever heard before but makes me smile.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Alfa-Mist.png" alt="Alfa Mist"/>
                <div class="caption">
                    <p>
                        By Dirk Neven - Alfa Mist, Maassilo Rotterdam 20 November 2022 - Alfa Mist, CC0,
    (
                        <a href="https://commons.wikimedia.org/w/index.php?curid=133801400">Wikimedia</a>
                        ).
                    </p>
                </div>
                <p>
                    The problem with AM’s music is that’s it’s extremely
                    <em>smoooooooth</em>
                    , to the point that I thought of it as sort of
    pleasant-background stuff. Then I took in a YouTube of a live-in-studio session (maybe
                    <a href="https://www.youtube.com/watch?v=15Nqbic6HZs">this one</a>
                    ?) and realized that I was listening to extremely
    sophisticated soloing and ensemble playing that deserves to be foreground. But still sweet.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Sora-Jobarteh.png" alt="Sora Jobarteh"/>
                <div class="caption">
                    <p>
                        By World Trade Organization from Switzerland, cropped by User:HLHJ - Aid for Trade Global Review 2017 –
    Day 1, CC BY-SA 2.0, (
                        <a href="https://commons.wikimedia.org/w/index.php?curid=72151783 ">Wikimedia</a>
                        ).
                    </p>
                </div>
                <h2 id="p-6">Kora Magic</h2>
                <p>
                    The Kora is that Gambian instrument with a gourd at the botton and dozens of strings.
                    <a href="https://sonajobarteh.com">Sona Jobarteh</a>
                    , British-Gambian, plays Kora and guitar and sings beautifully and has a
    great band. Here she is at
                    <a href="https://www.youtube.com/watch?v=A78b9IgI3EU">Jazz à Parquerolles</a>
                    .
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Wagner-Glass.png" alt="Vanessa Wagner Glass Etudes album cover"/>
                <h2 id="p-7">And now for something completely different</h2>
                <p>
                    <a href="https://vanessawagner.net">Vanessa Wagner</a>
                    is a French classical pianist of whom I’d not heard. But Qobuz offered
    a new recording of Phil Glass’s
                    <cite>Piano Etudes</cite>
                    which, despite being a big fan, I’d never listened to.
    Here’s
                    <a href="https://www.youtube.com/watch?v=mS0zt7tZYSE">Etude No. 2</a>
                    , which is pretty nice, as is the whole recording;
    dreamy, shimmering stuff. I found myself leaning back with eyes closed.
                </p>
                <h2 id="p-8">It makes me happy</h2>
                <p>That there’s plenty of music out there that’s new and good.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>GenAI Predictions</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/09/26/GenAI-Predictions"/>
        <link rel="replies" thr:count="7" type="application/xhtml+xml" href="/ongoing/When/202x/2025/09/26/GenAI-Predictions#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/09/26/GenAI-Predictions</id>
        <published>2025-09-26T12:00:00-07:00</published>
        <updated>2025-10-02T09:16:45-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/AI"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="AI"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">I’m going to take a big chance here and make predictions about GenAI’s future.     Yeah, I know, you’re feeling overloaded on this stuff and me too, but it     seems to have sucked the air out of all the other conversations. I would so like to return to     arguing about Functional Programming or Free Trade.  This is risky and there’s a pretty good chance that I’m     completely wrong. But I’ll try to entertain while prognosticating</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>I’m going to take a big chance here and make predictions about GenAI’s future.
    Yeah, I know, you’re feeling overloaded on this stuff and me too, but it
    seems to have sucked the air out of all the other conversations. I would so like to return to
    arguing about Functional Programming or Free Trade.  This is risky and there’s a pretty good chance that I’m
    completely wrong. But I’ll try to entertain while prognosticating.</p>
                <h2 id="p-6">Reverse Centaurs</h2>
                <p>
                    That’s the title of a
                    <a href="https://locusmag.com/feature/commentary-cory-doctorow-reverse-centaurs/">Cory Doctorow</a>
                    essay, which I think is spot
    on. I’m pretty sure anyone who’s read even this far would enjoy it and it’s not long, and it’d help understand this.
    Go have a look, I’ll wait.
                </p>
                <h2 id="p-4">Hallucinations won’t get fixed</h2>
                <p>I have one good and one excellent argument to support this prediction. Good first: While my understanding of LLMs is not
    that deep, it doesn’t have to be to understand that it’s really difficult (as in, we don’t know how) to connect the model’s
    machinations to our underlying reality, so as to fact-check.</p>
                <p>
                    The above is my non-expert intuition at work. But then there’s
                    <a href="https://arxiv.org/pdf/2509.04664">Why Language Models Hallucinate</a>
                    , three authors from OpenAI and one from Georgia
    Tech, which seems to show that hallucinations are an inevitable result of current training practices.
                </p>
                <p>
                    And here’s the excellent argument: If there were a way to eliminate the hallucinations,
                    <em>somebody already would
    have</em>
                    . An army of
    smart, experienced people, backed by effectively infinite funds, have been hunting this white
    whale for years now without much success. My conclusion is, don’t hold your breath waiting.
                </p>
                <p>Maybe there’ll be a surprise breakthrough next Tuesday. Could happen, but I’d be really surprised.</p>
                <p>(When it comes to LLMs and code, the picture is different; see below.)</p>
                <h2 id="p-1">The mass layoffs won’t happen</h2>
                <p>The central goal of GenAI is the elimination of tens of millions of knowledge workers.
    That’s the only path to the profits that can cover the costs of training and
    running those models.</p>
                <p>
                    To support this scenario the AI has to run in Cory’s “reverse centaur” mode, where the models do the work and the
    humans tend them. This allows the production of several times more work per human, generally of lower quality, with inevitable
    hallucinations. There are two problems here: First, that at least some of the output is
                    <a href="https://hbr.org/2025/09/ai-generated-workslop-is-destroying-productivity">workslop</a>
                    , whose cleanup costs eat away at
    the productivity wins.
    Second, that the lower quality hurts your customers and your business goes
    downhill.
                </p>
                <p>I just don’t see it. Yeah, I know, every CEO is being told that this will work and they’ll be heroes to their
    shareholders. But the data we have so far keeps refusing to support those productivity claims.</p>
                <p>OK then, remove the “reverse” and run in centaur mode, where smart humans use AI tools judiciously to improve productivity
    and quality. Which might be a good idea for some people in some jobs.
    But in that scenario neither the output boost nor the quality gain get you to where you can dismiss enough
    millions of knowledge workers to afford the AI bills.</p>
                <h2 id="p-2">The financial damage will be huge</h2>
                <p>
                    Back to Cory, with
                    <a href="https://pluralistic.net/2025/09/27/econopocalypse/#subprime-intelligence">The real (economic) AI
    apocalypse is nigh</a>
                    . It’s good, well worth reading, but at this point pretty well conventional wisdom as seen by everyone who
    isn’t either peddling a GenAI product or (especially) fundraising to build one.
                </p>
                <p>
                    To pile on a bit, I’m seeing things every week like for example this:
                    <a href="https://fortune.com/2025/09/23/ai-boom-unsustainable-tech-spending-parabolic-deutsche-bank/">The AI boom is
    unsustainable unless tech spending goes ‘parabolic,’ Deutsche Bank warns: ‘This is highly unlikely’</a>
                    .
                </p>
                <p>
                    The aggregate investment is ludicrous. The only people who are actually making money are the ones
                    <a href="https://www.ft.com/content/e93e56df-dd9b-40c1-b77a-dba1ca01e473">selling the gold-mining equipment</a>
                    to the peddlers.
    Like they say,
                    <a href="https://en.wikipedia.org/wiki/Herbert_Stein#Stein's_Law">“If something cannot go on forever, it will stop.”</a>
                    Where
    by “forever”, in the case of GenAI, I mean “sometime in 2026, probably”.
                </p>
                <h2 id="p-3">… But the economy won’t collapse</h2>
                <p>Cory forecasts existential disaster, but I’m less worried.
    Those most hurt when the bubble collapses will be the investing classes who, generally speaking, can afford it. 
    Yeah, if the S&amp;P 500 drops by a third, the screaming will shake the heavens, but I honestly don’t see it hitting as hard as
    2008 and don’t see how the big-picture economy falls apart. That work that the genAI shills say would be automated away is still
    gonna have to be done, right?</p>
                <h2 id="p-5">The software profession will change, but not <em>that</em> much</h2>
                <p>
                    Here’s where I get in trouble, because a big chunk of my professional peers, including people I admire, see
    GenAI-boosted coding as pure poison:
                    <a href="https://anthonymoser.github.io/writing/ai/haterdom/2025/08/26/i-am-an-ai-hater.html">“In a kind of nihilistic symmetry,
    their dream of the perfect slave machine drains the life of those who use it as well as those who turn the gears.”</a>
                    (The
    title of that essay is “I Am An AI Hater.”)
                </p>
                <p>
                    I’m not a hater.
    I argued above that LLMs generating human discourse have no way to check their output for consistency with
    reality. But if it’s code, “reality” is approximated by what will compile and build and pass the tests. The agent-based systems
    iteratively generate code, reality-check it, and don’t show it to you until it passes. One consequence is that the
    quality of help you get from the model should depend on the quality of your test framework. Which warms my
                    <a href="/ongoing/When/202x/2021/05/15/Testing-in-2021">testing-fanatic</a>
                    heart.
                </p>
                <p>So, my first specific prediction: Generated code will be a routine thing in the toolkit, going forward from here. It’s pretty
    obvious that LLMs are better at predicting code sequences than human language.</p>
                <p>
                    In
                    <a href="https://sourcegraph.com/blog/revenge-of-the-junior-developer">Revenge of the junior developer</a>
                    , Steve Yegge
    says, more or less, “Resistance is useless. You will be assimilated.” But he’s wrong; there are going to be places where we
    put the models to work, and others where we won’t. We don’t know which places those are and aren’t, but I have (weaker)
    predictions; let’s be honest and just say “guesses”.
                </p>
                <p>Where I suspect generated code will likely appear:</p>
                <ul>
                    <li>
                        <p>
                            Application logic: “Depreciate the values in the
                            <code>AMOUNT</code>
                            field of the
                            <code>INSTALLED</code>
                            table forward
      ten years and write the
                            <code>NAME</code>
                            field and the depreciated value into a CSV.” Or “Look at JIRA ticket 248975 and
      create a fix.”
                        </p>
                        <p>(By the way, this is a high proportion of what actual real-world programmers do every day.)</p>
                    </li>
                    <li>
                        <p>
                            Glorified StackOverflow-style lookups like I did in
                            <a href="/ongoing/When/202x/2025/07/01/First-AI-Code">My First GenAI Code</a>
                            .
                        </p>
                    </li>
                    <li>
                        <p>
                            Drafting code that needs to run against interfaces too big and complex to hold in your head, like for example the
      Android and AWS APIs (“When I shake the phone, grab the location from GPS and drop it in the
                            <code>INCOMING</code>
                            S3 bucket”). Or
      CSS (“Render that against a faded indigo background flush right, and hold it steady while scrolling so the text slides around
      it”).
                        </p>
                    </li>
                    <li>
                        <p>SQL. This feels like a no-brainer. So much klunky syntax and so many moving pieces.</p>
                    </li>
                </ul>
                <p>Where I suspect LLM output won’t help much.</p>
                <ul>
                    <li>
                        <p>Interaction design. I mean, c’mon, it requires predicting how humans understand and behave.</p>
                    </li>
                    <li>
                        <p>Low level infrastructure code, the kind I’ve spent my whole life on, where you care a whole lot about about conserving
      memory and finding sublinear algorithms and shrinking code paths and having good  benchmarks.</p>
                    </li>
                </ul>
                <p>Here are areas where I don’t have a prediction but would like to know whether and how LLM fits in (or not).</p>
                <ul>
                    <li>
                        <p>Help with testing: Writing unit and integration tests, keeping an eye on coverage, creating a bunch of BDD tests from a
      verbal description of what a function is going to do.</p>
                    </li>
                    <li>
                        <p>Infrastructure as code: CI/CD, Terraform and peers, all that stuff. There are so many ways to get it wrong.</p>
                    </li>
                    <li>
                        <p>
                            Bad old-school concurrency that uses explicit mutexes and
                            <code>java.lang.Thread</code>
                            where you have to understand
      language memory models and suchlike.
                        </p>
                    </li>
                </ul>
                <h2 id="p-7">The real reason not to use GenAI</h2>
                <p>Because it’s being sold by a panoply of grifters and chancers and financial engineers who know that the world where their dreams
    come true would be generally shitty, and they don’t care.</p>
                <p>(Not to mention the environmental costs and the poor folk in the poor countries where the QA and safety work is
    outsourced.)</p>
                <p>Final prediction: After the air goes out of the assholes’ bubble, we won’t have to live in the world they imagine. Thank
    goodness.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Social Media Provenance Challenge</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media"/>
        <link rel="replies" thr:count="13" type="application/xhtml+xml" href="/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media</id>
        <published>2025-10-01T12:00:00-07:00</published>
        <updated>2025-10-01T12:00:00-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Identity"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Identity"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Social Media"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Social Media"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">At a     <a href="https://iptc.org/news/iptc-photo-metadata-conference-2025-recordings-now-available/">a recent     online conference</a>, I said that we      can “change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers     to be believed.” I was talking about media<span class="dashes"> —</span> images, video, audio.      We can make it <em>much</em> easier to tell when media is faked and when it’s real.     There’s work to do, but it’s straightforward stuff and we could get there soon. Here’s how</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    At a
                    <a href="https://iptc.org/news/iptc-photo-metadata-conference-2025-recordings-now-available/">a recent
    online conference</a>
                    , I said that we 
    can “change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers
    to be believed.” I was talking about media
                    <span class="dashes"> —</span>
                    images, video, audio. 
    We can make it
                    <em>much</em>
                    easier to tell when media is faked and when it’s real.
    There’s work to do, but it’s straightforward stuff and we could get there soon. Here’s how.
                </p>
                <h2 id="p-8">The Nadia story</h2>
                <p>This is a vision of what success looks like.</p>
                <p>Nadia lives in LA.
    She has a popular social-media account with a reputation for stylish pictures of urban
    life. She’s not terribly political, just a talented street photog. Her handle is “[email protected]”.</p>
                <p>She’s in Venice Beach the afternoon of Sunday August 9, 2026, when federal agents take down a vendor selling
    cheap Asian ladies’ wear. She gets a great shot 
    of an enforcer carrying away an armful of pretty dresses while two more bend the merchant over his countertop.
    None of the agents in the picture are in uniform, all are masked.</p>
                <p>
                    She signs into her “CoolTonesLA” account on
                    <code>hotpix.example</code>
                    and drafts a post saying “Feds raid Venice
    Beach”. When she uploads 
    the picture, there’s a pop-up asking “Sign this
    image?” Nadia knows what this means, and selects “Yes”. By midnight her post has gone viral.
                </p>
                <img src="cr.png" alt="Content Credentials glyph" class="inline"/>
                <p>As a result of Nadia agreeing to “sign” the image, anyone who sees her post, whether in a browser or mobile app,  also
    sees that little “Cr” badge in the photo’s top right corner. 
    When they mouse over it, a little pop-up says something like:</p>
                <blockquote class="popup">
                    <p style="font-family: sans-serif">
                        Signature is valid.
                        <br/>
                        Media was
                        <span class="fakelink">posted</span>
                        by
                        <span class="fakelink">@CoolTonesLA</span>
                        <br/>
                        on
                        <span class="fakelink">hotpix.example</span>
                        <br/>
                        at 5:40 PM PDT, August 9th, 2026.
                    </p>
                </blockquote>
                <p>The links point to Nadia’s feed and her instance’s home page. Following them can give the reader a feeling
    for what kind of person she is, the nature of her server, and the quality of her work. Most people are inclined to believe the
    photo is real.</p>
                <p>Marco is a troublemaker. He grabs Nadia’s photo and posts it to his social-media account with the caption
    “Criminal illegals terrorize local business. Lock ’em up!”  He’s not technical and doesn’t strip the metadata. Since the
    picture is already signed, he doesn’t get the “Sign this picture?” prompt.
    Anyone who sees his post will see the “Cr” badge and mousing over it makes it pretty clear that it isn’t what he says it
    is. Commenters gleefully point this out.  By the time Marco takes the post down, his credibility is
    damaged.</p>
                <p>Maggie is a more technical troublemaker. She sees Marco’s post and likes it, strips the picture’s metadata, and reposts it. 
    When she gets the “Sign this picture?” prompt, she says “No”, so it doesn’t get
    a “Cr” badge. Hostile commenters accuse her of posting a fake, saying “LOL badge-free zone”. It is less likely that her
    post will go viral.</p>
                <p>Miko isn’t political but thinks the photo would be more dramatic if she Photoshopped it to add a harsh dystopian lighting
    effect. When she reposts her version, the “Cr” badge won’t be there because the pixels have changed.</p>
                <p>Morris follows Maggie. He grabs the stripped picture and, when he posts it, says “Yes”
    to signing. In his post the image will show up with the “Cr” and credit it to him, with a “posted” timestamp later than Nadia’s initial
    post. Now, the 
    picture’s believability will depend on Morris’s. Does he have a credible track record?
    Also, there’s a chance that someone will notice what Morris did and point out that he stole Nadia’s picture.</p>
                <p>(In fact, I wouldn’t be surprised if people ran programs against the social-network firehose looking for media signed by more than
    one account, which would be easy to detect.)</p>
                <p>That’s the Nadia story.</p>
                <h2 id="p-2">How it’s done</h2>
                <p>The rest of this piece explains in some detail how the Nadia story can be supported by technology that
    already exists, with a few adjustments. If jargon like “PKIX” and “TLS” and “Nginx” is foreign to you, you’re unlikely to
    enjoy the following. Before you go, please consider: Do you think making the Nadia story come true
    would be a good investment?</p>
                <p>I’m not a really deep expert on all the bits and pieces, so it’s possible that I’ve got something wrong. Therefore, this
    blog piece will be a living document in that I’ll correct any convincingly-reported errors, with the goal that it
    accurately describes a realistic technical roadmap to the Nadia story.</p>
                <p>
                    By this time I’ve posted enough times about C2PA that I’m going to assume people know what it is and how it works. For my long,
    thorough explainer, see
                    <a href="https://www.tbray.org/ongoing/When/202x/2023/10/28/C2PA-Workflows">On C2PA</a>
                    . Or, check out the
                    <a href="https://contentcredentials.org/">Content Credentials Web site.</a>
                </p>
                <p>Tl;dr: C2PA is a list of assertions about a media object, stored in its metadata, with a digital signature that includes the
    assertions and the bits of the picture or video.</p>
                <p>
                    This discussion assumes the use of C2PA and also an in-progress specification from the
                    <a href="https://cawg.io">Creator Assertions Working Group</a>
                    (CAWG) called
                    <a href="https://cawg.io/identity/1.2-draft">Identity Assertion</a>
                    .
                </p>
                <p>Not all the pieces are quite ready to support the Nadia story. But there’s a clear path forward to closing each gap.</p>
                <h2 id="p-3">“Sign this picture?”</h2>
                <p>C2PA and CAWG specify many assertions that you can make about a piece of media. For now let’s focus just on what we
    need for provenance. 
    When the media is uploaded to a social-network service, there are two facts that the server knows,
    absolutely and unambiguously: Who uploaded it (because they’ve had to sign in) and when it happened.</p>
                <p>
                    In the current state of
    the specification drafts, “Who” is the
                    <code>cawg.social_media</code>
                    property from the draft
                    <a href="https://cawg.io/identity/1.2-draft/#vc-credentialsubject-verifiedidentity-type">Identity Assertion spec, section
    8.1.2.5.1</a>
                    , and “When” is the
                    <code>c2pa.time-stamp</code>
                    property from the
                    <a href="https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_requirements_2">C2PA
    specification, section 18.17.3</a>
                    .
                </p>
                <p>I think these two are all you need for a big improvement in social network  media provenance,
    so let’s stick with them.</p>
                <h2 id="p-4">What key?</h2>
                <p>
                    Let’s go back to the Nadia story.
    It needs the Who/When assertions to be digitally signed in a way that will convince a tech-savvy human or a PKIX validation
    library that the signature could only have been applied by the server at
                    <code>hotpix.example</code>
                    .
                </p>
                <p>
                    The C2PA people have been thinking about this. They are working on a
                    <a href="https://iptc.org/verified-news-publishers-list/">Verified News Publishers List</a>
                    , to be maintained and managed by,
    uh, that’s not clear to me. The idea is that C2PA software would, when validating a digital signature, require
    that the PKIX cert is one of those on the Publishers List.
                </p>
                <p>This isn’t going to work for a decentralized social network, which has tens of thousands of independent servers
    run by co-ops, academic departments, municipal governments, or just a gaggle of friends who kick in on Patreon. And anyhow,
    Fediverse instances don’t claim to be “News Publishers”, verified or not.</p>
                <p>
                    So what key can
                    <code>hotpix.example</code>
                    sign with?
    Fortunately, there’s already a keypair and PKIX certificate in place on every social-media server, the one it uses to
    support TLS connections. The one at
                    <code>tbray.org</code>
                    , that’s being used right now to protect your interaction
    with this blog, is in
                    <code>/etc/letsencrypt/live/</code>
                    and the private key is obviously not generally readable.
                </p>
                <p>
                    That cert will contain the public key corresponding to the host’s private key, the cert's ancestry, and the host name.
    It’s all that any PKIX library needs to verify that yes, this could only have been signed by
                    <code>hotpix.example</code>
                    . However, there will be objections.
                </p>
                <p>
                    <b>Objection</b>
                    : “
                    <code>hotpix.example</code>
                    is not a Verified News Publisher!” True enough, the C2PA validation libraries would
    have to accept X.509 certs. Maybe they do already? Maybe this requires an extension of the current specs? In any
    case, the software’s all open-source, could be forked if necessary.
                </p>
                <p>
                    <b>Objection</b>
                    : “That cert was issued for the purpose of encrypting TLS connections, not for some weird photo provenance
    application. Look at the
                    <a href="https://en.wikipedia.org/wiki/Object_identifier">OID</a>
                    !” OK, but seriously, who cares?
    The math does what the math 
    does, and it works.
                </p>
                <p>
                    <b>Objection</b>
                    : “I have to be super-careful about protecting my private key and I don’t want to give a copy to the hippies
    running the social-media server.” I sympathize but, in most cases, social media is all that
    server’s doing.
                </p>
                <p>Having said that, it would be great if there were extensions to Nginx and Apache httpd where you could request
    that they sign the assertions for you. Neither would be rocket science.</p>
                <p>OK, so we sign Nadia’s Who/When assertions and her photo’s pixels  with our host’s TLS key, and ship it off into the
    world. What’s next?</p>
                <h2 id="p-5">How to validate?</h2>
                <p>Verifying these assertions, in a Web or mobile app, is going to require a C2PA library to pick apart the assertions and
    a PKIX library for the signature check.</p>
                <p>
                    We already have
                    <a href="https://github.com/contentauth/c2pa-rs">c2pa-rs</a>
                    , Rust code with MIT and Apache licenses.
    Rust libraries can be called
    from some  other programming languages but in the normal course of affairs I’d expect there soon to be native implementations.
    Once again, all these technologies are old as dirt, absolutely no rocket science required.
                </p>
                <p>
                    How about validating the signatures?  I was initially puzzled about this one because, as a
    programmer, certs only come into the picture when I do something like
                    <code>http.Get()</code>
                    and the
    library takes care of all that stuff. So I can’t speak from experience.
                </p>
                <p>
                    But I think the infrastructure is there.  Here’s a Curl blogger praising
                    <a href="https://eissing.org/icing/posts/curl-apple-sectrust/">Apple SecTrust</a>
                    . Over on Android, there’s
                    <a href="https://developer.android.com/reference/javax/net/ssl/X509ExtendedTrustManager">X509ExtendedTrustManager</a>
                    .
    I assume Windows has something. And if
    all else fails, you could just download a trusted-roots file from the
                    <a href="https://curl.se/docs/caextract.html">Curl</a>
                    or
                    <a href="https://android.googlesource.com/platform/system/ca-certificates/+/master/files/">Android</a>
                    projects and refresh it
    every week or two.
                </p>
                <h2 id="p-7">What am I missing?</h2>
                <p>This feels a little too easy, something that could be done in months not years. Perhaps I’m oversimplifying.
    Having said that, I think the most important thing to get right is the scenarios, so we know what effect we want to achieve.</p>
                <p>What do you think of the Nadia story?</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>C2PA Investigations</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/09/18/C2PA-Investigations"/>
        <link rel="replies" thr:count="5" type="application/xhtml+xml" href="/ongoing/When/202x/2025/09/18/C2PA-Investigations#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/09/18/C2PA-Investigations</id>
        <published>2025-09-18T12:00:00-07:00</published>
        <updated>2025-09-30T15:06:15-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Identity"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Identity"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">This is the blog version of my talk at the IPTC’s online     <a href="https://iptc.org/events/photo-metadata-conference-2019/">Photo Metadata Conference</a> conference.     Its title is the one the conference organizers slapped on my session without asking; I was initially going to     object but then I thought of the big guitar riff in Dire Straits’ <cite>Private Investigations</cite> and snickered.     If you want, instead of reading, to watch me present,     <a href="https://www.youtube.com/watch?si=BMfVGUQNcJOR1w2z&amp;amp;t=1610&amp;amp;v=wRjExw8OMUc&amp;amp;feature=youtu.be">that’s on YouTube</a>.     Here we go</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    This is the blog version of my talk at the IPTC’s online
                    <a href="https://iptc.org/events/photo-metadata-conference-2019/">Photo Metadata Conference</a>
                    conference.
    Its title is the one the conference organizers slapped on my session without asking; I was initially going to
    object but then I thought of the big guitar riff in Dire Straits’
                    <cite>Private Investigations</cite>
                    and snickered.
    If you want, instead of reading, to watch me present,
                    <a href="https://www.youtube.com/watch?si=BMfVGUQNcJOR1w2z&amp;t=1610&amp;v=wRjExw8OMUc&amp;feature=youtu.be">that’s on YouTube</a>
                    .
    Here we go.
                </p>
                <p>
                    Hi all, thanks for having me. Today I represent… nobody,
                    <em>officially</em>
                    . I’m not on any of the committees nor am I an
    employee of any of the providers. But I’m a photographer and software developer and social-media activist and have written a lot about
    C2PA. So under all those hats this is a subject I care about.
                </p>
                <p>Also, I posted this on Twitter back in 2017.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/2017-twitter.png" alt="Twitter post from 2017 presaging C2pA"/>
                <p>I’m not claiming that I was the first with this idea, but I’ve been thinking about the issues for quite a while.</p>
                <p>Enough self-introduction. Today I’m going to look at C2PA in practice right now in 2025. Then I’m going to talk about what I
    think it’s for. Let’s start with a picture.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/L1000004.png" alt="Picture of a shopping mall storefront"/>
                <div class="caption">
                    <p>
                        This smaller version doesn’t have C2PA,
                        <br/>
                        but if you click on it, the larger version you get does.
                        <br/>
                        Photo credit: Rob Pike
                    </p>
                </div>
                <p>I should start by saying that a few of the things that I’m going to show you are, umm, broken. But I’m still a C2PA fan. Bear
    in mind that at this point everything is beta or preview or whatever, at best v1.0. I think we’re in glass-half-full mode.</p>
                <p>This photo is entirely created and processed by off-the-shelf commercial products and has content credentials, and let me say
    that I had a freaking hard time finding such a photo. There are very few Content Credentials out there on the Internet. That’s
    because nearly every online photo is delivered either via social media or by professional publishing software. In both cases, the
    metadata is routinely stripped, bye-bye C2PA. So one of the big jobs facing us in putting Content Credentials to work is to stop
    publishers from deleting them.</p>
                <p>Of course, that’s complicated. Professional publishers probably want the Content Credentials in place, but on social media
    privacy is a key issue and stripping the metadata is arguably a good default choice. So there are a lot of policy discussions to
    be had up front of the software work.</p>
                <p>Anyhow, let’s look at the C2PA. </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/ca-glyphs-1.png" alt="Picture with two Content Credentials glyphs and one drop-down"/>
                <p>I open up that picture in Chrome and there are little “Cr” glyphs at both the top left and top right corners; that’s because
    I’ve installed multiple C2PA Chrome plug-ins. Turns out these seem to only be available for Chrome, which is irritating. Anyhow,
    I’ve clicked on the one in the top left.</p>
                <p>That’s a little disappointing. It says the credentials were recorded by Lightroom, and gives my name, but I think it’s hiding
    way more than it’s revealing. Maybe the one on the top right will be more informative?</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/ca-glyphs-2.png" alt="Picture with two Content Credentials glyphs and one drop-down"/>
                <p>More or less the same info. A slightly richer presentation But both displays have an “inspect” button and both do the same
    thing. Let’s click it!</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/broken-inspector.png" alt="Content Credentials inspector page, failing to retrieve a page for review"/>
                <p>This is the Adobe Content Credentials inspector and it’s broken. That’s disappointing. Having said that, I was in a Discord
    chat with a senior Adobe person this morning and they’re aware of the problem.</p>
                <p>But anyhow, I can drag and drop the
    picture like they say.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/2-phase-c2pa.png" alt="Content credentials as displayed by the Inspector"/>
                <p>Much much better. It turns out that this picture was originally taken with a Leica M11-P. The photographer is a famous software
    guy named Rob Pike, who follows me on Mastodon and wanted to help out.</p>
                <p>So, thanks Rob, and thanks also to the Leica store in Sydney, Australia, who loaned him the M11. He hasn’t told me how he
    arranged that, but I’m curious.</p>
                <p>I edited it in Lightroom, and if you look close, you can see that I cropped it down and brightened it up. Let’s zoom in on
    the content credentials for the Leica image.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/leica-cc.png" alt="Leica-generated C2PA display"/>
                <p>There’s the camera model, the capture date (which is wrong because Rob didn’t get around to setting the camera’s date before
    he took the picture.) The additional hardware (R-Adapter-M), the dimensions, ISO, focal length, and shutter speed.</p>
                <p>Speaking as a photographer, this is kind of cool. There’s a problem in that it’s partly wrong. The focal length isn’t zero,
    and Rob is pretty sure he didn’t have an adapter on. But Leica is trying to do the right thing and they’ll get there.</p>
                <p>Now let’s look at the assertions that were added by Lightroom.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/lr-cc.png" alt="Lightroom-generated C2PA display"/>
                <p>There’s a lot of interesting stuff in here, particularly the provenance. Lightroom lets you manage your identities, using
    what we call “OAuth flows”, so it can ask Instagram (with my permission) what my Instagram ID is. It goes even further with
    LinkedIn; it turns out that LinkedIn has an integration with the Clear ID people, the ones who fast-track you at the airport. So
    I set up a Clear ID, which required photos of my passport, and went through the dance with LinkedIn to link it up, and then with
    Lightroom so it knew my LinkedIn ID. So to expand, what it’s really saying is: “Adobe says that LinkedIn says that Clear says
    that the government ID of the person who posted this says that he’s named Timothy Bray”.</p>
                <p>
                    I don’t know about you, but this feels like pretty strong provenance medicine to me. I understand that the C2PA committee and
    the
                    <a href="https://cawg.io">CAWG</a>
                    people are re-working the provenance assertions. To them: Please don’t screw this particular
    style of provenance up.
                </p>
                <p>Now let’s look at what Lightroom says it did. It may be helpful to know what I in fact did.</p>
                <ol>
                    <li>
                        <p>Cropped the picture down.</p>
                    </li>
                    <li>
                        <p>Used Lightroom’s “Dehaze” tool because it looked a little cloudy.</p>
                    </li>
                    <li>
                        <p>Adjusted the exposure and contrast, and boosted the blacks a bit.</p>
                    </li>
                    <li>
                        <p>Sharpened it up.</p>
                    </li>
                </ol>
                <p>Lightroom knows what I did, and you might wonder how it got from those facts to that relatively content-free
    description that reads like it was written by lawyers.
    Anyhow, I’d like to know. Since I’m a computer geek, I used the open-source “c2patool” to dump what the assertions
    actually are.  I apologize if this hurts your eyes.</p>
                <p>It turns out that there is way more data in those files than the inspector shows. For example, the Leica claims included 29
    EXIF values, here are three I selected more or less at random:</p>
                <div class="highlight">
                    <pre>
                        <span></span>
                        <span class="p"></span>
                        <span class="w"></span>
                        <span class="nt">&quot;exif:ApertureValue&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;2.79917&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;exif:BitsPerSample&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;16&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;exif:BodySerialNumber&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;6006238&quot;</span>
                        <span class="p">,</span>
                    </pre>
                </div>
                <p>Some of these are interesting: In the Leica claims, the serial number. I could see that as a useful provenance claim. Or as a
    potentially lethal privacy risk. Hmmm.</p>
                <div class="highlight">
                    <pre>
                        <span></span>
                        <span class="p"></span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;action&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;c2pa.color_adjustments&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;parameters&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;action&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;c2pa.color_adjustments&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;parameters&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;com.adobe.acr.value&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;60&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;com.adobe.acr&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;Exposure2012&quot;</span>
                        <span class="w"></span>
                        <span class="p">}</span>
                        <span class="w"></span>
                        <span class="p">},</span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;action&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;c2pa.color_adjustments&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;parameters&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;com.adobe.acr&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;Sharpness&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;com.adobe.acr.value&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;52&quot;</span>
                        <span class="w"></span>
                        <span class="p">}</span>
                        <span class="w"></span>
                        <span class="p">},</span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;action&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;c2pa.cropped&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;parameters&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;com.adobe.acr.value&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;Rotated Crop&quot;</span>
                        <span class="p">,</span>
                        <span class="w"></span>
                        <span class="nt">&quot;com.adobe.acr&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;Crop&quot;</span>
                        <span class="w"></span>
                        <span class="p">}</span>
                        <span class="w"></span>
                        <span class="p">}</span>
                    </pre>
                </div>
                <p>And in the Lightroom section, it actually shows exactly what I did, see the sharpness and exposure values.</p>
                <p>My feeling is that the inspector is doing either too much or too little. At the minimal end you could just say “hand
    processed? Yes/No” and “genAI? Yes/No”.  For a photo professional, they might like to drill down and see what I actually did. I
    don’t see who would find the existing presentation useful. There’s clearly work to do in this space.</p>
                <p>Oh wait, did I just say “AI”? Yes, yes I did. Let’s look at another picture, in this case a lousy picture.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/TXT55638.png" alt="Picture of an under-construction high-rise behind leaves"/>
                <p>I was out for a walk and thought the building behind the tree was interesting. I was disappointed when I pulled it up on the
    screen, but I still liked the shape and decided to try and save it.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/TXT55638-good.png" alt="Picture of an under-construction high-rise behind leaves, improved"/>
                <p>So I used Lightroom’s “Select Sky” to recover its color, and “Select Subject” to pull the building details out of the
    shadows. Both of these Lightroom features, which are pretty magic and I use all the time, are billed as being AI-based. I
    believe it.</p>
                <p>Let’s look at what the C2PA discloses.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/lr-tower.png" alt="Lightroom C2PA assertions with automation AI"/>
                <p>Having said all that, if you look at the C2PA (or at the data behind it) Lightroom discloses only “Color or Exposure”,
    “Cropping”, and “Drawing” edits. Nothing about AI.</p>
                <p>Hmm. Is that OK? I personally think it is, and highlights the distinction between what I’d call “automation” AI and
    Generative AI. I mean, selecting the sky and subject is something that a skilled Photoshop user could accomplish with a lot of
    tinkering, the software is just speeding things up. But I don’t know, others might disagree.</p>
                <p>Well, how about that generative AI?</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/chatgpt.png" alt="Turtle in shallow water, generated by ChatGPT"/>
                <div class="caption">
                    <p>Fails <code>c2patool</code> validation, “DigitalSourceType” is <code>trainedAlgorithmicMedia</code></p>
                </div>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/budai.png" alt="Desktop with decorations, Magic Erase has been applied"/>
                <div class="caption">
                    <p>“DigitalSourceType” is <code>compositeWithTrainedAlgorithmicMedia</code></p>
                </div>
                <p>The turtle is 100% synthetic, from ChatGPT, and on the right is a Pixel 10 shot on which I did a few edits including “Magic
    Eraser”.  Both of these came with Content Credentials; chatGPT’s is actually invalid, but on the glass-half-full front, the
    Pixel 10’s were also invalid up until a few days ago, then they fixed it. So this stuff does get fixed.</p>
                <p>I’m happy about the consistent use of C2PA terminology, they are clearly marking the images as genAI-involved.</p>
                <p>I’m about done talking about the state of the Content Credentials art generally but I should probably talk about this
    device.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/pixel-10.png" alt="Blue Pixel 10"/>
                <p>Because it marks the arrival of Content Credentials on the mass consumer market. Nobody knows how many Pixels Google actually
    sells but I guarantee it’s a lot more than Leica sells M11’s. And since Samsung tends to follow Google pretty closely, we’re
    heading for tens then hundreds of millions of C2PA-generating mobile devices. I wonder when Apple will climb on board?</p>
                <p>Let’s have a look at that C2PA.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/p10-c2pa.png" alt="C2PA associated with Magic Eraser image"/>
                <p>This view of the C2PA is from the Google Photos app.  It’s very limited.  In particular, there is nothing in there to support
    provenance. In fact, it’s the opposite, Google is bending over backward to avoid anything that could be interpreted as breaking the
    privacy contract by sharing information about the user.</p>
                <p>Let’s pull back the covers and dig a little deeper. Here are a few notes</p>
                <ul>
                    <li>
                        <p>The device is identified just as “Pixel camera”. There are lots of different kinds of those!</p>
                    </li>
                    <li>
                        <p>The C2PA inclusion is Not optional!</p>
                    </li>
                    <li>
                        <p>DigitalSourceType:  <code>computationalCapture</code>
(if no genAI)</p>
                    </li>
                    <li>
                        <p>Timestamp is “untrusted”</p>
                    </li>
                </ul>
                <p>The C2PA not being optional removes a lot of UI issues but still, well, I’m not smart enough to have fully thought through
    the implications. That Digital Source Type looks good and appropriate, and the untrusted-ness of the timestamp is
    interesting.</p>
                <p>You notice that my full-workflow examples featured a Leica rather than the Pixel, and that’s because the toolchain is
    currently broken for me: Neither Lightroom nor Photoshop can handle the P10 C2PA. I’ll skip the details, except to say that
    Adobe is aware of the bug, a version mismatch, and they say they’re working on it.</p>
                <p>Before we leave the Pixel 10, I should say that there are plenty of alternate camera apps in Android and iOS, some quite
    good, and it’d be perfectly possible for them to ship much richer C2PA, notably including provenance, location, and so on.</p>
                <p>I guess that concludes my look at the current state of the Content Credentials art. Now I’d like to talk about what Content
    Credentials are for.  To start with, I think it’d be helpful to sort the assertions into three baskets.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-1.png" alt="C2PA assertions in Capture, Processing, and Provenance baskets"/>
                <p>Capture, that’s like that Leica EXIF stuff we showed earlier. What kind of camera and lens, what the shooting parameters
    were. Processing, that’s like the Lightroom report: How was the image manipulated, and by what software. Provenance: Which
    person or organization produced this?</p>
                <p>But I think this picture has an important oversimplification, let me fix that.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-2.png" alt="C2PA assertion baskets with the addition of GenAI"/>
                <p>Processing is logically where you’d disclose the presence of GenAI.  And in terms of what people practically care about,
    that’s super important and deserves special consideration.</p>
                <p>Now I’m going to leave the realm of facts and give you opinions. As for the Capture data there on the left… who cares?
    Really, I’m trying to imagine a scenario in which anyone cares about the camera or lens or F stop.  I guess there’s an exception
    if you want to prove that the photo was taken by one of Annie Liebowitz’s cameras, but that’s really provenance.</p>
                <p>Let’s think about a professional publication scenario. They get photos from photographers, employees or agencies or
    whatever. They might want to be really sure that the photo was from the photographer and not an imposter. So having C2PA
    provenance would be nice. Then when the publisher gets photos, they do a routine check of the provenance and if it doesn’t check
    out, they don’t run the picture without a close look first.</p>
                <p>They also probably want to check for the “is there genAI?” indicator in the C2PA, and, well, I don’t know what they might do,
    but I’m pretty sure they’d want to know.</p>
                <p>That same publisher might want to equip the photos they publish with C2PA, to demonstrate that they are really the ones who
    chose and provided the media. That assertion should be applied routinely by their content management system.  Which should be
    easy, on the technology side anyhow.</p>
                <p>So from the point of view of a professional publisher, provenance matters, and being careful about GenAI matters, and in the
    C2PA domain, I think that’s all that really matters.</p>
                <p>Now let’s turn to Social Media, which is the source of most of the images that most people see most days.  Today, all the
    networks strip all the photo metadata, and that decision involves a lot of complicated privacy and intellectual-property
    thinking.  But there is one important FACT that they know: For any new piece of media, they know which account uploaded the damn
    thing, because that account owner had to log in to do it. So I think it’s a no-brainer that IF THE USER WISHES, they can have a
    Content Credentials assertion in the photo saying “Initially uploaded by Tim Bray at LinkedIn” or whoever at wherever.</p>
                <p>What we’d like to achieve is that if you see some shocking or controversial media, you’d really want to know who originally
    posted it before you decided whether you believed it, and if Content Credentials are absent, that’s a big red flag. And if the
    picture is of the current situation in Gaza, your reaction might be different depending on whether it was originally from an
    Israeli military social-media account, or the Popular Front for the Liberation of Palestine, or by the BBC, or by
    [email protected].</p>
                <p>Anyhow, here’s how I see it:</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-3.png" alt="C2PA assertion baskets inflated according to their relative importance"/>
                <p>So for me, it’s the P and A in C2PA that matter – provenance and authenticity. I think the technology has the potential to
    change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers to be
    believed. I think the first steps that have been taken so far are broadly correct and the path forward is reasonably clear. All
    the little things that are broken, we can fix ’em.</p>
                <p>And there aren’t that many things that matter more than promoting truth and discouraging lies.</p>
                <p>And that’s all, folks.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Maritime Wrap-up</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/09/13/Maritime-Wrap"/>
        <link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/09/13/Maritime-Wrap#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/09/13/Maritime-Wrap</id>
        <published>2025-09-13T12:00:00-07:00</published>
        <updated>2025-09-15T22:22:33-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Places/Maritimes"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Places"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Maritimes"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Only a few more pictures to share from     <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">our vacation</a>, which I’ll wrap up in conventional tourism     advice</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Only a few more pictures to share from
                    <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">our vacation</a>
                    , which I’ll wrap up in conventional tourism
    advice.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55876.png" alt="Looking down off a cliff at a tiny boat far below"/>
                <div class="caption">
                    <p>It’s mostly about the oceanfront, and what you can see from it.</p>
                </div>
                <h2 id="p-1">Food and drink</h2>
                <p>I recommend all of the following.</p>
                <p>
                    <a href="https://www.schoolhousebrewery.ca">Schoolhouse Brewery</a>
                    in Windsor, NS; nice space, decent food, the Vice Principal is
      a good IPA.  Maybe the  beer that I enjoyed most was “Exile on North Street” from
                    <a href="https://unfuckingfiltered.com/beer/">unfiltered brewing</a>
                    ; you might want to follow that link and also check out
      the URL.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250815_230941783.png" alt="sunset through grasses"/>
                <p>
                    I didn’t love Halifax that much but it has this charming little neighborhood called
                    <a href="https://en.wikipedia.org/wiki/Hydrostone">Hydrostone</a>
                    , where
                    <a href="https://www.thebrownhound.ca">The Brown Hound</a>
                    offered very solid food and beer.
      We didn’t spend that much time in New Brunswick, but Moncton’s
                    <a href="https://www.pumphousebrewpub.ca">Pump House</a>
                    was cheery and competent; a cool space; I can’t remember which of
      their IPAs I had, but it was good. The other peak New Brunswick goodness was
                    <a href="https://www.adorablechocolat.ca">Adorable Chocolat</a>
                    in Shediac, where everyone was effortlessly bilingual and the
      pastries just divine. Don’t miss it if you’re anywhere near.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55910.png" alt="Cape Breton coastline, people swimming, houses on the slopes"/>
                <div class="caption">
                    <p>People live by the sea, and swim in it.</p>
                </div>
                <p>
                    Charlottetown’s not that rich in dining options, but got a really excellent lunch at
                    <a href="https://www.thecorkandcast.com">The Cork &amp; Cast</a>
                    .
      Maybe our best meal of the trip was at
                    <a href="https://wheelhouseseafoodpasta.ca/menu#SEAFOOD">The Wheelhouse</a>
                    , in Digby. Scallops all around, seared is the best
      option.
                </p>
                <h2 id="p-5">Cities, towns, and other tourists</h2>
                <p>Every good tourist spot in the world seems to suffer from increasingly intense and persistent overcrowding, and the Maritimes
    are no exception.  On top of which, they’re thinly populated, fewer than two million souls in three provinces. The biggest city,
    Halifax (and the entire province of Prince Edward Island) are both smaller than individual Vancouver suburbs. It’s not a place
    for savouring urban flavors.</p>
                <p>In Nova Scotia, Halifax has too many cruise ships; stay away from its so-called “farmers market” unless you love cruise
    culture. Lunenberg is big enough to soak up its waves of visitors and still offer unique visuals.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55847.png" alt="Tourists at Peggy’s Cove"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55848.png" alt="The cove at Peggy’s Cove"/>
                <div class="caption">
                    <p>Overcrowded but has nice bits.</p>
                </div>
                <p>Peggy’s Cove I just can’t recommend; beautiful but jam-packed
    with cars looking for parking and people risking their lives on the rocks.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250822_163228719.png" alt="Fort Anne in Annapolis Royal"/>
                <div class="caption">
                    <p>These were once defences but now just a pleasant walk.</p>
                </div>
                <p>
                    I do recommend visiting
                    <a href="https://en.wikipedia.org/wiki/Annapolis_Royal">Annapolis Royal</a>
                    ; it’s got that great garden
    and Fort Anne, despite its lengthy and chequered military history, is lovely and peaceful.
                </p>
                <p>In PEI, Charlottetown makes an effort and it has a beautiful basilica, but just isn’t big enough to reward a whole day’s
    visit.</p>
                <p>In NB, Moncton is OK but its biggest tourist attraction is the tide going in and out.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55961.png" alt="Crowded tidal flat at Hopewell Provincial Park"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55966.png" alt="Clifftop forest at Hopewell Provincial Park"/>
                <div class="caption">
                    <p>Hopewell Provincial Park, NB. The clifftop trees are exceptional.</p>
                </div>
                <h2 id="p-3">Lodging</h2>
                <p>
                    The hotels and Airbnbs and VRBOs were OK, mostly. The
                    <a href="https://www.theharbourviewinn.com">Harbourview Inn</a>
                    , near Digby, is a charmingly-traditional guest-house. The rooms
    are OK, but the downstairs is warmly welcoming, drinks available when the host’s there to man the bar, lots of space to sink
    into a comfy chair and conversation or your laptop. Also the breakfast was solid.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250813_113114060.png" alt="Sky drama over Lake Ainsley"/>
                <div class="caption">
                    <p>Excited clouds over Lake Ainsley, NS.</p>
                </div>
                <p>
                    But the trip’s lodging highlight was this VRBO called
                    <a href="https://www.vrbo.com/en-ca/cottage-rental/p9830781">Forest Lake House</a>
                    on Lake
    Ainsley, the Maritimes’ biggest. Isolated, comfortable, outstanding grounds, your own private forest walk; everything anyone
    could want. We stopped traveling and had a chill-out day there, enjoying every minute of it.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250817_152127492.png" alt="Swimming at Cavendish, PEI"/>
                <div class="caption">
                    <p>Lots of people but plenty at room at Cavendish beach.</p>
                </div>
                <h2 id="p-4">Otherwise</h2>
                <p>
                    We only swam once, at Cavendish Beach in PEI’s Anne of Green Gables territory, very nicely set up.  But what looked
    most appealing to me was
                    <a href="https://www.lockeport.ns.ca/index.php/tourism-recreation/crescent-beach-vic">Crescent Beach</a>
                    in Lockeport, Nova
    Scotia; I wish we’d made time to have a swim there.
                </p>
                <p>Turns out all three vacationers had farming or agriculture-adjacent roots. If you care about that stuff, driving around PEI
    is a treat; the agriculture is super-intensive and, to my eye, pleasingly well-done.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56060.png" alt="A farm field with hay bales by the seaside"/>
                <div class="caption">
                    <p>The farmlands extend to the seaside.</p>
                </div>
                <p>But if you have the time, get away from PEI’s farms and head northwest, drive
    down the coast from Tignish to West Point; that ride is full of colors and sea-fronts that aren’t like anywhere else I’ve
    seen.</p>
                <p>
                    Since it’s the New World there’s plenty of nasty history around the indigenous folk, the
                    <a href="https://en.wikipedia.org/wiki/Mi%27kmaq">Mi'kmaq</a>
                    nation. But you really have to look to find it. We visited the
                    <a href="https://www.millbrookheritagecentre.ca">Millbrook Cultural &amp; Heritage Centre</a>
                    in Truro, which is much better
    than nothing.
                </p>
                <p>You gotta drive; we put 3,742km on a basic rented Kia. The roads are way better taken care of than here out West.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56014.png" alt="Maritime sunset"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250824_214226484.png" alt="The ocean near Liverpool, NS"/>
                <div class="caption">
                    <p>Bye-bye, Maritimes.</p>
                </div>
                <p>We didn’t run across a single human Maritimer who was anything less than friendly and welcoming.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56069.png" alt="A white house perched on rocks above the sea-side"/>
                <p>Nice people living along
    beautiful oceanfronts, plenty good enough for me.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Maritime Colors</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/09/01/Maritime-Colors"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/09/01/Maritime-Colors#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/09/01/Maritime-Colors</id>
        <published>2025-09-01T12:00:00-07:00</published>
        <updated>2025-09-05T22:48:59-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Places/Maritimes"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Places"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Maritimes"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts/Photos/Cameras"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Arts"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Photos"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Cameras"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">When someone (<a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">like us</a>)     comes back from a trip to the Maritimes, they’re apt to have pictures of     brightly-colored houses. This is to show those colors off and not just in houses. Plus a camera color     conundrum</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    When someone (
                    <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">like us</a>
                    )
    comes back from a trip to the Maritimes, they’re apt to have pictures of
    brightly-colored houses. This is to show those colors off and not just in houses. Plus a camera color
    conundrum.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55945.png" alt="A trailer park with small building covered by bright colored fenders"/>
                <div class="caption">
                    <p>On the northwest coast of PEI, probably near Cape Wolfe.</p>
                </div>
                <p>In that picture above, glance at the bit of beach showing left of the little lighthouse. There’s a color story there
    too.</p>
                <h2 id="p-1">Residentials</h2>
                <p>
                    As it happens, our very first outing on the vacation was to
                    <a href="https://en.wikipedia.org/wiki/Lunenburg,_Nova_Scotia">Lunenberg</a>
                    , which features those cheerful houses.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55826.png" alt="Brightly colored houses in Lunenberg"/>
                <p>It wasn’t just tourist magnets like Lunenberg; anywhere in the Maritimes you’re apt to see exuberantly-painted
    residences, a practice I admire. While the Maritimes are a long way from my home in Vancouver, we share a long, dim, grey
    winter, and any splash of color can help with that Seasonal Affective Disorder.</p>
                <p>
                    Also, we
                    <a href="/ongoing/When/202x/2025/02/28/Moved">recently bought a house</a>
                    and, while we like it, it’s an undistinguished
    near-grey, so we’re looking for color schemes to steal.
    Thus I took lots of pictures of bright houses.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/PXL_20250822_180516990.png" alt="Apricot-and-brown house"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55828.png" alt="Blue house in Lunenberg"/>
                <p>A couple years back we painted our cabin a cheery blue based on sampling photos of the shutters on Mykonos. A few 
    neighbors rolled their eyes but nobody’s actually complained.</p>
                <h2 id="p-2">Red</h2>
                <p>That’s the other color you have to talk about down east; I mean the color of the soil and sand and rocks. PEI in
    particular is famous for its red dirt, when you come in the on the ferry from Nova Scotia the first thing you notice is the
    island’s red fringe. I took a million pictures and maybe this is the closest to capturing it.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55948.png" alt="Red sand and dirt on a PEI beachfront"/>
                <div class="caption">
                    <p>Not far from that first picture.</p>
                </div>
                <h2 id="p-3">Green Conundrum</h2>
                <p>
                    One of Nova Scotia’s attractions is the
                    <a href="https://en.wikipedia.org/wiki/Cabot_Trail">Cabot Trail</a>
                    , a 300km loop around Cape Breton, stretching northeast out
    into the Atlantic. This one scenic turn-off has you looking at a big, densely-forested mountainside. 
    It’s more chaotic than our West-Coast temperate rain forests, with many tree species jumbled together. The
    spectrum of greens under shifting clouds was a real treat for the eyes. Here are two of the pictures I came away with.
    Have a look at them for a moment.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/PXL_20250813_161053505.png" alt="Forested mountainside"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55881.png" alt="Forested mountainside"/>
                <p>Above is by my Pixel 7, below a modern Fujifilm camera.  When I unloaded them on the
    big outboard screen, I was disappointed with the Fujifilm take, which seemed a little flat and boring; was thinking the Pixel had
    done better. But then I started feeling uneasy; my memory kept telling me that that mountainside just
    didn’t include that yellow flavor in the Pixel’s highlights. I mean, those highlights look great, but I’m pretty sure they’re lies.</p>
                <p>After a while, I edited the Fujifilm version just a teeny bit, gently bumping Lightroom’s “exposure” and “Vibrance” sliders, and
    I thought what 
    I got was very close to what I remembered. The Pixel photo is entirely un-touched.</p>
                <p>I’m not sure what to think. Mobile-phone cameras in general and the Pixel in particular proudly boast their “computational
    photography” and “AI” chops and, yeah, the Pixel produced a photo that it’s hard not to like.</p>
                <p>And quite a few of the pictures I publish in this space have have been adjusted pretty heavily in Lightroom. I stand by my
    claim that I’m mostly trying to make something that looks like what I saw. But increasingly, I suspect the Pixel is showing
    colors people like, as opposed to what’s real.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Maritime Birds and Bees</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/08/30/Maritime-Wildlife"/>
        <link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2025/08/30/Maritime-Wildlife#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/08/30/Maritime-Wildlife</id>
        <published>2025-08-30T12:00:00-07:00</published>
        <updated>2025-08-31T09:05:08-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Places/Maritimes"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Places"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Maritimes"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Nova Scotia and New Brunswick each have plenty of wilderness; PEI not so much. So pictures of bears and cougars and so on     would be plausible, as would marine mammals. But no. Herewith, from our     <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">recent vacation</a>, birds and bees, with a little     lens-geek side trip</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Nova Scotia and New Brunswick each have plenty of wilderness; PEI not so much. So pictures of bears and cougars and so on
    would be plausible, as would marine mammals. But no. Herewith, from our
                    <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">recent vacation</a>
                    , birds and bees, with a little
    lens-geek side trip.
                </p>
                <h2 id="p-1">Birds</h2>
                <p>Having touristed around Charlottetown, we drove down a series of smaller and smaller back roads and ended up
    at Canceaux Cove near Rocky Point, which I thought might present a nice vista of the city. It did, but the city looks boring.
    By way of consolation, there were these cute little birds running around on the beach and then flying loops in formation over the
    water.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55982.png" alt="Small birds on a beach"/>
                <div class="caption">
                    <p>
                        Pretty sure these are
                        <a href="https://en.wikipedia.org/wiki/Semipalmated_plover">Semipalmated plovers</a>
                        .
                    </p>
                </div>
                <p>I wanted to get a picture of them in the air so I sauntered down the beach, assuming
    they’d fly away picturesquely. They studiously ignored me and eventually I had to jump and down and wave my arms and even then
    they took off grudgingly.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55984.png" alt="small birds flying over the ocean"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55987.png" alt="small birds flying over the ocean"/>
                <p>They were graceful and did this mysterious thing that birds can do, staying in formation with no obvious leader.
    I’ve had the pleasure, very occasionally, of being in engineering teams like that.</p>
                <h2 id="p-2">Bees</h2>
                <p>
                    We went to
                    <a href="https://en.wikipedia.org/wiki/Annapolis_Royal">Annapolis Royal</a>
                    because of its
                    <a href="https://historicgardens.wordpress.com">Historic Gardens</a>
                    and wow, what a treat. I think even those who don’t see
    themselves as garden fans would enjoy an hour or more sauntering around in there.  I like taking pictures of flowers and a lot
    of these flowers had bees in them.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56034-2.png" alt="Three orange flowers, one with bee"/>
                <p>This one was cute enough to reward a close-up.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56034.png" alt="Close-up of bee in orange flower."/>
                <div class="caption">
                    <p>Aren’t her wings cute?</p>
                </div>
                <p>And I ask, what could be better than a cute bee in a pretty flower? Obviously, <em>two</em> bees.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56040.png" alt="Two bees in an orange flower"/>
                <p>And again, a closer look.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56040-2.png" alt="Two bees in an orange flower, close-up"/>
                <p>Bees are admirable creatures and I don’t want to make fun of them, but this surprised-looking little citizen makes me
    laugh. (She’s just navigating from one blossom to the next.)</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56045.png" alt="bee caught in flight among the blossoms"/>
                <h2 id="p-3">Lens</h2>
                <p>
                    All of these are shot with Fujifilm’s
                    <a href="https://www.fujifilm-x.com/en-ca/products/lenses/xf55-200mmf35-48-r-lm-ois/">55-200mm</a>
                    lens, which I’ve had for at
    least eleven years. Up till now, I’ve always pointed it at faraway things, but wow, I think I’ll be taking this to more gardens
    in future.
                </p>
                <p>
                    I mention the lens partly so I can link to this
                    <a href="https://www.lensrentals.com/blog/2016/02/the-long-awaited-scary-and-amazing-fuji-lens-teardown/?srsltid=AfmBOorQfgob6drIXwtTJ9xuixBbnSvZE2F8x7Jba0AA3U60uoFAB3gY">awesome
    (and funny) teardown piece</a>
                    from Lensrentals.
                </p>
                <p>And, on the way out, let’s let that lens show off with a couple of roses.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56057.png" alt="Yellow rose and bud"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56058.png" alt="Pink roses, black background"/>
                <p>Remember, pink and black are the colors of rock &amp; roll.
    And if you’re anywhere near Annapolis Royal, stop and visit that garden.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Maritime Vacation</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/08/27/Maritime-Vacation"/>
        <link rel="replies" thr:count="0" type="application/xhtml+xml" href="/ongoing/When/202x/2025/08/27/Maritime-Vacation#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/08/27/Maritime-Vacation</id>
        <published>2025-08-27T12:00:00-07:00</published>
        <updated>2025-08-28T12:36:15-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Places/Maritimes"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Places"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Maritimes"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">The sound of the wind surging through birchy Eastern woods isn’t like the same coastal gusts in my own Pacific rain     forest; around you not above you, alto not baritone. The colors differ too: Forests, houses, soil, and sea. And everywhere     little white churches, each with its cemetery. A scattering of forts, far too many cannons.  And everything faces the sea</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>The sound of the wind surging through birchy Eastern woods isn’t like the same coastal gusts in my own Pacific rain
    forest; around you not above you, alto not baritone. The colors differ too: Forests, houses, soil, and sea. And everywhere
    little white churches, each with its cemetery. A scattering of forts, far too many cannons.  And everything faces the sea.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250814_142523016.png" alt="Cape Breton forest"/>
                <div class="caption">
                    <p>Birchy Cape Breton forest.</p>
                </div>
                <p>For the first time since Covid and, more important, since Lauren’s 2½-year battle with Long Covid, we went on the road for
    pleasure; Lauren and I and our dear friend Sally from Warragul, Australia. To my shame, all my decades’ travel had never taken
    me to Canada east of Montreal, so we spent a couple of weeks poking around Nova Scotia and Prince Edward Island, plus a bit of
    New Brunswick. I took many pictures and it’ll take a few blog pieces to share those that I think deserve it.</p>
                <p>No part of Canada’s settler culture is old by European or Asian standards, but ten generations of white people
    lived and died here before the first rough town organized itself near what’s now Vancouver. They had to be buried someplace, thus the
    graveyards everywhere you go. These were captured near Whycocomagh.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55871.png" alt="Gravestone of Lillian S. DeWolfe, 1876-1958"/>
                <div class="caption">
                    <p>Lillian S. DeWolfe, Oct 1876 Sept 1958.</p>
                </div>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55874.png" alt="A simple grave marker saying only “sleeping”"/>
                <p>How long will it still matter that my hometown is one of the world’s youngest big cities?</p>
                <p>Many graveyards are church attachments, but many more greet you at a random turn in the road; always framed by forest.
    The density of churches is remarkable; all built of wood, mostly white, mostly well-kept. This one was attached to the graves
    above and is untypically faded (but lovely inside).</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55869.png" alt="Square white wooden church, it needs a paint job"/>
                <p>Some of the churches have become boutiques and breweries, but those that haven’t still occur more densely than in any other
    New World jurisdiction I’ve seen. Why should faith hold stronger down East?</p>
                <p>
                    Another church, St Dunstan’s Basilica in Charlottetown, offered perhaps the most intense experience of the whole trip,
    because a singer and organist were practicing elaborate hymn treatments. Both were great, the organ is a magnificent Casavant,
    and parish organist
                    <a href="https://en.wikipedia.org/wiki/Leo_Marchildon">Leo Marchildon</a>
                    was having fun, putting lots of wind through those
    pipes including the 32’ bass monsters.  My ears and I were smiling when we left.
                </p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55925.png" alt="Stained glass in St. Dunstan’s Basilica, Charlottetown"/>
                <div class="caption">
                    <p>The stained glass is nothing special<br/>but I liked the opened panes at the bottom.</p>
                </div>
                <p>Forts and cannons, I said; the Maritimes’ messy history included repeated captures and recaptures by the forces of France and
    Britain and the USA, and quite a few of the forts had been put to their intended use, repelling or falling to one invader or
    another.</p>
                <p>The locals, at least the ones who set things up for tourists, seem to take their history seriously; I don’t pretend
    expertise or even much interest in it, but I have to say that some cannons have good typography.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250824_214613137.png" alt="Engraving on metal: Crown and “VR”"/>
                <div class="caption">
                    <p>
                        “VR” is Victoria Regina of course,
                        <br/>
                        so sometime in the second half of the 19
                        <sup>th</sup>
                        century.
                    </p>
                </div>
                <p>The colors are different, and an entry later in this series will dip in gleefully and give me a platform for camera geekery.
    One expects changes in houses and vegetation when you travel four timezones away, but nothing prepared
    me for the shockingly red soil in Prince Edward Island (hereinafter PEI).</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55937.png" alt="red and blue see, red soil, wind turbines"/>
                <div class="caption">
                    <p>Past Tignish at PEI’s northern extremity,<br/>well off the paved-roads part.</p>
                </div>
                <p>I opened with words about everything facing the sea. Not entirely true, sometimes you’re looking at a lake.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250823_162017189.png" alt="Kids in a large calm lake, circular ripples"/>
                <div class="caption">
                    <p>Those kids don’t know how lucky they are.</p>
                </div>
                <p>This is in the wonderful Kejimkujik National Park in central Nova Scotia, mostly closed due to extreme wildfire peril.</p>
                <p>All across the Maritimes, drought was in effect; crops failing, forest trails closed. Which reminds me; near that lake there was a
    birch-bark-canoe workshop. I asked the guy making the canoe how long it took. He said “My great-grandpa could do it in seven days,
    because back then there were birch trees big enough that you could make the whole hull out of a single piece.”  It’s very
    difficult to find any aspect of life on earth that isn’t exhibiting Anthropocene damage.</p>
                <p>Usually, it’s the sea that you’re looking at.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT56066.png" alt="Nova Scotia coastline near Annapolis Royal"/>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250822_223613924.png" alt="rocky beach at low tide"/>
                <div class="caption">
                    <p>Above, coastline near Annapolis Royal.<br/>Below, low tide near Chipman Brook.</p>
                </div>
                <p>From one end of Canada to the other; to me, the surprise was not so much the difference in the landscapes but the similarity
    of the people; they spoke my accent, shopped in my stores, obeyed my road signs. More on that later. For now, this.</p>
                <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250825_141305938.png" alt="Trees frame the seawater and a couple of oceanfront houses"/>
                <div class="caption">
                    <p>On Bell Island, among the LaHaves.</p>
                </div>
            </div>
        </content>
    </entry>
    <entry>
        <title>RFC 9839 and Bad Unicode</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/08/14/RFC9839"/>
        <link rel="replies" thr:count="3" type="application/xhtml+xml" href="/ongoing/When/202x/2025/08/14/RFC9839#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/08/14/RFC9839</id>
        <published>2025-08-14T12:00:00-07:00</published>
        <updated>2025-08-23T03:17:06-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Text"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Text"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">Unicode is good. If you’re designing a data structure or protocol that has text fields, they should contain     Unicode characters encoded in UTF-8. There’s another question, though:     “<em>Which</em> Unicode characters?” The      answer is “Not all of them, please exclude some.”</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    Unicode is good. If you’re designing a data structure or protocol that has text fields, they should contain
    Unicode characters encoded in UTF-8. There’s another question, though:
    “
                    <em>Which</em>
                    Unicode characters?” The 
    answer is “Not all of them, please exclude some.”
                </p>
                <p>
                    This issue keeps coming up, so Paul Hoffman and I put together an individual-submission draft
    to the IETF and now (where by “now” I mean “two years later”) it’s been published as
                    <a href="https://www.rfc-editor.org/rfc/rfc9839.html">RFC 9839</a>
                    . It explains which characters are bad, and why, then offers
    three plausible less-bad subsets that you might want to use.
    Herewith a bit of background, but…
                </p>
                <h2 id="p-2">Please</h2>
                <p>If you’re actually working on something new that will have text fields, please read the RFC. It’s only ten pages long, and that’s
    with all the IETF boilerplate. It’s written specifically for software and networking people.</p>
                <h2 id="p-3">The smoking gun</h2>
                <p>
                    The badness that 9839 focuses on is “problematic characters”, so let’s start with a painful example of what that means.
    Suppose you’re designing a protocol that uses JSON and one of your constructs has a
                    <code>username</code>
                    field.
    Suppose you get this message (I omit all the non-
                    <code>username</code>
                    fields). It’s 
    a perfectly legal JSON text:
                </p>
                <div class="highlight">
                    <pre>
                        <span></span>
                        <span class="p">{</span>
                        <span class="w"></span>
                        <span class="nt">&quot;username&quot;</span>
                        <span class="p">:</span>
                        <span class="w"></span>
                        <span class="s2">&quot;\u0000\u0089\uDEAD\uD9BF\uDFFF&quot;</span>
                        <span class="p">}</span>
                    </pre>
                </div>
                <p>
                    Unpacking all the JSON escaping gibberish reveals that the value of the
                    <code>username</code>
                    field contains four 
    numeric “code points” identifying Unicode characters:
                </p>
                <ol>
                    <li>
                        <p>
                            The first code point is zero, in Unicode jargon
                            <code>U+0000</code>
                            . In human-readable text it
      has no meaning, but it will interfere with the operation of certain programming languages.
                        </p>
                    </li>
                    <li>
                        <p>
                            Next is Unicode
                            <code>U+0089</code>
                            , official name “CHARACTER TABULATION WITH JUSTIFICATION”. It’s what Unicode calls a
                            <a href="https://en.wikipedia.org/wiki/C0_and_C1_control_codes">C1
      control code</a>
                            , inherited from ISO/IEC 6429:1992, adopted from
                            <a href="https://www.ecma-international.org/wp-content/uploads/ECMA-48_5th_edition_june_1991.pdf">ECMA 48</a>
                            (1991), which calls it
      “HTJ” and says:
                            <i>HTJ causes the contents of the active field (the field in the presentation component that contains the
      active presentation position) to be shifted forward so that it ends at the character position preceding the
      following character tabulation stop. The active presentation position is moved to that following character
      tabulation stop. The character positions which precede the beginning of the shifted string are put into the
      erased state.</i>
                        </p>
                        <p>Good luck with that.</p>
                    </li>
                    <li>
                        <p>
                            The third code point,
                            <code>U+DEAD</code>
                            , in Unicode lingo, is an “unpaired surrogate”.  To understand,
      you’d have to learn how Unicode’s much-detested
                            <a href="https://en.wikipedia.org/wiki/UTF-16">UTF-16</a>
                            encoding works.
      I recommend not bothering.
                        </p>
                        <p>All you need to know is that surrogates are only meaningful when they come in pairs in UTF-16 encoded text. There is
      effectively no such text on the wire and thus no excuse for tolerating surrogates in your data. In fact, the UTF-8 specification
      says that you mustn’t use UTF-8 to encode surrogates. But the real problem is that different libraries in different
      programming languages don’t always do the same things when they encounter this sort of fœtid interloper.</p>
                    </li>
                    <li>
                        <p>
                            Finally,
                            <code>\uD9BF\uDFFF</code>
                            is JSON for the code point
                            <code>U+7FFFF</code>
                            .
      Unicode has a category called “noncharacter”, containing a few dozen code points that, for a variety of
      reasons, some good, 
      don’t represent anything and must not be interchanged on the wire.
                            <code>U+7FFFF</code>
                            is one of those.
                        </p>
                    </li>
                </ol>
                <p>The four code points in the example are all clearly problematic. 
    The just-arrived RFC 9839 formalizes the notion of “problematic” and
    offers easy-to-cite language saying which of these problematic types you want to
    exclude from your text fields. Which, if you’re going to use JSON, you should probably do.</p>
                <h2 id="p-6">Don’t blame Doug</h2>
                <p>Doug Crockford I mean, the inventor of JSON.  If he (or I or really anyone careful) were inventing JSON now that Unicode is
    mature, he’d have been fussier about its character repertoire. Having said that, we’re stuck with JSON-as-it-is forever, so we
    need a good way to say which of the problematic characters we’re going to exclude even if JSON allows them.</p>
                <h2 id="p-5">PRECISion</h2>
                <p>
                    You may find yourself wondering why the IETF waited until 2025 to provide help with Bad Unicode.
    It didn’t; here’s
                    <a href="https://www.rfc-editor.org/rfc/rfc8264.html">RFC 8264</a>
                    :
                    <cite>PRECIS Framework: Preparation, Enforcement, and
    Comparison of Internationalized Strings in Application Protocols</cite>
                    ; the first PRECIS predecessor was published in 2002.
    8264 is 43 pages long, containing a
                    <em>very</em>
                    thorough discussion of many more potential Bad Unicode issues than 9839 does.
                </p>
                <p>Like 9839, PRECIS specifies subsets of the Unicode character repertoire and goes further, providing a mechanism for defining
    more.</p>
                <p>Having said that, PRECIS doesn’t seem to be very widely used by people who are defining new data structures and protocols. My
    personal opinion is that there are two problems which make it hard to adopt. First, it’s large and 
    complex, with many moving parts, and requires careful study to understand. Developers are (for good reason) lazy.</p>
                <p>Second, using PRECIS ties you to a specific version of Unicode. In particular, it forbids the use of the (nearly a million)
    unassigned code points. Since each release of Unicode includes new code point assignments, that means that a sender and receiver
    need to agree on exactly which version of Unicode they’re both going to use if they want reliably interoperable behavior. This
    makes life difficult for anyone writing a general-purpose code designed to be used in lots of different applications.</p>
                <p>I personally think that the only version of Unicode anybody wants to use is “as recent as possible”, so they can be confident
    of having all the latest emojis.</p>
                <p>Anyhow, 9839 is simpler and dumber than PRECIS. But I think some people will find it useful and now the IETF agrees.</p>
                <h2 id="p-7">Source code</h2>
                <p>
                    I’ve written a little Go-language library to validate incoming text fields against each of the three subsets that 9839
    specifies,
                    <a href="https://github.com/timbray/RFC9839">here</a>
                    .  I don’t claim it’s optimal, but it is well-tested.
                </p>
                <p>It doesn’t have a version number or release just yet, I’ll wait till a few folk have had a chance to spot any dumb mistakes I
    probably made.</p>
                <h2 id="p-9">Details</h2>
                <p>Here’s a compact summary of the world of problematic Unicode code points and data formats and standards.</p>
                <table>
                    <tr valign="top" align="center">
                        <td class="empty"></td>
                        <th colspan="3">Problematic classes excluded?</th>
                    </tr>
                    <tr valign="top">
                        <td class="empty"></td>
                        <th>Surrogates</th>
                        <th>Legacy controls</th>
                        <th>Noncharacters</th>
                    </tr>
                    <tr align="center">
                        <td>CBOR</td>
                        <td class="happy">yes</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                    </tr>
                    <tr align="center">
                        <td>I-JSON</td>
                        <td class="happy">yes</td>
                        <td class="unhappy">no</td>
                        <td class="happy">yes</td>
                    </tr>
                    <tr align="center">
                        <td>JSON</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                    </tr>
                    <tr align="center">
                        <td>Protobufs</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                    </tr>
                    <tr align="center">
                        <td>TOML</td>
                        <td class="happy">yes</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                    </tr>
                    <tr align="center">
                        <td>XML</td>
                        <td class="happy">yes</td>
                        <td class="neutral">partial [1]</td>
                        <td class="neutral">partial [2]</td>
                    </tr>
                    <tr align="center">
                        <td>YAML</td>
                        <td class="happy">yes</td>
                        <td class="neutral">mostly [3]</td>
                        <td class="neutral">partial [2]</td>
                    </tr>
                    <tr valign="top" align="center">
                        <td class="empty"></td>
                        <th colspan="3">RFC 9839 Subsets</th>
                    </tr>
                    <tr align="center">
                        <td>Scalars</td>
                        <td class="happy">yes</td>
                        <td class="unhappy">no</td>
                        <td class="unhappy">no</td>
                    </tr>
                    <tr align="center">
                        <td>XML</td>
                        <td class="happy">yes</td>
                        <td class="neutral">partial</td>
                        <td class="neutral">partial</td>
                    </tr>
                    <tr align="center">
                        <td>Assignables</td>
                        <td class="happy">yes</td>
                        <td class="happy">yes</td>
                        <td class="happy">yes</td>
                    </tr>
                </table>
                <p>Notes:</p>
                <p><b>[1]</b> XML allows C1 controls.</p>
                <p><b>[2]</b> XML and YAML don’t exclude the noncharacters outside the Basic Multilingual Pane.</p>
                <p>
                    <b>[3]</b>
                    YAML excludes all the legacy controls except for the mostly-harmless
                    <code>U+0085</code>
                    , another version of
                    <code>\n</code>
                    used in IBM mainframe documents.
                </p>
                <h2 id="p-8">Thanks!</h2>
                <p>9839 is not a solo production. It received an extraordinary amount of discussion and improvement from a lot of smart and
    well-informed people 
    and the published version, 15 draft revisions later, is immensely better than my initial draft. My sincere thanks go to my
    co-editor Paul Hoffman and to all those mentioned in the RFC’s “Acknowledgements” section.</p>
                <h2 id="p-4">On individual submissions</h2>
                <p>
                    9839 is the second “individual submission” RFC I’ve pushed through the IETF (the other is
                    <a href="https://datatracker.ietf.org/doc/html/rfc7725">RFC 7725</a>
                    , which registers the HTTP 451 status code).  While it’s nice
    to decide something is worth standardizing and eventually have that happen, it’s really a lot of work. Some of that work is
    annoying.
                </p>
                <p>I’ve been involved in
    other efforts as Working-Group member, WG chair, and WG specification editor, and I can report authoritatively that creating an
    RFC the traditional way, through a Working Group, is easier and better.</p>
                <p>I feel discomfort advising others not to follow in my footsteps, but in this case I think it’s the right advice.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>Long Links</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/08/04/Long-Links"/>
        <link rel="replies" thr:count="1" type="application/xhtml+xml" href="/ongoing/When/202x/2025/08/04/Long-Links#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/08/04/Long-Links</id>
        <published>2025-08-04T12:00:00-07:00</published>
        <updated>2025-08-07T11:14:33-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">All of these <cite>Long Links</cite> pieces have begun with more or less the same words, so why     stop now?  This is an annotated parade of links to long-form pieces. Most people won’t have the time     (nor the weird assortment of interests) to consume them all, but I hope that most readers will find one     or two      reward a visit</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    All of these
                    <cite>Long Links</cite>
                    pieces have begun with more or less the same words, so why
    stop now?  This is an annotated parade of links to long-form pieces. Most people won’t have the time
    (nor the weird assortment of interests) to consume them all, but I hope that most readers will find one
    or two 
    reward a visit.
                </p>
                <h2 id="p-2">Radisson (and Groseilliers)</h2>
                <p>
                    I don’t know if it is still the case, but in my youth, Canadian elementary education included several overexcited units
    about the
                    <a href="https://en.wikipedia.org/wiki/Coureur_des_bois">
                        <i>Coureurs des bois</i>
                    </a>
                    , early European settlers 
    in “New France” (now Québec) who ventured, by foot and canoe, far to the north and west, mostly engaged in trading with the
    indigenous peoples: trinkets (and later, serious hardware including guns) for furs.
                </p>
                <p>
                    The names I remembered were Radisson and Groseilliers, but I don’t recall learning much about who they were and what
    they did. Then I ran across the 2019 book
                    <a href="https://www.biblioasis.com/shop/non-fiction/bush-runner-the-life-and-times-of-pierre-esprit-radisson/">Bush Runner:
    The Adventures of Pierre-Esprit Radisson</a>
                    and, wow… The writing is pedestrian but who cares because what a
    story! Radisson lived an absolutely astonishing life. He went as deep into the bush as anyone of his era, interacted intensely
    with the indigenous people as business partner, friend, and foe, worked for Charles of England and Louis of France (changing
    sides several times), in 1670 founded the Hudson’s Bay Company (recently, 355 years later, deceased), and fortunately took
    notes, a copy of which was preserved by Samuel Pepys.
                </p>
                <p>I learned more from this book’s pages about the early history of Upper and Lower Canada than all those elementary-school
    units had to offer, and had loads of fun doing so.  I guess this is a fairly Canadian-specific Long Link, but I think anyone
    interested in the early history of Europeans in North America would find much to enjoy.</p>
                <h2 id="p-4">Music</h2>
                <p>It’s rare these days that I discover interesting new musicians, but here are two of those rarities.</p>
                <p>
                    <a href="https://luciehorsch.com">Lucie Horsch</a>
                    plays recorder, you know, the cheap plastic thing they use to introduce
    second-graders to music. It’s actually a lovely instrument and I wish we would switch to its German name, 
    “Blockflöte”, which to my ear sounds a bit like the instrument does. Anyhow, check out this YouTube entitled only
                    <a href="https://www.youtube.com/watch?v=LJyl2D16PZY&amp;list=RDLJyl2D16PZY&amp;start_radio=1">Lucie Horsch - Bach</a>
                    ,
    annoyingly omitting any mention of
                    <em>which</em>
                    Bach. Annoyance aside, it’s a pretty great performance, Ms Horsch is the real
    deal, full of virtuosity and grace.
                </p>
                <p>
                    I got an unusual mid-week message from Qobuz, all excited about
                    <a href="https://transgressiverecords.com/artist/the-new-eves/">The New Eves’</a>
                    new record
                    <cite>The New Eve Is
    Rising</cite>
                    . So I played it in the car on a long crosstown drive and now I’m all excited too. The New Eves are
    talented, musically surprising, and above all, insanely brave.
                </p>
                <p>
                    Their music doesn’t sound like anything else and
    flies in the face of all conventional wisdom concerning popular music. They take absurd chances and yeah, the album has klunkers
    amid the bangers, but when I got to its end I went back and started at the beginning again. I found myself
    smiling ear-to-ear over and over. Maybe I’m being a bit over-the-top here, but check them out:
                    <a href="https://www.youtube.com/watch?v=l9Q9ge6j_O4&amp;list=RDl9Q9ge6j_O4&amp;start_radio=1">Mother</a>
                    is live.
                    <a href="https://www.youtube.com/watch?v=MovNWuNPXXE&amp;list=RDMovNWuNPXXE&amp;start_radio=1">Cow Song</a>
                    is off the new
    album and strong albeit with forgettable video.
                </p>
                <h2 id="p-3">Life online</h2>
                <p>
                    Every Long Links has hardcore-geek threads and there is no harder core imaginable than Filippo Valsordi’s
                    <a href="https://words.filippo.io/assembly-mutation/">Go Assembly Mutation Testing</a>
                    . I have always admired (but never
    actually used) mutation testing, and Filippo offers a convincing argument that it moves catching certain classes of bug from
    nearly impossible to pretty easy. Good stuff!
                </p>
                <p>
                    And of course we can’t ignore genAI and programming. Most of you are likely aware of
                    <a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">Measuring the Impact of Early-2025 AI on
    Experienced Open-Source Developer Productivity</a>
                    , but I’m linking again to boost its visibility, because hard
    quantitative research on methodology is damn rare in our profession. I will confess to being a little (but just a little)
    surprised at the conclusions.
                </p>
                <p>
                    It is apparently quite possible that Intel will exit the business of making high-end chips, leaving TSMC with a global
    monopoly:
                    <a href="https://d2d.substack.com/p/d2d-contd-intel-and-the-wide-open">Intel and the Wide Open Barn Doors</a>
                    .
    This is an unsettling prospect.
    Not, I have to say, surprising though. I’ve sneered at Intel leadership cluelessness for years and years, see
                    <a href="/ongoing/When/200x/2006/01/14/On-Intel">here</a>
                    and
                    <a href="/ongoing/When/200x/2006/02/16/Viiv-Jive">here</a>
                    .
                </p>
                <p>
                    Finally, here’s the charmingly-titled
                    <a href="https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/">How to Surf the Web in 2025, and
    Why You Should</a>
                    . I love this piece.
                </p>
                <h2 id="p-1">Class Reductionism</h2>
                <p>
                    The news keeps making me want to build something around the
                    <code>classreductionist.org</code>
                    domain name I’ve owned for
    years.
                </p>
                <p>
                    The tl;dr on Class Reductionism is something like “In the best possible world it’ll take generations to disassemble the
    global tangle of intersectional oppression, but we could treat the symptoms effectively
                    <em>right now this year</em>
                    by sending
    money to the poor. I’m talking about Universal Basic Income or suchlike. I wrote a
                    <a href="/ongoing/When/202x/2023/01/16/Class-Reductionism">couple thousand words</a>
                    on the subject back in 2023, and there are
    complexities, and I probably won’t put up that site. But I still do maintain that a very high proportion of our societal pain is
    rooted in the egregious inequality, and consequent poverty, that seems a baked-in feature of Late Capitalism.
                </p>
                <p>
                    Let’s start with Nobelist Paul Krugman, who’s been writing an “Understanding Inequality” series on his paywalled newsletter
    and then republishing a gratis version, start
                    <a href="https://stonecenter.gc.cuny.edu/tag/focus-inequality/">here</a>
                    .  Very data-dense and educational.
    Hmm, that site is slow; there’s a livelier table of contents
                    <a href="https://paulkrugman.substack.com/p/i-coulda-made-a-better-deal">here</a>
                    .
                </p>
                <p>
                    Don’t kid yourself that this is just an American problem, see
                    <a href="https://www.nytimes.com/2025/06/23/business/china-upward-mobility-inequality.html?unlocked_article_code=1.cE8.Ptfc.XicZ0XVgHPsJ&amp;smid=url-share">‘The Better Life Is Out of Reach’: The Chinese Dream Is Slipping Away</a>
                    .
                </p>
                <p>
                    Let’s pull the impersonal veil of facts and figures aside and focus on the human experience of what we used to call Class Struggle.
                    <a href="https://macleans.ca/society/confessions-of-the-working-poor/">Confessions of the Working Poor</a>
                    is beautifully
    written and opened my eyes to lifestyle choices that I didn’t even know some people have to make.
                </p>
                <p>
                    But hey, there are people who are just fine with this:
                    <a href="https://finance.yahoo.com/news/deltas-premium-play-is-taking-advantage-of-the-growing-economic-split-100044776.html">Delta's
    premium play is taking advantage of the growing economic split</a>
                    .
                </p>
                <p>
                    Look, being class-determinist-adjacent doesn’t mean you should ignore intersectional awfulness:
                    <a href="https://www.newyorker.com/magazine/2025/08/04/the-plunder-of-black-america-calvin-schermerhorn-book-review">What We
    Miss When We Talk About the Racial Wealth Gap</a>
                    .
                </p>
                <h2 id="p-5">No more sections</h2>
                <p>The remaining Long Links refused to be organized so I had to turn them loose; call it the Long Tail.</p>
                <p><a href="https://articles.c-a-s-t.com/the-venetian-origins-of-roman-type-a856eb3f0cb">The Venetian origins of roman
    type</a>. You might think you don’t care about typography but still enjoy the pictures and descriptions here.</p>
                <!--
    <p><a href="https://www.newyorker.com/magazine/2025/07/28/mary-had-schizophrenia-then-suddenly-she-didnt">Mary Had
    Schizophrenia—Then Suddenly She Didn’t</a></p>-->
                <p>
                    This guy is a full-time
                    <a href="https://urbancoyoteresearch.com/researcher/stanley-d-gehrt-phd">Coyote researcher</a>
                    . What a great gig! I’m an admirer
    of those animals and how they’ve carved themselves a comfy niche in most of North America’s big cities.  (Even if it means that
    you better not let your cat out at night.) They’re also remarkably attractive.
                </p>
                <p>
                    Here’s another long list of Long Links, and many of you will wonder why anyone would choose to browse it:
                    <a href="https://petapixel.com/2025/07/18/the-best-camera-stores-in-tokyo-the-ultimate-guide/">The Best Camera Stores in
    Tokyo: The Ultimate Guide</a>
                    . Some of the interiors are remarkable.
                </p>
                <p>
                    Oh, while we’re on the subject of photography:
                    <a href="https://petapixel.com/2025/07/22/a-photojournalist-took-a-fujifilm-instax-camera-to-a-cartel-wedding/">A
    Photojournalist Took a Fujifilm Instax Camera to a Mexican Cartel Wedding</a>
                    .
                </p>
                <p>
                    GLP-1’s (i.e. Ozempic and friends) would probably dominate a large section of the news if weren’t for all the political
    craziness. Here’s one small example:
                    <a href="https://www.glp1digest.com/p/how-glp-1s-are-breaking-life-insurance">How GLP-1s Are Breaking Life Insurance</a>
                    .
                </p>
                <p>
                    Science is hard. There are lots of largely-unsolved areas, and “gap-map.org” tries to organize them:
                    <a href="https://www.gap-map.org/?sort=rank&amp;utm_source=substack&amp;utm_medium=email&amp;fields=astrophysics">Fundamental
    Development Gap Map v1.0</a>
                    . The UI is a little klunky but the thing still sucked me right in.
                </p>
                <p>
                    I’m going to give the last word to Laurie Penny. I don’t know what we’d do without her.
                    <a href="https://lauriepenny.substack.com/p/in-a-time-of-monsters-do-we-have">In a time of monsters: do we have any ideas for
    surviving the zombie apocalypse that aren’t nightmare patriarchy?</a>
                </p>
            </div>
        </content>
    </entry>
    <entry>
        <title>De-Google Project Update</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/07/29/DeGoogling"/>
        <link rel="replies" thr:count="20" type="application/xhtml+xml" href="/ongoing/When/202x/2025/07/29/DeGoogling#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/07/29/DeGoogling</id>
        <published>2025-07-29T12:00:00-07:00</published>
        <updated>2025-07-31T12:06:18-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World/Life Online/De-Google"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="The World"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Life Online"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="De-Google"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">I     <a href="/ongoing/When/202x/2024/03/09/DeGoogling">introduced this family project</a> in the spring of 2024.     I won’t reproduce those arguments for why we’re working on this, but in the current climate I feel like I hardly need to.     Since that post, our aversion to Google dependency has only grown stronger. Progress has been non-zero but not fast</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    I
                    <a href="/ongoing/When/202x/2024/03/09/DeGoogling">introduced this family project</a>
                    in the spring of 2024.
    I won’t reproduce those arguments for why we’re working on this, but in the current climate I feel like I hardly need to.
    Since that post, our aversion to Google dependency has only grown stronger. Progress has been non-zero but not fast.
                </p>
                <p>Here’s the table, with progress notes below.</p>
                <table>
                    <tr valign="top">
                        <th>Need</th>
                        <th>Supplier</th>
                        <th>Alternatives</th>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-3">Office</a>
                        </td>
                        <td class="unhappy">Google Workspace</td>
                        <td>Proton?</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-17">Data sharing</a>
                        </td>
                        <td class="happy">Dropbox</td>
                        <td></td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-17">Photos</a>
                        </td>
                        <td class="unhappy">Google Photos</td>
                        <td>Dropbox?</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-16">Video meetings</a>
                        </td>
                        <td class="unhappy">Google
	Meet</td>
                        <td>Jitsi, Signal?</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-10">Maps</a>
                        </td>
                        <td class="unhappy">Google Maps</td>
                        <td>Magic Earth, Here, something OSM-based?</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-4">Browser</a>
                        </td>
                        <td class="happy">Safari, Firefox, Vivaldi, LibreWolf</td>
                        <td></td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-12">Search</a>
                        </td>
                        <td class="unhappy">Google</td>
                        <td>Bing-based options, Kagi?</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-5">Chat</a>
                        </td>
                        <td class="happy">Signal</td>
                        <td></td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-6">Photo editing</a>
                        </td>
                        <td class="neutral">Adobe
	Lightroom &amp; Nik</td>
                        <td>Capture One, Darktable, ?</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-7">In-car interface</a>
                        </td>
                        <td class="neutral">Google Android Auto</td>
                        <td>Automaker software</td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-8">Play my music</a>
                        </td>
                        <td class="happy">Plex, USB</td>
                        <td></td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-9">Discover music</a>
                        </td>
                        <td class="happy">Qobuz</td>
                        <td></td>
                    </tr>
                    <tr valign="top">
                        <td>
                            <a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-13">TV</a>
                        </td>
                        <td class="neutral">Roku, Apple, migration</td>
                        <td></td>
                    </tr>
                </table>
                <p>Pink indicates a strong desire to get off the incumbent service, green means we’re happy-ish with what we’re using, and blue
    means that, happy or not, it’s not near the top of the priority list.</p>
                <p>I’ll reproduce the metrics we care about when looking to replace Google products, some combination of:</p>
                <ol>
                    <li>
                        <p>Not ad-supported</p>
                    </li>
                    <li>
                        <p>Not VC-funded</p>
                    </li>
                    <li>
                        <p>Not Google, Microsoft, or Amazon</p>
                    </li>
                </ol>
                <p>The list used to include “Open Source” but I decided that while that’s good, it’s less important than the other three criteria.</p>
                <p>Now let’s walk down the chart.</p>
                <h2 id="p-3">Office</h2>
                <p>This is going to be a wrenching transition; we’ve been running the family on Google stuff forever, and I anticipate
    muscle-memory pain. But increasingly, using Google apps feels like being in enemy territory. And, as I said last time, I
    will not be sorry to shake the dust of Google Drive and Docs from my heels, I find them clumsy and am 
    always having trouble finding something that I know is in there.</p>
                <p>While I haven’t dug in seriously yet, I keep hearing reasonably-positive things about Proton, and nothing substantive to
    scare me away.  Wish us luck.</p>
                <h2 id="p-17">Data sharing (progress!)</h2>
                <p>Dropbox is, eh, OK. It doesn’t seem actively evil, there’s no advertising, and the price is low.</p>
                <h2 id="p-21">Photos</h2>
                <p>We’re a four-Android family including a couple of prolific photographers, and everything just gets pumped into Google and
    then it fills up and then they want more money.  If we could configure the phones to skip Google and go straight to Dropbox,
    that would be a step forward.</p>
                <h2 id="p-16">Video meetings</h2>
                <p>Google meet isn’t painful but I totally suspect it of data-mining what should be private conversations. I’m getting the
    feeling that the technical difficulty of videoconferencing is going steadily down, so I’m reasonably optimistic that
    something a little less evil will come along with a fair price.</p>
                <h2 id="p-10">Maps</h2>
                <p>
                    The fear and loathing that
                    <a href="/ongoing/When/201x/2017/06/29/Fear-Google-Reviews">I started feeling in 2017</a>
                    grows only stronger.  But replacements
    aren’t obvious.
    It’s a pity, maps
    and directions and reviews feel like a natural monopoly that should be a public utility or something, rather than a corporate moat.
                </p>
                <h2 id="p-4">Browser (progress!)</h2>
                <p>Chrome has seriously started making my flesh crawl; once again, enemy territory. Fortunately, there are lots of good options.
    Even people like us who have multiple lives we need to keep separate can find enough better browsers out there.</p>
                <p>Maybe I’ll have a look at one of the new genAI-company browsers ha ha just kidding.</p>
                <h2 id="p-12">Search</h2>
                <p>The reports on Kagi keep being positive and giving it a try is definitely on the To-Do list.</p>
                <h2 id="p-5">Chat</h2>
                <p>Signal is the only sane choice at this point in history for personal use.</p>
                <h2 id="p-6">Photo editing</h2>
                <p>Adobe’s products are good, and I’m proficient and happy with Lightroom, but they are definitely suffering from bad genAI
    craziness. Also the price is becoming unreasonable.</p>
                <p>I’ve had a few Lightroom software failures in recent months and if that
    becomes a trend, looking seriously at the alternatives will move to the top of the priority list.</p>
                <h2 id="p-7">In-car interface</h2>
                <p>
                    It’s tough, Android Auto is a truly great product. I think I’m stuck here for now, particularly given that I plan to be
    driving a
                    <a href="/ongoing/What/The%20World/Jaguar%20Diary/">2019-model-year car</a>
                    for the foreseeable future. Also, it
    supports my music apps.
                </p>
                <h2 id="p-9">Discover music and play mine (progress!)</h2>
                <p>Progress here. I’ve almost completely stopped using YouTube Music in favor of Plex and Qobuz. Really no downside; YTM has
    more or less completely lost the ability to suggest good new stuff.</p>
                <h2 id="p-13">TV</h2>
                <p>
                    Video continues morphing itself into Cable TV redux. We have an old Roku box that works fine and I think I’ve managed to find
    its don’t-spy-on-us settings. We’ll keep subscribing to Apple+ as long as they keep shipping great shows.  I have zero regrets
    about having
                    <a href="/ongoing/When/202x/2025/03/06/Canceled-Prime">left Prime behind</a>
                    .
                </p>
                <p>As for the rest, we’ve become migrants,
    exclusively month-at-a-time subscriptions for the purpose of watching some serial or sports league, unsubscribe after the season
    finale or championship game. The good news is that I
    haven’t encountered much friction in unsubscribing, just a certain amount of earnest pleading.</p>
                <h2 id="p-20">Looking forward</h2>
                <p>I have yet to confront any of the really hard parts of this project, but the sense of urgency is increasing. Let’s see.</p>
            </div>
        </content>
    </entry>
    <entry>
        <title>QRS: Finite-state Struggles</title>
        <link href="https://www.tbray.org/ongoing/When/202x/2025/07/21/Automaton-merge-war"/>
        <link rel="replies" thr:count="2" type="application/xhtml+xml" href="/ongoing/When/202x/2025/07/21/Automaton-merge-war#comments"/>
        <id>https://www.tbray.org/ongoing/When/202x/2025/07/21/Automaton-merge-war</id>
        <published>2025-07-21T12:00:00-07:00</published>
        <updated>2025-07-22T09:10:25-07:00</updated>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Quamina Diary"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Quamina Diary"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Technology/Software"/>
        <category scheme="https://www.tbray.org/ongoing/What/" term="Software"/>
        <summary type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">I just posted a big     <a href="https://github.com/timbray/quamina">Quamina</a> PR representing months of work, brought on     by the addition of a small basic regular-expression feature.  This ramble doesn’t exactly have a smooth story arc but I’m     posting it anyhow because I know there are people     out there interested in state-machine engineering and they are my people</div>
        </summary>
        <content type="xhtml">
            <div xmlns="http://www.w3.org/1999/xhtml">
                <p>
                    I just posted a big
                    <a href="https://github.com/timbray/quamina">Quamina</a>
                    PR representing months of work, brought on
    by the addition of a small basic regular-expression feature.  This ramble doesn’t exactly have a smooth story arc but I’m
    posting it anyhow because I know there are people
    out there interested in state-machine engineering and they are my people.
                </p>
                <p>
                    As far as I can tell, a couple of the problems I’m trying to solve
    haven’t been addressed before, at least not by anyone who published their findings.
    Partly because of that, I’m starting to wonder if all
                    <a href="/ongoing/What/Technology/Quamina%20Diary/">these disorderly Quamina postings</a>
                    might
    be worked into a small book or monograph or something. State machines are really freaking useful software constructs!
    So yeah, this is a war story not an essay, but if you like finite automata you’ll likely be interested in bits of it.
                </p>
                <h2 id="p-1">The story thus far</h2>
                <p>
                    Prior to beginning work on Regular Expressions, I’d already wired shell-style “
                    <code>*</code>
                    ” wildcards into Quamina, which
    forced me to start working with NFAs and ε-transitions. The implementation wasn’t crushingly difficult, and
    the performance was… OK-ish.
                </p>
                <p>
                    Which leads me to The Benchmark From Hell.
    I wondered how the wildcard functionality would work under heavy stress, so I pulled in a list of 12,959 five-letter strings
    from the Wordle source code, and inserted a “
                    <code>*</code>
                    ” at a random position in each. Here are the first ten:
                </p>
                <blockquote>
                    <pre>
                        <code>aalii*
*aargh
aar*ti
abaca*
a*baci
a*back
ab*acs
ab*aft
abak*a</code>
                    </pre>
                </blockquote>
                <p>
                    I created an NFA for each and merged them together
                    <a href="/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata">as described here</a>
                    . Building and merging the automata were
    plenty fast enough, and the merged NFA had 46,424 states, which felt reasonable.
    Matching strings against it ran at under ten thousand per second, which is pretty poor given that Quamina can do a million or
    two per second on patterns encoded in a DFA.
                </p>
                <p>But, I thought, still reasonably usable.</p>
                <h2 id="p-2">The cursed “<code>?</code>”</h2>
                <p>
                    Last year, my
                    <a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series">slow grind through the regexp features</a>
                    had led me
    to the zero-or-one quantifier “
                    <code>?</code>
                    ”.  The state machine for these things is not rocket science; there’s a discussion
    with pictures in my recent
                    <a href="/ongoing/When/202x/2025/07/07/Epsilon-Wrangling#p-3">Epsilon Wrangling</a>
                    .
                </p>
                <p>
                    So I implemented that and fired off the unit tests, most of which
                    <a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1">I didn’t have to write</a>
                    , and they all failed.
    Not a surprise I guess.
                </p>
                <p>
                    It turned out that the way I’d implemented ε-transitions for the wildcards
                    <a href="/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata#p-9">was partially wrong</a>
                    , as in it worked for the tight-loop
    state-to-itself ε-transitions, but not for more general-purpose things like “
                    <code>?</code>
                    ” requires.
                </p>
                <p>
                    In fact, it turns out that merging NFAs is hard (DFAs are easy), and I found precious little help online.
                    <a href="https://en.wikipedia.org/wiki/Thompson%27s_construction">Thompson’s construction</a>
                    does give an answer: Make an
    otherwise-empty state with two ε-transitions, one to each of the automata, and it’ll do the right thing. Let’s call that
    a “splice state”. It’s easy to implement, so I did. Splicing is hardly “merging” in the Quamina sense, but still.
                </p>
                <p>Unfortunately, the performance was hideously bad, just a few matches per second while pegging the CPU.
    A glance at the final NFA was sobering; endless chains of splice states, some thousands long.</p>
                <p>At this point
    I became very unhappy and got stalled for months dealing with real-life issues while this problem lurked at the back
    of my mind, growling for attention occasionally.</p>
                <p>Eventually I let the growler out of the cave and started to think through approaches. But first…</p>
                <h2 id="p-4">Worth solving?</h2>
                <p>Is it, really? What sane person is going to want to search for the union of thousands of regular expressions in general or
    wild-carded strings in particular?</p>
                <p>
                    I didn’t think about this problem at all, because of my experience with Quamina’s parent,
                    <a href="https://github.com/aws/event-ruler">Ruler</a>
                    . When it became popular among several AWS and Amazon teams, people
    sometimes found it useful to match the union of not just thousands but a million or more different patterns. When you write
    software that anyone actually uses, don’t expect the people using it to share your opinions on what is and isn’t
    reasonable. So I wasn’t going to get any mental peace until I cracked this nut.
                </p>
                <p>I eventually decided that three approaches were worth trying:</p>
                <ol>
                    <li>
                        <p>Figure out a way really to merge, not just splice, the wildcarded patterns, to produce a simpler automaton.</p>
                    </li>
                    <li>
                        <p>Optimize the NFA-traversal code path.</p>
                    </li>
                    <li>
                        <p>Any NFA can be transformed into a DFA, says computer-science theory. So do that, because Quamina is really fast at
      DFA-based matching.</p>
                    </li>
                </ol>
                <h2 id="p-5">Nfa2Dfa</h2>
                <p>I ended up doing all of these things and haven’t entirely given up on any of them.
    The most intellectually-elegant was the transform-to-DFA approach, because if I did that, I could remove the fairly-complex
    NFA-traversal logic from Quamina.</p>
                <p>It turns out that the Net is rich with textbook extracts and YouTubes and slide-shows about how to do the NFA-to-DFA
    conversion. It ended up being quite a pleasing little chunk of code, only a couple hundred lines.</p>
                <p>The bad news: Converting each individual wildcard NFA to a DFA was amazingly fast, but then as I merged them in one by one,
    the number of automaton states started increasing explosively and the process slowed down so much that I never had the patience
    to let it finish. Finite-automata theory warns that this can happen, but it’s hard to characterize the cases where it does.
    I guess this one of them.</p>
                <p>
                    Having said that, I haven’t discarded the
                    <code>nfa2Dfa</code>
                    code, because perhaps I ought to offer a Quamina option to
    apply this if you have some collection of patterns that you want to run really super fast and are willing to wait for a while
    for the transformation process to complete. Also, I may have missed opportunities to optimize the conversion; maybe it’s making
    more states than it needs to?
                </p>
                <h2 id="p-6">Faster NFA traversal</h2>
                <p>
                    Recently in
                    <a href="/ongoing/When/202x/2025/07/07/Epsilon-Wrangling">Epsilon wrangling</a>
                    I described how NFA traversal has to work,
    relying heavily on implementing a thing called an ε-closure.
                </p>
                <p>So I profiled the traversal process and discovered, unsurprisingly, that most of the time was going into memory allocation
    while computing those ε-closures. So now Quamina has an ε-closure cache and will only compute each one once.</p>
                <p>
                    This helped a lot but not nearly enough, and the profiler was still telling me the pain was in Go’s allocation and
    garbage-collection machinery. Whittling away at this kind of stuff is not rocket science. The standard Go trick I’ve seen over
    and over is to keep all your data in slices, keep re-using them then chopping them back to
                    <code>[:0]</code>
                    for each request.  After a while they’ll have grown to the
    point where all the operations are just copying bytes around, no allocation required.
                </p>
                <p>Which also helped, but the speed wasn’t close to what I wanted.</p>
                <h2 id="p-7">Merging wildcard automata</h2>
                <p>
                    I coded multiple ways to do this, and they kept failing. But I eventually found a way to build those
    automata so that any two of them, or any one of them and a DFA, can merged and generate dramatically
    fewer ε-transition chains.  I’m not going to write this up here for two reasons: First of all, it’s not
                    <em>that</em>
                    interesting, and second, I worry that I may have to change the approach further as I go on implementing new regxp operators.
                </p>
                <p>
                    In particular, at one point I was looking at the code while it wasn’t working, and I could see that if I added a particular
    conditional it would work, but I couldn’t think of a principled reason to do it. Obviously I’ll have to sort this out
    eventually. In the meantime, if you’re the sort of um special person who is now burning with curiosity, check out my branch from
    that PR and have a look at the
                    <code>spinout</code>
                    type.
                </p>
                <p>
                    Anyhow, I added that conditional even though it puzzled me a bit, and now you can add wildcard patterns to Quamina at 80K/second,
    and my 12.9K wildcards generate an NFA with with almost 70K states, which can scan events at almost 400K/second. And that’s good
    enough to ship the
                    <code>“?”</code>
                    feature.
                </p>
                <p>By the way, I tried feeding that 70K-state automaton to the DFA converter, and gave up after it’d burned an hour of CPU and
    grown to occupy many GB of RAM.</p>
                <h2 id="p-8">Next steps</h2>
                <p>Add “<code>+</code>” and “<code>*</code>”, and really hope I don’t have to redesign the NFA machinery again.</p>
                <p>Also, figure out the explanation for that puzzling <code>if</code> statement.</p>
                <h2 id="p-9">And I should say…</h2>
                <p>Despite the very narrow not to say obsessive focus of this series, I’ve gotten a few bits and pieces of positive feedback. So
    there are a few people out there who care about this stuff. To all of you, thanks.</p>
            </div>
        </content>
    </entry>
</feed>
Raw text
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
      xmlns:thr='http://purl.org/syndication/thread/1.0'
      xml:lang='en-us'>
 <title>ongoing by Tim Bray</title>
 <link rel='hub' href='http://pubsubhubbub.appspot.com/' />
 <id>https://www.tbray.org/ongoing/</id>
 <link href='https://www.tbray.org/ongoing/' />
 <link rel='self' href='https://www.tbray.org/ongoing/ongoing.atom' />
 <link rel='replies'       thr:count='101'       href='https://www.tbray.org/ongoing/comments.atom' />
 <logo>rsslogo.jpg</logo>
 <icon>/favicon.ico</icon>
 <updated>2025-12-06T20:11:03-08:00</updated>
 <author><name>Tim Bray</name></author>
 <subtitle>ongoing fragmented essay by Tim Bray</subtitle>
 <rights>All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright</rights>
 <generator uri='/misc/Colophon'>Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, and ImageMagick. Industrial-strength technology, baby.</generator>

<entry>
 <title>Tracy Numbers</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/12/02/Bell-Combinatorics#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics</id>
 <published>2025-12-02T12:00:00-08:00</published>
 <updated>2025-12-06T11:03:30-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Music' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Music' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking     a class in Afro-Cuban rhythms from     <a href='https://drumming.ca'>Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the     basics of Afro-Cuban are the     <a href='https://en.wikipedia.org/wiki/Bell_pattern'>Bell Patterns</a>, which come straight out of Africa.     The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of     three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It     feels like it’s in four, particularly when played fast</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking
    a class in Afro-Cuban rhythms from
    <a href="https://drumming.ca">Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the
    basics of Afro-Cuban are the
    <a href="https://en.wikipedia.org/wiki/Bell_pattern">Bell Patterns</a>, which come straight out of Africa.
    The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of
    three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It
    feels like it’s in four, particularly when played fast.</p>
    <p>Here’s the standard bell pattern in music notation. Instead of one 12/8 bar, I’ve broken it into four 3/8 chunks. Let’s call
    those “mini-measures”; I’ll use that or just “minis” in the rest of this piece.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern" />
    <div class='caption'><p><audio controls="controls" src="standard.m4a"></audio></p></div>
    <p>Bell patterns are never played in isolation, but circularly on fast repeat, so the first note immediately follows
    the last.</p>
    <p>In the sound sample, I’m playing a background beat on a conga, emphasizing the beginning of the 12/8 measures.
    The actual bell pattern is on the high “child” bell of a
    <a href="https://en.wikipedia.org/wiki/Ewe_drumming#Gankogui">Gankoqui</a>, an African dual-cowbell set.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/PXL_20251201_192632520.png" alt="Black cat considers a Gankoqui" />
    <div class='caption'><p><a href="/ongoing/When/202x/2021/02/22/Meet-Thorn">“þ” the cat</a> was trying bell patterns but
    unfortunately<br/>cats can’t count as high as 12. Collar by
    <a href="https://www.birdsbesafe.com">BirdsBeSafe.com</a>.</p></div>
    <p>That’s my Gankoqui.
    I bought it off someone on Etsy who imports them from Ghana. 
    It came with that little thin stick that sounds nice, but sometimes I use a regular drumstick when things get loud.</p>
    <h2 id='p-1'>The problem</h2>
    <p>Russell’s a good teacher and the standard pattern isn’t that tricky, but I just couldn’t get a grip on it.
    It’s a little harder than it looks what with cycling it really fast, and  then
    you’re playing it against complicated music with other instrumental voices. 
    I probably would have got there, but the lessons ran out of gas in the depths of Covid.</p>
    <h2 id='p-2'>Introducing Tracy</h2>
    <p>She was Russell’s long-time partner, a good person and good drummer too.  When you were struggling
    with a complex rhythm it was helpful to watch Tracy’s hands, because she was <em>always</em> on the beat.</p>
    <p>Tracy lived with stage four metastatic cancer for many years and braved endless awful rounds of therapy while remaining generally
    cheerful. She could be morbidly funny; I bought her congas (you can hear one behind the beat in the samples) when she had a
    storage-space problem.  She told me she was carefully planning her finances so she’d run out of money just before the cancer got
    her.</p>
    <p>I always enjoyed any time I spent with her. Then, a dozen years into her cancer
    journey, this last summer it got into her brain and it was pretty clear her end times were upon her.</p>
    <h2 id='p-3'>The hospice</h2>
    <p>Tracy’s last months were spent at
    <a href="https://stjohnhospice.ca">St. John Hospice</a> in Vancouver’s far west.  I can’t say enough
    good things about it. If you’re near Vancouver and your death becomes imminent, try to be there if you can’t be at home.
    It’s comfortable and the staff are expert and infinitely kind. The rules that apply at hospices
    are different from those at hospitals; for example, Tracy’s cat joined her in residency and had the run of the place.</p>
    <p>I (and other fans of Russell and Tracy) visited the hospice a few times. My last visit was just days before her death
    and, while she was fatigued and spaced-out, it was still Tracy.
    I wasn’t close enough to call her a friend, but I miss her.</p>
    <p>We got to talking about Afro-Cuban music and I laughed at myself, saying how I never could get that damn bell pattern
    down. Said Russell: “Oh, you mean the standard 12/8 pattern? Tracy, let’s show him” and on the second try, they were doing it
    together, just voices, <i>ta ta ta-ta, ta ta ta</i>. </p>
    <p>Driving home from the hospice, I told myself that if Tracy could manage the bell pattern in her condition, I could bloody
    well learn it.  So I studied the details and used a metronome app and after a while
    I thought I had it down pretty well.</p>
    <h2 id='p-4'>Sounds cool</h2>
    <p>I go to a weekly by-invitation African drum jam where I’m on the weaker end of the skill
    spectrum. The first time a 12/8 came along after I thought I’d learned the pattern,  I had to summon up courage
    and then I fluffed the first few bars. But after a while I 
    was grooving along and smiling and thinking the bell sounded pretty cool against the thunder of all the djembés and dununs.</p>
    <p>And, even played amateurishly, it does sound cool. Let’s have another look at the music.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png" alt="standard 12/8 bell pattern" />
    <div class='caption'><p><audio controls="controls" src="standard.m4a"></audio></p></div>
    <p>West-African drumming often tries to achieve rhythmic tension, where a given note could fit in multiple ways and your
    ear is not 100% sure what’s going on. The standard pattern does this, twice.</p>
    <p>Remember, I said that 12/8 sounds like it’s
    “in four”, especially if you hit the first beat of each of the four mini-measures. But two of
    the four minis here go around the first note, weakening the 4/4 feel.
    Especially on that third mini; you can feel the beat slide by the missing “one”.</p>
    <p>Also, the last three notes are evenly spaced two beats
    apart, so six of them would fill the 12-beat pattern, suggesting that this might be in triple time, not 12/8.</p>
    <p>The effect, to my ears, is of the bell, higher-pitched than the drums, shifting against the rhythm, or even dancing
    across it.  At the drum jam, at almost any given moment it won’t be just drums, one or more people will have
    clave sticks or rattles or tambourines or cowbells weaving through the beat.</p>
    <h2 id='p-5'>Mixing it up</h2>
    <p>After I felt confident playing the standard pattern, it still sounded cool, but I wanted to branch out, not just
    go around and around the same seven notes. So the first thing I did was start mixing in a few of these.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-1.png" alt="bell pattern variation" />
    <div class='caption'><p><audio controls="controls" src="5333.m4a"></audio></p></div>
    <p>This repeats the second bar through the end of the phrase. In the sound sample I mix it up with the standard pattern.
    It’s got less rhythmic tension but on the other hand
    flows along smoothly with the drum thunder.  Also you don’t have to think at all, so you can enjoy listening to what the other
    people are playing.</p>
    <p>Then I got a little more ambitious and reshuffled:</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-2.png" alt="bell pattern variation" />
    <div class='caption'><p><audio controls="controls" src="5253.m4a"></audio></p></div>
    <p>The mini-measures are the same as in the standard pattern, just in a different order.  Anyhow, this kind of thing is fun.</p>
    <h2 id='p-6'>Combinatorics</h2>
    <p>Then one evening I was lying in bed, thoughts wandering, and wondered “How many bell patterns are there?”
    A little mental math showed that of course there are eight possible arrangements of tones
    in a 3-note mini-measure. Here they are:</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/12/02/8-measures.png" alt="Possible arrangements of notes in 3/8 time" />
    <div class='caption'><p>I’ll use the boxed numbers to identify the minis.</p></div>
    <p>Why are the minis numbered in that order? Every computer programmer looking at this already knows, but for the rest of you: If the
    notes are ones and the rests are zeroes, they are the eight binary numbers between zero and seven inclusive.
    So each number’s binary bits show where the drumstrokes are. 
    By the way, numbers four through
    seven have a note on the one beat, zero through three don’t.</p>
    <p>Is it weird to have a zero i.e. silent mini? I don’t think so, sometimes spaces between the notes really matter.</p>
    <h2 id='p-7'>Patterns</h2>
    <p>Anyhow, the original question was about the number of different bell patterns. Each has four
    mini-measures with 8 possible values. So the answer is 8 ⨉ 8 ⨉ 8 ⨉ 8, which is 4,096.</p>
    <p>And each of them can be identified by four little numbers, ranging from T0000 (I can hear the bandleader yelling “gimme zeroes
    for the sax break”) to T7777, a flurry of eighth notes that you might use in the big encore-number finish designed to leave the
    audience yelling as you walk off stage. The standard bell pattern is T5325; in binary “101 011 010 101” and the 1’s are drumstrokes.
    The first variation above is T5333 and the second is T5253.</p>
    <p>The “T” in front of each bell pattern number is for Tracy.</p>
    <p>If you go look at the
    <a href="https://en.wikipedia.org/wiki/Bell_pattern">Wikipedia Bell-pattern article</a>, they emphasize that there are lots of
    different patterns. Now they all have numbers! The article
    <a href="https://en.wikipedia.org/wiki/Bell_pattern#128_bell_patterns">makes special mention of</a> T5124, T5221, and T5244.</p>
    <h2 id='p-8'>But why, Tim?!</h2>
    <p>I’m a computer programmer with a Math degree, and an amateur musician.
    Anyone who thinks that these are disjoint disciplines is wrong.
    And, I think the notation is (on a very small scale) kind of pleasing.</p>
    <p>But the work has actually helped me.
    Now that I’ve considered each mini-measure and its personality. I find all of them sneaking into
    my Gankoqui excursions, which have gotten noticeably weirder, for example T5635.
    Nobody’s threatened to kick me out of the jam, so far.</p>
    <p>Also, this has given me a real appreciation of whoever it was that, probably thousands of years ago and certainly in Africa,
    picked the “standard” pattern as, well, standard. Because it’s great.</p>
    <h2 id='p-9'>What’s missing?</h2>
    <p>You may have noticed that Gankoquis have two bells and I’ve been ignoring that fact. Normally you’d play these patterns
    on the smaller “child” bell, but sometimes bringing the big parent bell in for a couple of strokes works 
    well.
    <a href="https://www.youtube.com/watch?v=X2K0i8e6Ftc">Here’s an example</a> (h/t Russell).</p>
    <p>Also, this discussion has been limited to 3/8 minis in 12/8 measures. There’s another whole universe of 4/4 rhythms that
    also have bell patterns (but everything exists in the shadow of the
    <a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave rhythm</a>).
    In that world a pattern has four measures, each of which can have sixteen possible values, so there are 65,536 different ones.</p>
    <p>And I could repeat the numbers construction above for 4/4. But I’m not going to, because the rewards feel smaller. In my
    experience, 4/4 rhythms lope smoothly along and everyone knows where the one is even when there’s no note on it, so there’s less
    ambiguity to work with.
    Anyhow, any neophyte (like for example me) can play a pretty smooth bell line against 4/4; just start with
    <a href="https://en.wikipedia.org/wiki/Clave_(rhythm)">clave</a> and add
    variations (or don’t) and you’ll be fine.</p>
    <h2 id='p-10'>Useful?</h2>
    <p>These numbers are just elementary mathemusical fun. If anyone else wanted to use them that’d be a pleasant surprise.
    If “anyone else” is you, go ahead, but they have a name and you have to use it. These are called Tracy Numbers.</p>
    <h2 id='p-11'>Colophon</h2>
    <p>Music fragments by
    <a href="https://www.mu.se/musescore-studio">MuseScore Studio</a>. Sound samples facilitated by GarageBand, a Shure MV51, and PSB
    Alphas.</p>
</div></content></entry>

<entry>
 <title>Fútbol Joy</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/11/23/Soccer-vs-Football#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football</id>
 <published>2025-11-23T12:00:00-08:00</published>
 <updated>2025-11-27T20:38:07-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Sports/Football' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Sports' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Football' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Sports/Soccer' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Soccer' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Last Saturday I had one of my peak 2025 experiences, at the     <a href='https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs'>MLS semifinal</a>      between the <a href='https://www.whitecapsfc.com/'>Vancouver Whitecaps FC</a> (hereinafter “Caps”) and     <a href='https://en.wikipedia.org/wiki/Los_Angeles_FC'>Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”.     53,095 other fans were there with my son and I; we came     home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other  TV sports</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Last Saturday I had one of my peak 2025 experiences, at the
    <a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">MLS semifinal</a> 
    between the <a href="https://www.whitecapsfc.com/">Vancouver Whitecaps FC</a> (hereinafter “Caps”) and
    <a href="https://en.wikipedia.org/wiki/Los_Angeles_FC">Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”.
    53,095 other fans were there with my son and I; we came
    home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other  TV sports.</p>
    <p>Earlier this year
    <a href="/ongoing/When/202x/2025/05/04/Southsiders">I wrote about becoming a Caps fan</a>. Anyone who enjoys this will probably
    like that piece too.</p>
    <p>Let’s set the scene with pictures.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_004124670.png" alt="Before the fútbol at the pub" />
    <div class='caption'><p>Supporters gather pre-game at a nearby Irish-flavored pub.</p></div>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_011735082.png" alt="Parading from the pub to the match" />
    <div class='caption'><p>Supporters march to the game.<br/>When you’re in a frivolous parade, everyone smiles<br/>at
    you, even the drivers hemmed in by paraders.</p></div>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_024033770.png" alt="Whitecaps tifo banner: fire that burns / blue melts gold" />
    <div class='caption'><p>The banner is what’s called a
    <a href="https://en.wikipedia.org/wiki/Tifo">tifo</a>.<br/>I have to admit I failed to parse it.</p></div>
    <h2 id='p-5'>The game</h2>
    <p>It was 120 minutes of ridiculously over-the-top psychodrama. I was exhausted at the end.
    If you want a full retrospective, type “whitecaps lafc” into any Web search to get the particulars. Or
    <a href="https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs">hit
    this</a>. But here’s the short version:</p>
    <ol>
      <li><p>The Caps came out sharp and fast and had LAFC pretty well flummoxed through most of the first half, scoring two goals,

      <a href="https://www.youtube.com/watch?v=9nEOw8ckWMA">one of which was a jaw-dropper</a>.
      They also managed to contain LAFC’s superstar
      <a href="https://en.wikipedia.org/wiki/Son_Heung-min">Son Heung-min</a>.</p></li>
      <li><p>In the second half, the visitors reconfigured and were much better. Son did the superstar thing and scored two goals,
      <a href="https://www.youtube.com/watch?v=-L9N8pkrkSM">one another jaw-dropper</a>, just as the game was ending, to tie things
      up.</p></li> 
      <li><p>The Caps lost two players, one for fouls, one to injury, and were down two men through most of overtime. LAFC’s assault
      was relentless but the Caps held on, getting more than a little lucky.</p></li>
      <li><p>So it went to a penalty-kick competition. Son, shockingly, missed; he was exhausted and limping. At the end of the
      day the Caps scored four out of five to LAFC’s three and got the win.</p></li>
    </ol>
    <p>Suffice it to say that the dramatic peak wasn’t
    any of the flashes of brilliance, but rather the errors that happen when people are at the limit of their endurance. Vancouver
    made one fewer, that’s all there was to it.</p>
    <h2 id='p-3'>That sound</h2>
    <p>There’s not another like it on this planet. I mean tens of thousands of voices in a big stadium greeting a home goal.
    Fútbol specifically because its goals, compared to North American sports where points come in dozens, are
    such huge markers. The sound-pressure wavefront, coming from every direction, of all those inarticulate howls of joy,
    all in the same tiny fraction of a second, is a whole-body experience.</p>
    <h2 id='p-6'>The side effect</h2>
    <p>I’ve long been a televised-sports fan; the only TV show that isn’t scripted and thus has real drama. But
    since getting mixed up in fútbol, I’ve sort of gone off the other sports I used to watch.  I had to think a bit to figure
    out why.</p>
    <p>It’s the ads.  The football, basketball and hockey broadcasts screech to a halt
    <a href="https://qz.com/150577/an-average-nfl-game-more-than-100-commercials-and-just-11-minutes-of-play">every ten or fewer
    minutes</a> for a couple of minutes of advertising. Most of the ads are dumb, many are offensive, and the relentless
    addiction-promoting gambling pitches are both. On top of which there’s the bone-headed repetition; someone somewhere thinks
    I’m gonna lean toward this generic SUV as opposed to that one because of the 138th time they’ve run that commercial where hip young
    people with fulfilling lives are going to have sex because of its dashboard geometry and motorized hatchback.
    I mean, the other SUVs have that stuff too, but this one’s actors are more convincingly likely to be headed for bed?</p>
    <p>Being in the room with this shit makes me angry even though my mute-button skillz are sharp.
    The world being what it is, I really don’t need to be around something that angers me several times per hour.
    So, while when young I loved playing both football and basketball, and while the pro games are good entertainment, 
    my patience seems to be running out.</p>
    <p>Fútbol, on the other hand, has two fiftyish-minute chunks of continuous action, so you can sink into the flow of the
    game. The contrast, switching back and forth between that and the other North American sports, is stark.</p>
    <p>(Except for I’m mostly forgiving baseball because its natural rhythm is full of stops suitable for hot dogs and beer and
    admiring cute babies and T-shirts and discussions of etymology and epidemiology.  I mean, the ads are still mindless repetitive
    shit, we’re just more accustomed to switching attention away when nothing’s happening.)</p>
    <p>And I’m not claiming that fútbol is more virtuous or less dirty than any other sport; after all, its global
    organizing body FIFA has repeatedly been exposed as
    <a href="https://en.wikipedia.org/wiki/FIFA#Corruption">galactically corrupt</a>. I’m just saying it offers a better
    experience.</p>
    <h2 id='p-9'>Soccer?</h2>
    <p>That word is an awkward invention by nineteenth-century British toffs based on abbreviating “association”. I accept that on my
    continent “football” means gridiron, but people who enjoy “soccer” still say it so in print I offer “fútbol”, which is a
    typographically nice little cluster; please humor me.</p>
    <p>Anyhow, you might want to check out your local team; in North America, the prices are lower than the other sports, who could
    be against cheap happiness with fewer gambling ads?</p>
</div></content></entry>

<entry>
 <title>Long Links</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links' />
 <link rel='replies'        thr:count='2'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/11/16/Long-Links#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links</id>
 <published>2025-11-16T12:00:00-08:00</published>
 <updated>2025-11-19T14:20:55-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the     choices will improve your day.  This time out it’s almost all politics, but that’s the way the world is.     And some of the politics aren’t American!</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the
    choices will improve your day.  This time out it’s almost all politics, but that’s the way the world is.
    And some of the politics aren’t American!</p>
    <p>Some of these are paywalled, sorry.
    And the whole thing is kind of long so if you’re in a hurry, you might want to jump to the last section, entitled
    <a href="#p-8">Wonderful things</a>.</p>
    <h2 id='p-7'>Social media</h2>
    <p>Here’s a real treat. Perhaps the premiere example of a blog that’s grown happily from a one-man operation to a
    successful and sustainable small business would be
    <a href="https://talkingpointsmemo.com">Talking Points Memo</a>. It provides what I think is about the deepest
    carefully-reported coverage of the American progressive scene available anywhere. I’ve been a subscriber for years.</p>
    <p>They’re celebrating their 25th anniversary and, to celebrate, have been working on a history of blogging:
    <a href="https://talkingpointsmemo.com/tpm-25">Pivots, Trolls, &amp; Blogrolls</a>.
    Contributors so far: Sarah Jaffe, Matt Pearce, Brian Beutler, Kylie Cheung, Megan Greenwell, David Weigel, Jon Allsop, Adam
    Mahoney, Julianne Escobedo Shepherd, Max Rivlin-Nadler, Bhaskar Sunkara, Hamilton Nolan, Ana Marie Cox, Marisa Kabas, Kelly
    Weill, Aurin Squire, Marcy Wheeler, Andrew Parsons, Jeet Heer, and Sarah Posner.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/TPM.png" alt="TPM 25th anniversary series" />
    <p>It’s full of razor-sharp insights and nostalgic smiles. I think it’s paywalled? If so, and if you’ve got feels about 
    the blog form, it’d probably be worth your while to sign up for a month just to read this collection.</p>
    <p>And thanks to Josh Marshall of <cite>TPM</cite> for putting it together all these years and especially for this particular
    mind candy.</p>
    <h2 id='p-4'>Politics (US)</h2>
    <p>The Trump administration is, generally speaking, strange.
    For a terrifying trip several standard deviations off the strange end of the strangeness,
    there’s 
    <a href="https://www.newyorker.com/magazine/2025/11/17/laura-loomers-endless-payback">Laura Loomer’s Endless Payback</a>.
    At several points in my traversal of this piece I simply could not believe what I was reading. My guess is that it will
    regularly be cited by historians of the 23rd century, to add spice to their narrative.</p>
    <p>Many commentators on the right have been horrified at Zohran Mamdani’s New York victory, seeing him as the white-hot
    pointy end of the “woke mind virus”.  Well, what could be more woke, I ask, than the Department of Africana Studies at Bowdoin,
    a boutique liberal-arts college in Maine?</p>
    <p>Mamdani was a student there, and now the former head of said department offers us
    <a href="https://lithub.com/maybe-dont-talk-to-the-new-york-times-about-zohran-mamdani/">Maybe Don’t Talk to the New York
    Times About Zohran Mamdani</a>. Peter Coviello is not a moderate but is a formidable writer: “The storied choice between
    socialism and barbarism was made exquisitely clear a good many years ago in the United States, and both major parties chose
    barbarism.” Despite that, it’s mostly written with a light touch, often amusing. Read it.</p> 
    <h2 id='p-5'>Politics (Other)</h2>
    <p>It’s not in the news much, but China is facing colossal economic challenges.
    <a href="https://www.nytimes.com/2025/09/23/opinion/china-economy-deflation-neijuan.html">Learn about “meijuan”</a> (in English,
    “involution”) which might well put the nation on the path of deflation. That’s a path that, once an economy is on it, is very
    hard to get off; it took Japan decades.</p>
    <p>While we’re looking at China… there used to be “Kremlinology”, a study of the entirely opaque workings of the top inner
    circles of the Soviet regime. In that spirit, here’s some
    <a href="https://en.wikipedia.org/wiki/Great_Hall_of_the_People">人民大会堂</a>-ology: 
    <a href="https://sinocism.com/p/forever-xi-jinping-perhaps-not">Forever Xi Jinping? Perhaps Not</a>.
    I enjoyed it but have no idea if it’s, you know, correct. Nobody outside that inner circle does.</p>
    <p>Now let’s jump seven time zones west, to France, where the redoubtable Thomas Piketty offers
    <a href="https://thomaspiketty.wordpress.com/2025/11/11/le-pens-rn-has-become-the-party-of-billionaires/">Le Pen’s RN has
    become the party of billionaires</a>. Unlike the Beijing piece, Piketty’s is (as usual for him) supported by concrete data and I tend
    to believe it.</p>
    <p>Last stop: Gaza, waiting to find out if an externally-imposed and leaky ceasefire will hold, and whether there is a path
    from where they are to something better. As for “where they are”, here’s
    <a href="https://www.nytimes.com/interactive/2025/10/08/opinion/gaza-strip-before-after.html">The Gaza I Knew Is
    Gone</a> by Ghada Abdulfattah.  It describes life’s experience for the citizens of Gaza after all these endless
    months of brutality.</p> 
    <h2 id='p-9'>Politics (everywhere)</h2>
    <p>Pope Leo’s 
    <a href="https://www.vatican.va/content/leo-xiv/en/apost_exhortations/documents/20251004-dilexi-te.html">Apostolic Exhortation
    Dilexi Te of the Holy Father Leo XIV To All Christians On Love For The Poor</a> got a short-lived run in the headlines,
    accompanied by “But that’s… socialism!” pearl-clutching from Stage Right. It deserves a read. The first three-quarters or
    so are a trip through Church history, starting in Nazareth, aimed at showing that concern for the poor has always been central
    to the faith. Which is fine, but eventually the Pope gets concrete about the twenty-first century, and is convincing whether or
    not you believe in any gods.</p>
    <p>The next section is about Tech and while
    <a href="https://csrc.nist.gov/csrc/media/Presentations/2023/radical-cs/images-media/sess-1-rogaway-bcm-workshop-2023.pdf">Radical 
    CS</a> is a presentation from “The Third NIST Workshop on Block Cipher Modes of Operation” it’s about politics, oh yes it is. We
    very much need more of this kind of thing.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/Radical-CS.png" alt="Suggestions for a radical CS" />
    <h2 id='p-6'>Tech</h2>
    <p>A <a href="https://infosec.exchange/@david_chisnall/115270162462304611">post from David Chisnall on Mastodon</a> contains this
    gem: “Machine learning is <em>amazing</em> if … the value of a correct answer is much higher than the cost of an incorrect
    answer.”
    Which is one of those things that’s obviously true as soon as you hear it. The whole piece is good.</p>
    <p>The churning debate around AI is full of arm-waving and relatively free of objective numerical data. So here’s Ed Zitron’s
    <a href="https://www.wheresyoured.at/costs/">This Is How Much Anthropic and Cursor Spend On Amazon Web Services</a>.
    And I ask: How do the people making these investments think they’re going to get their money back?</p>
    <p>Speaking of things are obviously true:
    <a href="https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software">TextEdit and the
    Relief of Simple Software</a>. We could do so much better than we do, and in our hearts we know why we’re not, and it’s about
    money and power, not technology.</p>
    <p>Bluesky has brought its AT Protocol to the IETF; let’s see what happens. Here are 
    <a href="https://www.ietf.org/archive/id/draft-newbold-at-architecture-00.html">Authenticated Transfer: Architecture
    Overview</a> and
    <a href="https://www.ietf.org/archive/id/draft-holmgren-at-repository-00.html">Authenticated Transfer Repository and
    Synchronization</a>. The drafts have 
    <a href="https://github.com/bluesky-social/ietf-drafts">source-code repos</a>.</p>
    <p>Finally, here’s <a href="https://spinel.coop">Spinel</a>, which is trying to build a decentralized, transparent,
    and somewhat-democratic engineering resource for the Ruby and Rails platforms. This follows on a distinctly-stinky power play where
    people with money grabbed the steering wheel. Best of luck to Spinel.</p>
    <h2 id='p-10'>Canadian health</h2>
    <p>Canada has “single-payer” public healthcare that comes with your taxes, which in my experience works well, see
    <a href="/ongoing/When/200x/2009/08/22/Alison">here</a> and
    <a href="/ongoing/When/202x/2025/07/09/Saskatchewan">here.</a></p>
    <p>This costs a lot of money, over $300B/year.
    Predictably, there are business types panting with eagerness to get their hands on some of that
    money. And they can; a lot of medical practices and clinics and labs are owned by private companies, apparently doing well while
    being restricted to billing the government for the standard fees. But what they <em>really</em> want is a two-tier system where
    they can directly charge rich people more for better care. It seems like every year someone thinks up a clever dodge to nibble
    away at the system. Fortunately, these people have, so far, ended up losing in the courts.</p>
    <p>Here’s a news story: 
    <a href="https://macleans.ca/society/health/ai-could-save-canadas-health-care-system/">AI Could Save Canada’s Health-Care
    System</a>. It’s actually pretty coherent and I found it plausible that this technology could maybe 
    improve, for example, the agonizingly slow emergency-room experience.</p>
    <p>But then I got curious as to the business angle and tracked the source of the story down to a business called called
    <a href="https://www.getmaple.ca">maple</a>. Sure enough, 
    <a href="https://helpdesk.getmaple.ca/en/articles/5375023-fees-to-see-a-general-practitioner-on-maple">here they are</a> trying to
    siphon off direct payments for access to doctors. I predict they’ll end up in court, and lose.</p>
    <p>And then there’s the government of Alberta, run by hard-right dipshits who hate most aspects of being Canadian and loathe the
    proposition that government can provide good and efficient services. Thus:
    <a href="https://www.cbc.ca/news/canada/calgary/alberta-paul-parks-mri-diagnostics-adriana-lagrange-9.6952189">Alberta
    government plans to allow residents to privately pay for any diagnostic or screening service</a>. Feaugh. I hope this one ends
    up in court too.</p>
    <h2 id='p-12'>Paying for Open Source</h2>
    <p>It is coming to the world’s attention that most of our tech infrastructure is radically dependent on
    open-source software maintenaned by a
    cadre of developers who are old, tired, and not getting paid for their work. I have direct experience with trying unsuccessfully
    to convince Big-Tech business leaders to invest in Open-Source maintenance and infrastructure. Here’s some of the coverage:</p>
    <ul>
      <li><p>In <cite>The Register</cite>:
      <a href="https://www.theregister.com/2024/09/18/open_source_maintainers_underpaid/">Open source maintainers underpaid,
      swamped by security, going gray</a>.</p></li>
      <li><p>Open Source Security Foundation:
      <a href="https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/">Open
      Infrastructure is Not Free: A Joint Statement on Sustainable Stewardship</a>.</p></li>
      <li><p>Nils Adermann:
      <a href="https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/">A Call for Sustainable Open Source
      Infrastructure</a>.</p></li>
      <li><p>Hackernoon: <a href="https://hackernoon.com/how-can-governments-pay-open-source-maintainers">How Can Governments Pay Open Source
      Maintainers?</a></p></li>
      <li><p>The New Stack: 
      <a href="https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/">FFmpeg to Google: Fund Us or Stop Sending
      Bugs</a>.</p></li>
    </ul>
    <p>Things obviously can’t go on as they are. The best path forward isn’t obvious to me, but we need to start finding it.</p>
    <h2 id='p-11'>Economics and life</h2>
    <p>Paul Krugman and Martin Wolf, two really smart guys who aren’t technologists,
    <a href="https://paulkrugman.substack.com/p/talking-ai-with-martin-wolf">talk about the impact of AI</a>. Technofeudalism is
    considered carefully.
    My favorite out-take
    is from Krugman: “[I] have come to the conclusion that anything that I want to believe about the prospects of AI and its
    economic effects, all I need to do is do a little searching, and I can find some expert who will tell me whatever it is I want to
    believe.” Even with that well-justified cynicism, there is deep stuff here.</p>
    <p>I read Matt Levine’s newsletter almost every day; not only does it teach you things about how money makes the world go round,
    it entertains; his glee at some particularly juicy financial swindle or clever arbitrage maneuver will bring a smile to your
    face.
    In <a href="https://newsletterhunt.com/emails/201930">Money Stuff: Quantum Bond Trading</a> he addresses a deeper question: Does
    the Finance business actually benefit society? Obviously a subject worthy of attention, and he makes it amusing.</p>
    <h2 id='p-8'>Wonderful things</h2>
    <p> The dude who wrote <a href="https://www.bikewanderer.com/on-the-road//packrafting-the-darien-gap">Paddling the Darien</a>
    is clearly crazy, I guess it’d be more polite to say “insanely brave”. Anyhow, I think there are very few people who won’t be
    astonished at these pictures and stories</p>
    <p>I’m not at all sure what <a href="https://jonathanhoefler.com/inventions">A. Inventions</a>, by Jonathan Hoefler,
    is, actually.  The link that I followed said that GenAI image generators were involved. I don’t care.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/16/calendars.png" alt="Alignment Calendars 1584–1811" />
    <div class='caption'><p>Alignment Calendars 1584–1811,<br/>from Jonathan Hoefler’s <cite>Inventions</cite>.</p></div>
    <p>Let’s end with music.  Here are two absolutely exquisite song performances, courtesy of YouTube. First,
    <a href="https://www.youtube.com/watch?v=1qahZ-whM6o">Old Enough</a> by the Raconteurs, Ricky Skaggs, and Ashley Monroe. The
    interplay of voices and strings is magical.  Then Billy Strings wiith his band and string players, doing
    <a href="https://www.youtube.com/watch?v=ZCtQdALo9DI">Gild the Lily</a>.  Just a lovely performance of a fine new song.</p>
    <p>That’s all, folks, see you next time.</p>
</div></content></entry>

<entry>
 <title>Kendzior Case-Study</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study' />
 <link rel='replies'        thr:count='3'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/11/13/Kendzior-Case-Study#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study</id>
 <published>2025-11-13T12:00:00-08:00</published>
 <updated>2025-11-14T10:55:57-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Social Media' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Social Media' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>There was recently a flurry of attention and dismay over     <a href='https://en.wikipedia.org/wiki/Sarah_Kendzior'>Sarah Kendzior</a> having been suspended from Bluesky by its     moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In     particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>There was recently a flurry of attention and dismay over
    <a href="https://en.wikipedia.org/wiki/Sarah_Kendzior">Sarah Kendzior</a> having been suspended from Bluesky by its
    moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In
    particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there.</p>
    <h2 id='p-1'>Disclosures</h2>
    <p>I’m a fan of Ms Kendzior, for example check out her recent
    <a href="https://sarahkendzior.substack.com/p/when-i-loved-new-York">When I Loved New York</a>; fine writing and incisive
    politics. I like the Bluesky experience and have warm feelings toward the team there, although my
    <a href="https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate">long-term social media bet is on Mastodon</a>.</p>
    <h2 id='p-2'>Back story</h2>
    <p>Back in early October, the <cite>Wall Street Journal</cite> published
    <a href="https://www.wsj.com/arts-culture/music/can-we-finally-give-johnny-cash-his-due-58ab24c2">It’s Finally Time to Give
    Johnny Cash His Due</a>, an appreciation for Johnny’s music that I totally agreed with. In particular I liked its praise for
    <a href="https://en.wikipedia.org/wiki/American_IV:_The_Man_Comes_Around">American IV: The Man Comes Around</a> which, recorded while
    he was more or less on his deathbed, is a masterpiece. It also said that, relative to other rockers, Johnny “can seem deeply
    uncool”.</p>
    <p>Ms Kendzior, who is apparently also a Cash fan and furthermore thinks he’s cool, posted to Bluesky “I want to shoot
    the author of this article just to watch him die.”  Which is pretty funny, because one of Johnny’s most famous lyrics, from
    <a href="https://en.wikipedia.org/wiki/Folsom_Prison_Blues">Folsom
    Prison Blues</a>, was “I shot a man in Reno just to watch him die.” (Just so you know: In 1968 Johnny performed the song at a
    benefit concert for the prisoners at Folsom, and on the live record (which is good), there is a burst of applause from the
    audience after the “shot a man” lyric. It was apparently added in postproduction.)</p>
    <p>Subsequently, per the 
    <a href="https://bsky.app/profile/safety.bsky.app/post/3m5hcx4n2hc2z">Bluesky Safety</a> account ”The account owner of
    @sarahkendzior.bsky.social  was suspended for 72 hours for expressing a desire to shoot the author of an article.”</p>
    <p>There was an outburst of fury on Bluesky about the sudden vanishing of Ms Kendzior’s account, and the explanation
    quoted above didn’t seem to reduce the heat much.  Since I know nothing about the mechanisms used by Bluesky Safety, I’m
    not going to dive any deeper into the Bluesky story.</p>
    <h2 id='p-3'>On Mastodon</h2>
    <p>I do know quite a bit about Mastodon’s trust-and-safety mechanisms, having been a moderator on
    <a href="https://cosocial.ca">CoSocial.ca</a> for a couple of years now.  So I’m going to walk through how the same story might
    have unfolded on Mastodon, assuming Ms Kendzior had made the same post about the <cite>WSJ</cite> article. There are a bunch of
    forks in this story’s path, where it might have gone one way or another depending on the humans involved.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/report-menu.png" alt="Mastodon “Report” menu" class="inline" />
    <h2 id='p-4'>Reporting</h2>
    <p>The Mastodon process is very much human-driven. Anyone who saw Ms Kendzior’s post could pull up the per-post menu and hit the
    “Report” button. I’ve put a sample of what that looks like on the right, assuming someone wanted to report yours truly.</p>
    <p>By the way, there are many independent Mastodon clients; some of them have “Report” screens that are way cooler than this. I
    use
    <a href="https://phanpy.social">Phanpy</a>, which has a hilarious little animation with an animated rubber stamp that
    leaves a red-ink “Spam” or whatever on the post you’re reporting.</p>
    <p>We’ll get into what happens with reports, but here’s the first fork in the road: Would the Kendzior post have been reported?
    I think there are three categories of people that are interesting. First, Kendzior fans who are hip to Johnny Cash, get the
    reference, snicker, and move on.  Second, followers who think “ouch, that could be misinterpreted”; they might throw a
    comment onto the post or just maybe report it. Third, Reply Guys who’ll jump at  any chance to take a vocal woman down; they’d
    gleefully report her en masse. There’s no way to predict what would have happened, but it wouldn’t be surprising if there were
    both categories of report, or either, or none.</p>
    <h2 id='p-5'>Moderating</h2>
    <p>When you file a report, it goes both to the moderators of your instance and the of instance where it was posted (who oversee the poster’s account).
    I dug up a 2024 report someone filed against me to give a feeling for what
    the moderator experience is like.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/timbray-report.png" alt="Report filed against Tim Bray for “antisemitism”" />
    <p>I think it’s reasonably self-explanatory. Note that the account that filed the report is not identified, but that the server
    it came from is.</p>
    <p>A lot of reports are just handled quickly by a single moderator and don’t take much thought: Bitcoin scammer or Bill Gates
    impersonator or someone with a swastika in their profile? Serious report, treated seriously.</p>
    <p>Others require some work. In the moderation screen, just below the part on display above, there’s space for moderators to
    discuss what to do.  (In this particular case they decided that criticism of political leadership wasn’t “antisemitism” and
    resolved the report with no action.)</p>
    <p>In the Kendzior case, what might the moderators have done? The answer, as usual, is “it depends”. If there were just one or
    two reports and they leaned on terminology like “bitch” and “woke”, quite possibly they would have been dismissed.</p>
    <p>If one or more reports were heartfelt expressions of revulsion or trauma at what seemed to be a hideous death threat, the
    moderators might well have decided to take action. Similarly if the reports were from people who’d got the reference and
    snickered but then decided that there really should have been a “just kidding” addendum.</p>
    <h2 id='p-6'>Action</h2>
    <p>Here are the actions a moderator can take.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions.png" alt="Mastodon moderation action options" />
    <p>If you select “Custom”, you get this:</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/13/actions-2.png" alt="More Mastodon moderation action optiosn" />
    <p>Once again, I think these are self-explanatory. Before taking up the question of what might happen in the Kendzior case, I
    should grant that moderators are just people, and sometimes they’re the wrong people. There have been servers with a reputation
    for draconian moderation on posts that are even moderately controversial. They typically haven’t 
    done very well in terms of attracting and retaining members.</p>
    <p>OK, what might happen in the Kendzior case? I’m pretty sure there are servers out there where the post would just have been
    deleted. But my bet is on that “Send a warning” option. Where the warning might go something like “That
    post of yours really shook up some people who didn’t get the Folsom Prison Blues reference and you should really
    update it somehow to make it clear you’re not serious.”</p>
    <p>Typically, people who get that kind of moderation message take it seriously. If not, the moderator can just delete the post.
    And if the person makes it clear they’re not going to co-operate, that creates a serious risk that if you let them go on shaking
    people up, your server could get mass-defederated, which is the death penalty. So (after some discussion) they’d delete the
    account. Everyone has the right to free speech, but nobody has a right to an audience courtesy of our server.</p>
    <h2 id='p-7'>Bottom line</h2>
    <p>It is very, very unlikely that in the Mastodon universe, Sarah Kendzior’s account would suddenly have globally vanished. It
    is quite likely that the shot-a-man post would have been edited appropriately, and possible that it would have just
    vanished.</p>
    <h2 id='p-8'>Will it scale?</h2>
    <p>I think the possible outcomes I suggested above are, well, OK.  I think the process I’ve described is also OK. The
    question arises as to whether this will hold together as the Fediverse grows by orders of magnitude.</p>
    <p>I think so?  People are working hard on moderation tools. I think this could be an area where AI would help, by
    highlighting possible problems for moderators in the same way that it highlights spots-to-look-at today for radiologists. We’ll
    see.</p>
    <p>There are also a couple of background realities that we should be paying more attention to.  First, bad actors tend to
    cluster on bad servers, simply because non-bad servers take moderation seriously. The defederation scalpel needs to be kept
    sharp and kept nearby.</p>
    <p>Secondly, I’m pretty convinced that the current open-enrollment policy adopted by many servers, where anyone can have an
    account just by asking for it, will eventually have to be phased out.  Even a tiny barrier to
    entry<span class='dashes'> —</span> a few words on why you want to join or, even better, a small
    payment<span class='dashes'> —</span> is going to reduce the frequency of troublemakers to an amazing degree.</p>
    <h2 id='p-9'>Take-aways</h2>
    <p>Well, now you know how moderation works in the Fediverse.  You’ll have to make up your own mind about whether you like it.</p>
</div></content></entry>

<entry>
 <title>Bye, Google Search</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind' />
 <link rel='replies'        thr:count='4'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind</id>
 <published>2025-11-01T12:00:00-07:00</published>
 <updated>2025-11-03T21:29:26-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Search' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Search' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Publishing' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Publishing' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online/De-Google' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='De-Google' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog     fragments using Google. No longer; I wired in     <a href='https://pagefind.app'>Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,     I’ll wait before getting into the details</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog
    fragments using Google. No longer; I wired in
    <a href="https://pagefind.app">Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,
    I’ll wait before getting into the details.</p>
    <h2 id='p-1'>The problem</h2>
    <p>Well, I mean, Google is <em>definitely</em> Part Of The Problem in advertising, surveillance, and Internet
    search. But the problem I’m talking about is that it just couldn’t find my pages, even 
    when I knew they were here and knew words that should find them.</p>
    <p>Either it dropped the entries from the index or dropped a bunch of search terms.
    Don’t know and don’t care now.  <span class='o'>ongoing</span> is my outboard memory
    and I search it <em>all the freaking time</em>. This failure mode was making me crazy.</p>
    <h2 id='p-2'>Pagefind</h2>
    <p>Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a
    waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user
    interface.</p>
    <h2 id='p-3'>How it works</h2>
    <p>They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one
    composed of static files. And it is, but there’s more to it than that; read on.</p>
    <p>First, you point a Node program at the root of your static-files tree and stand back. My tree has a bit over 5,000 files
    containing about 2½ million words, adding up to a bit over 20M of text. By default, it assumes you’re indexing HTML and includes
    all the text inside each page’s <code>&lt;body></code> element.</p>
    <p>You have to provide a <code>glob</code> argument to match the files you want to index; in most cases, something like
    <code>root/**/*.html</code> would do the trick. Working this out was for me the hardest part because among other things my
    articles don’t end with <code>.html</code>; maybe it’ll be helpful for some to
    note that what worked for <span class='o'>ongoing</span>
    was:<br/><code>When/???x/????/??/??/[a-zA-Z0-9]&lt;[\-_a-zA-Z0-9]:></code></p> 
    <p>This produced an index organized into about 11K files adding up to about 78M.  It includes a directory with one file per
    HTML page being searched.</p>
    <p>I’d assumed I’d have to wire this up to my Web server somehow, but no: It’s all done in the client by fetching little bits
    and pieces of the index using ordinary HTTP GETs.
    For example, I ran a search for the word “minimal”, which resulted in my browser fetching a total of seven files totaling
    about 140K. That’s what they mean by “static”; not just the data, but the index too.</p>
    <p>Finally, I noticed a couple of WASM files, so I had to check out
    <a href="https://github.com/Pagefind/pagefind">the source code</a> and, sure enough, this is basically a Rust app. Again I’m
    impressed.  I hope that slick modern Rust/WASM code isn’t offended by me rubbing it up against this blog’s messy old
    Perl/Ruby/raw-JS/XML tangle.</p> 
    <h2 id='p-9'>Scalable?</h2>
    <p>Interesting question. For the purposes of this blog, Pagefind is ideal. But, indexing my 2½ million words burned a solid
    minute of CPU on the feeble VPS that hosts <span class='o'>ongoing</span>. I wonder if the elapsed time is linear in the data
    size, but it wouldn’t surprise me if it were worse. Furthermore, the index occupies more storage than the underlying data, which
    might be a problem for some.</p>
    <p>Also, what happens when I do a search while the indexing is in progress?  Just
    to be sure, I think I’ll wire it up to build the index in a new directory and switch indices as atomically as possible.</p>
    <p>Finally, I think that if you wanted to sustain a lot of searches per second, you’d really want to get behind a CDN, which would
    make all that static index fetching really fly.</p>
    <h2 id='p-4'>Configuring</h2>
    <p>The default look-and-feel was mostly OK by me, but the changes I had to make did involve quality time with the inspector,
    figuring out the class and ID complexities and then iterating the CSS.</p>
    <p>The one thing that in the rear-view seems unnecessary is that I had to add a <code>data-pagefind-meta</code> attribute to the
    element at the very bottom of the page where the date is to include it in the result list. There should be a way
    to do this without custom markup. John Siracusa filed a
    <a href="https://github.com/Pagefind/pagefind/issues/974">related bug</a>.</p>
    <h2 id='p-8'>Deployment</h2>
    <p>There’s hardly any work. I’ll re-run the indexer every day with a crontab entry and it looks it should just take care of
    itself.</p>
    <h2 id='p-5'>To do?</h2>
    <p>Well, I could beautify the output some more but I’m pretty happy with it after just a little work. I can customize the sort
    order, which I gather is in descending order of how significant Pagefind thinks the match is. There’s a temptation to sort it in
    reverse date order. Actually, apparently I can also influence the significance algorithm.  Anyhow I’ll run with mostly-defaults
    for now.</p>
    <h2 id='p-6'>Search options</h2>
    <p>I notice that the software is pretty good at, and aggressive about, matching across verb forms and singular/plural and
    prefixes. Which I guess is what you want?  You can apparently defeat that by enclosing a word in quotes if you want it matched
    exactly. Works for phrases too. I wonder what other goodies are in there; couldn’t find any docs on that subject.</p>
    <p>Finally, there’s an excellent feature set I’ll never use; it’s smart about lots of languages. But alas, I write
    monolingually.</p>
    <h2 id='p-10'>Shameful cleanup</h2>
    <p>Like I said, getting Pagefind installed and working was easy. Getting the CSS tuned up was a bit more effort. But I have to
    confess that I put hours and hours into hiding my dirty secrets.</p>
    <p>You see, <span class='o'>ongoing</span> contains way more
    writing than you or Google can see. It’s set up so I can “semi-publish” pieces; there but unlinked.  There was a whole lot of
    this kind of stuff: Photo albums from social events, pitches to employers about why they should hire various people
    including me, rants at
    employers for example about why Solaris should adopt the Linux userland (I was right) and why Android should include a Python
    SDK (I was right), and pieces that employer PR groups convinced me to bury. One of my minor regrets about no longer being
    employed is I no longer get to exercise my mad PR-group-wrangling skillz.</p>
    <p>But when your search software is just walking the file tree, it doesn’t know what’s “published” and what’s not.  I ended up
    using my rusty shell muscles with <code>xarg</code> and <code>sed</code> and <code>awk</code> and even an <code>ed(1)</code>
    script. I think I got it all, but who knows, search hard enough and you might find something embarrassing. If you do, I’d sure
    appreciate an email.</p>
    <h2 id='p-7'>Thanks!</h2>
    <p>To the folks who built this. Seems like a good thing.</p>
</div></content></entry>

<entry>
 <title>Time to Migrate</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate' />
 <link rel='replies'        thr:count='6'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/11/03/Time-to-Migrate#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate</id>
 <published>2025-11-03T12:00:00-08:00</published>
 <updated>2025-11-03T12:00:00-08:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Business/Publishing' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Business' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Publishing' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean     any combination of “less useful”, “less safe”, or “less fun”.     This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to     go. Come join me.  Here’s why</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean
    any combination of “less useful”, “less safe”, or “less fun”.
    This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to
    go. Come join me.  Here’s why.</p>
    <h2 id='p-2'>Defining terms</h2>
    <p>In this post, by “Social media” I mean 
    “what Twitter used to be, back when it was good”. We should expect our social-media future to be <em>at least</em>
    as useful, safe, and fun as that baseline. (But we can do better!)</p>
    <p>By “Mastodon” I mean the many servers, mostly running the
    <a href="https://github.com/mastodon/mastodon">Mastodon software</a>, that
    communicate using the
    <a href="https://en.wikipedia.org/wiki/ActivityPub">ActivityPub protocol</a>. Now I’ll try to convince you to start using one of
    them.</p> 
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/join-mastodon.png" alt="join-mastodon.org" />
    <div class='caption'><p>Start at
    <a href="https://joinmastodon.org">joinmastodon.org</a></p></div>
    <h2 id='p-4'>The simplest argument</h2> 
    <p>Have you noticed that social-media products, in the long term, can’t seem to manage to stay fun and safe and useful? 
    I have.  But there’s one huge exception, a tool that’s been serving billions of us for
    decades, and works about as well as it ever did.  I’m talking about email.</p>
    <p>Why does email stay reasonably healthy? Because nobody owns it. Anyone on any server can communicate with anyone else on any
    other and it Just Works. Nobody can buy it and make it a vehicle for their politics. Nobody can crank up the ad density or
    make things worse to improve their profit margin.</p> 
    <p>Mastodon’s like email that way. Plus it does all the Post and Repost and Quote and Follow and Reply and Like and Block stuff that you’re
    used to, and there are thousands of servers and anyone can run one and nobody can own the whole thing.  It doesn’t have ads and it
    won’t. It’s dead easy to use and it’s fun and you should
    <a href="https://joinmastodon.org">give it a try</a>.</p>
    <p>The rest of this essay goes into detail about why Mastodon is generally great and specifically better than the
    alternatives. But if that simple pitch sounded good, stop here,
    <a href="https://joinmastodon.org/">go get an account</a> and climb on board.</p>
    <!--
    <p>But first…</p>
    <h2 id='p-5'>Is social media worth saving?</h2>
    <p>I regularly read that it’s pernicious and evil, damaging the mental health of young people,
    and should be stamped out or foregone. I disagree. I think the problem is late-stage capitalism; every company that
    offers a social-media product is under relentless financial pressure to yield steadily-growing profits, going on forever.</p>
    <p>Since
    there’s a global limit to the number of customers that any service can attract, that means they have to suck more out of each
    user. Where by “suck more out of” I mean what social-media professionals call “increase engagement”.</p>
    <p>So, engagement is increased at literally any cost, notably including the
    <a href="https://erinkissane.com/meta-in-myanmar-part-i-the-setup">slaughter of the Rohingya</a>.</p>
    <p>I for one do <em>not</em> agree that there’s anything essentially pernicious about having networked online
    conversations. Once again, I appeal to email, which generally doesn’t exhibit the usual social-media pathologies.</p>
    <p>I’d even appeal to Twitter-that-was, when authoritative voices were
    talking about any subject from every angle, and when you could find out if you’d just felt an earthquake and be horrified or overjoyed
    about Maple Leafs playoff collapse. It was fun and useful and educational.</p>
    <p>So, Social Media? Yes. Centralized corporate social media? No.</p> 
    <p>Now, here are a bunch of great things about Mastodon, if that pitch above didn’t quite convince you to switch now.</p> -->
    <h2 id='p-18'>Why now?</h2>
    <p>Two things motivated me to post this piece now. First, this month is  my three-year anniversary of
    <a href="/ongoing/When/202x/2022/11/26/Bye-Twitter">bailing out on Twitter</a> in favor of Mastodon.</p>
    <p>Second is the release of Mastodon 4.5, which I think closes the last few important-missing-feature gaps.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/masto4-5.png" alt="Mastodon v4.5 announcement" />
    <p>The software is improving rapidly, particularly in the last couple of releases. It’s got cool features you won’t find
    elsewhere, and there’s very little cool stuff from elsewhere that’s not here.  There was a time when newly-arrived people had
    confusing or unfriendly experiences, or missed features that were important to them.
    It looks to me like those days are over.</p> 
    <h2 id='p-6'>Migration</h2>
    <p>Mastodon is many thousands of servers, and you can join the biggest,
    <a href="https://mastodon.social/explore">mastodon.social</a>, or
    <a href="https://joinmastodon.org/servers">shop around for another</a>. But here’s the magic thing: If you end up disliking the
    server you’re on, or find a better one, you can migrate and <em>take your followers with you</em>! You can’t ever get locked
    in.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/serveres.png" alt="Choosing a Mastodon server" />
    <div class='caption'><p>The server-selection menu has lots of options.</p></div>
    <p>This is probably Mastodon’s most important feature. It’s why no billionaire can buy it and no corporation can enshittify it.  As
    far as I know, Mastodon is the first widely-adopted social software ever to offer this.</p> 
    <h2 id='p-7'>Interaction</h2>
    <p>You hear it over and over: “I had &lt;a big number> of followers on Twitter and now I have &lt;a less-big number> on
    Mastodon, but I get so much more conversation and interaction when I post here.”</p>
    <p>One of the people you’ll hear that from is me.
    My follower count is less than half the 45K I had on Twitter-that-was, but I get immensely more intelligent, friendly
    interaction than I ever got there.  (And then sometimes I get told firmly that I’m wrong about this or that, but hey.)  It’s
    the best social-media experience I’ve ever had.</p>
    <p>Dunno about you, but conversation and interaction
    seem like a big deal to me.  One reason things are lively is…</p>
    <h2 id='p-8'>Sex</h2>
    <p>Here’s an axiom: An ad-supported service can’t have sex-positive or explicit content. Advertisers simply won’t tolerate
    having their message appear beside NSFW images or Gay-Leatherman tales or exuberant trans-positivity. Mastodon
    can.</p>
    <p>Of course, you gotta be reasonable, posting anything actually illegal will get your ass perma-blocked and your account
    suspended. So will posting anything that’s NSFW etc without a “Content Warning”. That’s a built-in feature of Mastodon which
    puts a little warning (“#NSFW” and “#Lewd” are popular) above your post, which is tastefully blurred-out until whoever’s
    looking at it clicks on “Show content”.
    I use these all the time when 
    I post about #baseball or #fútbol because a lot of the geeks and greens who follow me are pointedly uninterested in sports.</p>
    <p>(Oh, typing that in reminds me that you can subscribe to hashtags on Mastodon: Let’s see, I currently subscribe to, among
    others,
    <a href="https://mastodon.social/search?q=%23Vancouver">#Vancouver</a>,
    <a href="https://mastodon.social/search?q=%23Murderbot">#Murderbot</a>, and
    <a href="https://mastodon.social/search?q=%23Fujifilm">#Fujifilm</a>.)</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/ivory.png" alt="The Ivory For Mastodon app for Apple platforms" />
    <div class='caption'><p>The “Ivory for Mastodon” app for Apple platforms,<br/>one of the many fine alternative clients.</p></div>
    <h2 id='p-9'>Moderation and defederation</h2>
    <p>Did I just mention, two paragraphs up, getting blocked? Mastodon isn’t free of griefers, but the tools to fight them are good
    and getting better.</p>
    <p>The good news is that each server moderates its own members. So there’s some variation
    of the standards from server to server, but less than you’d think. Since there are thousands of servers, there are
    thousands of moderators, which is a lot.</p>
    <p>If you act in a way that others find offensive, you’ll probably get blocked by the offended people and also reported; the
    report can come from any server and it’ll go to the moderators on yours. On a well-run server, those mods will have a look and
    if you’ve actually been bad, your post might get yanked and you might get warned, or in an extreme case, booted off.</p>
    <p>(I’ve been reported for saying unkind things about Bibi Netanyahu and for posting too many photos of my
    cats (no, really) but that kind of thing is cheerfully ignored by good moderation teams.)</p>
    <p>Then there’s Mastodon’s nuclear weapon: Defederation.
    Suppose you’re prone to nasty bigotry in public and you get reported a lot and your server’s moderators <em>don’t</em> rein
    you in. Eventually, word will get around, and if things aren’t cleaned up, most servers will defederate yours, so that
    <em>nobody</em> on their server can see posts from anyone on yours. Your site is no longer part of the “Fediverse”; this is a powerful
    incentive for server owners to take moderation seriously.</p>
    <p>The effect of all this is that the haters and scammers and Nazis who show up get shuffled off-stage PDQ. Well,
    almost always; a couple of years ago a wave of incoming Black people had bad experiences with racist abuse. Ouch. But
    the good news is that recent Mastodon releases have been shutting prone-to-abuse channels
    down, so things are better than then and should continue to improve.</p>
    <h2 id='p-11'>Links are good</h2>
    <p>Corporate social-media services like to
    <a href="https://talkingpointsmemo.com/tpm-25/how-elon-musks-changes-to-x-made-our-discourse-far-stupider">downrank posts with
    links</a>.
    Which makes me want
    to scream, because my favorite thing to post is a link+reaction to something cool, and my favorite posts to read are too.</p>
    <p>On Mastodon, when you have a link in a post, the software automatically fetches a preview of whatever you linked to and uses
    it to decorate your link.
    I mean, it’s the damn Internet, it only got interesting to non-geeks when we figured out how to turn millions of servers
    into a great big honking searchable hypertext.</p>
    <h2 id='p-12'>Search</h2>
    <p>Speaking of which, Mastodon search is pretty good these days. It’s become, just like this blog, part of my outboard
    memory, and I’m always typing things like “telephoto from:me has:media” into the search box. Fast enough, too.</p>
    <h2 id='p-13'>Great clients</h2>
    <p>Another good thing about Mastodon is that there are lots of
    clients to choose from, mostly open-source. The best ones are miles ahead of Xitter and Threads and
    Bluesky and, really, anything.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/Screenshot_20251110-104045.png" alt="A post from Brian Krebs in the Tusky app" />
    <div class='caption'><p>Anniversary post in the Android “Tusky” app.</p></div>
    <p>There are official Web and mobile clients from the Mastodon team and they’re fine, especially for admin and moderation work.
    But iOS people should check out
    <a href="https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/">Ivory</a>, Androiders should look at
    <a href="https://tusky.app">Tusky</a>, and everyone should try
    <a href="https://phanpy.social">Phanpy</a>. I live in Phanpy on both my Mac and my Pixel<span class='dashes'> —</span> it’s a
    Web thing but installable as a PWA on both Android and iOS.</p>
    <p>Commercial products, especially social-media services, have <em>never</em> been at peace with third-party clients.
    Twitter used to be, but then it stabbed those developers in the back. It’s easy to
    understand why; every product manager has it drilled into them that they <em>must control the user experience</em>. This ignores
    the ancient wisdom (I first heard it from
    <a href="https://en.wikipedia.org/wiki/Bill_Joy">Bill Joy</a>) “Wherever you work, most of the smart people are somewhere else.”</p>
    <p>Mastodon doesn’t have that kind of product manager, but it does have a
    <a href="https://docs.joinmastodon.org/api/">fully-capable API</a>, developed in the open and with no
    hidden or restricted features. Which means you’re going to get better clients.</p>
    <h2 id='p-14'>Algorithms</h2>
    <p>The algorithms that commercial social-media services use to sort your feed have one goal only: Maximize engagement and thus
    revenue. They have no concern for quality or novelty, and have been widely condemned by people who think about this stuff. So
    much so that there’s a feeling that Algorithms Are Bad.</p>
    <p>Mastodon has an algorithm: Show the posts from the accounts you follow, latest first. It works pretty
    well. It also has “Trending” feeds of the most popular posts, hashtags, and links.  I hit those once a
    day or so to get a feeling for what’s going on in the world.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/11/03/trending.png" alt="Trending screen in PhanPy" />
    <div class='caption'><p>The “Trending” display in Phanpy.</p></div>
    <p>I do think there’s room for improvement here; Bluesky has shown off the idea of pluggable feed-ranking algorithms, with many to
    choose from, and I like it. No reason in principle we couldn’t have the same thing on Mastodon.</p>
    <h2 id='p-15'>Money</h2>
    <p>Every other social network has started with a big pot of money, whether from venture-capital investors (Twitter, Instagram) or
    from a Big Tech corporate parent (Google+, Threads).  The people who provided that money want it back, plus a whole lot more.
    Thus, the manic drive for “engagement” and growth at all costs. They need to build huge data centers and employ an elite
    operations team plus an even more elite marketing group.</p>
    <p>Mastodon, eh… a gaggle of nonprofits and co-ops and unincorporated affinity groups, financed by Patreon or low annual dues
    or Some Random Geek who enjoys running a server.</p>
    <p>Since nobody owns it, nobody can extract a profit from it. Which means that from the big-money point of view, it’s entirely
    non-investable. The goal isn’t for anybody to make money, it’s to be instructive and intense and fun. It’s run on the cheap.
    You know what they call systems that are cheap and diversified? Resilient. Sustainable. Long-lived.</p>
    <p>Last year
    <a href="https://www.tbray.org/ongoing/When/202x/2024/11/15/Not-Bluesky">I wrote</a>: 
    “Think of the Fediverse not as just one organism, but a population of mammals, scurrying around the ankles of the bigger and
    richer alternatives. And when those alternatives enshittify or fall to earth, the Fediversians will still be there.” After
    “scurrying” I should have added “and evolving”.</p>
    <h2 id='p-19'>What about Bluesky?</h2>
    <p>I like the Bluesky people and their software, but I worry a lot about whether they’re really decentralized in practice, and
    even more about their financial future. I wrote up the details in
    <a href="/ongoing/When/202x/2024/11/15/Not-Bluesky">Why Not Bluesky</a>.</p>
    <h2 id='p-16'>Mastodon’s the only option</h2>
    <p>The only social-media option, I mean, that’s decentralized, not owned or controlled by anyone, and working well today as you
    read this. It’s intense and interactive and fun. Why settle for less?</p>
    <p><i>(Disclosure: I have no formal connections with the Mastodon organization, aside from being a low-level supporter on
    Patreon.)</i></p>
</div></content></entry>

<entry>
 <title>Grokipedia</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia' />
 <link rel='replies'        thr:count='2'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/10/28/Grokipedia#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia</id>
 <published>2025-10-28T12:00:00-07:00</published>
 <updated>2025-10-29T21:09:53-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Publishing/Reference' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Publishing' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Reference' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I     succumbed to boredom and killed the tab. Thus my introduction to     <a href='https://en.wikipedia.org/wiki/Grokipedia'>Grokipedia</a>. Here are early impressions</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I
    succumbed to boredom and killed the tab. Thus my introduction to
    <a href="https://en.wikipedia.org/wiki/Grokipedia">Grokipedia</a>. Here are early impressions.</p>
    <h2 id='p-1'>On Bray</h2>
    <p>My Grokipedia entry has over seven thousand words, compared to a mere 1,300 in
    <a href="https://en.wikipedia.org/wiki/Tim_Bray">my Wikipedia article</a>. It’s pretty clear how it was generated; an LLM, trained
    on who-knows-what but definitely including that Wikipedia article and this blog, was told to go nuts.</p>
    <p>Speaking as a leading but highly biased expert on the subject of T. Bray, here are the key take-aways:</p>
    <h2 id='p-2'>(Overly) complete</h2>
    <p>It covers all the territory; there is no phase of my life’s activity that could possibly be encountered in combing the Web
    that is not exhaustively covered. In theory this should be good but in fact, who cares about the details of what I worked on
    at Sun Microsystems between 2004 and 2010? I suppose I should but, like I said, I couldn’t force myself to plod all the way
    through it.</p>
    <h2 id='p-3'>Wrong</h2>
    <p>Every paragraph contains significant errors. Sometimes the text is explicitly self-contradictory on the face of it,
    sometimes the mistakes are subtle enough that only I would spot them.</p>
    <h2 id='p-4'>Style</h2>
    <p>The writing has that LLM view-from-nowhere flat-affect semi-academic flavor. I don’t like it but the evidence suggests that
    some people do?</p>
    <h2 id='p-5'>References</h2>
    <p>All the references are just URLs and at least some of them entirely fail to support the text. Here’s an example. In
    discussion of my expert-witness work for the FTC in their litigation against Meta concerning its acquisitions of Instagram and
    WhatsApp, Grokipedia says:</p>
    <blockquote><p>[Bray] opined that users' perceptions of response times in online services critically influence market
    dynamics.</p></blockquote>
    <p>It cites
    <a href="https://www.ftc.gov/system/files/ftc_gov/pdf/FTCReplytoMetaResponse-CounterstatementofMaterialFacts.pdf">Federal
    Trade Commission’s Reply to Meta Platforms, Inc.’s Response to Federal Trade Commission’s Counterstatement of Material
    Facts</a> (warning: 2,857-page PDF). Okay, that was one of the things I argued, but the 425 pages of court documents that I
    filed, and the references to my reporting in the monster document, make it clear that it was one tiny subset of the main
    argument.</p>
    <p>Anyhow, I (so that you won’t have to) spent a solid fifteen minutes spelunking back and forth through that FTC doc, looking
    for strings like “response time” and “latency” and so on. Maybe somewhere in those pages there’s support for the claim quoted
    above, but I couldn’t find it.</p>
    <h2 id='p-6'>Useful?</h2>
    <p>Wikipedia, in my mind, has two main purposes: A quick visit to find out the basics about some city or person or plant or
    whatever, or a deep-dive to find out what we <em>really</em> know about genetic linkages to autism or Bach’s relationship with
    Frederick the Great or whatever.</p>
    <p>At the moment, Grokipedia doesn’t really serve either purpose very well. But, after all, this is release 0.1, maybe we
    should give it a chance.</p>
    <p>Or, maybe not.</p>
    <h2 id='p-7'>Woke/Anti-Woke</h2>
    <p>The whole point, one gathers, is to provide an antidote to Wikipedia’s alleged woke bias. So I dug into that. Let’s consider
    three examples of what I found.  First, from that same paragraph about the FTC opinion quoted above:</p>
    <blockquote>
      <p>While Bray and aligned progressives contend that such dominance stifles innovation by enabling predatory acquisitions and
      reduced rivalry—evidenced by fewer startup exits in concentrated sectors—counterarguments highlight that Big Tech's scale has
      fueled empirical gains, with these firms investing over $240 billion in U.S. R&amp;D in 2024 (more than a quarter of national
      totals) and driving AI, cloud, and patent surges.[<a href="https://www.tbray.org/ongoing/When/202x/2020/06/08/Anti-monopoly">128</a>]
      [<a href="https://www.intereconomics.eu/contents/year/2025/number/2/article/big-tech-and-the-us-digital-military-industrial-complex.html">131</a>] Six tech industries alone accounted for
      over one-third of 
      U.S. GDP growth from 2012–2021, comprising about 9% of the 
      economy and sustaining 9.3 million jobs amid falling consumer prices and rapid technological diffusion.
      [<a href="https://itif.org/publications/2023/05/30/six-tech-industries-accounted-for-more-than-one-third-of-gdp-growth-in-the-last-decade/">132]</a> 
      [<a href="https://jamesmadison.org/the-united-states-is-the-leader-of-the-digital-revolution-pro-tech-policies-are-key/">133</a>]
      Right-leaning economists often defend consumer welfare metrics and market self-correction, warning that forced divestitures
      risk eroding the efficiencies and investment incentives that have propelled sector productivity above 6% annual growth in key
      areas like durable manufacturing tech.
      [<a href="https://itif.org/publications/2025/09/19/five-persistent-myths-about-big-tech/">134</a>]
      [<a href="https://www.nber.org/digest/oct01/technology-and-productivity-growth?page=1&amp;perPage=50">135</a>]</p>
    </blockquote>
    <p>I’ve linked the numbered citations to the indicated URLs. Maybe visit one or two of them and see what you think? Four are
    to articles arguing, basically, that monopolies must be OK because the companies accused of it are growing really fast and
    driving the economy. They seem mostly to be from right-wing think-tanks but I guess that’s what those think-tanks are for.  One
    of them, #131, <cite>Big Tech and the US Digital-Military-Industrial Complex</cite>, I think isn’t helpful to the argument at
    all. But still, it’s broadly doing what they advertise: Pushing back against “woke” positions, in this case the position that
    monopolization is bad.</p>
    <p>I looked at a couple of other examples.  For example, this is from the header of the Greta Thunberg article:</p>
    <blockquote>
      <p>While credited with elevating youth engagement on environmental issues, Thunberg's promotion of urgent, existential climate
      threats has drawn scrutiny for diverging from nuanced empirical assessments of climate risks and adaptation capacities, as
      well as for extending her activism into broader political arenas such as anti-capitalist and geopolitical protests.[5][6]</p>
    </blockquote>
    <p>Somehow I feel no urge to click on those citation links.</p>
    <p>If Ms Thunberg is out there on the “woke” end of the spectrum, let’s flit over to the other end, namely the entry for
    J.D. Vance, on the subject of his book <cite>Hillbilly Elegy</cite>.</p>
    <blockquote>
      <p>Critics from progressive outlets, including Sarah Smarsh in her 2018 book <cite>Heartland</cite>, faulted the memoir for
      overemphasizing personal and cultural failings at the expense of structural economic policies, arguing it perpetuated
      stereotypes of rural whites as self-sabotaging.[71] These objections, often rooted in institutional analyses from academia and
      media, overlooked data on behavioral patterns like opioid dependency rates—peaking at 21.5 deaths per 100,000 in Appalachia
      around 2016—that aligned with Vance's observations of "deaths of despair" precursors.[72]</p>
    </blockquote>
    <p>I read and enjoyed <cite>Heartland</cite> but the citation is to a <cite>New Yorker</cite> article that doesn’t mention
    Smarsh. As for the second sentence… my first reaction as I trudged through its many clauses, was “life’s too short”.
    But seriously, opioid-death statistics weaken the hypothesis about structural economic issues? Don’t get it.</p>
    <h2 id='p-8'>Take-away</h2>
    <p>Wikipedia is,
    <a href="/ongoing/When/202x/2024/06/15/Wikipedia-Pain">to quote myself</a>, the encyclopedia that “anyone who’s willing to
    provide citations can edit”.
    Grokipedia is “the encyclopedia that Elon Musk’s LLM can edit, with sketchy citations and no progressive argument left
    un-attacked.”</p>
    <p>So I guess it’s Working As Intended?</p>
</div></content></entry>

<entry>
 <title>Recent Music</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/10/15/Current-Music' />
 <link rel='replies'        thr:count='2'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/10/15/Current-Music#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/10/15/Current-Music</id>
 <published>2025-10-15T12:00:00-07:00</published>
 <updated>2025-10-16T13:50:12-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Music' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Music' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>There are musical seasons where I re-listen to the old faves, the kind of stuff you can read about in my     <a href='/ongoing/What/Song%20of%20the%20Day/'>half-year of “Song of the Day” essays</a> from 2018. This autumn I find myself     listening to new music by living people.  Here’s some of it</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>There are musical seasons where I re-listen to the old faves, the kind of stuff you can read about in my
    <a href="/ongoing/What/Song%20of%20the%20Day/">half-year of “Song of the Day” essays</a> from 2018. This autumn I find myself
    listening to new music by living people.  Here’s some of it.</p>
    <p>The musical influx is directly related to my
    <a href="/ongoing/When/202x/2025/06/22/Qobuz-and-Others">adoption of Qobuz</a>, whose weekly editors’-picks are always worth a look
    and have led me to more than half of the tunes in this post.  Qobuz, like me, still believes in the album as a useful unit of
    music and thus I’ll cover a few of those.  And live-performance YouTubes of course.
    You’ll spot a pattern: A lot of this stuff is African or African-adjacent with Euro angles and jazz flavors.</p>
    <h2 id='p-2'>Ghana Downtown</h2>
    <p>The
    <a href="https://soundwayrecords.com/artists/kwashibu-area-band?lang=en_GB">Kwashibu Area Band</a>, founded in Accra, have been
    around for a few years and played in a few styles, sometimes as
    <a href="https://en.wikipedia.org/wiki/Pat_Thomas_(Ghanaian_musician)">Pat Thomas’</a> band.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Kwashibu-Love-Warrior.png" alt="Title of Love Warrior’s Anthem by Kwashibu Area Band" />
    <p>What happened was, Qobuz offered up
    their recent
    <a href="https://kwashibu.bandcamp.com/album/love-warrior-s-anthem">Love Warrior’s Anthem</a> and there isn’t a weak spot on
    it. Their record label says something about mixing
    <a href="https://en.wikipedia.org/wiki/Highlife">Highlife</a> and jazz; OK I guess. 
    Here’s
    <a href="https://www.youtube.com/@KwashibuAreaBand">their YouTube channel</a> but it doesn’t seem to have anything live from the
    Love-Warrior material. It isn’t often that I listen to an entire album end-to-end more than once.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/The-New-Eves.png" alt="The New Eves" />
    <div class='caption'><p>Posted to Flickr by p_a_h, licensed under the  Creative Commons Attribution 4.0 International license.</p></div>
    <h2 id='p-1'>Loud Rude Brits</h2>    
<p><a href="https://en.wikipedia.org/wiki/The_New_Eves">The New Eves</a> are from Brighton and Wikipedia calls them “folk punk”
    which is weird because yeah, they’re loud and rude, but a lot of 
    the instrumental sound is cello/violin/flute. Anyhow, check out 
    <a href="https://www.youtube.com/watch?v=l9Q9ge6j_O4&amp;list=RDl9Q9ge6j_O4&amp;start_radio=1">Mother</a>.
    I listened to most of their recent LP <cite>The New Eve Is Rising</cite> while driving around town and that’s really a lot of
    good and very intense music.</p>
    <h2 id='p-3'>Rwanda Sings With Strings</h2>
    <p>That’s the title of the latest from “The Good Ones”, here it is
    <a href="https://thegoodonesband.bandcamp.com/album/rwanda-sings-with-strings">on BandCamp</a>. Adrien Kazigira and Janvier
    Havugimana are described as a “folk duo”; the songs are two-voice harmonies backed with swinging acoustic guitars. This record is
    just like the title says:  They set up in a hotel room with a couple of string players and recorded these songs in a single take
    with no written music and no overdubs.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Good-Ones.png" alt="Cover of Rwanda Sings With Strings by The Good Ones" />
    <p>It’s awfully sweet stuff and while none of the lyrics are in English, they offer translations of the song titles, which
    include <cite>One Red Sunday, You Lied &amp; Tried to Steal My Land</cite>, <cite>In the Hills of Nyarusange They Talk Too
    Much</cite>, and <cite>You Were Given a Dowry, But Abandoned Me</cite>. This music does so much with so little.</p>
    <h2 id='p-4'>Rapper Piano</h2>
    <p><a href="https://alfamist.co.uk">Alfa Mist</a> was a rapper who went to music school and learned to play keyboards as an adult.
    The music’s straight-ahead Jazz but he still raps a bit here and there, it blends in nicely. If you get a chance to listen to an
    interview with him you should, if only for his voice; he’s from South London and of Ugandan heritage, which results in an
    accent like nothing I’ve ever heard before but makes me smile.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Alfa-Mist.png" alt="Alfa Mist" />
    <div class='caption'><p>By Dirk Neven - Alfa Mist, Maassilo Rotterdam 20 November 2022 - Alfa Mist, CC0,
    (<a href="https://commons.wikimedia.org/w/index.php?curid=133801400">Wikimedia</a>).</p></div>
    <p>The problem with AM’s music is that’s it’s extremely <em>smoooooooth</em>, to the point that I thought of it as sort of
    pleasant-background stuff. Then I took in a YouTube of a live-in-studio session (maybe
    <a href="https://www.youtube.com/watch?v=15Nqbic6HZs">this one</a>?) and realized that I was listening to extremely
    sophisticated soloing and ensemble playing that deserves to be foreground. But still sweet.</p>

    <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Sora-Jobarteh.png" alt="Sora Jobarteh" />
    <div class='caption'><p>By World Trade Organization from Switzerland, cropped by User:HLHJ - Aid for Trade Global Review 2017 –
    Day 1, CC BY-SA 2.0, (<a href="https://commons.wikimedia.org/w/index.php?curid=72151783 ">Wikimedia</a>).</p></div>
    <h2 id='p-6'>Kora Magic</h2>
    <p>The Kora is that Gambian instrument with a gourd at the botton and dozens of strings.
    <a href="https://sonajobarteh.com">Sona Jobarteh</a>, British-Gambian, plays Kora and guitar and sings beautifully and has a
    great band. Here she is at <a href="https://www.youtube.com/watch?v=A78b9IgI3EU">Jazz à Parquerolles</a>.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/10/15/Wagner-Glass.png" alt="Vanessa Wagner Glass Etudes album cover" />
    <h2 id='p-7'>And now for something completely different</h2>
    <p><a href="https://vanessawagner.net">Vanessa Wagner</a> is a French classical pianist of whom I’d not heard. But Qobuz offered
    a new recording of Phil Glass’s <cite>Piano Etudes</cite> which, despite being a big fan, I’d never listened to.
    Here’s <a href="https://www.youtube.com/watch?v=mS0zt7tZYSE">Etude No. 2</a>, which is pretty nice, as is the whole recording;
    dreamy, shimmering stuff. I found myself leaning back with eyes closed.</p>
    <h2 id='p-8'>It makes me happy</h2>
    <p>That there’s plenty of music out there that’s new and good.</p>
</div></content></entry>

<entry>
 <title>GenAI Predictions</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/09/26/GenAI-Predictions' />
 <link rel='replies'        thr:count='7'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/09/26/GenAI-Predictions#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/09/26/GenAI-Predictions</id>
 <published>2025-09-26T12:00:00-07:00</published>
 <updated>2025-10-02T09:16:45-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/AI' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='AI' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I’m going to take a big chance here and make predictions about GenAI’s future.     Yeah, I know, you’re feeling overloaded on this stuff and me too, but it     seems to have sucked the air out of all the other conversations. I would so like to return to     arguing about Functional Programming or Free Trade.  This is risky and there’s a pretty good chance that I’m     completely wrong. But I’ll try to entertain while prognosticating</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>I’m going to take a big chance here and make predictions about GenAI’s future.
    Yeah, I know, you’re feeling overloaded on this stuff and me too, but it
    seems to have sucked the air out of all the other conversations. I would so like to return to
    arguing about Functional Programming or Free Trade.  This is risky and there’s a pretty good chance that I’m
    completely wrong. But I’ll try to entertain while prognosticating.</p>
    <h2 id='p-6'>Reverse Centaurs</h2>
    <p>That’s the title of a
    <a href="https://locusmag.com/feature/commentary-cory-doctorow-reverse-centaurs/">Cory Doctorow</a> essay, which I think is spot
    on. I’m pretty sure anyone who’s read even this far would enjoy it and it’s not long, and it’d help understand this.
    Go have a look, I’ll wait.</p>
    <h2 id='p-4'>Hallucinations won’t get fixed</h2>
    <p>I have one good and one excellent argument to support this prediction. Good first: While my understanding of LLMs is not
    that deep, it doesn’t have to be to understand that it’s really difficult (as in, we don’t know how) to connect the model’s
    machinations to our underlying reality, so as to fact-check.</p>
    <p>The above is my non-expert intuition at work. But then there’s
    <a href="https://arxiv.org/pdf/2509.04664">Why Language Models Hallucinate</a>, three authors from OpenAI and one from Georgia
    Tech, which seems to show that hallucinations are an inevitable result of current training practices.</p>
    <p>And here’s the excellent argument: If there were a way to eliminate the hallucinations, <em>somebody already would
    have</em>. An army of
    smart, experienced people, backed by effectively infinite funds, have been hunting this white
    whale for years now without much success. My conclusion is, don’t hold your breath waiting.</p>
    <p>Maybe there’ll be a surprise breakthrough next Tuesday. Could happen, but I’d be really surprised.</p>
    <p>(When it comes to LLMs and code, the picture is different; see below.)</p>
    <h2 id='p-1'>The mass layoffs won’t happen</h2>
    <p>The central goal of GenAI is the elimination of tens of millions of knowledge workers.
    That’s the only path to the profits that can cover the costs of training and
    running those models.</p>
    <p>To support this scenario the AI has to run in Cory’s “reverse centaur” mode, where the models do the work and the
    humans tend them. This allows the production of several times more work per human, generally of lower quality, with inevitable
    hallucinations. There are two problems here: First, that at least some of the output is
    <a href="https://hbr.org/2025/09/ai-generated-workslop-is-destroying-productivity">workslop</a>, whose cleanup costs eat away at
    the productivity wins.
    Second, that the lower quality hurts your customers and your business goes
    downhill.</p>
    <p>I just don’t see it. Yeah, I know, every CEO is being told that this will work and they’ll be heroes to their
    shareholders. But the data we have so far keeps refusing to support those productivity claims.</p>
    <p>OK then, remove the “reverse” and run in centaur mode, where smart humans use AI tools judiciously to improve productivity
    and quality. Which might be a good idea for some people in some jobs.
    But in that scenario neither the output boost nor the quality gain get you to where you can dismiss enough
    millions of knowledge workers to afford the AI bills.</p>
    <h2 id='p-2'>The financial damage will be huge</h2>
    <p>Back to Cory, with <a href="https://pluralistic.net/2025/09/27/econopocalypse/#subprime-intelligence">The real (economic) AI
    apocalypse is nigh</a>. It’s good, well worth reading, but at this point pretty well conventional wisdom as seen by everyone who
    isn’t either peddling a GenAI product or (especially) fundraising to build one.</p>
    <p>To pile on a bit, I’m seeing things every week like for example this:
    <a href="https://fortune.com/2025/09/23/ai-boom-unsustainable-tech-spending-parabolic-deutsche-bank/">The AI boom is
    unsustainable unless tech spending goes ‘parabolic,’ Deutsche Bank warns: ‘This is highly unlikely’</a>.</p>
    <p>The aggregate investment is ludicrous. The only people who are actually making money are the ones
    <a href="https://www.ft.com/content/e93e56df-dd9b-40c1-b77a-dba1ca01e473">selling the gold-mining equipment</a> to the peddlers.
    Like they say,
    <a href="https://en.wikipedia.org/wiki/Herbert_Stein#Stein's_Law">“If something cannot go on forever, it will stop.”</a> Where
    by “forever”, in the case of GenAI, I mean “sometime in 2026, probably”.</p>
    <h2 id='p-3'>… But the economy won’t collapse</h2>
    <p>Cory forecasts existential disaster, but I’m less worried.
    Those most hurt when the bubble collapses will be the investing classes who, generally speaking, can afford it. 
    Yeah, if the S&amp;P 500 drops by a third, the screaming will shake the heavens, but I honestly don’t see it hitting as hard as
    2008 and don’t see how the big-picture economy falls apart. That work that the genAI shills say would be automated away is still
    gonna have to be done, right?</p>
    <h2 id='p-5'>The software profession will change, but not <em>that</em> much</h2>
    <p>Here’s where I get in trouble, because a big chunk of my professional peers, including people I admire, see
    GenAI-boosted coding as pure poison:
    <a href="https://anthonymoser.github.io/writing/ai/haterdom/2025/08/26/i-am-an-ai-hater.html">“In a kind of nihilistic symmetry,
    their dream of the perfect slave machine drains the life of those who use it as well as those who turn the gears.”</a> (The
    title of that essay is “I Am An AI Hater.”)</p>
    <p>I’m not a hater.
    I argued above that LLMs generating human discourse have no way to check their output for consistency with
    reality. But if it’s code, “reality” is approximated by what will compile and build and pass the tests. The agent-based systems
    iteratively generate code, reality-check it, and don’t show it to you until it passes. One consequence is that the
    quality of help you get from the model should depend on the quality of your test framework. Which warms my
    <a href="/ongoing/When/202x/2021/05/15/Testing-in-2021">testing-fanatic</a> heart.</p>
    <p>So, my first specific prediction: Generated code will be a routine thing in the toolkit, going forward from here. It’s pretty
    obvious that LLMs are better at predicting code sequences than human language.</p>
    <p>In <a href="https://sourcegraph.com/blog/revenge-of-the-junior-developer">Revenge of the junior developer</a>, Steve Yegge
    says, more or less, “Resistance is useless. You will be assimilated.” But he’s wrong; there are going to be places where we
    put the models to work, and others where we won’t. We don’t know which places those are and aren’t, but I have (weaker)
    predictions; let’s be honest and just say “guesses”.</p>
    <p>Where I suspect generated code will likely appear:</p>
    <ul>
      <li><p>Application logic: “Depreciate the values in the <code>AMOUNT</code> field of the <code>INSTALLED</code> table forward
      ten years and write the <code>NAME</code> field and the depreciated value into a CSV.” Or “Look at JIRA ticket 248975 and
      create a fix.”</p>
      <p>(By the way, this is a high proportion of what actual real-world programmers do every day.)</p></li>
      <li><p>Glorified StackOverflow-style lookups like I did in
      <a href="/ongoing/When/202x/2025/07/01/First-AI-Code">My First GenAI Code</a>.</p></li>
      <li><p>Drafting code that needs to run against interfaces too big and complex to hold in your head, like for example the
      Android and AWS APIs (“When I shake the phone, grab the location from GPS and drop it in the <code>INCOMING</code> S3 bucket”). Or
      CSS (“Render that against a faded indigo background flush right, and hold it steady while scrolling so the text slides around
      it”).</p></li>
      <li><p>SQL. This feels like a no-brainer. So much klunky syntax and so many moving pieces.</p></li>
    </ul>
    <p>Where I suspect LLM output won’t help much.</p>
    <ul>
      <li><p>Interaction design. I mean, c’mon, it requires predicting how humans understand and behave.</p></li>
      <li><p>Low level infrastructure code, the kind I’ve spent my whole life on, where you care a whole lot about about conserving
      memory and finding sublinear algorithms and shrinking code paths and having good  benchmarks.</p></li>
    </ul>
    <p>Here are areas where I don’t have a prediction but would like to know whether and how LLM fits in (or not).</p>
    <ul>
      <li><p>Help with testing: Writing unit and integration tests, keeping an eye on coverage, creating a bunch of BDD tests from a
      verbal description of what a function is going to do.</p></li>
      <li><p>Infrastructure as code: CI/CD, Terraform and peers, all that stuff. There are so many ways to get it wrong.</p></li>
      <li><p>Bad old-school concurrency that uses explicit mutexes and <code>java.lang.Thread</code> where you have to understand
      language memory models and suchlike.</p></li>
    </ul>
    <h2 id='p-7'>The real reason not to use GenAI</h2>
    <p>Because it’s being sold by a panoply of grifters and chancers and financial engineers who know that the world where their dreams
    come true would be generally shitty, and they don’t care.</p>
    <p>(Not to mention the environmental costs and the poor folk in the poor countries where the QA and safety work is
    outsourced.)</p>
    <p>Final prediction: After the air goes out of the assholes’ bubble, we won’t have to live in the world they imagine. Thank
    goodness.</p>
</div></content></entry>

<entry>
 <title>Social Media Provenance Challenge</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media' />
 <link rel='replies'        thr:count='13'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media</id>
 <published>2025-10-01T12:00:00-07:00</published>
 <updated>2025-10-01T12:00:00-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Identity' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Identity' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Social Media' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Social Media' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>At a     <a href='https://iptc.org/news/iptc-photo-metadata-conference-2025-recordings-now-available/'>a recent     online conference</a>, I said that we      can “change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers     to be believed.” I was talking about media<span class="dashes"> —</span> images, video, audio.      We can make it <em>much</em> easier to tell when media is faked and when it’s real.     There’s work to do, but it’s straightforward stuff and we could get there soon. Here’s how</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>At a
    <a href="https://iptc.org/news/iptc-photo-metadata-conference-2025-recordings-now-available/">a recent
    online conference</a>, I said that we 
    can “change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers
    to be believed.” I was talking about media<span class='dashes'> —</span> images, video, audio. 
    We can make it <em>much</em> easier to tell when media is faked and when it’s real.
    There’s work to do, but it’s straightforward stuff and we could get there soon. Here’s how.</p>
    <h2 id='p-8'>The Nadia story</h2>
    <p>This is a vision of what success looks like.</p>
    <p>Nadia lives in LA.
    She has a popular social-media account with a reputation for stylish pictures of urban
    life. She’s not terribly political, just a talented street photog. Her handle is “[email protected]”.</p>
    <p>She’s in Venice Beach the afternoon of Sunday August 9, 2026, when federal agents take down a vendor selling
    cheap Asian ladies’ wear. She gets a great shot 
    of an enforcer carrying away an armful of pretty dresses while two more bend the merchant over his countertop.
    None of the agents in the picture are in uniform, all are masked.</p>
    <p>She signs into her “CoolTonesLA” account on <code>hotpix.example</code> and drafts a post saying “Feds raid Venice
    Beach”. When she uploads 
    the picture, there’s a pop-up asking “Sign this
    image?” Nadia knows what this means, and selects “Yes”. By midnight her post has gone viral.</p>
    <img src="cr.png" alt="Content Credentials glyph" class="inline"/>
    <p>As a result of Nadia agreeing to “sign” the image, anyone who sees her post, whether in a browser or mobile app,  also
    sees that little “Cr” badge in the photo’s top right corner. 
    When they mouse over it, a little pop-up says something like:</p>
    <blockquote class="popup"><p style="font-family: sans-serif">Signature is valid.<br/>Media was
    <span class="fakelink">posted</span> by
    <span class="fakelink">@CoolTonesLA</span><br/>on 
    <span class="fakelink">hotpix.example</span><br/>at 5:40 PM PDT, August 9th, 2026.</p></blockquote>
    <p>The links point to Nadia’s feed and her instance’s home page. Following them can give the reader a feeling
    for what kind of person she is, the nature of her server, and the quality of her work. Most people are inclined to believe the
    photo is real.</p> 
    <p>Marco is a troublemaker. He grabs Nadia’s photo and posts it to his social-media account with the caption
    “Criminal illegals terrorize local business. Lock ’em up!”  He’s not technical and doesn’t strip the metadata. Since the
    picture is already signed, he doesn’t get the “Sign this picture?” prompt.
    Anyone who sees his post will see the “Cr” badge and mousing over it makes it pretty clear that it isn’t what he says it
    is. Commenters gleefully point this out.  By the time Marco takes the post down, his credibility is
    damaged.</p>
    <p>Maggie is a more technical troublemaker. She sees Marco’s post and likes it, strips the picture’s metadata, and reposts it. 
    When she gets the “Sign this picture?” prompt, she says “No”, so it doesn’t get
    a “Cr” badge. Hostile commenters accuse her of posting a fake, saying “LOL badge-free zone”. It is less likely that her
    post will go viral.</p> 
    <p>Miko isn’t political but thinks the photo would be more dramatic if she Photoshopped it to add a harsh dystopian lighting
    effect. When she reposts her version, the “Cr” badge won’t be there because the pixels have changed.</p>
    <p>Morris follows Maggie. He grabs the stripped picture and, when he posts it, says “Yes”
    to signing. In his post the image will show up with the “Cr” and credit it to him, with a “posted” timestamp later than Nadia’s initial
    post. Now, the 
    picture’s believability will depend on Morris’s. Does he have a credible track record?
    Also, there’s a chance that someone will notice what Morris did and point out that he stole Nadia’s picture.</p>
    <p>(In fact, I wouldn’t be surprised if people ran programs against the social-network firehose looking for media signed by more than
    one account, which would be easy to detect.)</p>
    <p>That’s the Nadia story.</p>
    <h2 id='p-2'>How it’s done</h2>
    <p>The rest of this piece explains in some detail how the Nadia story can be supported by technology that
    already exists, with a few adjustments. If jargon like “PKIX” and “TLS” and “Nginx” is foreign to you, you’re unlikely to
    enjoy the following. Before you go, please consider: Do you think making the Nadia story come true
    would be a good investment?</p>
    <p>I’m not a really deep expert on all the bits and pieces, so it’s possible that I’ve got something wrong. Therefore, this
    blog piece will be a living document in that I’ll correct any convincingly-reported errors, with the goal that it
    accurately describes a realistic technical roadmap to the Nadia story.</p>
    <p>By this time I’ve posted enough times about C2PA that I’m going to assume people know what it is and how it works. For my long,
    thorough explainer, see
    <a href="https://www.tbray.org/ongoing/When/202x/2023/10/28/C2PA-Workflows">On C2PA</a>. Or, check out the
    <a href="https://contentcredentials.org/">Content Credentials Web site.</a></p>
    <p>Tl;dr: C2PA is a list of assertions about a media object, stored in its metadata, with a digital signature that includes the
    assertions and the bits of the picture or video.</p>
    <p>This discussion assumes the use of C2PA and also an in-progress specification from the
    <a href="https://cawg.io">Creator Assertions Working Group</a> (CAWG) called
    <a href="https://cawg.io/identity/1.2-draft">Identity Assertion</a>.</p>
    <p>Not all the pieces are quite ready to support the Nadia story. But there’s a clear path forward to closing each gap.</p>
    <h2 id='p-3'>“Sign this picture?”</h2>
    <p>C2PA and CAWG specify many assertions that you can make about a piece of media. For now let’s focus just on what we
    need for provenance. 
    When the media is uploaded to a social-network service, there are two facts that the server knows,
    absolutely and unambiguously: Who uploaded it (because they’ve had to sign in) and when it happened.</p>
    <p>In the current state of
    the specification drafts, “Who” is the <code>cawg.social_media</code> property from the draft
    <a href="https://cawg.io/identity/1.2-draft/#vc-credentialsubject-verifiedidentity-type">Identity Assertion spec, section
    8.1.2.5.1</a>, and “When” is the <code>c2pa.time-stamp</code> property from the
    <a href="https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_requirements_2">C2PA
    specification, section 18.17.3</a>.</p>
    <p>I think these two are all you need for a big improvement in social network  media provenance,
    so let’s stick with them.</p>
    <h2 id='p-4'>What key?</h2>
    <p>Let’s go back to the Nadia story.
    It needs the Who/When assertions to be digitally signed in a way that will convince a tech-savvy human or a PKIX validation
    library that the signature could only have been applied by the server at <code>hotpix.example</code>.</p>
    <p>The C2PA people have been thinking about this. They are working on a
    <a href="https://iptc.org/verified-news-publishers-list/">Verified News Publishers List</a>, to be maintained and managed by,
    uh, that’s not clear to me. The idea is that C2PA software would, when validating a digital signature, require
    that the PKIX cert is one of those on the Publishers List.</p>
    <p>This isn’t going to work for a decentralized social network, which has tens of thousands of independent servers
    run by co-ops, academic departments, municipal governments, or just a gaggle of friends who kick in on Patreon. And anyhow,
    Fediverse instances don’t claim to be “News Publishers”, verified or not.</p>
    <p>So what key can <code>hotpix.example</code> sign with?
    Fortunately, there’s already a keypair and PKIX certificate in place on every social-media server, the one it uses to
    support TLS connections. The one at <code>tbray.org</code>, that’s being used right now to protect your interaction
    with this blog, is in <code>/etc/letsencrypt/live/</code> and the private key is obviously not generally readable.</p>
    <p>That cert will contain the public key corresponding to the host’s private key, the cert's ancestry, and the host name.
    It’s all that any PKIX library needs to verify that yes, this could only have been signed by
    <code>hotpix.example</code>. However, there will be objections.</p>
    <p><b>Objection</b>: “<code>hotpix.example</code> is not a Verified News Publisher!” True enough, the C2PA validation libraries would
    have to accept X.509 certs. Maybe they do already? Maybe this requires an extension of the current specs? In any
    case, the software’s all open-source, could be forked if necessary.</p>
    <p><b>Objection</b>: “That cert was issued for the purpose of encrypting TLS connections, not for some weird photo provenance
    application. Look at the
    <a href="https://en.wikipedia.org/wiki/Object_identifier">OID</a>!” OK, but seriously, who cares?
    The math does what the math 
    does, and it works.</p>
    <p><b>Objection</b>: “I have to be super-careful about protecting my private key and I don’t want to give a copy to the hippies
    running the social-media server.” I sympathize but, in most cases, social media is all that
    server’s doing.</p>
    <p>Having said that, it would be great if there were extensions to Nginx and Apache httpd where you could request
    that they sign the assertions for you. Neither would be rocket science.</p>
    <p>OK, so we sign Nadia’s Who/When assertions and her photo’s pixels  with our host’s TLS key, and ship it off into the
    world. What’s next?</p> 
    <h2 id='p-5'>How to validate?</h2>
    <p>Verifying these assertions, in a Web or mobile app, is going to require a C2PA library to pick apart the assertions and
    a PKIX library for the signature check.</p>
    <p>We already have
    <a href="https://github.com/contentauth/c2pa-rs">c2pa-rs</a>, Rust code with MIT and Apache licenses.
    Rust libraries can be called
    from some  other programming languages but in the normal course of affairs I’d expect there soon to be native implementations.
    Once again, all these technologies are old as dirt, absolutely no rocket science required.</p>
    <p>How about validating the signatures?  I was initially puzzled about this one because, as a
    programmer, certs only come into the picture when I do something like <code>http.Get()</code> and the
    library takes care of all that stuff. So I can’t speak from experience.</p>
    <p>But I think the infrastructure is there.  Here’s a Curl blogger praising
    <a href="https://eissing.org/icing/posts/curl-apple-sectrust/">Apple SecTrust</a>. Over on Android, there’s
    <a href="https://developer.android.com/reference/javax/net/ssl/X509ExtendedTrustManager">X509ExtendedTrustManager</a>.
    I assume Windows has something. And if
    all else fails, you could just download a trusted-roots file from the
    <a href="https://curl.se/docs/caextract.html">Curl</a> or
    <a href="https://android.googlesource.com/platform/system/ca-certificates/+/master/files/">Android</a> projects and refresh it
    every week or two.</p> 
    <h2 id='p-7'>What am I missing?</h2>
    <p>This feels a little too easy, something that could be done in months not years. Perhaps I’m oversimplifying.
    Having said that, I think the most important thing to get right is the scenarios, so we know what effect we want to achieve.</p>
    <p>What do you think of the Nadia story?</p>
</div></content></entry>

<entry>
 <title>C2PA Investigations</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/09/18/C2PA-Investigations' />
 <link rel='replies'        thr:count='5'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/09/18/C2PA-Investigations#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/09/18/C2PA-Investigations</id>
 <published>2025-09-18T12:00:00-07:00</published>
 <updated>2025-09-30T15:06:15-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Identity' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Identity' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>This is the blog version of my talk at the IPTC’s online     <a href='https://iptc.org/events/photo-metadata-conference-2019/'>Photo Metadata Conference</a> conference.     Its title is the one the conference organizers slapped on my session without asking; I was initially going to     object but then I thought of the big guitar riff in Dire Straits’ <cite>Private Investigations</cite> and snickered.     If you want, instead of reading, to watch me present,     <a href='https://www.youtube.com/watch?si=BMfVGUQNcJOR1w2z&amp;amp;t=1610&amp;amp;v=wRjExw8OMUc&amp;amp;feature=youtu.be'>that’s on YouTube</a>.     Here we go</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>This is the blog version of my talk at the IPTC’s online
    <a href="https://iptc.org/events/photo-metadata-conference-2019/">Photo Metadata Conference</a> conference.
    Its title is the one the conference organizers slapped on my session without asking; I was initially going to
    object but then I thought of the big guitar riff in Dire Straits’ <cite>Private Investigations</cite> and snickered.
    If you want, instead of reading, to watch me present,
    <a href="https://www.youtube.com/watch?si=BMfVGUQNcJOR1w2z&amp;t=1610&amp;v=wRjExw8OMUc&amp;feature=youtu.be">that’s on YouTube</a>.
    Here we go.</p>
    <p>Hi all, thanks for having me. Today I represent… nobody, <em>officially</em>. I’m not on any of the committees nor am I an
    employee of any of the providers. But I’m a photographer and software developer and social-media activist and have written a lot about
    C2PA. So under all those hats this is a subject I care about.</p>
    <p>Also, I posted this on Twitter back in 2017.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/2017-twitter.png" alt="Twitter post from 2017 presaging C2pA" />
    <p>I’m not claiming that I was the first with this idea, but I’ve been thinking about the issues for quite a while.</p>
    <p>Enough self-introduction. Today I’m going to look at C2PA in practice right now in 2025. Then I’m going to talk about what I
    think it’s for. Let’s start with a picture.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/L1000004.png" alt="Picture of a shopping mall storefront" />
    <div class='caption'><p>This smaller version doesn’t have C2PA,<br/>but if you click on it, the larger version you get does.
    <br/>Photo credit: Rob Pike</p></div>
    <p>I should start by saying that a few of the things that I’m going to show you are, umm, broken. But I’m still a C2PA fan. Bear
    in mind that at this point everything is beta or preview or whatever, at best v1.0. I think we’re in glass-half-full mode.</p>
    <p>This photo is entirely created and processed by off-the-shelf commercial products and has content credentials, and let me say
    that I had a freaking hard time finding such a photo. There are very few Content Credentials out there on the Internet. That’s
    because nearly every online photo is delivered either via social media or by professional publishing software. In both cases, the
    metadata is routinely stripped, bye-bye C2PA. So one of the big jobs facing us in putting Content Credentials to work is to stop
    publishers from deleting them.</p>
    <p>Of course, that’s complicated. Professional publishers probably want the Content Credentials in place, but on social media
    privacy is a key issue and stripping the metadata is arguably a good default choice. So there are a lot of policy discussions to
    be had up front of the software work.</p>
    <p>Anyhow, let’s look at the C2PA. </p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/ca-glyphs-1.png" alt="Picture with two Content Credentials glyphs and one drop-down" />
    <p>I open up that picture in Chrome and there are little “Cr” glyphs at both the top left and top right corners; that’s because
    I’ve installed multiple C2PA Chrome plug-ins. Turns out these seem to only be available for Chrome, which is irritating. Anyhow,
    I’ve clicked on the one in the top left.</p> 
    <p>That’s a little disappointing. It says the credentials were recorded by Lightroom, and gives my name, but I think it’s hiding
    way more than it’s revealing. Maybe the one on the top right will be more informative?</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/ca-glyphs-2.png" alt="Picture with two Content Credentials glyphs and one drop-down" />
    <p>More or less the same info. A slightly richer presentation But both displays have an “inspect” button and both do the same
    thing. Let’s click it!</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/broken-inspector.png" alt="Content Credentials inspector page, failing to retrieve a page for review" />
    <p>This is the Adobe Content Credentials inspector and it’s broken. That’s disappointing. Having said that, I was in a Discord
    chat with a senior Adobe person this morning and they’re aware of the problem.</p>
    <p>But anyhow, I can drag and drop the
    picture like they say.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/2-phase-c2pa.png" alt="Content credentials as displayed by the Inspector" />
    <p>Much much better. It turns out that this picture was originally taken with a Leica M11-P. The photographer is a famous software
    guy named Rob Pike, who follows me on Mastodon and wanted to help out.</p>
    <p>So, thanks Rob, and thanks also to the Leica store in Sydney, Australia, who loaned him the M11. He hasn’t told me how he
    arranged that, but I’m curious.</p>
    <p>I edited it in Lightroom, and if you look close, you can see that I cropped it down and brightened it up. Let’s zoom in on
    the content credentials for the Leica image.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/leica-cc.png" alt="Leica-generated C2PA display" />
    <p>There’s the camera model, the capture date (which is wrong because Rob didn’t get around to setting the camera’s date before
    he took the picture.) The additional hardware (R-Adapter-M), the dimensions, ISO, focal length, and shutter speed.</p>
    <p>Speaking as a photographer, this is kind of cool. There’s a problem in that it’s partly wrong. The focal length isn’t zero,
    and Rob is pretty sure he didn’t have an adapter on. But Leica is trying to do the right thing and they’ll get there.</p>
    <p>Now let’s look at the assertions that were added by Lightroom.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/lr-cc.png" alt="Lightroom-generated C2PA display" />
    <p>There’s a lot of interesting stuff in here, particularly the provenance. Lightroom lets you manage your identities, using
    what we call “OAuth flows”, so it can ask Instagram (with my permission) what my Instagram ID is. It goes even further with
    LinkedIn; it turns out that LinkedIn has an integration with the Clear ID people, the ones who fast-track you at the airport. So
    I set up a Clear ID, which required photos of my passport, and went through the dance with LinkedIn to link it up, and then with
    Lightroom so it knew my LinkedIn ID. So to expand, what it’s really saying is: “Adobe says that LinkedIn says that Clear says
    that the government ID of the person who posted this says that he’s named Timothy Bray”.</p>
    <p>I don’t know about you, but this feels like pretty strong provenance medicine to me. I understand that the C2PA committee and
    the
    <a href="https://cawg.io">CAWG</a> people are re-working the provenance assertions. To them: Please don’t screw this particular
    style of provenance up.</p>
    <p>Now let’s look at what Lightroom says it did. It may be helpful to know what I in fact did.</p>
    <ol>
      <li><p>Cropped the picture down.</p></li>
      <li><p>Used Lightroom’s “Dehaze” tool because it looked a little cloudy.</p></li>
      <li><p>Adjusted the exposure and contrast, and boosted the blacks a bit.</p></li>
      <li><p>Sharpened it up.</p></li>
    </ol>
    <p>Lightroom knows what I did, and you might wonder how it got from those facts to that relatively content-free
    description that reads like it was written by lawyers.
    Anyhow, I’d like to know. Since I’m a computer geek, I used the open-source “c2patool” to dump what the assertions
    actually are.  I apologize if this hurts your eyes.</p>
    <p>It turns out that there is way more data in those files than the inspector shows. For example, the Leica claims included 29
    EXIF values, here are three I selected more or less at random:</p>
    <div class="highlight"><pre><span></span><span class="p"></span><span class="w">          </span><span class="nt">&quot;exif:ApertureValue&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;2.79917&quot;</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;exif:BitsPerSample&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;16&quot;</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;exif:BodySerialNumber&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;6006238&quot;</span><span class="p">,</span>
</pre></div>
    <p>Some of these are interesting: In the Leica claims, the serial number. I could see that as a useful provenance claim. Or as a
    potentially lethal privacy risk. Hmmm.</p>
        <div class="highlight"><pre><span></span><span class="p"></span><span class="w">            </span><span class="p">{</span>
<span class="w">              </span><span class="nt">&quot;action&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;c2pa.color_adjustments&quot;</span><span class="p">,</span>
<span class="w">              </span><span class="nt">&quot;parameters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">              </span><span class="nt">&quot;action&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;c2pa.color_adjustments&quot;</span><span class="p">,</span>
<span class="w">              </span><span class="nt">&quot;parameters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">                </span><span class="nt">&quot;com.adobe.acr.value&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;60&quot;</span><span class="p">,</span>
<span class="w">                </span><span class="nt">&quot;com.adobe.acr&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Exposure2012&quot;</span>
<span class="w">              </span><span class="p">}</span>
<span class="w">            </span><span class="p">},</span>
<span class="w">            </span><span class="p">{</span>
<span class="w">              </span><span class="nt">&quot;action&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;c2pa.color_adjustments&quot;</span><span class="p">,</span>
<span class="w">              </span><span class="nt">&quot;parameters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">                </span><span class="nt">&quot;com.adobe.acr&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Sharpness&quot;</span><span class="p">,</span>
<span class="w">                </span><span class="nt">&quot;com.adobe.acr.value&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;52&quot;</span>
<span class="w">              </span><span class="p">}</span>
<span class="w">            </span><span class="p">},</span>
<span class="w">            </span><span class="p">{</span>
<span class="w">              </span><span class="nt">&quot;action&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;c2pa.cropped&quot;</span><span class="p">,</span>
<span class="w">              </span><span class="nt">&quot;parameters&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">                </span><span class="nt">&quot;com.adobe.acr.value&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Rotated Crop&quot;</span><span class="p">,</span>
<span class="w">                </span><span class="nt">&quot;com.adobe.acr&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Crop&quot;</span>
<span class="w">              </span><span class="p">}</span>
<span class="w">            </span><span class="p">}</span>
</pre></div>
    <p>And in the Lightroom section, it actually shows exactly what I did, see the sharpness and exposure values.</p> 
    <p>My feeling is that the inspector is doing either too much or too little. At the minimal end you could just say “hand
    processed? Yes/No” and “genAI? Yes/No”.  For a photo professional, they might like to drill down and see what I actually did. I
    don’t see who would find the existing presentation useful. There’s clearly work to do in this space.</p>
    <p>Oh wait, did I just say “AI”? Yes, yes I did. Let’s look at another picture, in this case a lousy picture.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/TXT55638.png" alt="Picture of an under-construction high-rise behind leaves" />
    <p>I was out for a walk and thought the building behind the tree was interesting. I was disappointed when I pulled it up on the
    screen, but I still liked the shape and decided to try and save it.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/TXT55638-good.png" alt="Picture of an under-construction high-rise behind leaves, improved" />
    <p>So I used Lightroom’s “Select Sky” to recover its color, and “Select Subject” to pull the building details out of the
    shadows. Both of these Lightroom features, which are pretty magic and I use all the time, are billed as being AI-based. I
    believe it.</p>
    <p>Let’s look at what the C2PA discloses.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/lr-tower.png" alt="Lightroom C2PA assertions with automation AI" />
    <p>Having said all that, if you look at the C2PA (or at the data behind it) Lightroom discloses only “Color or Exposure”,
    “Cropping”, and “Drawing” edits. Nothing about AI.</p>
    <p>Hmm. Is that OK? I personally think it is, and highlights the distinction between what I’d call “automation” AI and
    Generative AI. I mean, selecting the sky and subject is something that a skilled Photoshop user could accomplish with a lot of
    tinkering, the software is just speeding things up. But I don’t know, others might disagree.</p>
    <p>Well, how about that generative AI?</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/chatgpt.png" alt="Turtle in shallow water, generated by ChatGPT" />
    <div class='caption'><p>Fails <code>c2patool</code> validation, “DigitalSourceType” is <code>trainedAlgorithmicMedia</code></p></div>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/budai.png" alt="Desktop with decorations, Magic Erase has been applied" />
    <div class='caption'><p>“DigitalSourceType” is <code>compositeWithTrainedAlgorithmicMedia</code></p></div>
    <p>The turtle is 100% synthetic, from ChatGPT, and on the right is a Pixel 10 shot on which I did a few edits including “Magic
    Eraser”.  Both of these came with Content Credentials; chatGPT’s is actually invalid, but on the glass-half-full front, the
    Pixel 10’s were also invalid up until a few days ago, then they fixed it. So this stuff does get fixed.</p>
    <p>I’m happy about the consistent use of C2PA terminology, they are clearly marking the images as genAI-involved.</p>
    <p>I’m about done talking about the state of the Content Credentials art generally but I should probably talk about this
    device.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/pixel-10.png" alt="Blue Pixel 10" />
    <p>Because it marks the arrival of Content Credentials on the mass consumer market. Nobody knows how many Pixels Google actually
    sells but I guarantee it’s a lot more than Leica sells M11’s. And since Samsung tends to follow Google pretty closely, we’re
    heading for tens then hundreds of millions of C2PA-generating mobile devices. I wonder when Apple will climb on board?</p>
    <p>Let’s have a look at that C2PA.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/p10-c2pa.png" alt="C2PA associated with Magic Eraser image" />
    <p>This view of the C2PA is from the Google Photos app.  It’s very limited.  In particular, there is nothing in there to support
    provenance. In fact, it’s the opposite, Google is bending over backward to avoid anything that could be interpreted as breaking the
    privacy contract by sharing information about the user.</p>
    <p>Let’s pull back the covers and dig a little deeper. Here are a few notes</p>
    <ul>
      <li><p>The device is identified just as “Pixel camera”. There are lots of different kinds of those!</p></li>
      <li><p>The C2PA inclusion is Not optional!</p></li>
      <li><p>DigitalSourceType:  <code>computationalCapture</code>
(if no genAI)</p></li>
      <li><p>Timestamp is “untrusted”</p></li>
    </ul>
    <p>The C2PA not being optional removes a lot of UI issues but still, well, I’m not smart enough to have fully thought through
    the implications. That Digital Source Type looks good and appropriate, and the untrusted-ness of the timestamp is
    interesting.</p>
    <p>You notice that my full-workflow examples featured a Leica rather than the Pixel, and that’s because the toolchain is
    currently broken for me: Neither Lightroom nor Photoshop can handle the P10 C2PA. I’ll skip the details, except to say that
    Adobe is aware of the bug, a version mismatch, and they say they’re working on it.</p>
    <p>Before we leave the Pixel 10, I should say that there are plenty of alternate camera apps in Android and iOS, some quite
    good, and it’d be perfectly possible for them to ship much richer C2PA, notably including provenance, location, and so on.</p>
    <p>I guess that concludes my look at the current state of the Content Credentials art. Now I’d like to talk about what Content
    Credentials are for.  To start with, I think it’d be helpful to sort the assertions into three baskets.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-1.png" alt="C2PA assertions in Capture, Processing, and Provenance baskets" />
    <p>Capture, that’s like that Leica EXIF stuff we showed earlier. What kind of camera and lens, what the shooting parameters
    were. Processing, that’s like the Lightroom report: How was the image manipulated, and by what software. Provenance: Which
    person or organization produced this?</p>
    <p>But I think this picture has an important oversimplification, let me fix that.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-2.png" alt="C2PA assertion baskets with the addition of GenAI" />
    <p>Processing is logically where you’d disclose the presence of GenAI.  And in terms of what people practically care about,
    that’s super important and deserves special consideration.</p>
    <p>Now I’m going to leave the realm of facts and give you opinions. As for the Capture data there on the left… who cares?
    Really, I’m trying to imagine a scenario in which anyone cares about the camera or lens or F stop.  I guess there’s an exception
    if you want to prove that the photo was taken by one of Annie Liebowitz’s cameras, but that’s really provenance.</p>
    <p>Let’s think about a professional publication scenario. They get photos from photographers, employees or agencies or
    whatever. They might want to be really sure that the photo was from the photographer and not an imposter. So having C2PA
    provenance would be nice. Then when the publisher gets photos, they do a routine check of the provenance and if it doesn’t check
    out, they don’t run the picture without a close look first.</p>
    <p>They also probably want to check for the “is there genAI?” indicator in the C2PA, and, well, I don’t know what they might do,
    but I’m pretty sure they’d want to know.</p>
    <p>That same publisher might want to equip the photos they publish with C2PA, to demonstrate that they are really the ones who
    chose and provided the media. That assertion should be applied routinely by their content management system.  Which should be
    easy, on the technology side anyhow.</p> 
    <p>So from the point of view of a professional publisher, provenance matters, and being careful about GenAI matters, and in the
    C2PA domain, I think that’s all that really matters.</p>
    <p>Now let’s turn to Social Media, which is the source of most of the images that most people see most days.  Today, all the
    networks strip all the photo metadata, and that decision involves a lot of complicated privacy and intellectual-property
    thinking.  But there is one important FACT that they know: For any new piece of media, they know which account uploaded the damn
    thing, because that account owner had to log in to do it. So I think it’s a no-brainer that IF THE USER WISHES, they can have a
    Content Credentials assertion in the photo saying “Initially uploaded by Tim Bray at LinkedIn” or whoever at wherever.</p> 
    <p>What we’d like to achieve is that if you see some shocking or controversial media, you’d really want to know who originally
    posted it before you decided whether you believed it, and if Content Credentials are absent, that’s a big red flag. And if the
    picture is of the current situation in Gaza, your reaction might be different depending on whether it was originally from an
    Israeli military social-media account, or the Popular Front for the Liberation of Palestine, or by the BBC, or by
    [email protected].</p>
    <p>Anyhow, here’s how I see it:</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-3.png" alt="C2PA assertion baskets inflated according to their relative importance" />
    <p>So for me, it’s the P and A in C2PA that matter – provenance and authenticity. I think the technology has the potential to
    change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers to be
    believed. I think the first steps that have been taken so far are broadly correct and the path forward is reasonably clear. All
    the little things that are broken, we can fix ’em.</p>
    <p>And there aren’t that many things that matter more than promoting truth and discouraging lies.</p>
    <p>And that’s all, folks.</p>
</div></content></entry>

<entry>
 <title>Maritime Wrap-up</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/09/13/Maritime-Wrap' />
 <link rel='replies'        thr:count='3'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/09/13/Maritime-Wrap#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/09/13/Maritime-Wrap</id>
 <published>2025-09-13T12:00:00-07:00</published>
 <updated>2025-09-15T22:22:33-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Places/Maritimes' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Places' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Maritimes' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Only a few more pictures to share from     <a href='/ongoing/When/202x/2025/08/27/Maritime-Vacation'>our vacation</a>, which I’ll wrap up in conventional tourism     advice</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Only a few more pictures to share from
    <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">our vacation</a>, which I’ll wrap up in conventional tourism
    advice.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55876.png" alt="Looking down off a cliff at a tiny boat far below" />
    <div class='caption'><p>It’s mostly about the oceanfront, and what you can see from it.</p></div>
    <h2 id='p-1'>Food and drink</h2>
    <p>I recommend all of the following.</p>
      <p><a href="https://www.schoolhousebrewery.ca">Schoolhouse Brewery</a> in Windsor, NS; nice space, decent food, the Vice Principal is
      a good IPA.  Maybe the  beer that I enjoyed most was “Exile on North Street” from
      <a href="https://unfuckingfiltered.com/beer/">unfiltered brewing</a>; you might want to follow that link and also check out
      the URL.</p>
      <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250815_230941783.png" alt="sunset through grasses" />
      <p>I didn’t love Halifax that much but it has this charming little neighborhood called
      <a href="https://en.wikipedia.org/wiki/Hydrostone">Hydrostone</a>, where
      <a href="https://www.thebrownhound.ca">The Brown Hound</a> offered very solid food and beer.
      We didn’t spend that much time in New Brunswick, but Moncton’s
      <a href="https://www.pumphousebrewpub.ca">Pump House</a> was cheery and competent; a cool space; I can’t remember which of
      their IPAs I had, but it was good. The other peak New Brunswick goodness was
      <a href="https://www.adorablechocolat.ca">Adorable Chocolat</a> in Shediac, where everyone was effortlessly bilingual and the
      pastries just divine. Don’t miss it if you’re anywhere near.</p>
      <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55910.png" alt="Cape Breton coastline, people swimming, houses on the slopes" />
      <div class='caption'><p>People live by the sea, and swim in it.</p></div>
      <p>Charlottetown’s not that rich in dining options, but got a really excellent lunch at
      <a href="https://www.thecorkandcast.com">The Cork &amp; Cast</a>.
      Maybe our best meal of the trip was at
      <a href="https://wheelhouseseafoodpasta.ca/menu#SEAFOOD">The Wheelhouse</a>, in Digby. Scallops all around, seared is the best
      option.
    </p>
    <h2 id='p-5'>Cities, towns, and other tourists</h2>
    <p>Every good tourist spot in the world seems to suffer from increasingly intense and persistent overcrowding, and the Maritimes
    are no exception.  On top of which, they’re thinly populated, fewer than two million souls in three provinces. The biggest city,
    Halifax (and the entire province of Prince Edward Island) are both smaller than individual Vancouver suburbs. It’s not a place
    for savouring urban flavors.</p>
    <p>In Nova Scotia, Halifax has too many cruise ships; stay away from its so-called “farmers market” unless you love cruise
    culture. Lunenberg is big enough to soak up its waves of visitors and still offer unique visuals.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55847.png" alt="Tourists at Peggy’s Cove" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55848.png" alt="The cove at Peggy’s Cove" />
    <div class='caption'><p>Overcrowded but has nice bits.</p></div>
    <p>Peggy’s Cove I just can’t recommend; beautiful but jam-packed
    with cars looking for parking and people risking their lives on the rocks.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250822_163228719.png" alt="Fort Anne in Annapolis Royal" />
    <div class='caption'><p>These were once defences but now just a pleasant walk.</p></div>
    <p>I do recommend visiting <a href="https://en.wikipedia.org/wiki/Annapolis_Royal">Annapolis Royal</a>; it’s got that great garden
    and Fort Anne, despite its lengthy and chequered military history, is lovely and peaceful.</p> 
    <p>In PEI, Charlottetown makes an effort and it has a beautiful basilica, but just isn’t big enough to reward a whole day’s
    visit.</p>
    <p>In NB, Moncton is OK but its biggest tourist attraction is the tide going in and out.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55961.png" alt="Crowded tidal flat at Hopewell Provincial Park" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55966.png" alt="Clifftop forest at Hopewell Provincial Park" />
    <div class='caption'><p>Hopewell Provincial Park, NB. The clifftop trees are exceptional.</p></div>
    <h2 id='p-3'>Lodging</h2>
    <p>The hotels and Airbnbs and VRBOs were OK, mostly. The
    <a href="https://www.theharbourviewinn.com">Harbourview Inn</a>, near Digby, is a charmingly-traditional guest-house. The rooms
    are OK, but the downstairs is warmly welcoming, drinks available when the host’s there to man the bar, lots of space to sink
    into a comfy chair and conversation or your laptop. Also the breakfast was solid.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250813_113114060.png" alt="Sky drama over Lake Ainsley" />
    <div class='caption'><p>Excited clouds over Lake Ainsley, NS.</p></div>
    <p>But the trip’s lodging highlight was this VRBO called
    <a href="https://www.vrbo.com/en-ca/cottage-rental/p9830781">Forest Lake House</a> on Lake
    Ainsley, the Maritimes’ biggest. Isolated, comfortable, outstanding grounds, your own private forest walk; everything anyone
    could want. We stopped traveling and had a chill-out day there, enjoying every minute of it.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250817_152127492.png" alt="Swimming at Cavendish, PEI" />
    <div class='caption'><p>Lots of people but plenty at room at Cavendish beach.</p></div>
    <h2 id='p-4'>Otherwise</h2>
    <p>We only swam once, at Cavendish Beach in PEI’s Anne of Green Gables territory, very nicely set up.  But what looked
    most appealing to me was 
    <a href="https://www.lockeport.ns.ca/index.php/tourism-recreation/crescent-beach-vic">Crescent Beach</a> in Lockeport, Nova
    Scotia; I wish we’d made time to have a swim there.</p>
    <p>Turns out all three vacationers had farming or agriculture-adjacent roots. If you care about that stuff, driving around PEI
    is a treat; the agriculture is super-intensive and, to my eye, pleasingly well-done.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56060.png" alt="A farm field with hay bales by the seaside" />
    <div class='caption'><p>The farmlands extend to the seaside.</p></div>
    <p>But if you have the time, get away from PEI’s farms and head northwest, drive
    down the coast from Tignish to West Point; that ride is full of colors and sea-fronts that aren’t like anywhere else I’ve
    seen.</p>
    <p>Since it’s the New World there’s plenty of nasty history around the indigenous folk, the
    <a href="https://en.wikipedia.org/wiki/Mi%27kmaq">Mi'kmaq</a> nation. But you really have to look to find it. We visited the
    <a href="https://www.millbrookheritagecentre.ca">Millbrook Cultural &amp; Heritage Centre</a> in Truro, which is much better
    than nothing.</p>
    <p>You gotta drive; we put 3,742km on a basic rented Kia. The roads are way better taken care of than here out West.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56014.png" alt="Maritime sunset" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250824_214226484.png" alt="The ocean near Liverpool, NS" />
    <div class='caption'><p>Bye-bye, Maritimes.</p></div>
    <p>We didn’t run across a single human Maritimer who was anything less than friendly and welcoming.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56069.png" alt="A white house perched on rocks above the sea-side" />
    <p>Nice people living along
    beautiful oceanfronts, plenty good enough for me.</p>
</div></content></entry>

<entry>
 <title>Maritime Colors</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/09/01/Maritime-Colors' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/09/01/Maritime-Colors#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/09/01/Maritime-Colors</id>
 <published>2025-09-01T12:00:00-07:00</published>
 <updated>2025-09-05T22:48:59-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Places/Maritimes' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Places' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Maritimes' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts/Photos/Cameras' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Arts' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Photos' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Cameras' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>When someone (<a href='/ongoing/When/202x/2025/08/27/Maritime-Vacation'>like us</a>)     comes back from a trip to the Maritimes, they’re apt to have pictures of     brightly-colored houses. This is to show those colors off and not just in houses. Plus a camera color     conundrum</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>When someone (<a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">like us</a>)
    comes back from a trip to the Maritimes, they’re apt to have pictures of
    brightly-colored houses. This is to show those colors off and not just in houses. Plus a camera color
    conundrum.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55945.png" alt="A trailer park with small building covered by bright colored fenders" />
    <div class='caption'><p>On the northwest coast of PEI, probably near Cape Wolfe.</p></div>
    <p>In that picture above, glance at the bit of beach showing left of the little lighthouse. There’s a color story there
    too.</p>
    <h2 id='p-1'>Residentials</h2>
    <p>As it happens, our very first outing on the vacation was to
    <a href="https://en.wikipedia.org/wiki/Lunenburg,_Nova_Scotia">Lunenberg</a>, which features those cheerful houses.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55826.png" alt="Brightly colored houses in Lunenberg" />
    <p>It wasn’t just tourist magnets like Lunenberg; anywhere in the Maritimes you’re apt to see exuberantly-painted
    residences, a practice I admire. While the Maritimes are a long way from my home in Vancouver, we share a long, dim, grey
    winter, and any splash of color can help with that Seasonal Affective Disorder.</p>
    <p>Also, we
    <a href="/ongoing/When/202x/2025/02/28/Moved">recently bought a house</a> and, while we like it, it’s an undistinguished
    near-grey, so we’re looking for color schemes to steal.
    Thus I took lots of pictures of bright houses.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/PXL_20250822_180516990.png" alt="Apricot-and-brown house" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55828.png" alt="Blue house in Lunenberg" />
    <p>A couple years back we painted our cabin a cheery blue based on sampling photos of the shutters on Mykonos. A few 
    neighbors rolled their eyes but nobody’s actually complained.</p>
    <h2 id='p-2'>Red</h2>
    <p>That’s the other color you have to talk about down east; I mean the color of the soil and sand and rocks. PEI in
    particular is famous for its red dirt, when you come in the on the ferry from Nova Scotia the first thing you notice is the
    island’s red fringe. I took a million pictures and maybe this is the closest to capturing it.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55948.png" alt="Red sand and dirt on a PEI beachfront" />
    <div class='caption'><p>Not far from that first picture.</p></div>
    <h2 id='p-3'>Green Conundrum</h2>
    <p>One of Nova Scotia’s attractions is the
    <a href="https://en.wikipedia.org/wiki/Cabot_Trail">Cabot Trail</a>, a 300km loop around Cape Breton, stretching northeast out
    into the Atlantic. This one scenic turn-off has you looking at a big, densely-forested mountainside. 
    It’s more chaotic than our West-Coast temperate rain forests, with many tree species jumbled together. The
    spectrum of greens under shifting clouds was a real treat for the eyes. Here are two of the pictures I came away with.
    Have a look at them for a moment.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/PXL_20250813_161053505.png" alt="Forested mountainside" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55881.png" alt="Forested mountainside" />
    <p>Above is by my Pixel 7, below a modern Fujifilm camera.  When I unloaded them on the
    big outboard screen, I was disappointed with the Fujifilm take, which seemed a little flat and boring; was thinking the Pixel had
    done better. But then I started feeling uneasy; my memory kept telling me that that mountainside just
    didn’t include that yellow flavor in the Pixel’s highlights. I mean, those highlights look great, but I’m pretty sure they’re lies.</p>
    <p>After a while, I edited the Fujifilm version just a teeny bit, gently bumping Lightroom’s “exposure” and “Vibrance” sliders, and
    I thought what 
    I got was very close to what I remembered. The Pixel photo is entirely un-touched.</p>
    <p>I’m not sure what to think. Mobile-phone cameras in general and the Pixel in particular proudly boast their “computational
    photography” and “AI” chops and, yeah, the Pixel produced a photo that it’s hard not to like.</p>
    <p>And quite a few of the pictures I publish in this space have have been adjusted pretty heavily in Lightroom. I stand by my
    claim that I’m mostly trying to make something that looks like what I saw. But increasingly, I suspect the Pixel is showing
    colors people like, as opposed to what’s real.</p>
</div></content></entry>

<entry>
 <title>Maritime Birds and Bees</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/08/30/Maritime-Wildlife' />
 <link rel='replies'        thr:count='0'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/08/30/Maritime-Wildlife#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/08/30/Maritime-Wildlife</id>
 <published>2025-08-30T12:00:00-07:00</published>
 <updated>2025-08-31T09:05:08-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Places/Maritimes' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Places' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Maritimes' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Nova Scotia and New Brunswick each have plenty of wilderness; PEI not so much. So pictures of bears and cougars and so on     would be plausible, as would marine mammals. But no. Herewith, from our     <a href='/ongoing/When/202x/2025/08/27/Maritime-Vacation'>recent vacation</a>, birds and bees, with a little     lens-geek side trip</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Nova Scotia and New Brunswick each have plenty of wilderness; PEI not so much. So pictures of bears and cougars and so on
    would be plausible, as would marine mammals. But no. Herewith, from our
    <a href="/ongoing/When/202x/2025/08/27/Maritime-Vacation">recent vacation</a>, birds and bees, with a little
    lens-geek side trip.</p>
    <h2 id='p-1'>Birds</h2>
    <p>Having touristed around Charlottetown, we drove down a series of smaller and smaller back roads and ended up
    at Canceaux Cove near Rocky Point, which I thought might present a nice vista of the city. It did, but the city looks boring.
    By way of consolation, there were these cute little birds running around on the beach and then flying loops in formation over the
    water.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55982.png" alt="Small birds on a beach" />
    <div class='caption'><p>Pretty sure these are
    <a href="https://en.wikipedia.org/wiki/Semipalmated_plover">Semipalmated plovers</a>.</p></div>
    <p>I wanted to get a picture of them in the air so I sauntered down the beach, assuming
    they’d fly away picturesquely. They studiously ignored me and eventually I had to jump and down and wave my arms and even then
    they took off grudgingly.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55984.png" alt="small birds flying over the ocean" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55987.png" alt="small birds flying over the ocean" />
    <p>They were graceful and did this mysterious thing that birds can do, staying in formation with no obvious leader.
    I’ve had the pleasure, very occasionally, of being in engineering teams like that.</p>
    <h2 id='p-2'>Bees</h2>
    <p>We went to
    <a href="https://en.wikipedia.org/wiki/Annapolis_Royal">Annapolis Royal</a> because of its
    <a href="https://historicgardens.wordpress.com">Historic Gardens</a> and wow, what a treat. I think even those who don’t see
    themselves as garden fans would enjoy an hour or more sauntering around in there.  I like taking pictures of flowers and a lot
    of these flowers had bees in them.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56034-2.png" alt="Three orange flowers, one with bee" />
    <p>This one was cute enough to reward a close-up.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56034.png" alt="Close-up of bee in orange flower." />
    <div class='caption'><p>Aren’t her wings cute?</p></div>
    <p>And I ask, what could be better than a cute bee in a pretty flower? Obviously, <em>two</em> bees.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56040.png" alt="Two bees in an orange flower" /> 
    <p>And again, a closer look.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56040-2.png" alt="Two bees in an orange flower, close-up" />
    <p>Bees are admirable creatures and I don’t want to make fun of them, but this surprised-looking little citizen makes me
    laugh. (She’s just navigating from one blossom to the next.)</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56045.png" alt="bee caught in flight among the blossoms" />
    <h2 id='p-3'>Lens</h2>
    <p>All of these are shot with Fujifilm’s
    <a href="https://www.fujifilm-x.com/en-ca/products/lenses/xf55-200mmf35-48-r-lm-ois/">55-200mm</a> lens, which I’ve had for at
    least eleven years. Up till now, I’ve always pointed it at faraway things, but wow, I think I’ll be taking this to more gardens
    in future.</p>
    <p>I mention the lens partly so I can link to this
    <a href="https://www.lensrentals.com/blog/2016/02/the-long-awaited-scary-and-amazing-fuji-lens-teardown/?srsltid=AfmBOorQfgob6drIXwtTJ9xuixBbnSvZE2F8x7Jba0AA3U60uoFAB3gY">awesome
    (and funny) teardown piece</a> from Lensrentals.</p>
    <p>And, on the way out, let’s let that lens show off with a couple of roses.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56057.png" alt="Yellow rose and bud" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56058.png" alt="Pink roses, black background" />
    <p>Remember, pink and black are the colors of rock &amp; roll.
    And if you’re anywhere near Annapolis Royal, stop and visit that garden.</p>
</div></content></entry>

<entry>
 <title>Maritime Vacation</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/08/27/Maritime-Vacation' />
 <link rel='replies'        thr:count='0'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/08/27/Maritime-Vacation#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/08/27/Maritime-Vacation</id>
 <published>2025-08-27T12:00:00-07:00</published>
 <updated>2025-08-28T12:36:15-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Places/Maritimes' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Places' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Maritimes' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>The sound of the wind surging through birchy Eastern woods isn’t like the same coastal gusts in my own Pacific rain     forest; around you not above you, alto not baritone. The colors differ too: Forests, houses, soil, and sea. And everywhere     little white churches, each with its cemetery. A scattering of forts, far too many cannons.  And everything faces the sea</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>The sound of the wind surging through birchy Eastern woods isn’t like the same coastal gusts in my own Pacific rain
    forest; around you not above you, alto not baritone. The colors differ too: Forests, houses, soil, and sea. And everywhere
    little white churches, each with its cemetery. A scattering of forts, far too many cannons.  And everything faces the sea.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250814_142523016.png" alt="Cape Breton forest" />
    <div class='caption'><p>Birchy Cape Breton forest.</p></div>
    <p>For the first time since Covid and, more important, since Lauren’s 2½-year battle with Long Covid, we went on the road for
    pleasure; Lauren and I and our dear friend Sally from Warragul, Australia. To my shame, all my decades’ travel had never taken
    me to Canada east of Montreal, so we spent a couple of weeks poking around Nova Scotia and Prince Edward Island, plus a bit of
    New Brunswick. I took many pictures and it’ll take a few blog pieces to share those that I think deserve it.</p>
    <p>No part of Canada’s settler culture is old by European or Asian standards, but ten generations of white people
    lived and died here before the first rough town organized itself near what’s now Vancouver. They had to be buried someplace, thus the
    graveyards everywhere you go. These were captured near Whycocomagh.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55871.png" alt="Gravestone of Lillian S. DeWolfe, 1876-1958" />
    <div class='caption'><p>Lillian S. DeWolfe, Oct 1876 Sept 1958.</p></div>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55874.png" alt="A simple grave marker saying only “sleeping”" />
    <p>How long will it still matter that my hometown is one of the world’s youngest big cities?</p>
    <p>Many graveyards are church attachments, but many more greet you at a random turn in the road; always framed by forest.
    The density of churches is remarkable; all built of wood, mostly white, mostly well-kept. This one was attached to the graves
    above and is untypically faded (but lovely inside).</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55869.png" alt="Square white wooden church, it needs a paint job" />
    <p>Some of the churches have become boutiques and breweries, but those that haven’t still occur more densely than in any other
    New World jurisdiction I’ve seen. Why should faith hold stronger down East?</p>
    <p>Another church, St Dunstan’s Basilica in Charlottetown, offered perhaps the most intense experience of the whole trip,
    because a singer and organist were practicing elaborate hymn treatments. Both were great, the organ is a magnificent Casavant,
    and parish organist
    <a href="https://en.wikipedia.org/wiki/Leo_Marchildon">Leo Marchildon</a> was having fun, putting lots of wind through those
    pipes including the 32’ bass monsters.  My ears and I were smiling when we left.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55925.png" alt="Stained glass in St. Dunstan’s Basilica, Charlottetown" />
    <div class='caption'><p>The stained glass is nothing special<br/>but I liked the opened panes at the bottom.</p></div>
    <p>Forts and cannons, I said; the Maritimes’ messy history included repeated captures and recaptures by the forces of France and
    Britain and the USA, and quite a few of the forts had been put to their intended use, repelling or falling to one invader or
    another.</p>
    <p>The locals, at least the ones who set things up for tourists, seem to take their history seriously; I don’t pretend
    expertise or even much interest in it, but I have to say that some cannons have good typography.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250824_214613137.png" alt="Engraving on metal: Crown and “VR”" />
    <div class='caption'><p>“VR” is Victoria Regina of course,<br/>so sometime in the second half of the 19<sup>th</sup>
    century.</p></div>
    <p>The colors are different, and an entry later in this series will dip in gleefully and give me a platform for camera geekery.
    One expects changes in houses and vegetation when you travel four timezones away, but nothing prepared
    me for the shockingly red soil in Prince Edward Island (hereinafter PEI).</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55937.png" alt="red and blue see, red soil, wind turbines" />
    <div class='caption'><p>Past Tignish at PEI’s northern extremity,<br/>well off the paved-roads part.</p></div>
    <p>I opened with words about everything facing the sea. Not entirely true, sometimes you’re looking at a lake.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250823_162017189.png" alt="Kids in a large calm lake, circular ripples" />
    <div class='caption'><p>Those kids don’t know how lucky they are.</p></div>
    <p>This is in the wonderful Kejimkujik National Park in central Nova Scotia, mostly closed due to extreme wildfire peril.</p>
    <p>All across the Maritimes, drought was in effect; crops failing, forest trails closed. Which reminds me; near that lake there was a
    birch-bark-canoe workshop. I asked the guy making the canoe how long it took. He said “My great-grandpa could do it in seven days,
    because back then there were birch trees big enough that you could make the whole hull out of a single piece.”  It’s very
    difficult to find any aspect of life on earth that isn’t exhibiting Anthropocene damage.</p>
    <p>Usually, it’s the sea that you’re looking at.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT56066.png" alt="Nova Scotia coastline near Annapolis Royal" />
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250822_223613924.png" alt="rocky beach at low tide" />
    <div class='caption'><p>Above, coastline near Annapolis Royal.<br/>Below, low tide near Chipman Brook.</p></div>
    <p>From one end of Canada to the other; to me, the surprise was not so much the difference in the landscapes but the similarity
    of the people; they spoke my accent, shopped in my stores, obeyed my road signs. More on that later. For now, this.</p>
    <img src="https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250825_141305938.png" alt="Trees frame the seawater and a couple of oceanfront houses" />
    <div class='caption'><p>On Bell Island, among the LaHaves.</p></div>
</div></content></entry>

<entry>
 <title>RFC 9839 and Bad Unicode</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/08/14/RFC9839' />
 <link rel='replies'        thr:count='3'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/08/14/RFC9839#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/08/14/RFC9839</id>
 <published>2025-08-14T12:00:00-07:00</published>
 <updated>2025-08-23T03:17:06-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Text' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Text' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>Unicode is good. If you’re designing a data structure or protocol that has text fields, they should contain     Unicode characters encoded in UTF-8. There’s another question, though:     “<em>Which</em> Unicode characters?” The      answer is “Not all of them, please exclude some.”</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>Unicode is good. If you’re designing a data structure or protocol that has text fields, they should contain
    Unicode characters encoded in UTF-8. There’s another question, though:
    “<em>Which</em> Unicode characters?” The 
    answer is “Not all of them, please exclude some.”</p>
    <p>This issue keeps coming up, so Paul Hoffman and I put together an individual-submission draft
    to the IETF and now (where by “now” I mean “two years later”) it’s been published as
    <a href="https://www.rfc-editor.org/rfc/rfc9839.html">RFC 9839</a>. It explains which characters are bad, and why, then offers
    three plausible less-bad subsets that you might want to use.
    Herewith a bit of background, but…</p>
    <h2 id='p-2'>Please</h2>
    <p>If you’re actually working on something new that will have text fields, please read the RFC. It’s only ten pages long, and that’s
    with all the IETF boilerplate. It’s written specifically for software and networking people.</p>
    <h2 id='p-3'>The smoking gun</h2>
    <p>The badness that 9839 focuses on is “problematic characters”, so let’s start with a painful example of what that means.
    Suppose you’re designing a protocol that uses JSON and one of your constructs has a <code>username</code> field.
    Suppose you get this message (I omit all the non-<code>username</code> fields). It’s 
    a perfectly legal JSON text:</p>
    <div class="highlight"><pre><span></span><span class="p">{</span>
  <span class="w">  </span><span class="nt">&quot;username&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;\u0000\u0089\uDEAD\uD9BF\uDFFF&quot;</span>
<span class="p">}</span>    </pre></div>
    <p>Unpacking all the JSON escaping gibberish reveals that the value of the <code>username</code> field contains four 
    numeric “code points” identifying Unicode characters:</p>
    <ol>
      <li><p>The first code point is zero, in Unicode jargon <code>U+0000</code>. In human-readable text it
      has no meaning, but it will interfere with the operation of certain programming languages.</p></li>
      <li><p>Next is Unicode <code>U+0089</code>, official name “CHARACTER TABULATION WITH JUSTIFICATION”. It’s what Unicode calls a
      <a href="https://en.wikipedia.org/wiki/C0_and_C1_control_codes">C1
      control code</a>, inherited from ISO/IEC 6429:1992, adopted from 
      <a href="https://www.ecma-international.org/wp-content/uploads/ECMA-48_5th_edition_june_1991.pdf">ECMA 48</a> (1991), which calls it
      “HTJ” and says: <i>HTJ causes the contents of the active field (the field in the presentation component that contains the
      active presentation position) to be shifted forward so that it ends at the character position preceding the
      following character tabulation stop. The active presentation position is moved to that following character
      tabulation stop. The character positions which precede the beginning of the shifted string are put into the
      erased state.</i></p>
      <p>Good luck with that.</p></li>
      <li><p>The third code point, <code>U+DEAD</code>, in Unicode lingo, is an “unpaired surrogate”.  To understand,
      you’d have to learn how Unicode’s much-detested
      <a href="https://en.wikipedia.org/wiki/UTF-16">UTF-16</a> encoding works.
      I recommend not bothering.</p>
      <p>All you need to know is that surrogates are only meaningful when they come in pairs in UTF-16 encoded text. There is
      effectively no such text on the wire and thus no excuse for tolerating surrogates in your data. In fact, the UTF-8 specification
      says that you mustn’t use UTF-8 to encode surrogates. But the real problem is that different libraries in different
      programming languages don’t always do the same things when they encounter this sort of fœtid interloper.</p>    </li>
      <li><p>Finally, <code>\uD9BF\uDFFF</code> is JSON for the code point <code>U+7FFFF</code>.
      Unicode has a category called “noncharacter”, containing a few dozen code points that, for a variety of
      reasons, some good, 
      don’t represent anything and must not be interchanged on the wire. <code>U+7FFFF</code> is one of those.</p></li>
    </ol>
    <p>The four code points in the example are all clearly problematic. 
    The just-arrived RFC 9839 formalizes the notion of “problematic” and
    offers easy-to-cite language saying which of these problematic types you want to
    exclude from your text fields. Which, if you’re going to use JSON, you should probably do.</p>
    <h2 id='p-6'>Don’t blame Doug</h2>
    <p>Doug Crockford I mean, the inventor of JSON.  If he (or I or really anyone careful) were inventing JSON now that Unicode is
    mature, he’d have been fussier about its character repertoire. Having said that, we’re stuck with JSON-as-it-is forever, so we
    need a good way to say which of the problematic characters we’re going to exclude even if JSON allows them.</p>
    <h2 id='p-5'>PRECISion</h2>
    <p>You may find yourself wondering why the IETF waited until 2025 to provide help with Bad Unicode.
    It didn’t; here’s
    <a href="https://www.rfc-editor.org/rfc/rfc8264.html">RFC 8264</a>: <cite>PRECIS Framework: Preparation, Enforcement, and
    Comparison of Internationalized Strings in Application Protocols</cite>; the first PRECIS predecessor was published in 2002.
    8264 is 43 pages long, containing a <em>very</em>
    thorough discussion of many more potential Bad Unicode issues than 9839 does.</p>
    <p>Like 9839, PRECIS specifies subsets of the Unicode character repertoire and goes further, providing a mechanism for defining
    more.</p>
    <p>Having said that, PRECIS doesn’t seem to be very widely used by people who are defining new data structures and protocols. My
    personal opinion is that there are two problems which make it hard to adopt. First, it’s large and 
    complex, with many moving parts, and requires careful study to understand. Developers are (for good reason) lazy.</p>
    <p>Second, using PRECIS ties you to a specific version of Unicode. In particular, it forbids the use of the (nearly a million)
    unassigned code points. Since each release of Unicode includes new code point assignments, that means that a sender and receiver
    need to agree on exactly which version of Unicode they’re both going to use if they want reliably interoperable behavior. This
    makes life difficult for anyone writing a general-purpose code designed to be used in lots of different applications.</p>
    <p>I personally think that the only version of Unicode anybody wants to use is “as recent as possible”, so they can be confident
    of having all the latest emojis.</p>
    <p>Anyhow, 9839 is simpler and dumber than PRECIS. But I think some people will find it useful and now the IETF agrees.</p>
    <h2 id='p-7'>Source code</h2>
    <p>I’ve written a little Go-language library to validate incoming text fields against each of the three subsets that 9839
    specifies,
    <a href="https://github.com/timbray/RFC9839">here</a>.  I don’t claim it’s optimal, but it is well-tested.</p>
    <p>It doesn’t have a version number or release just yet, I’ll wait till a few folk have had a chance to spot any dumb mistakes I
    probably made.</p>
    <h2 id='p-9'>Details</h2>
    <p>Here’s a compact summary of the world of problematic Unicode code points and data formats and standards.</p>
    <table>
      <tr valign="top" align="center"><td class="empty"></td><th colspan="3">Problematic classes excluded?</th></tr>
      <tr valign="top"><td class="empty"></td><th>Surrogates</th><th>Legacy controls</th><th>Noncharacters</th></tr>
      <tr align="center"><td>CBOR</td><td class="happy">yes</td><td class="unhappy">no</td><td class="unhappy">no</td></tr>
      <tr align="center"><td>I-JSON</td><td class="happy">yes</td><td class="unhappy">no</td><td class="happy">yes</td></tr>
      <tr align="center"><td>JSON</td><td class="unhappy">no</td><td class="unhappy">no</td><td class="unhappy">no</td></tr>
      <tr align="center"><td>Protobufs</td><td class="unhappy">no</td><td class="unhappy">no</td><td class="unhappy">no</td></tr>
      <tr align="center"><td>TOML</td><td class="happy">yes</td><td class="unhappy">no</td><td class="unhappy">no</td></tr>
      <tr align="center"><td>XML</td><td class="happy">yes</td><td class="neutral">partial [1]</td><td class="neutral">partial [2]</td></tr>
      <tr align="center"><td>YAML</td><td class="happy">yes</td><td class="neutral">mostly [3]</td><td class="neutral">partial [2]</td></tr>
      <tr valign="top" align="center"><td class="empty"></td><th colspan="3">RFC 9839 Subsets</th></tr>
      <tr align="center"><td>Scalars</td><td class="happy">yes</td><td class="unhappy">no</td><td class="unhappy">no</td></tr>
      <tr align="center"><td>XML</td><td class="happy">yes</td><td class="neutral">partial</td><td class="neutral">partial</td></tr>
      <tr align="center"><td>Assignables</td><td class="happy">yes</td><td class="happy">yes</td><td class="happy">yes</td></tr>
    </table>
    <p>Notes:</p>
    <p><b>[1]</b> XML allows C1 controls.</p>
    <p><b>[2]</b> XML and YAML don’t exclude the noncharacters outside the Basic Multilingual Pane.</p>
    <p><b>[3]</b> YAML excludes all the legacy controls except for the mostly-harmless <code>U+0085</code>, another version of
    <code>\n</code> used in IBM mainframe documents.</p>
    <h2 id='p-8'>Thanks!</h2>
    <p>9839 is not a solo production. It received an extraordinary amount of discussion and improvement from a lot of smart and
    well-informed people 
    and the published version, 15 draft revisions later, is immensely better than my initial draft. My sincere thanks go to my
    co-editor Paul Hoffman and to all those mentioned in the RFC’s “Acknowledgements” section.</p>
    <h2 id='p-4'>On individual submissions</h2>
    <p>9839 is the second “individual submission” RFC I’ve pushed through the IETF (the other is
    <a href="https://datatracker.ietf.org/doc/html/rfc7725">RFC 7725</a>, which registers the HTTP 451 status code).  While it’s nice
    to decide something is worth standardizing and eventually have that happen, it’s really a lot of work. Some of that work is
    annoying.</p>
    <p>I’ve been involved in
    other efforts as Working-Group member, WG chair, and WG specification editor, and I can report authoritatively that creating an
    RFC the traditional way, through a Working Group, is easier and better.</p>
    <p>I feel discomfort advising others not to follow in my footsteps, but in this case I think it’s the right advice.</p>
</div></content></entry>

<entry>
 <title>Long Links</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/08/04/Long-Links' />
 <link rel='replies'        thr:count='1'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/08/04/Long-Links#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/08/04/Long-Links</id>
 <published>2025-08-04T12:00:00-07:00</published>
 <updated>2025-08-07T11:14:33-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>All of these <cite>Long Links</cite> pieces have begun with more or less the same words, so why     stop now?  This is an annotated parade of links to long-form pieces. Most people won’t have the time     (nor the weird assortment of interests) to consume them all, but I hope that most readers will find one     or two      reward a visit</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>All of these <cite>Long Links</cite> pieces have begun with more or less the same words, so why
    stop now?  This is an annotated parade of links to long-form pieces. Most people won’t have the time
    (nor the weird assortment of interests) to consume them all, but I hope that most readers will find one
    or two 
    reward a visit.</p>
    <h2 id='p-2'>Radisson (and Groseilliers)</h2>
    <p>I don’t know if it is still the case, but in my youth, Canadian elementary education included several overexcited units
    about the
    <a href="https://en.wikipedia.org/wiki/Coureur_des_bois"><i>Coureurs des bois</i></a>, early European settlers 
    in “New France” (now Québec) who ventured, by foot and canoe, far to the north and west, mostly engaged in trading with the
    indigenous peoples: trinkets (and later, serious hardware including guns) for furs.</p>
    <p>The names I remembered were Radisson and Groseilliers, but I don’t recall learning much about who they were and what
    they did. Then I ran across the 2019 book
    <a href="https://www.biblioasis.com/shop/non-fiction/bush-runner-the-life-and-times-of-pierre-esprit-radisson/">Bush Runner:
    The Adventures of Pierre-Esprit Radisson</a> and, wow… The writing is pedestrian but who cares because what a
    story! Radisson lived an absolutely astonishing life. He went as deep into the bush as anyone of his era, interacted intensely
    with the indigenous people as business partner, friend, and foe, worked for Charles of England and Louis of France (changing
    sides several times), in 1670 founded the Hudson’s Bay Company (recently, 355 years later, deceased), and fortunately took
    notes, a copy of which was preserved by Samuel Pepys.</p>
    <p>I learned more from this book’s pages about the early history of Upper and Lower Canada than all those elementary-school
    units had to offer, and had loads of fun doing so.  I guess this is a fairly Canadian-specific Long Link, but I think anyone
    interested in the early history of Europeans in North America would find much to enjoy.</p>
    <h2 id='p-4'>Music</h2>
    <p>It’s rare these days that I discover interesting new musicians, but here are two of those rarities.</p>
    <p><a href="https://luciehorsch.com">Lucie Horsch</a> plays recorder, you know, the cheap plastic thing they use to introduce
    second-graders to music. It’s actually a lovely instrument and I wish we would switch to its German name, 
    “Blockflöte”, which to my ear sounds a bit like the instrument does. Anyhow, check out this YouTube entitled only
    <a href="https://www.youtube.com/watch?v=LJyl2D16PZY&amp;list=RDLJyl2D16PZY&amp;start_radio=1">Lucie Horsch - Bach</a>,
    annoyingly omitting any mention of <em>which</em> Bach. Annoyance aside, it’s a pretty great performance, Ms Horsch is the real
    deal, full of virtuosity and grace.</p>
    <p>I got an unusual mid-week message from Qobuz, all excited about 
    <a href="https://transgressiverecords.com/artist/the-new-eves/">The New Eves’</a> new record <cite>The New Eve Is
    Rising</cite>. So I played it in the car on a long crosstown drive and now I’m all excited too. The New Eves are
    talented, musically surprising, and above all, insanely brave.</p>
    <p>Their music doesn’t sound like anything else and
    flies in the face of all conventional wisdom concerning popular music. They take absurd chances and yeah, the album has klunkers
    amid the bangers, but when I got to its end I went back and started at the beginning again. I found myself
    smiling ear-to-ear over and over. Maybe I’m being a bit over-the-top here, but check them out: 
    <a href="https://www.youtube.com/watch?v=l9Q9ge6j_O4&amp;list=RDl9Q9ge6j_O4&amp;start_radio=1">Mother</a> is live.
    <a href="https://www.youtube.com/watch?v=MovNWuNPXXE&amp;list=RDMovNWuNPXXE&amp;start_radio=1">Cow Song</a> is off the new
    album and strong albeit with forgettable video.</p>
    <h2 id='p-3'>Life online</h2>
    <p>Every Long Links has hardcore-geek threads and there is no harder core imaginable than Filippo Valsordi’s
    <a href="https://words.filippo.io/assembly-mutation/">Go Assembly Mutation Testing</a>. I have always admired (but never
    actually used) mutation testing, and Filippo offers a convincing argument that it moves catching certain classes of bug from
    nearly impossible to pretty easy. Good stuff!</p>
    <p>And of course we can’t ignore genAI and programming. Most of you are likely aware of 
    <a href="https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/">Measuring the Impact of Early-2025 AI on
    Experienced Open-Source Developer Productivity</a>, but I’m linking again to boost its visibility, because hard
    quantitative research on methodology is damn rare in our profession. I will confess to being a little (but just a little)
    surprised at the conclusions.</p>
    <p>It is apparently quite possible that Intel will exit the business of making high-end chips, leaving TSMC with a global
    monopoly:
    <a href="https://d2d.substack.com/p/d2d-contd-intel-and-the-wide-open">Intel and the Wide Open Barn Doors</a>.
    This is an unsettling prospect.
    Not, I have to say, surprising though. I’ve sneered at Intel leadership cluelessness for years and years, see
    <a href="/ongoing/When/200x/2006/01/14/On-Intel">here</a> and
    <a href="/ongoing/When/200x/2006/02/16/Viiv-Jive">here</a>.</p>
    <p>Finally, here’s the charmingly-titled
    <a href="https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/">How to Surf the Web in 2025, and
    Why You Should</a>. I love this piece.</p>
    <h2 id='p-1'>Class Reductionism</h2>
    <p>The news keeps making me want to build something around the <code>classreductionist.org</code> domain name I’ve owned for
    years.</p>
    <p>The tl;dr on Class Reductionism is something like “In the best possible world it’ll take generations to disassemble the
    global tangle of intersectional oppression, but we could treat the symptoms effectively <em>right now this year</em> by sending
    money to the poor. I’m talking about Universal Basic Income or suchlike. I wrote a
    <a href="/ongoing/When/202x/2023/01/16/Class-Reductionism">couple thousand words</a> on the subject back in 2023, and there are
    complexities, and I probably won’t put up that site. But I still do maintain that a very high proportion of our societal pain is
    rooted in the egregious inequality, and consequent poverty, that seems a baked-in feature of Late Capitalism.</p>
    <p>Let’s start with Nobelist Paul Krugman, who’s been writing an “Understanding Inequality” series on his paywalled newsletter
    and then republishing a gratis version, start
    <a href="https://stonecenter.gc.cuny.edu/tag/focus-inequality/">here</a>.  Very data-dense and educational.
    Hmm, that site is slow; there’s a livelier table of contents
    <a href="https://paulkrugman.substack.com/p/i-coulda-made-a-better-deal">here</a>.</p>
    <p>Don’t kid yourself that this is just an American problem, see
    <a href="https://www.nytimes.com/2025/06/23/business/china-upward-mobility-inequality.html?unlocked_article_code=1.cE8.Ptfc.XicZ0XVgHPsJ&amp;smid=url-share">‘The Better Life Is Out of Reach’: The Chinese Dream Is Slipping Away</a>.</p>
    <p>Let’s pull the impersonal veil of facts and figures aside and focus on the human experience of what we used to call Class Struggle.
    <a href="https://macleans.ca/society/confessions-of-the-working-poor/">Confessions of the Working Poor</a> is beautifully
    written and opened my eyes to lifestyle choices that I didn’t even know some people have to make.</p>
    <p>But hey, there are people who are just fine with this: 
    <a href="https://finance.yahoo.com/news/deltas-premium-play-is-taking-advantage-of-the-growing-economic-split-100044776.html">Delta's
    premium play is taking advantage of the growing economic split</a>.</p>
    <p>Look, being class-determinist-adjacent doesn’t mean you should ignore intersectional awfulness: 
    <a href="https://www.newyorker.com/magazine/2025/08/04/the-plunder-of-black-america-calvin-schermerhorn-book-review">What We
    Miss When We Talk About the Racial Wealth Gap</a>.</p>
    <h2 id='p-5'>No more sections</h2>
    <p>The remaining Long Links refused to be organized so I had to turn them loose; call it the Long Tail.</p>
    <p><a href="https://articles.c-a-s-t.com/the-venetian-origins-of-roman-type-a856eb3f0cb">The Venetian origins of roman
    type</a>. You might think you don’t care about typography but still enjoy the pictures and descriptions here.</p>
    <!--
    <p><a href="https://www.newyorker.com/magazine/2025/07/28/mary-had-schizophrenia-then-suddenly-she-didnt">Mary Had
    Schizophrenia—Then Suddenly She Didn’t</a></p>-->
    <p>This guy is a full-time
    <a href="https://urbancoyoteresearch.com/researcher/stanley-d-gehrt-phd">Coyote researcher</a>. What a great gig! I’m an admirer
    of those animals and how they’ve carved themselves a comfy niche in most of North America’s big cities.  (Even if it means that
    you better not let your cat out at night.) They’re also remarkably attractive.</p>
    <p>Here’s another long list of Long Links, and many of you will wonder why anyone would choose to browse it:
    <a href="https://petapixel.com/2025/07/18/the-best-camera-stores-in-tokyo-the-ultimate-guide/">The Best Camera Stores in
    Tokyo: The Ultimate Guide</a>. Some of the interiors are remarkable.</p>
    <p>Oh, while we’re on the subject of photography: 
    <a href="https://petapixel.com/2025/07/22/a-photojournalist-took-a-fujifilm-instax-camera-to-a-cartel-wedding/">A
    Photojournalist Took a Fujifilm Instax Camera to a Mexican Cartel Wedding</a>.</p>
    <p>GLP-1’s (i.e. Ozempic and friends) would probably dominate a large section of the news if weren’t for all the political
    craziness. Here’s one small example: 
    <a href="https://www.glp1digest.com/p/how-glp-1s-are-breaking-life-insurance">How GLP-1s Are Breaking Life Insurance</a>.</p>
    <p>Science is hard. There are lots of largely-unsolved areas, and “gap-map.org” tries to organize them:
    <a href="https://www.gap-map.org/?sort=rank&amp;utm_source=substack&amp;utm_medium=email&amp;fields=astrophysics">Fundamental
    Development Gap Map v1.0</a>. The UI is a little klunky but the thing still sucked me right in.</p>
    <p>I’m going to give the last word to Laurie Penny. I don’t know what we’d do without her.
    <a href="https://lauriepenny.substack.com/p/in-a-time-of-monsters-do-we-have">In a time of monsters: do we have any ideas for
    surviving the zombie apocalypse that aren’t nightmare patriarchy?</a></p>
</div></content></entry>

<entry>
 <title>De-Google Project Update</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/07/29/DeGoogling' />
 <link rel='replies'        thr:count='20'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/07/29/DeGoogling#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/07/29/DeGoogling</id>
 <published>2025-07-29T12:00:00-07:00</published>
 <updated>2025-07-31T12:06:18-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World/Life Online/De-Google' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='The World' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Life Online' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='De-Google' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I     <a href='/ongoing/When/202x/2024/03/09/DeGoogling'>introduced this family project</a> in the spring of 2024.     I won’t reproduce those arguments for why we’re working on this, but in the current climate I feel like I hardly need to.     Since that post, our aversion to Google dependency has only grown stronger. Progress has been non-zero but not fast</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>I
    <a href="/ongoing/When/202x/2024/03/09/DeGoogling">introduced this family project</a> in the spring of 2024.
    I won’t reproduce those arguments for why we’re working on this, but in the current climate I feel like I hardly need to.
    Since that post, our aversion to Google dependency has only grown stronger. Progress has been non-zero but not fast.</p>
    <p>Here’s the table, with progress notes below.</p>
    <table>
      <tr valign="top"><th>Need</th><th>Supplier</th><th>Alternatives</th></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-3">Office</a></td>
	<td class="unhappy">Google Workspace</td>
	<td>Proton?</td>
      </tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-17">Data sharing</a></td>
	<td class="happy">Dropbox</td>
      <td></td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-17">Photos</a></td>
	<td class="unhappy">Google Photos</td>
      <td>Dropbox?</td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-16">Video meetings</a></td>
	<td class="unhappy">Google
	Meet</td>
      <td>Jitsi, Signal?</td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-10">Maps</a></td>
	<td class="unhappy">Google Maps</td>
      <td>Magic Earth, Here, something OSM-based?</td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-4">Browser</a></td>
	<td class="happy">Safari, Firefox, Vivaldi, LibreWolf</td>
      <td></td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-12">Search</a></td>
	<td class="unhappy">Google</td>
      <td>Bing-based options, Kagi?</td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-5">Chat</a></td>
	<td class="happy">Signal</td>
      <td></td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-6">Photo editing</a></td>
	<td class="neutral">Adobe
	Lightroom &amp; Nik</td>
      <td>Capture One, Darktable, ?</td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-7">In-car interface</a></td>
	<td class="neutral">Google Android Auto</td>
      <td>Automaker software</td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-8">Play my music</a></td>
	<td class="happy">Plex, USB</td>
      <td></td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-9">Discover music</a></td>
	<td class="happy">Qobuz</td>
	<td></td></tr>
      <tr valign="top">
	<td><a href="/ongoing/When/202x/2024/03/09/DeGoogling#p-13">TV</a></td>
	<td class="neutral">Roku, Apple, migration</td>
      <td></td></tr>
    </table>
    <p>Pink indicates a strong desire to get off the incumbent service, green means we’re happy-ish with what we’re using, and blue
    means that, happy or not, it’s not near the top of the priority list.</p>
    <p>I’ll reproduce the metrics we care about when looking to replace Google products, some combination of:</p>
    <ol>
      <li><p>Not ad-supported</p></li>
      <li><p>Not VC-funded</p></li>
      <li><p>Not Google, Microsoft, or Amazon</p></li>
    </ol>
    <p>The list used to include “Open Source” but I decided that while that’s good, it’s less important than the other three criteria.</p>
    <p>Now let’s walk down the chart.</p>
    <h2 id='p-3'>Office</h2>
    <p>This is going to be a wrenching transition; we’ve been running the family on Google stuff forever, and I anticipate
    muscle-memory pain. But increasingly, using Google apps feels like being in enemy territory. And, as I said last time, I
    will not be sorry to shake the dust of Google Drive and Docs from my heels, I find them clumsy and am 
    always having trouble finding something that I know is in there.</p>
    <p>While I haven’t dug in seriously yet, I keep hearing reasonably-positive things about Proton, and nothing substantive to
    scare me away.  Wish us luck.</p>
    <h2 id='p-17'>Data sharing (progress!)</h2>
    <p>Dropbox is, eh, OK. It doesn’t seem actively evil, there’s no advertising, and the price is low.</p>
    <h2 id='p-21'>Photos</h2>
    <p>We’re a four-Android family including a couple of prolific photographers, and everything just gets pumped into Google and
    then it fills up and then they want more money.  If we could configure the phones to skip Google and go straight to Dropbox,
    that would be a step forward.</p>
    <h2 id='p-16'>Video meetings</h2>
    <p>Google meet isn’t painful but I totally suspect it of data-mining what should be private conversations. I’m getting the
    feeling that the technical difficulty of videoconferencing is going steadily down, so I’m reasonably optimistic that
    something a little less evil will come along with a fair price.</p>
    <h2 id='p-10'>Maps</h2>
    <p>The fear and loathing that 
    <a href="/ongoing/When/201x/2017/06/29/Fear-Google-Reviews">I started feeling in 2017</a> grows only stronger.  But replacements
    aren’t obvious.
    It’s a pity, maps
    and directions and reviews feel like a natural monopoly that should be a public utility or something, rather than a corporate moat.</p>
    <h2 id='p-4'>Browser (progress!)</h2>
    <p>Chrome has seriously started making my flesh crawl; once again, enemy territory. Fortunately, there are lots of good options.
    Even people like us who have multiple lives we need to keep separate can find enough better browsers out there.</p>
    <p>Maybe I’ll have a look at one of the new genAI-company browsers ha ha just kidding.</p>
    <h2 id='p-12'>Search</h2>
    <p>The reports on Kagi keep being positive and giving it a try is definitely on the To-Do list.</p>
    <h2 id='p-5'>Chat</h2>
    <p>Signal is the only sane choice at this point in history for personal use.</p>
    <h2 id='p-6'>Photo editing</h2>
    <p>Adobe’s products are good, and I’m proficient and happy with Lightroom, but they are definitely suffering from bad genAI
    craziness. Also the price is becoming unreasonable.</p>
    <p>I’ve had a few Lightroom software failures in recent months and if that
    becomes a trend, looking seriously at the alternatives will move to the top of the priority list.</p>
    <h2 id='p-7'>In-car interface</h2>
    <p>It’s tough, Android Auto is a truly great product. I think I’m stuck here for now, particularly given that I plan to be
    driving a <a href="/ongoing/What/The%20World/Jaguar%20Diary/">2019-model-year car</a> for the foreseeable future. Also, it
    supports my music apps.</p>
    <h2 id='p-9'>Discover music and play mine (progress!)</h2>
    <p>Progress here. I’ve almost completely stopped using YouTube Music in favor of Plex and Qobuz. Really no downside; YTM has
    more or less completely lost the ability to suggest good new stuff.</p>
    <h2 id='p-13'>TV</h2>
    <p>Video continues morphing itself into Cable TV redux. We have an old Roku box that works fine and I think I’ve managed to find
    its don’t-spy-on-us settings. We’ll keep subscribing to Apple+ as long as they keep shipping great shows.  I have zero regrets
    about having
    <a href="/ongoing/When/202x/2025/03/06/Canceled-Prime">left Prime behind</a>.</p>
    <p>As for the rest, we’ve become migrants,
    exclusively month-at-a-time subscriptions for the purpose of watching some serial or sports league, unsubscribe after the season
    finale or championship game. The good news is that I
    haven’t encountered much friction in unsubscribing, just a certain amount of earnest pleading.</p>
    <h2 id='p-20'>Looking forward</h2>
    <p>I have yet to confront any of the really hard parts of this project, but the sense of urgency is increasing. Let’s see.</p>
</div></content></entry>

<entry>
 <title>QRS: Finite-state Struggles</title>
 <link href='https://www.tbray.org/ongoing/When/202x/2025/07/21/Automaton-merge-war' />
 <link rel='replies'        thr:count='2'        type='application/xhtml+xml'        href='/ongoing/When/202x/2025/07/21/Automaton-merge-war#comments' />
 <id>https://www.tbray.org/ongoing/When/202x/2025/07/21/Automaton-merge-war</id>
 <published>2025-07-21T12:00:00-07:00</published>
 <updated>2025-07-22T09:10:25-07:00</updated>
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Quamina Diary' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Quamina Diary' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Technology/Software' />
 <category scheme='https://www.tbray.org/ongoing/What/' term='Software' />
 <summary type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>I just posted a big     <a href='https://github.com/timbray/quamina'>Quamina</a> PR representing months of work, brought on     by the addition of a small basic regular-expression feature.  This ramble doesn’t exactly have a smooth story arc but I’m     posting it anyhow because I know there are people     out there interested in state-machine engineering and they are my people</div></summary>
<content type='xhtml'><div xmlns='http://www.w3.org/1999/xhtml'>
    <p>I just posted a big
    <a href="https://github.com/timbray/quamina">Quamina</a> PR representing months of work, brought on
    by the addition of a small basic regular-expression feature.  This ramble doesn’t exactly have a smooth story arc but I’m
    posting it anyhow because I know there are people
    out there interested in state-machine engineering and they are my people.</p>
    <p>As far as I can tell, a couple of the problems I’m trying to solve
    haven’t been addressed before, at least not by anyone who published their findings.
    Partly because of that, I’m starting to wonder if all
    <a href="/ongoing/What/Technology/Quamina%20Diary/">these disorderly Quamina postings</a> might
    be worked into a small book or monograph or something. State machines are really freaking useful software constructs!
    So yeah, this is a war story not an essay, but if you like finite automata you’ll likely be interested in bits of it.</p>
    <h2 id='p-1'>The story thus far</h2>
    <p>Prior to beginning work on Regular Expressions, I’d already wired shell-style “<code>*</code>” wildcards into Quamina, which
    forced me to start working with NFAs and ε-transitions. The implementation wasn’t crushingly difficult, and
    the performance was… OK-ish.</p>
    <p>Which leads me to The Benchmark From Hell.
    I wondered how the wildcard functionality would work under heavy stress, so I pulled in a list of 12,959 five-letter strings
    from the Wordle source code, and inserted a “<code>*</code>” at a random position in each. Here are the first ten:</p>
    <blockquote><pre><code>aalii*
*aargh
aar*ti
abaca*
a*baci
a*back
ab*acs
ab*aft
abak*a</code></pre></blockquote>
    <p>I created an NFA for each and merged them together
    <a href="/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata">as described here</a>. Building and merging the automata were
    plenty fast enough, and the merged NFA had 46,424 states, which felt reasonable.
    Matching strings against it ran at under ten thousand per second, which is pretty poor given that Quamina can do a million or
    two per second on patterns encoded in a DFA.</p>
    <p>But, I thought, still reasonably usable.</p>
    <h2 id='p-2'>The cursed “<code>?</code>”</h2>
    <p>Last year, my
    <a href="/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series">slow grind through the regexp features</a> had led me
    to the zero-or-one quantifier “<code>?</code>”.  The state machine for these things is not rocket science; there’s a discussion
    with pictures in my recent
    <a href="/ongoing/When/202x/2025/07/07/Epsilon-Wrangling#p-3">Epsilon Wrangling</a>.</p>
    <p>So I implemented that and fired off the unit tests, most of which
    <a href="/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1">I didn’t have to write</a>, and they all failed.
    Not a surprise I guess.</p>
    <p>It turned out that the way I’d implemented ε-transitions for the wildcards
    <a href="/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata#p-9">was partially wrong</a>, as in it worked for the tight-loop
    state-to-itself ε-transitions, but not for more general-purpose things like “<code>?</code>” requires.</p>
    <p>In fact, it turns out that merging NFAs is hard (DFAs are easy), and I found precious little help online.
    <a href="https://en.wikipedia.org/wiki/Thompson%27s_construction">Thompson’s construction</a> does give an answer: Make an
    otherwise-empty state with two ε-transitions, one to each of the automata, and it’ll do the right thing. Let’s call that
    a “splice state”. It’s easy to implement, so I did. Splicing is hardly “merging” in the Quamina sense, but still.</p>
    <p>Unfortunately, the performance was hideously bad, just a few matches per second while pegging the CPU.
    A glance at the final NFA was sobering; endless chains of splice states, some thousands long.</p>
    <p>At this point
    I became very unhappy and got stalled for months dealing with real-life issues while this problem lurked at the back
    of my mind, growling for attention occasionally.</p>
    <p>Eventually I let the growler out of the cave and started to think through approaches. But first…</p>
    <h2 id='p-4'>Worth solving?</h2>
    <p>Is it, really? What sane person is going to want to search for the union of thousands of regular expressions in general or
    wild-carded strings in particular?</p>
    <p>I didn’t think about this problem at all, because of my experience with Quamina’s parent,
    <a href="https://github.com/aws/event-ruler">Ruler</a>. When it became popular among several AWS and Amazon teams, people
    sometimes found it useful to match the union of not just thousands but a million or more different patterns. When you write
    software that anyone actually uses, don’t expect the people using it to share your opinions on what is and isn’t
    reasonable. So I wasn’t going to get any mental peace until I cracked this nut.</p>
    <p>I eventually decided that three approaches were worth trying:</p>
    <ol>
      <li><p>Figure out a way really to merge, not just splice, the wildcarded patterns, to produce a simpler automaton.</p></li>
      <li><p>Optimize the NFA-traversal code path.</p></li>
      <li><p>Any NFA can be transformed into a DFA, says computer-science theory. So do that, because Quamina is really fast at
      DFA-based matching.</p></li>
    </ol>
    <h2 id='p-5'>Nfa2Dfa</h2>
    <p>I ended up doing all of these things and haven’t entirely given up on any of them.
    The most intellectually-elegant was the transform-to-DFA approach, because if I did that, I could remove the fairly-complex
    NFA-traversal logic from Quamina.</p>
    <p>It turns out that the Net is rich with textbook extracts and YouTubes and slide-shows about how to do the NFA-to-DFA
    conversion. It ended up being quite a pleasing little chunk of code, only a couple hundred lines.</p>
    <p>The bad news: Converting each individual wildcard NFA to a DFA was amazingly fast, but then as I merged them in one by one,
    the number of automaton states started increasing explosively and the process slowed down so much that I never had the patience
    to let it finish. Finite-automata theory warns that this can happen, but it’s hard to characterize the cases where it does.
    I guess this one of them.</p>
    <p>Having said that, I haven’t discarded the <code>nfa2Dfa</code> code, because perhaps I ought to offer a Quamina option to
    apply this if you have some collection of patterns that you want to run really super fast and are willing to wait for a while
    for the transformation process to complete. Also, I may have missed opportunities to optimize the conversion; maybe it’s making
    more states than it needs to?</p>
    <h2 id='p-6'>Faster NFA traversal</h2>
    <p>Recently in
    <a href="/ongoing/When/202x/2025/07/07/Epsilon-Wrangling">Epsilon wrangling</a> I described how NFA traversal has to work,
    relying heavily on implementing a thing called an ε-closure.</p>
    <p>So I profiled the traversal process and discovered, unsurprisingly, that most of the time was going into memory allocation
    while computing those ε-closures. So now Quamina has an ε-closure cache and will only compute each one once.</p>
    <p>This helped a lot but not nearly enough, and the profiler was still telling me the pain was in Go’s allocation and
    garbage-collection machinery. Whittling away at this kind of stuff is not rocket science. The standard Go trick I’ve seen over
    and over is to keep all your data in slices, keep re-using them then chopping them back to <code>[:0]</code>
    for each request.  After a while they’ll have grown to the
    point where all the operations are just copying bytes around, no allocation required.</p>
    <p>Which also helped, but the speed wasn’t close to what I wanted.</p>
    <h2 id='p-7'>Merging wildcard automata</h2>
    <p>I coded multiple ways to do this, and they kept failing. But I eventually found a way to build those
    automata so that any two of them, or any one of them and a DFA, can merged and generate dramatically
    fewer ε-transition chains.  I’m not going to write this up here for two reasons: First of all, it’s not <em>that</em>
    interesting, and second, I worry that I may have to change the approach further as I go on implementing new regxp operators.</p>
    <p>In particular, at one point I was looking at the code while it wasn’t working, and I could see that if I added a particular
    conditional it would work, but I couldn’t think of a principled reason to do it. Obviously I’ll have to sort this out
    eventually. In the meantime, if you’re the sort of um special person who is now burning with curiosity, check out my branch from
    that PR and have a look at the <code>spinout</code> type.</p>
    <p>Anyhow, I added that conditional even though it puzzled me a bit, and now you can add wildcard patterns to Quamina at 80K/second,
    and my 12.9K wildcards generate an NFA with with almost 70K states, which can scan events at almost 400K/second. And that’s good
    enough to ship the <code>“?”</code> feature.</p>
    <p>By the way, I tried feeding that 70K-state automaton to the DFA converter, and gave up after it’d burned an hour of CPU and
    grown to occupy many GB of RAM.</p>
    <h2 id='p-8'>Next steps</h2>
    <p>Add “<code>+</code>” and “<code>*</code>”, and really hope I don’t have to redesign the NFA machinery again.</p>
    <p>Also, figure out the explanation for that puzzling <code>if</code> statement.</p>
    <h2 id='p-9'>And I should say…</h2>
    <p>Despite the very narrow not to say obsessive focus of this series, I’ve gotten a few bits and pieces of positive feedback. So
    there are a few people out there who care about this stuff. To all of you, thanks.</p>
</div></content></entry>

</feed>
Raw headers
{
  "accept-ranges": "bytes",
  "cf-cache-status": "DYNAMIC",
  "cf-ray": "9aa23723c7696196-ORD",
  "connection": "keep-alive",
  "content-length": "219146",
  "content-security-policy": "frame-ancestors 'self';",
  "content-type": "application/atom+xml",
  "date": "Sun, 07 Dec 2025 07:12:34 GMT",
  "etag": "\"3580a-64554ddf54a08\"",
  "last-modified": "Sun, 07 Dec 2025 04:11:03 GMT",
  "server": "cloudflare",
  "strict-transport-security": "max-age=31536000; includeSubdomains; preload",
  "x-content-type-options": "nosniff"
}
Parsed with @rowanmanning/feed-parser
{
  "meta": {
    "type": "atom",
    "version": "1.0"
  },
  "language": "en-us",
  "title": "ongoing by Tim Bray",
  "description": "ongoing fragmented essay by Tim Bray",
  "copyright": "All content written by Tim Bray and photos by Tim Bray Copyright Tim Bray, some rights reserved, see /ongoing/misc/Copyright",
  "url": "https://www.tbray.org/ongoing/",
  "self": "https://www.tbray.org/ongoing/ongoing.atom",
  "published": null,
  "updated": "2025-12-07T04:11:03.000Z",
  "generator": {
    "label": "Generated from XML source code using Perl, Expat, Emacs, Mysql, Ruby, and ImageMagick. Industrial-strength technology, baby.",
    "version": null,
    "url": "/misc/Colophon"
  },
  "image": {
    "title": null,
    "url": "rsslogo.jpg"
  },
  "authors": [
    {
      "name": "Tim Bray",
      "email": null,
      "url": null
    }
  ],
  "categories": [],
  "items": [
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics",
      "title": "Tracy Numbers",
      "description": "Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking     a class in Afro-Cuban rhythms from     Russell Shumsky, with whom I’ve studied West-African drumming for many years. Among the     basics of Afro-Cuban are the     Bell Patterns, which come straight out of Africa.     The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of     three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It     feels like it’s in four, particularly when played fast",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/12/02/Bell-Combinatorics",
      "published": "2025-12-02T20:00:00.000Z",
      "updated": "2025-12-06T19:03:30.000Z",
      "content": "<p>Here’s a story about African rhythms and cancer and combinatorics. It starts a few years ago when I was taking\n    a class in Afro-Cuban rhythms from\n    <a href=\"https://drumming.ca\">Russell Shumsky</a>, with whom I’ve studied West-African drumming for many years. Among the\n    basics of Afro-Cuban are the\n    <a href=\"https://en.wikipedia.org/wiki/Bell_pattern\">Bell Patterns</a>, which come straight out of Africa.\n    The most basic is the “Standard Pattern”, commonly accompanying 12/8music. “12/8” means there are four clusters of\n    three notes and you can count it “one-two-three two-two-three three-two-three four-two-three”. It\n    feels like it’s in four, particularly when played fast.</p>\n    <p>Here’s the standard bell pattern in music notation. Instead of one 12/8 bar, I’ve broken it into four 3/8 chunks. Let’s call\n    those “mini-measures”; I’ll use that or just “minis” in the rest of this piece.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png\" alt=\"standard 12/8 bell pattern\"></img>\n    <div class=\"caption\"><p><audio controls=\"controls\" src=\"standard.m4a\"></audio></p></div>\n    <p>Bell patterns are never played in isolation, but circularly on fast repeat, so the first note immediately follows\n    the last.</p>\n    <p>In the sound sample, I’m playing a background beat on a conga, emphasizing the beginning of the 12/8 measures.\n    The actual bell pattern is on the high “child” bell of a\n    <a href=\"https://en.wikipedia.org/wiki/Ewe_drumming#Gankogui\">Gankoqui</a>, an African dual-cowbell set.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/PXL_20251201_192632520.png\" alt=\"Black cat considers a Gankoqui\"></img>\n    <div class=\"caption\"><p><a href=\"/ongoing/When/202x/2021/02/22/Meet-Thorn\">“þ” the cat</a> was trying bell patterns but\n    unfortunately<br></br>cats can’t count as high as 12. Collar by\n    <a href=\"https://www.birdsbesafe.com\">BirdsBeSafe.com</a>.</p></div>\n    <p>That’s my Gankoqui.\n    I bought it off someone on Etsy who imports them from Ghana. \n    It came with that little thin stick that sounds nice, but sometimes I use a regular drumstick when things get loud.</p>\n    <h2 id=\"p-1\">The problem</h2>\n    <p>Russell’s a good teacher and the standard pattern isn’t that tricky, but I just couldn’t get a grip on it.\n    It’s a little harder than it looks what with cycling it really fast, and  then\n    you’re playing it against complicated music with other instrumental voices. \n    I probably would have got there, but the lessons ran out of gas in the depths of Covid.</p>\n    <h2 id=\"p-2\">Introducing Tracy</h2>\n    <p>She was Russell’s long-time partner, a good person and good drummer too.  When you were struggling\n    with a complex rhythm it was helpful to watch Tracy’s hands, because she was <em>always</em> on the beat.</p>\n    <p>Tracy lived with stage four metastatic cancer for many years and braved endless awful rounds of therapy while remaining generally\n    cheerful. She could be morbidly funny; I bought her congas (you can hear one behind the beat in the samples) when she had a\n    storage-space problem.  She told me she was carefully planning her finances so she’d run out of money just before the cancer got\n    her.</p>\n    <p>I always enjoyed any time I spent with her. Then, a dozen years into her cancer\n    journey, this last summer it got into her brain and it was pretty clear her end times were upon her.</p>\n    <h2 id=\"p-3\">The hospice</h2>\n    <p>Tracy’s last months were spent at\n    <a href=\"https://stjohnhospice.ca\">St. John Hospice</a> in Vancouver’s far west.  I can’t say enough\n    good things about it. If you’re near Vancouver and your death becomes imminent, try to be there if you can’t be at home.\n    It’s comfortable and the staff are expert and infinitely kind. The rules that apply at hospices\n    are different from those at hospitals; for example, Tracy’s cat joined her in residency and had the run of the place.</p>\n    <p>I (and other fans of Russell and Tracy) visited the hospice a few times. My last visit was just days before her death\n    and, while she was fatigued and spaced-out, it was still Tracy.\n    I wasn’t close enough to call her a friend, but I miss her.</p>\n    <p>We got to talking about Afro-Cuban music and I laughed at myself, saying how I never could get that damn bell pattern\n    down. Said Russell: “Oh, you mean the standard 12/8 pattern? Tracy, let’s show him” and on the second try, they were doing it\n    together, just voices, <i>ta ta ta-ta, ta ta ta</i>. </p>\n    <p>Driving home from the hospice, I told myself that if Tracy could manage the bell pattern in her condition, I could bloody\n    well learn it.  So I studied the details and used a metronome app and after a while\n    I thought I had it down pretty well.</p>\n    <h2 id=\"p-4\">Sounds cool</h2>\n    <p>I go to a weekly by-invitation African drum jam where I’m on the weaker end of the skill\n    spectrum. The first time a 12/8 came along after I thought I’d learned the pattern,  I had to summon up courage\n    and then I fluffed the first few bars. But after a while I \n    was grooving along and smiling and thinking the bell sounded pretty cool against the thunder of all the djembés and dununs.</p>\n    <p>And, even played amateurishly, it does sound cool. Let’s have another look at the music.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/standard.png\" alt=\"standard 12/8 bell pattern\"></img>\n    <div class=\"caption\"><p><audio controls=\"controls\" src=\"standard.m4a\"></audio></p></div>\n    <p>West-African drumming often tries to achieve rhythmic tension, where a given note could fit in multiple ways and your\n    ear is not 100% sure what’s going on. The standard pattern does this, twice.</p>\n    <p>Remember, I said that 12/8 sounds like it’s\n    “in four”, especially if you hit the first beat of each of the four mini-measures. But two of\n    the four minis here go around the first note, weakening the 4/4 feel.\n    Especially on that third mini; you can feel the beat slide by the missing “one”.</p>\n    <p>Also, the last three notes are evenly spaced two beats\n    apart, so six of them would fill the 12-beat pattern, suggesting that this might be in triple time, not 12/8.</p>\n    <p>The effect, to my ears, is of the bell, higher-pitched than the drums, shifting against the rhythm, or even dancing\n    across it.  At the drum jam, at almost any given moment it won’t be just drums, one or more people will have\n    clave sticks or rattles or tambourines or cowbells weaving through the beat.</p>\n    <h2 id=\"p-5\">Mixing it up</h2>\n    <p>After I felt confident playing the standard pattern, it still sounded cool, but I wanted to branch out, not just\n    go around and around the same seven notes. So the first thing I did was start mixing in a few of these.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-1.png\" alt=\"bell pattern variation\"></img>\n    <div class=\"caption\"><p><audio controls=\"controls\" src=\"5333.m4a\"></audio></p></div>\n    <p>This repeats the second bar through the end of the phrase. In the sound sample I mix it up with the standard pattern.\n    It’s got less rhythmic tension but on the other hand\n    flows along smoothly with the drum thunder.  Also you don’t have to think at all, so you can enjoy listening to what the other\n    people are playing.</p>\n    <p>Then I got a little more ambitious and reshuffled:</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/variation-2.png\" alt=\"bell pattern variation\"></img>\n    <div class=\"caption\"><p><audio controls=\"controls\" src=\"5253.m4a\"></audio></p></div>\n    <p>The mini-measures are the same as in the standard pattern, just in a different order.  Anyhow, this kind of thing is fun.</p>\n    <h2 id=\"p-6\">Combinatorics</h2>\n    <p>Then one evening I was lying in bed, thoughts wandering, and wondered “How many bell patterns are there?”\n    A little mental math showed that of course there are eight possible arrangements of tones\n    in a 3-note mini-measure. Here they are:</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/12/02/8-measures.png\" alt=\"Possible arrangements of notes in 3/8 time\"></img>\n    <div class=\"caption\"><p>I’ll use the boxed numbers to identify the minis.</p></div>\n    <p>Why are the minis numbered in that order? Every computer programmer looking at this already knows, but for the rest of you: If the\n    notes are ones and the rests are zeroes, they are the eight binary numbers between zero and seven inclusive.\n    So each number’s binary bits show where the drumstrokes are. \n    By the way, numbers four through\n    seven have a note on the one beat, zero through three don’t.</p>\n    <p>Is it weird to have a zero i.e. silent mini? I don’t think so, sometimes spaces between the notes really matter.</p>\n    <h2 id=\"p-7\">Patterns</h2>\n    <p>Anyhow, the original question was about the number of different bell patterns. Each has four\n    mini-measures with 8 possible values. So the answer is 8 ⨉ 8 ⨉ 8 ⨉ 8, which is 4,096.</p>\n    <p>And each of them can be identified by four little numbers, ranging from T0000 (I can hear the bandleader yelling “gimme zeroes\n    for the sax break”) to T7777, a flurry of eighth notes that you might use in the big encore-number finish designed to leave the\n    audience yelling as you walk off stage. The standard bell pattern is T5325; in binary “101 011 010 101” and the 1’s are drumstrokes.\n    The first variation above is T5333 and the second is T5253.</p>\n    <p>The “T” in front of each bell pattern number is for Tracy.</p>\n    <p>If you go look at the\n    <a href=\"https://en.wikipedia.org/wiki/Bell_pattern\">Wikipedia Bell-pattern article</a>, they emphasize that there are lots of\n    different patterns. Now they all have numbers! The article\n    <a href=\"https://en.wikipedia.org/wiki/Bell_pattern#128_bell_patterns\">makes special mention of</a> T5124, T5221, and T5244.</p>\n    <h2 id=\"p-8\">But why, Tim?!</h2>\n    <p>I’m a computer programmer with a Math degree, and an amateur musician.\n    Anyone who thinks that these are disjoint disciplines is wrong.\n    And, I think the notation is (on a very small scale) kind of pleasing.</p>\n    <p>But the work has actually helped me.\n    Now that I’ve considered each mini-measure and its personality. I find all of them sneaking into\n    my Gankoqui excursions, which have gotten noticeably weirder, for example T5635.\n    Nobody’s threatened to kick me out of the jam, so far.</p>\n    <p>Also, this has given me a real appreciation of whoever it was that, probably thousands of years ago and certainly in Africa,\n    picked the “standard” pattern as, well, standard. Because it’s great.</p>\n    <h2 id=\"p-9\">What’s missing?</h2>\n    <p>You may have noticed that Gankoquis have two bells and I’ve been ignoring that fact. Normally you’d play these patterns\n    on the smaller “child” bell, but sometimes bringing the big parent bell in for a couple of strokes works \n    well.\n    <a href=\"https://www.youtube.com/watch?v=X2K0i8e6Ftc\">Here’s an example</a> (h/t Russell).</p>\n    <p>Also, this discussion has been limited to 3/8 minis in 12/8 measures. There’s another whole universe of 4/4 rhythms that\n    also have bell patterns (but everything exists in the shadow of the\n    <a href=\"https://en.wikipedia.org/wiki/Clave_(rhythm)\">clave rhythm</a>).\n    In that world a pattern has four measures, each of which can have sixteen possible values, so there are 65,536 different ones.</p>\n    <p>And I could repeat the numbers construction above for 4/4. But I’m not going to, because the rewards feel smaller. In my\n    experience, 4/4 rhythms lope smoothly along and everyone knows where the one is even when there’s no note on it, so there’s less\n    ambiguity to work with.\n    Anyhow, any neophyte (like for example me) can play a pretty smooth bell line against 4/4; just start with\n    <a href=\"https://en.wikipedia.org/wiki/Clave_(rhythm)\">clave</a> and add\n    variations (or don’t) and you’ll be fine.</p>\n    <h2 id=\"p-10\">Useful?</h2>\n    <p>These numbers are just elementary mathemusical fun. If anyone else wanted to use them that’d be a pleasant surprise.\n    If “anyone else” is you, go ahead, but they have a name and you have to use it. These are called Tracy Numbers.</p>\n    <h2 id=\"p-11\">Colophon</h2>\n    <p>Music fragments by\n    <a href=\"https://www.mu.se/musescore-studio\">MuseScore Studio</a>. Sound samples facilitated by GarageBand, a Shure MV51, and PSB\n    Alphas.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Arts/Music",
          "term": "Arts/Music",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Music",
          "term": "Music",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football",
      "title": "Fútbol Joy",
      "description": "Last Saturday I had one of my peak 2025 experiences, at the     MLS semifinal      between the Vancouver Whitecaps FC (hereinafter “Caps”) and     Los Angeles FC (“LAFC”). Both those FC’s stand for “Fútbol Club”.     53,095 other fans were there with my son and I; we came     home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other  TV sports",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/11/23/Soccer-vs-Football",
      "published": "2025-11-23T20:00:00.000Z",
      "updated": "2025-11-28T04:38:07.000Z",
      "content": "<p>Last Saturday I had one of my peak 2025 experiences, at the\n    <a href=\"https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs\">MLS semifinal</a> \n    between the <a href=\"https://www.whitecapsfc.com/\">Vancouver Whitecaps FC</a> (hereinafter “Caps”) and\n    <a href=\"https://en.wikipedia.org/wiki/Los_Angeles_FC\">Los Angeles FC</a> (“LAFC”). Both those FC’s stand for “Fútbol Club”.\n    53,095 other fans were there with my son and I; we came\n    home smiling. I’d like to share a bit of the joy and an unexpected side-effect: I’ve gone off most other  TV sports.</p>\n    <p>Earlier this year\n    <a href=\"/ongoing/When/202x/2025/05/04/Southsiders\">I wrote about becoming a Caps fan</a>. Anyone who enjoys this will probably\n    like that piece too.</p>\n    <p>Let’s set the scene with pictures.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_004124670.png\" alt=\"Before the fútbol at the pub\"></img>\n    <div class=\"caption\"><p>Supporters gather pre-game at a nearby Irish-flavored pub.</p></div>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_011735082.png\" alt=\"Parading from the pub to the match\"></img>\n    <div class=\"caption\"><p>Supporters march to the game.<br></br>When you’re in a frivolous parade, everyone smiles<br></br>at\n    you, even the drivers hemmed in by paraders.</p></div>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/23/PXL_20251123_024033770.png\" alt=\"Whitecaps tifo banner: fire that burns / blue melts gold\"></img>\n    <div class=\"caption\"><p>The banner is what’s called a\n    <a href=\"https://en.wikipedia.org/wiki/Tifo\">tifo</a>.<br></br>I have to admit I failed to parse it.</p></div>\n    <h2 id=\"p-5\">The game</h2>\n    <p>It was 120 minutes of ridiculously over-the-top psychodrama. I was exhausted at the end.\n    If you want a full retrospective, type “whitecaps lafc” into any Web search to get the particulars. Or\n    <a href=\"https://www.mlssoccer.com/playoffs/2025/news/vancouver-whitecaps-keep-mls-cup-dream-alive-unbelievable-win-lafc-playoffs\">hit\n    this</a>. But here’s the short version:</p>\n    <ol>\n      <li><p>The Caps came out sharp and fast and had LAFC pretty well flummoxed through most of the first half, scoring two goals,\n\n      <a href=\"https://www.youtube.com/watch?v=9nEOw8ckWMA\">one of which was a jaw-dropper</a>.\n      They also managed to contain LAFC’s superstar\n      <a href=\"https://en.wikipedia.org/wiki/Son_Heung-min\">Son Heung-min</a>.</p></li>\n      <li><p>In the second half, the visitors reconfigured and were much better. Son did the superstar thing and scored two goals,\n      <a href=\"https://www.youtube.com/watch?v=-L9N8pkrkSM\">one another jaw-dropper</a>, just as the game was ending, to tie things\n      up.</p></li> \n      <li><p>The Caps lost two players, one for fouls, one to injury, and were down two men through most of overtime. LAFC’s assault\n      was relentless but the Caps held on, getting more than a little lucky.</p></li>\n      <li><p>So it went to a penalty-kick competition. Son, shockingly, missed; he was exhausted and limping. At the end of the\n      day the Caps scored four out of five to LAFC’s three and got the win.</p></li>\n    </ol>\n    <p>Suffice it to say that the dramatic peak wasn’t\n    any of the flashes of brilliance, but rather the errors that happen when people are at the limit of their endurance. Vancouver\n    made one fewer, that’s all there was to it.</p>\n    <h2 id=\"p-3\">That sound</h2>\n    <p>There’s not another like it on this planet. I mean tens of thousands of voices in a big stadium greeting a home goal.\n    Fútbol specifically because its goals, compared to North American sports where points come in dozens, are\n    such huge markers. The sound-pressure wavefront, coming from every direction, of all those inarticulate howls of joy,\n    all in the same tiny fraction of a second, is a whole-body experience.</p>\n    <h2 id=\"p-6\">The side effect</h2>\n    <p>I’ve long been a televised-sports fan; the only TV show that isn’t scripted and thus has real drama. But\n    since getting mixed up in fútbol, I’ve sort of gone off the other sports I used to watch.  I had to think a bit to figure\n    out why.</p>\n    <p>It’s the ads.  The football, basketball and hockey broadcasts screech to a halt\n    <a href=\"https://qz.com/150577/an-average-nfl-game-more-than-100-commercials-and-just-11-minutes-of-play\">every ten or fewer\n    minutes</a> for a couple of minutes of advertising. Most of the ads are dumb, many are offensive, and the relentless\n    addiction-promoting gambling pitches are both. On top of which there’s the bone-headed repetition; someone somewhere thinks\n    I’m gonna lean toward this generic SUV as opposed to that one because of the 138th time they’ve run that commercial where hip young\n    people with fulfilling lives are going to have sex because of its dashboard geometry and motorized hatchback.\n    I mean, the other SUVs have that stuff too, but this one’s actors are more convincingly likely to be headed for bed?</p>\n    <p>Being in the room with this shit makes me angry even though my mute-button skillz are sharp.\n    The world being what it is, I really don’t need to be around something that angers me several times per hour.\n    So, while when young I loved playing both football and basketball, and while the pro games are good entertainment, \n    my patience seems to be running out.</p>\n    <p>Fútbol, on the other hand, has two fiftyish-minute chunks of continuous action, so you can sink into the flow of the\n    game. The contrast, switching back and forth between that and the other North American sports, is stark.</p>\n    <p>(Except for I’m mostly forgiving baseball because its natural rhythm is full of stops suitable for hot dogs and beer and\n    admiring cute babies and T-shirts and discussions of etymology and epidemiology.  I mean, the ads are still mindless repetitive\n    shit, we’re just more accustomed to switching attention away when nothing’s happening.)</p>\n    <p>And I’m not claiming that fútbol is more virtuous or less dirty than any other sport; after all, its global\n    organizing body FIFA has repeatedly been exposed as\n    <a href=\"https://en.wikipedia.org/wiki/FIFA#Corruption\">galactically corrupt</a>. I’m just saying it offers a better\n    experience.</p>\n    <h2 id=\"p-9\">Soccer?</h2>\n    <p>That word is an awkward invention by nineteenth-century British toffs based on abbreviating “association”. I accept that on my\n    continent “football” means gridiron, but people who enjoy “soccer” still say it so in print I offer “fútbol”, which is a\n    typographically nice little cluster; please humor me.</p>\n    <p>Anyhow, you might want to check out your local team; in North America, the prices are lower than the other sports, who could\n    be against cheap happiness with fewer gambling ads?</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Sports/Football",
          "term": "Sports/Football",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Sports",
          "term": "Sports",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Football",
          "term": "Football",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Sports/Soccer",
          "term": "Sports/Soccer",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Soccer",
          "term": "Soccer",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links",
      "title": "Long Links",
      "description": "As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the     choices will improve your day.  This time out it’s almost all politics, but that’s the way the world is.     And some of the politics aren’t American!",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/11/16/Long-Links",
      "published": "2025-11-16T20:00:00.000Z",
      "updated": "2025-11-19T22:20:55.000Z",
      "content": "<p>As usual, offering more long-form stuff here than any one person should be expected to read all of, hoping that a few of the\n    choices will improve your day.  This time out it’s almost all politics, but that’s the way the world is.\n    And some of the politics aren’t American!</p>\n    <p>Some of these are paywalled, sorry.\n    And the whole thing is kind of long so if you’re in a hurry, you might want to jump to the last section, entitled\n    <a href=\"#p-8\">Wonderful things</a>.</p>\n    <h2 id=\"p-7\">Social media</h2>\n    <p>Here’s a real treat. Perhaps the premiere example of a blog that’s grown happily from a one-man operation to a\n    successful and sustainable small business would be\n    <a href=\"https://talkingpointsmemo.com\">Talking Points Memo</a>. It provides what I think is about the deepest\n    carefully-reported coverage of the American progressive scene available anywhere. I’ve been a subscriber for years.</p>\n    <p>They’re celebrating their 25th anniversary and, to celebrate, have been working on a history of blogging:\n    <a href=\"https://talkingpointsmemo.com/tpm-25\">Pivots, Trolls, & Blogrolls</a>.\n    Contributors so far: Sarah Jaffe, Matt Pearce, Brian Beutler, Kylie Cheung, Megan Greenwell, David Weigel, Jon Allsop, Adam\n    Mahoney, Julianne Escobedo Shepherd, Max Rivlin-Nadler, Bhaskar Sunkara, Hamilton Nolan, Ana Marie Cox, Marisa Kabas, Kelly\n    Weill, Aurin Squire, Marcy Wheeler, Andrew Parsons, Jeet Heer, and Sarah Posner.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/16/TPM.png\" alt=\"TPM 25th anniversary series\"></img>\n    <p>It’s full of razor-sharp insights and nostalgic smiles. I think it’s paywalled? If so, and if you’ve got feels about \n    the blog form, it’d probably be worth your while to sign up for a month just to read this collection.</p>\n    <p>And thanks to Josh Marshall of <cite>TPM</cite> for putting it together all these years and especially for this particular\n    mind candy.</p>\n    <h2 id=\"p-4\">Politics (US)</h2>\n    <p>The Trump administration is, generally speaking, strange.\n    For a terrifying trip several standard deviations off the strange end of the strangeness,\n    there’s \n    <a href=\"https://www.newyorker.com/magazine/2025/11/17/laura-loomers-endless-payback\">Laura Loomer’s Endless Payback</a>.\n    At several points in my traversal of this piece I simply could not believe what I was reading. My guess is that it will\n    regularly be cited by historians of the 23rd century, to add spice to their narrative.</p>\n    <p>Many commentators on the right have been horrified at Zohran Mamdani’s New York victory, seeing him as the white-hot\n    pointy end of the “woke mind virus”.  Well, what could be more woke, I ask, than the Department of Africana Studies at Bowdoin,\n    a boutique liberal-arts college in Maine?</p>\n    <p>Mamdani was a student there, and now the former head of said department offers us\n    <a href=\"https://lithub.com/maybe-dont-talk-to-the-new-york-times-about-zohran-mamdani/\">Maybe Don’t Talk to the New York\n    Times About Zohran Mamdani</a>. Peter Coviello is not a moderate but is a formidable writer: “The storied choice between\n    socialism and barbarism was made exquisitely clear a good many years ago in the United States, and both major parties chose\n    barbarism.” Despite that, it’s mostly written with a light touch, often amusing. Read it.</p> \n    <h2 id=\"p-5\">Politics (Other)</h2>\n    <p>It’s not in the news much, but China is facing colossal economic challenges.\n    <a href=\"https://www.nytimes.com/2025/09/23/opinion/china-economy-deflation-neijuan.html\">Learn about “meijuan”</a> (in English,\n    “involution”) which might well put the nation on the path of deflation. That’s a path that, once an economy is on it, is very\n    hard to get off; it took Japan decades.</p>\n    <p>While we’re looking at China… there used to be “Kremlinology”, a study of the entirely opaque workings of the top inner\n    circles of the Soviet regime. In that spirit, here’s some\n    <a href=\"https://en.wikipedia.org/wiki/Great_Hall_of_the_People\">人民大会堂</a>-ology: \n    <a href=\"https://sinocism.com/p/forever-xi-jinping-perhaps-not\">Forever Xi Jinping? Perhaps Not</a>.\n    I enjoyed it but have no idea if it’s, you know, correct. Nobody outside that inner circle does.</p>\n    <p>Now let’s jump seven time zones west, to France, where the redoubtable Thomas Piketty offers\n    <a href=\"https://thomaspiketty.wordpress.com/2025/11/11/le-pens-rn-has-become-the-party-of-billionaires/\">Le Pen’s RN has\n    become the party of billionaires</a>. Unlike the Beijing piece, Piketty’s is (as usual for him) supported by concrete data and I tend\n    to believe it.</p>\n    <p>Last stop: Gaza, waiting to find out if an externally-imposed and leaky ceasefire will hold, and whether there is a path\n    from where they are to something better. As for “where they are”, here’s\n    <a href=\"https://www.nytimes.com/interactive/2025/10/08/opinion/gaza-strip-before-after.html\">The Gaza I Knew Is\n    Gone</a> by Ghada Abdulfattah.  It describes life’s experience for the citizens of Gaza after all these endless\n    months of brutality.</p> \n    <h2 id=\"p-9\">Politics (everywhere)</h2>\n    <p>Pope Leo’s \n    <a href=\"https://www.vatican.va/content/leo-xiv/en/apost_exhortations/documents/20251004-dilexi-te.html\">Apostolic Exhortation\n    Dilexi Te of the Holy Father Leo XIV To All Christians On Love For The Poor</a> got a short-lived run in the headlines,\n    accompanied by “But that’s… socialism!” pearl-clutching from Stage Right. It deserves a read. The first three-quarters or\n    so are a trip through Church history, starting in Nazareth, aimed at showing that concern for the poor has always been central\n    to the faith. Which is fine, but eventually the Pope gets concrete about the twenty-first century, and is convincing whether or\n    not you believe in any gods.</p>\n    <p>The next section is about Tech and while\n    <a href=\"https://csrc.nist.gov/csrc/media/Presentations/2023/radical-cs/images-media/sess-1-rogaway-bcm-workshop-2023.pdf\">Radical \n    CS</a> is a presentation from “The Third NIST Workshop on Block Cipher Modes of Operation” it’s about politics, oh yes it is. We\n    very much need more of this kind of thing.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/16/Radical-CS.png\" alt=\"Suggestions for a radical CS\"></img>\n    <h2 id=\"p-6\">Tech</h2>\n    <p>A <a href=\"https://infosec.exchange/@david_chisnall/115270162462304611\">post from David Chisnall on Mastodon</a> contains this\n    gem: “Machine learning is <em>amazing</em> if … the value of a correct answer is much higher than the cost of an incorrect\n    answer.”\n    Which is one of those things that’s obviously true as soon as you hear it. The whole piece is good.</p>\n    <p>The churning debate around AI is full of arm-waving and relatively free of objective numerical data. So here’s Ed Zitron’s\n    <a href=\"https://www.wheresyoured.at/costs/\">This Is How Much Anthropic and Cursor Spend On Amazon Web Services</a>.\n    And I ask: How do the people making these investments think they’re going to get their money back?</p>\n    <p>Speaking of things are obviously true:\n    <a href=\"https://www.newyorker.com/culture/infinite-scroll/textedit-and-the-relief-of-simple-software\">TextEdit and the\n    Relief of Simple Software</a>. We could do so much better than we do, and in our hearts we know why we’re not, and it’s about\n    money and power, not technology.</p>\n    <p>Bluesky has brought its AT Protocol to the IETF; let’s see what happens. Here are \n    <a href=\"https://www.ietf.org/archive/id/draft-newbold-at-architecture-00.html\">Authenticated Transfer: Architecture\n    Overview</a> and\n    <a href=\"https://www.ietf.org/archive/id/draft-holmgren-at-repository-00.html\">Authenticated Transfer Repository and\n    Synchronization</a>. The drafts have \n    <a href=\"https://github.com/bluesky-social/ietf-drafts\">source-code repos</a>.</p>\n    <p>Finally, here’s <a href=\"https://spinel.coop\">Spinel</a>, which is trying to build a decentralized, transparent,\n    and somewhat-democratic engineering resource for the Ruby and Rails platforms. This follows on a distinctly-stinky power play where\n    people with money grabbed the steering wheel. Best of luck to Spinel.</p>\n    <h2 id=\"p-10\">Canadian health</h2>\n    <p>Canada has “single-payer” public healthcare that comes with your taxes, which in my experience works well, see\n    <a href=\"/ongoing/When/200x/2009/08/22/Alison\">here</a> and\n    <a href=\"/ongoing/When/202x/2025/07/09/Saskatchewan\">here.</a></p>\n    <p>This costs a lot of money, over $300B/year.\n    Predictably, there are business types panting with eagerness to get their hands on some of that\n    money. And they can; a lot of medical practices and clinics and labs are owned by private companies, apparently doing well while\n    being restricted to billing the government for the standard fees. But what they <em>really</em> want is a two-tier system where\n    they can directly charge rich people more for better care. It seems like every year someone thinks up a clever dodge to nibble\n    away at the system. Fortunately, these people have, so far, ended up losing in the courts.</p>\n    <p>Here’s a news story: \n    <a href=\"https://macleans.ca/society/health/ai-could-save-canadas-health-care-system/\">AI Could Save Canada’s Health-Care\n    System</a>. It’s actually pretty coherent and I found it plausible that this technology could maybe \n    improve, for example, the agonizingly slow emergency-room experience.</p>\n    <p>But then I got curious as to the business angle and tracked the source of the story down to a business called called\n    <a href=\"https://www.getmaple.ca\">maple</a>. Sure enough, \n    <a href=\"https://helpdesk.getmaple.ca/en/articles/5375023-fees-to-see-a-general-practitioner-on-maple\">here they are</a> trying to\n    siphon off direct payments for access to doctors. I predict they’ll end up in court, and lose.</p>\n    <p>And then there’s the government of Alberta, run by hard-right dipshits who hate most aspects of being Canadian and loathe the\n    proposition that government can provide good and efficient services. Thus:\n    <a href=\"https://www.cbc.ca/news/canada/calgary/alberta-paul-parks-mri-diagnostics-adriana-lagrange-9.6952189\">Alberta\n    government plans to allow residents to privately pay for any diagnostic or screening service</a>. Feaugh. I hope this one ends\n    up in court too.</p>\n    <h2 id=\"p-12\">Paying for Open Source</h2>\n    <p>It is coming to the world’s attention that most of our tech infrastructure is radically dependent on\n    open-source software maintenaned by a\n    cadre of developers who are old, tired, and not getting paid for their work. I have direct experience with trying unsuccessfully\n    to convince Big-Tech business leaders to invest in Open-Source maintenance and infrastructure. Here’s some of the coverage:</p>\n    <ul>\n      <li><p>In <cite>The Register</cite>:\n      <a href=\"https://www.theregister.com/2024/09/18/open_source_maintainers_underpaid/\">Open source maintainers underpaid,\n      swamped by security, going gray</a>.</p></li>\n      <li><p>Open Source Security Foundation:\n      <a href=\"https://openssf.org/blog/2025/09/23/open-infrastructure-is-not-free-a-joint-statement-on-sustainable-stewardship/\">Open\n      Infrastructure is Not Free: A Joint Statement on Sustainable Stewardship</a>.</p></li>\n      <li><p>Nils Adermann:\n      <a href=\"https://blog.packagist.com/a-call-for-sustainable-open-source-infrastructure/\">A Call for Sustainable Open Source\n      Infrastructure</a>.</p></li>\n      <li><p>Hackernoon: <a href=\"https://hackernoon.com/how-can-governments-pay-open-source-maintainers\">How Can Governments Pay Open Source\n      Maintainers?</a></p></li>\n      <li><p>The New Stack: \n      <a href=\"https://thenewstack.io/ffmpeg-to-google-fund-us-or-stop-sending-bugs/\">FFmpeg to Google: Fund Us or Stop Sending\n      Bugs</a>.</p></li>\n    </ul>\n    <p>Things obviously can’t go on as they are. The best path forward isn’t obvious to me, but we need to start finding it.</p>\n    <h2 id=\"p-11\">Economics and life</h2>\n    <p>Paul Krugman and Martin Wolf, two really smart guys who aren’t technologists,\n    <a href=\"https://paulkrugman.substack.com/p/talking-ai-with-martin-wolf\">talk about the impact of AI</a>. Technofeudalism is\n    considered carefully.\n    My favorite out-take\n    is from Krugman: “[I] have come to the conclusion that anything that I want to believe about the prospects of AI and its\n    economic effects, all I need to do is do a little searching, and I can find some expert who will tell me whatever it is I want to\n    believe.” Even with that well-justified cynicism, there is deep stuff here.</p>\n    <p>I read Matt Levine’s newsletter almost every day; not only does it teach you things about how money makes the world go round,\n    it entertains; his glee at some particularly juicy financial swindle or clever arbitrage maneuver will bring a smile to your\n    face.\n    In <a href=\"https://newsletterhunt.com/emails/201930\">Money Stuff: Quantum Bond Trading</a> he addresses a deeper question: Does\n    the Finance business actually benefit society? Obviously a subject worthy of attention, and he makes it amusing.</p>\n    <h2 id=\"p-8\">Wonderful things</h2>\n    <p> The dude who wrote <a href=\"https://www.bikewanderer.com/on-the-road//packrafting-the-darien-gap\">Paddling the Darien</a>\n    is clearly crazy, I guess it’d be more polite to say “insanely brave”. Anyhow, I think there are very few people who won’t be\n    astonished at these pictures and stories</p>\n    <p>I’m not at all sure what <a href=\"https://jonathanhoefler.com/inventions\">A. Inventions</a>, by Jonathan Hoefler,\n    is, actually.  The link that I followed said that GenAI image generators were involved. I don’t care.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/16/calendars.png\" alt=\"Alignment Calendars 1584–1811\"></img>\n    <div class=\"caption\"><p>Alignment Calendars 1584–1811,<br></br>from Jonathan Hoefler’s <cite>Inventions</cite>.</p></div>\n    <p>Let’s end with music.  Here are two absolutely exquisite song performances, courtesy of YouTube. First,\n    <a href=\"https://www.youtube.com/watch?v=1qahZ-whM6o\">Old Enough</a> by the Raconteurs, Ricky Skaggs, and Ashley Monroe. The\n    interplay of voices and strings is magical.  Then Billy Strings wiith his band and string players, doing\n    <a href=\"https://www.youtube.com/watch?v=ZCtQdALo9DI\">Gild the Lily</a>.  Just a lovely performance of a fine new song.</p>\n    <p>That’s all, folks, see you next time.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study",
      "title": "Kendzior Case-Study",
      "description": "There was recently a flurry of attention and dismay over     Sarah Kendzior having been suspended from Bluesky by its     moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In     particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/11/13/Kendzior-Case-Study",
      "published": "2025-11-13T20:00:00.000Z",
      "updated": "2025-11-14T18:55:57.000Z",
      "content": "<p>There was recently a flurry of attention and dismay over\n    <a href=\"https://en.wikipedia.org/wiki/Sarah_Kendzior\">Sarah Kendzior</a> having been suspended from Bluesky by its\n    moderation system. Since the state of the art in trust and safety is evolving fast, this is worth a closer look. In\n    particular, Mastodon has a really different approach, so let’s see how the Kendzior drama would have played out there.</p>\n    <h2 id=\"p-1\">Disclosures</h2>\n    <p>I’m a fan of Ms Kendzior, for example check out her recent\n    <a href=\"https://sarahkendzior.substack.com/p/when-i-loved-new-York\">When I Loved New York</a>; fine writing and incisive\n    politics. I like the Bluesky experience and have warm feelings toward the team there, although my\n    <a href=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate\">long-term social media bet is on Mastodon</a>.</p>\n    <h2 id=\"p-2\">Back story</h2>\n    <p>Back in early October, the <cite>Wall Street Journal</cite> published\n    <a href=\"https://www.wsj.com/arts-culture/music/can-we-finally-give-johnny-cash-his-due-58ab24c2\">It’s Finally Time to Give\n    Johnny Cash His Due</a>, an appreciation for Johnny’s music that I totally agreed with. In particular I liked its praise for\n    <a href=\"https://en.wikipedia.org/wiki/American_IV:_The_Man_Comes_Around\">American IV: The Man Comes Around</a> which, recorded while\n    he was more or less on his deathbed, is a masterpiece. It also said that, relative to other rockers, Johnny “can seem deeply\n    uncool”.</p>\n    <p>Ms Kendzior, who is apparently also a Cash fan and furthermore thinks he’s cool, posted to Bluesky “I want to shoot\n    the author of this article just to watch him die.”  Which is pretty funny, because one of Johnny’s most famous lyrics, from\n    <a href=\"https://en.wikipedia.org/wiki/Folsom_Prison_Blues\">Folsom\n    Prison Blues</a>, was “I shot a man in Reno just to watch him die.” (Just so you know: In 1968 Johnny performed the song at a\n    benefit concert for the prisoners at Folsom, and on the live record (which is good), there is a burst of applause from the\n    audience after the “shot a man” lyric. It was apparently added in postproduction.)</p>\n    <p>Subsequently, per the \n    <a href=\"https://bsky.app/profile/safety.bsky.app/post/3m5hcx4n2hc2z\">Bluesky Safety</a> account ”The account owner of\n    @sarahkendzior.bsky.social  was suspended for 72 hours for expressing a desire to shoot the author of an article.”</p>\n    <p>There was an outburst of fury on Bluesky about the sudden vanishing of Ms Kendzior’s account, and the explanation\n    quoted above didn’t seem to reduce the heat much.  Since I know nothing about the mechanisms used by Bluesky Safety, I’m\n    not going to dive any deeper into the Bluesky story.</p>\n    <h2 id=\"p-3\">On Mastodon</h2>\n    <p>I do know quite a bit about Mastodon’s trust-and-safety mechanisms, having been a moderator on\n    <a href=\"https://cosocial.ca\">CoSocial.ca</a> for a couple of years now.  So I’m going to walk through how the same story might\n    have unfolded on Mastodon, assuming Ms Kendzior had made the same post about the <cite>WSJ</cite> article. There are a bunch of\n    forks in this story’s path, where it might have gone one way or another depending on the humans involved.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/report-menu.png\" alt=\"Mastodon “Report” menu\" class=\"inline\"></img>\n    <h2 id=\"p-4\">Reporting</h2>\n    <p>The Mastodon process is very much human-driven. Anyone who saw Ms Kendzior’s post could pull up the per-post menu and hit the\n    “Report” button. I’ve put a sample of what that looks like on the right, assuming someone wanted to report yours truly.</p>\n    <p>By the way, there are many independent Mastodon clients; some of them have “Report” screens that are way cooler than this. I\n    use\n    <a href=\"https://phanpy.social\">Phanpy</a>, which has a hilarious little animation with an animated rubber stamp that\n    leaves a red-ink “Spam” or whatever on the post you’re reporting.</p>\n    <p>We’ll get into what happens with reports, but here’s the first fork in the road: Would the Kendzior post have been reported?\n    I think there are three categories of people that are interesting. First, Kendzior fans who are hip to Johnny Cash, get the\n    reference, snicker, and move on.  Second, followers who think “ouch, that could be misinterpreted”; they might throw a\n    comment onto the post or just maybe report it. Third, Reply Guys who’ll jump at  any chance to take a vocal woman down; they’d\n    gleefully report her en masse. There’s no way to predict what would have happened, but it wouldn’t be surprising if there were\n    both categories of report, or either, or none.</p>\n    <h2 id=\"p-5\">Moderating</h2>\n    <p>When you file a report, it goes both to the moderators of your instance and the of instance where it was posted (who oversee the poster’s account).\n    I dug up a 2024 report someone filed against me to give a feeling for what\n    the moderator experience is like.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/timbray-report.png\" alt=\"Report filed against Tim Bray for “antisemitism”\"></img>\n    <p>I think it’s reasonably self-explanatory. Note that the account that filed the report is not identified, but that the server\n    it came from is.</p>\n    <p>A lot of reports are just handled quickly by a single moderator and don’t take much thought: Bitcoin scammer or Bill Gates\n    impersonator or someone with a swastika in their profile? Serious report, treated seriously.</p>\n    <p>Others require some work. In the moderation screen, just below the part on display above, there’s space for moderators to\n    discuss what to do.  (In this particular case they decided that criticism of political leadership wasn’t “antisemitism” and\n    resolved the report with no action.)</p>\n    <p>In the Kendzior case, what might the moderators have done? The answer, as usual, is “it depends”. If there were just one or\n    two reports and they leaned on terminology like “bitch” and “woke”, quite possibly they would have been dismissed.</p>\n    <p>If one or more reports were heartfelt expressions of revulsion or trauma at what seemed to be a hideous death threat, the\n    moderators might well have decided to take action. Similarly if the reports were from people who’d got the reference and\n    snickered but then decided that there really should have been a “just kidding” addendum.</p>\n    <h2 id=\"p-6\">Action</h2>\n    <p>Here are the actions a moderator can take.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/actions.png\" alt=\"Mastodon moderation action options\"></img>\n    <p>If you select “Custom”, you get this:</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/13/actions-2.png\" alt=\"More Mastodon moderation action optiosn\"></img>\n    <p>Once again, I think these are self-explanatory. Before taking up the question of what might happen in the Kendzior case, I\n    should grant that moderators are just people, and sometimes they’re the wrong people. There have been servers with a reputation\n    for draconian moderation on posts that are even moderately controversial. They typically haven’t \n    done very well in terms of attracting and retaining members.</p>\n    <p>OK, what might happen in the Kendzior case? I’m pretty sure there are servers out there where the post would just have been\n    deleted. But my bet is on that “Send a warning” option. Where the warning might go something like “That\n    post of yours really shook up some people who didn’t get the Folsom Prison Blues reference and you should really\n    update it somehow to make it clear you’re not serious.”</p>\n    <p>Typically, people who get that kind of moderation message take it seriously. If not, the moderator can just delete the post.\n    And if the person makes it clear they’re not going to co-operate, that creates a serious risk that if you let them go on shaking\n    people up, your server could get mass-defederated, which is the death penalty. So (after some discussion) they’d delete the\n    account. Everyone has the right to free speech, but nobody has a right to an audience courtesy of our server.</p>\n    <h2 id=\"p-7\">Bottom line</h2>\n    <p>It is very, very unlikely that in the Mastodon universe, Sarah Kendzior’s account would suddenly have globally vanished. It\n    is quite likely that the shot-a-man post would have been edited appropriately, and possible that it would have just\n    vanished.</p>\n    <h2 id=\"p-8\">Will it scale?</h2>\n    <p>I think the possible outcomes I suggested above are, well, OK.  I think the process I’ve described is also OK. The\n    question arises as to whether this will hold together as the Fediverse grows by orders of magnitude.</p>\n    <p>I think so?  People are working hard on moderation tools. I think this could be an area where AI would help, by\n    highlighting possible problems for moderators in the same way that it highlights spots-to-look-at today for radiologists. We’ll\n    see.</p>\n    <p>There are also a couple of background realities that we should be paying more attention to.  First, bad actors tend to\n    cluster on bad servers, simply because non-bad servers take moderation seriously. The defederation scalpel needs to be kept\n    sharp and kept nearby.</p>\n    <p>Secondly, I’m pretty convinced that the current open-enrollment policy adopted by many servers, where anyone can have an\n    account just by asking for it, will eventually have to be phased out.  Even a tiny barrier to\n    entry<span class=\"dashes\"> —</span> a few words on why you want to join or, even better, a small\n    payment<span class=\"dashes\"> —</span> is going to reduce the frequency of troublemakers to an amazing degree.</p>\n    <h2 id=\"p-9\">Take-aways</h2>\n    <p>Well, now you know how moderation works in the Fediverse.  You’ll have to make up your own mind about whether you like it.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Social Media",
          "term": "The World/Social Media",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Social Media",
          "term": "Social Media",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind",
      "title": "Bye, Google Search",
      "description": "For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog     fragments using Google. No longer; I wired in     Pagefind; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,     I’ll wait before getting into the details",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/11/01/Blog-Search-Pagefind",
      "published": "2025-11-01T19:00:00.000Z",
      "updated": "2025-11-04T05:29:26.000Z",
      "content": "<p>For this blog, I mean. Which used to have a little search window in the corner of the banner just above that looked up blog\n    fragments using Google. No longer; I wired in\n    <a href=\"https://pagefind.app\">Pagefind</a>; click on the magnifying glass up there on the right to try it out. Go ahead, do it now,\n    I’ll wait before getting into the details.</p>\n    <h2 id=\"p-1\">The problem</h2>\n    <p>Well, I mean, Google is <em>definitely</em> Part Of The Problem in advertising, surveillance, and Internet\n    search. But the problem I’m talking about is that it just couldn’t find my pages, even \n    when I knew they were here and knew words that should find them.</p>\n    <p>Either it dropped the entries from the index or dropped a bunch of search terms.\n    Don’t know and don’t care now.  <span class=\"o\">ongoing</span> is my outboard memory\n    and I search it <em>all the freaking time</em>. This failure mode was making me crazy.</p>\n    <h2 id=\"p-2\">Pagefind</h2>\n    <p>Tl;dr: I downloaded it and installed it and it Just Worked out of the box. I’d describe the look and feel but that’d be a\n    waste of time since you just tried it out. It’s fast enough and doesn’t seem to miss anything and has a decent user\n    interface.</p>\n    <h2 id=\"p-3\">How it works</h2>\n    <p>They advertise “fully static search library”, which I assumed meant it’s designed to work against sites like this one\n    composed of static files. And it is, but there’s more to it than that; read on.</p>\n    <p>First, you point a Node program at the root of your static-files tree and stand back. My tree has a bit over 5,000 files\n    containing about 2½ million words, adding up to a bit over 20M of text. By default, it assumes you’re indexing HTML and includes\n    all the text inside each page’s <code><body></code> element.</p>\n    <p>You have to provide a <code>glob</code> argument to match the files you want to index; in most cases, something like\n    <code>root/**/*.html</code> would do the trick. Working this out was for me the hardest part because among other things my\n    articles don’t end with <code>.html</code>; maybe it’ll be helpful for some to\n    note that what worked for <span class=\"o\">ongoing</span>\n    was:<br></br><code>When/???x/????/??/??/[a-zA-Z0-9]<[\\-_a-zA-Z0-9]:></code></p> \n    <p>This produced an index organized into about 11K files adding up to about 78M.  It includes a directory with one file per\n    HTML page being searched.</p>\n    <p>I’d assumed I’d have to wire this up to my Web server somehow, but no: It’s all done in the client by fetching little bits\n    and pieces of the index using ordinary HTTP GETs.\n    For example, I ran a search for the word “minimal”, which resulted in my browser fetching a total of seven files totaling\n    about 140K. That’s what they mean by “static”; not just the data, but the index too.</p>\n    <p>Finally, I noticed a couple of WASM files, so I had to check out\n    <a href=\"https://github.com/Pagefind/pagefind\">the source code</a> and, sure enough, this is basically a Rust app. Again I’m\n    impressed.  I hope that slick modern Rust/WASM code isn’t offended by me rubbing it up against this blog’s messy old\n    Perl/Ruby/raw-JS/XML tangle.</p> \n    <h2 id=\"p-9\">Scalable?</h2>\n    <p>Interesting question. For the purposes of this blog, Pagefind is ideal. But, indexing my 2½ million words burned a solid\n    minute of CPU on the feeble VPS that hosts <span class=\"o\">ongoing</span>. I wonder if the elapsed time is linear in the data\n    size, but it wouldn’t surprise me if it were worse. Furthermore, the index occupies more storage than the underlying data, which\n    might be a problem for some.</p>\n    <p>Also, what happens when I do a search while the indexing is in progress?  Just\n    to be sure, I think I’ll wire it up to build the index in a new directory and switch indices as atomically as possible.</p>\n    <p>Finally, I think that if you wanted to sustain a lot of searches per second, you’d really want to get behind a CDN, which would\n    make all that static index fetching really fly.</p>\n    <h2 id=\"p-4\">Configuring</h2>\n    <p>The default look-and-feel was mostly OK by me, but the changes I had to make did involve quality time with the inspector,\n    figuring out the class and ID complexities and then iterating the CSS.</p>\n    <p>The one thing that in the rear-view seems unnecessary is that I had to add a <code>data-pagefind-meta</code> attribute to the\n    element at the very bottom of the page where the date is to include it in the result list. There should be a way\n    to do this without custom markup. John Siracusa filed a\n    <a href=\"https://github.com/Pagefind/pagefind/issues/974\">related bug</a>.</p>\n    <h2 id=\"p-8\">Deployment</h2>\n    <p>There’s hardly any work. I’ll re-run the indexer every day with a crontab entry and it looks it should just take care of\n    itself.</p>\n    <h2 id=\"p-5\">To do?</h2>\n    <p>Well, I could beautify the output some more but I’m pretty happy with it after just a little work. I can customize the sort\n    order, which I gather is in descending order of how significant Pagefind thinks the match is. There’s a temptation to sort it in\n    reverse date order. Actually, apparently I can also influence the significance algorithm.  Anyhow I’ll run with mostly-defaults\n    for now.</p>\n    <h2 id=\"p-6\">Search options</h2>\n    <p>I notice that the software is pretty good at, and aggressive about, matching across verb forms and singular/plural and\n    prefixes. Which I guess is what you want?  You can apparently defeat that by enclosing a word in quotes if you want it matched\n    exactly. Works for phrases too. I wonder what other goodies are in there; couldn’t find any docs on that subject.</p>\n    <p>Finally, there’s an excellent feature set I’ll never use; it’s smart about lots of languages. But alas, I write\n    monolingually.</p>\n    <h2 id=\"p-10\">Shameful cleanup</h2>\n    <p>Like I said, getting Pagefind installed and working was easy. Getting the CSS tuned up was a bit more effort. But I have to\n    confess that I put hours and hours into hiding my dirty secrets.</p>\n    <p>You see, <span class=\"o\">ongoing</span> contains way more\n    writing than you or Google can see. It’s set up so I can “semi-publish” pieces; there but unlinked.  There was a whole lot of\n    this kind of stuff: Photo albums from social events, pitches to employers about why they should hire various people\n    including me, rants at\n    employers for example about why Solaris should adopt the Linux userland (I was right) and why Android should include a Python\n    SDK (I was right), and pieces that employer PR groups convinced me to bury. One of my minor regrets about no longer being\n    employed is I no longer get to exercise my mad PR-group-wrangling skillz.</p>\n    <p>But when your search software is just walking the file tree, it doesn’t know what’s “published” and what’s not.  I ended up\n    using my rusty shell muscles with <code>xarg</code> and <code>sed</code> and <code>awk</code> and even an <code>ed(1)</code>\n    script. I think I got it all, but who knows, search hard enough and you might find something embarrassing. If you do, I’d sure\n    appreciate an email.</p>\n    <h2 id=\"p-7\">Thanks!</h2>\n    <p>To the folks who built this. Seems like a good thing.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Search",
          "term": "Technology/Search",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Search",
          "term": "Search",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/Publishing",
          "term": "Technology/Publishing",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Publishing",
          "term": "Publishing",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World/Life Online/De-Google",
          "term": "The World/Life Online/De-Google",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Life Online",
          "term": "Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "De-Google",
          "term": "De-Google",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate",
      "title": "Time to Migrate",
      "description": "Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean     any combination of “less useful”, “less safe”, or “less fun”.     This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to     go. Come join me.  Here’s why",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/11/03/Time-to-Migrate",
      "published": "2025-11-03T20:00:00.000Z",
      "updated": "2025-11-03T20:00:00.000Z",
      "content": "<p>Dear World: Now is a good time to get off social media that’s going downhill. Where by “downhill” I mean\n    any combination of “less useful”, “less safe”, or “less fun”.\n    This month marks the third anniversary of my Mastodon migration and I’m convinced that right now, in late 2025, it’s the best place to\n    go. Come join me.  Here’s why.</p>\n    <h2 id=\"p-2\">Defining terms</h2>\n    <p>In this post, by “Social media” I mean \n    “what Twitter used to be, back when it was good”. We should expect our social-media future to be <em>at least</em>\n    as useful, safe, and fun as that baseline. (But we can do better!)</p>\n    <p>By “Mastodon” I mean the many servers, mostly running the\n    <a href=\"https://github.com/mastodon/mastodon\">Mastodon software</a>, that\n    communicate using the\n    <a href=\"https://en.wikipedia.org/wiki/ActivityPub\">ActivityPub protocol</a>. Now I’ll try to convince you to start using one of\n    them.</p> \n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/join-mastodon.png\" alt=\"join-mastodon.org\"></img>\n    <div class=\"caption\"><p>Start at\n    <a href=\"https://joinmastodon.org\">joinmastodon.org</a></p></div>\n    <h2 id=\"p-4\">The simplest argument</h2> \n    <p>Have you noticed that social-media products, in the long term, can’t seem to manage to stay fun and safe and useful? \n    I have.  But there’s one huge exception, a tool that’s been serving billions of us for\n    decades, and works about as well as it ever did.  I’m talking about email.</p>\n    <p>Why does email stay reasonably healthy? Because nobody owns it. Anyone on any server can communicate with anyone else on any\n    other and it Just Works. Nobody can buy it and make it a vehicle for their politics. Nobody can crank up the ad density or\n    make things worse to improve their profit margin.</p> \n    <p>Mastodon’s like email that way. Plus it does all the Post and Repost and Quote and Follow and Reply and Like and Block stuff that you’re\n    used to, and there are thousands of servers and anyone can run one and nobody can own the whole thing.  It doesn’t have ads and it\n    won’t. It’s dead easy to use and it’s fun and you should\n    <a href=\"https://joinmastodon.org\">give it a try</a>.</p>\n    <p>The rest of this essay goes into detail about why Mastodon is generally great and specifically better than the\n    alternatives. But if that simple pitch sounded good, stop here,\n    <a href=\"https://joinmastodon.org/\">go get an account</a> and climb on board.</p>\n    \n    <h2 id=\"p-18\">Why now?</h2>\n    <p>Two things motivated me to post this piece now. First, this month is  my three-year anniversary of\n    <a href=\"/ongoing/When/202x/2022/11/26/Bye-Twitter\">bailing out on Twitter</a> in favor of Mastodon.</p>\n    <p>Second is the release of Mastodon 4.5, which I think closes the last few important-missing-feature gaps.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/masto4-5.png\" alt=\"Mastodon v4.5 announcement\"></img>\n    <p>The software is improving rapidly, particularly in the last couple of releases. It’s got cool features you won’t find\n    elsewhere, and there’s very little cool stuff from elsewhere that’s not here.  There was a time when newly-arrived people had\n    confusing or unfriendly experiences, or missed features that were important to them.\n    It looks to me like those days are over.</p> \n    <h2 id=\"p-6\">Migration</h2>\n    <p>Mastodon is many thousands of servers, and you can join the biggest,\n    <a href=\"https://mastodon.social/explore\">mastodon.social</a>, or\n    <a href=\"https://joinmastodon.org/servers\">shop around for another</a>. But here’s the magic thing: If you end up disliking the\n    server you’re on, or find a better one, you can migrate and <em>take your followers with you</em>! You can’t ever get locked\n    in.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/serveres.png\" alt=\"Choosing a Mastodon server\"></img>\n    <div class=\"caption\"><p>The server-selection menu has lots of options.</p></div>\n    <p>This is probably Mastodon’s most important feature. It’s why no billionaire can buy it and no corporation can enshittify it.  As\n    far as I know, Mastodon is the first widely-adopted social software ever to offer this.</p> \n    <h2 id=\"p-7\">Interaction</h2>\n    <p>You hear it over and over: “I had <a big number> of followers on Twitter and now I have <a less-big number> on\n    Mastodon, but I get so much more conversation and interaction when I post here.”</p>\n    <p>One of the people you’ll hear that from is me.\n    My follower count is less than half the 45K I had on Twitter-that-was, but I get immensely more intelligent, friendly\n    interaction than I ever got there.  (And then sometimes I get told firmly that I’m wrong about this or that, but hey.)  It’s\n    the best social-media experience I’ve ever had.</p>\n    <p>Dunno about you, but conversation and interaction\n    seem like a big deal to me.  One reason things are lively is…</p>\n    <h2 id=\"p-8\">Sex</h2>\n    <p>Here’s an axiom: An ad-supported service can’t have sex-positive or explicit content. Advertisers simply won’t tolerate\n    having their message appear beside NSFW images or Gay-Leatherman tales or exuberant trans-positivity. Mastodon\n    can.</p>\n    <p>Of course, you gotta be reasonable, posting anything actually illegal will get your ass perma-blocked and your account\n    suspended. So will posting anything that’s NSFW etc without a “Content Warning”. That’s a built-in feature of Mastodon which\n    puts a little warning (“#NSFW” and “#Lewd” are popular) above your post, which is tastefully blurred-out until whoever’s\n    looking at it clicks on “Show content”.\n    I use these all the time when \n    I post about #baseball or #fútbol because a lot of the geeks and greens who follow me are pointedly uninterested in sports.</p>\n    <p>(Oh, typing that in reminds me that you can subscribe to hashtags on Mastodon: Let’s see, I currently subscribe to, among\n    others,\n    <a href=\"https://mastodon.social/search?q=%23Vancouver\">#Vancouver</a>,\n    <a href=\"https://mastodon.social/search?q=%23Murderbot\">#Murderbot</a>, and\n    <a href=\"https://mastodon.social/search?q=%23Fujifilm\">#Fujifilm</a>.)</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/ivory.png\" alt=\"The Ivory For Mastodon app for Apple platforms\"></img>\n    <div class=\"caption\"><p>The “Ivory for Mastodon” app for Apple platforms,<br></br>one of the many fine alternative clients.</p></div>\n    <h2 id=\"p-9\">Moderation and defederation</h2>\n    <p>Did I just mention, two paragraphs up, getting blocked? Mastodon isn’t free of griefers, but the tools to fight them are good\n    and getting better.</p>\n    <p>The good news is that each server moderates its own members. So there’s some variation\n    of the standards from server to server, but less than you’d think. Since there are thousands of servers, there are\n    thousands of moderators, which is a lot.</p>\n    <p>If you act in a way that others find offensive, you’ll probably get blocked by the offended people and also reported; the\n    report can come from any server and it’ll go to the moderators on yours. On a well-run server, those mods will have a look and\n    if you’ve actually been bad, your post might get yanked and you might get warned, or in an extreme case, booted off.</p>\n    <p>(I’ve been reported for saying unkind things about Bibi Netanyahu and for posting too many photos of my\n    cats (no, really) but that kind of thing is cheerfully ignored by good moderation teams.)</p>\n    <p>Then there’s Mastodon’s nuclear weapon: Defederation.\n    Suppose you’re prone to nasty bigotry in public and you get reported a lot and your server’s moderators <em>don’t</em> rein\n    you in. Eventually, word will get around, and if things aren’t cleaned up, most servers will defederate yours, so that\n    <em>nobody</em> on their server can see posts from anyone on yours. Your site is no longer part of the “Fediverse”; this is a powerful\n    incentive for server owners to take moderation seriously.</p>\n    <p>The effect of all this is that the haters and scammers and Nazis who show up get shuffled off-stage PDQ. Well,\n    almost always; a couple of years ago a wave of incoming Black people had bad experiences with racist abuse. Ouch. But\n    the good news is that recent Mastodon releases have been shutting prone-to-abuse channels\n    down, so things are better than then and should continue to improve.</p>\n    <h2 id=\"p-11\">Links are good</h2>\n    <p>Corporate social-media services like to\n    <a href=\"https://talkingpointsmemo.com/tpm-25/how-elon-musks-changes-to-x-made-our-discourse-far-stupider\">downrank posts with\n    links</a>.\n    Which makes me want\n    to scream, because my favorite thing to post is a link+reaction to something cool, and my favorite posts to read are too.</p>\n    <p>On Mastodon, when you have a link in a post, the software automatically fetches a preview of whatever you linked to and uses\n    it to decorate your link.\n    I mean, it’s the damn Internet, it only got interesting to non-geeks when we figured out how to turn millions of servers\n    into a great big honking searchable hypertext.</p>\n    <h2 id=\"p-12\">Search</h2>\n    <p>Speaking of which, Mastodon search is pretty good these days. It’s become, just like this blog, part of my outboard\n    memory, and I’m always typing things like “telephoto from:me has:media” into the search box. Fast enough, too.</p>\n    <h2 id=\"p-13\">Great clients</h2>\n    <p>Another good thing about Mastodon is that there are lots of\n    clients to choose from, mostly open-source. The best ones are miles ahead of Xitter and Threads and\n    Bluesky and, really, anything.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/Screenshot_20251110-104045.png\" alt=\"A post from Brian Krebs in the Tusky app\"></img>\n    <div class=\"caption\"><p>Anniversary post in the Android “Tusky” app.</p></div>\n    <p>There are official Web and mobile clients from the Mastodon team and they’re fine, especially for admin and moderation work.\n    But iOS people should check out\n    <a href=\"https://apps.apple.com/us/app/ivory-for-mastodon-by-tapbots/\">Ivory</a>, Androiders should look at\n    <a href=\"https://tusky.app\">Tusky</a>, and everyone should try\n    <a href=\"https://phanpy.social\">Phanpy</a>. I live in Phanpy on both my Mac and my Pixel<span class=\"dashes\"> —</span> it’s a\n    Web thing but installable as a PWA on both Android and iOS.</p>\n    <p>Commercial products, especially social-media services, have <em>never</em> been at peace with third-party clients.\n    Twitter used to be, but then it stabbed those developers in the back. It’s easy to\n    understand why; every product manager has it drilled into them that they <em>must control the user experience</em>. This ignores\n    the ancient wisdom (I first heard it from\n    <a href=\"https://en.wikipedia.org/wiki/Bill_Joy\">Bill Joy</a>) “Wherever you work, most of the smart people are somewhere else.”</p>\n    <p>Mastodon doesn’t have that kind of product manager, but it does have a\n    <a href=\"https://docs.joinmastodon.org/api/\">fully-capable API</a>, developed in the open and with no\n    hidden or restricted features. Which means you’re going to get better clients.</p>\n    <h2 id=\"p-14\">Algorithms</h2>\n    <p>The algorithms that commercial social-media services use to sort your feed have one goal only: Maximize engagement and thus\n    revenue. They have no concern for quality or novelty, and have been widely condemned by people who think about this stuff. So\n    much so that there’s a feeling that Algorithms Are Bad.</p>\n    <p>Mastodon has an algorithm: Show the posts from the accounts you follow, latest first. It works pretty\n    well. It also has “Trending” feeds of the most popular posts, hashtags, and links.  I hit those once a\n    day or so to get a feeling for what’s going on in the world.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/11/03/trending.png\" alt=\"Trending screen in PhanPy\"></img>\n    <div class=\"caption\"><p>The “Trending” display in Phanpy.</p></div>\n    <p>I do think there’s room for improvement here; Bluesky has shown off the idea of pluggable feed-ranking algorithms, with many to\n    choose from, and I like it. No reason in principle we couldn’t have the same thing on Mastodon.</p>\n    <h2 id=\"p-15\">Money</h2>\n    <p>Every other social network has started with a big pot of money, whether from venture-capital investors (Twitter, Instagram) or\n    from a Big Tech corporate parent (Google+, Threads).  The people who provided that money want it back, plus a whole lot more.\n    Thus, the manic drive for “engagement” and growth at all costs. They need to build huge data centers and employ an elite\n    operations team plus an even more elite marketing group.</p>\n    <p>Mastodon, eh… a gaggle of nonprofits and co-ops and unincorporated affinity groups, financed by Patreon or low annual dues\n    or Some Random Geek who enjoys running a server.</p>\n    <p>Since nobody owns it, nobody can extract a profit from it. Which means that from the big-money point of view, it’s entirely\n    non-investable. The goal isn’t for anybody to make money, it’s to be instructive and intense and fun. It’s run on the cheap.\n    You know what they call systems that are cheap and diversified? Resilient. Sustainable. Long-lived.</p>\n    <p>Last year\n    <a href=\"https://www.tbray.org/ongoing/When/202x/2024/11/15/Not-Bluesky\">I wrote</a>: \n    “Think of the Fediverse not as just one organism, but a population of mammals, scurrying around the ankles of the bigger and\n    richer alternatives. And when those alternatives enshittify or fall to earth, the Fediversians will still be there.” After\n    “scurrying” I should have added “and evolving”.</p>\n    <h2 id=\"p-19\">What about Bluesky?</h2>\n    <p>I like the Bluesky people and their software, but I worry a lot about whether they’re really decentralized in practice, and\n    even more about their financial future. I wrote up the details in\n    <a href=\"/ongoing/When/202x/2024/11/15/Not-Bluesky\">Why Not Bluesky</a>.</p>\n    <h2 id=\"p-16\">Mastodon’s the only option</h2>\n    <p>The only social-media option, I mean, that’s decentralized, not owned or controlled by anyone, and working well today as you\n    read this. It’s intense and interactive and fun. Why settle for less?</p>\n    <p><i>(Disclosure: I have no formal connections with the Mastodon organization, aside from being a low-level supporter on\n    Patreon.)</i></p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Business/Publishing",
          "term": "Business/Publishing",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Business",
          "term": "Business",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Publishing",
          "term": "Publishing",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World/Life Online",
          "term": "The World/Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Life Online",
          "term": "Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia",
      "title": "Grokipedia",
      "description": "Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I     succumbed to boredom and killed the tab. Thus my introduction to     Grokipedia. Here are early impressions",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/10/28/Grokipedia",
      "published": "2025-10-28T19:00:00.000Z",
      "updated": "2025-10-30T04:09:53.000Z",
      "content": "<p>Last night I had a very strange experience: About two thirds of the way through reading a Web page about myself, Tim Bray, I\n    succumbed to boredom and killed the tab. Thus my introduction to\n    <a href=\"https://en.wikipedia.org/wiki/Grokipedia\">Grokipedia</a>. Here are early impressions.</p>\n    <h2 id=\"p-1\">On Bray</h2>\n    <p>My Grokipedia entry has over seven thousand words, compared to a mere 1,300 in\n    <a href=\"https://en.wikipedia.org/wiki/Tim_Bray\">my Wikipedia article</a>. It’s pretty clear how it was generated; an LLM, trained\n    on who-knows-what but definitely including that Wikipedia article and this blog, was told to go nuts.</p>\n    <p>Speaking as a leading but highly biased expert on the subject of T. Bray, here are the key take-aways:</p>\n    <h2 id=\"p-2\">(Overly) complete</h2>\n    <p>It covers all the territory; there is no phase of my life’s activity that could possibly be encountered in combing the Web\n    that is not exhaustively covered. In theory this should be good but in fact, who cares about the details of what I worked on\n    at Sun Microsystems between 2004 and 2010? I suppose I should but, like I said, I couldn’t force myself to plod all the way\n    through it.</p>\n    <h2 id=\"p-3\">Wrong</h2>\n    <p>Every paragraph contains significant errors. Sometimes the text is explicitly self-contradictory on the face of it,\n    sometimes the mistakes are subtle enough that only I would spot them.</p>\n    <h2 id=\"p-4\">Style</h2>\n    <p>The writing has that LLM view-from-nowhere flat-affect semi-academic flavor. I don’t like it but the evidence suggests that\n    some people do?</p>\n    <h2 id=\"p-5\">References</h2>\n    <p>All the references are just URLs and at least some of them entirely fail to support the text. Here’s an example. In\n    discussion of my expert-witness work for the FTC in their litigation against Meta concerning its acquisitions of Instagram and\n    WhatsApp, Grokipedia says:</p>\n    <blockquote><p>[Bray] opined that users' perceptions of response times in online services critically influence market\n    dynamics.</p></blockquote>\n    <p>It cites\n    <a href=\"https://www.ftc.gov/system/files/ftc_gov/pdf/FTCReplytoMetaResponse-CounterstatementofMaterialFacts.pdf\">Federal\n    Trade Commission’s Reply to Meta Platforms, Inc.’s Response to Federal Trade Commission’s Counterstatement of Material\n    Facts</a> (warning: 2,857-page PDF). Okay, that was one of the things I argued, but the 425 pages of court documents that I\n    filed, and the references to my reporting in the monster document, make it clear that it was one tiny subset of the main\n    argument.</p>\n    <p>Anyhow, I (so that you won’t have to) spent a solid fifteen minutes spelunking back and forth through that FTC doc, looking\n    for strings like “response time” and “latency” and so on. Maybe somewhere in those pages there’s support for the claim quoted\n    above, but I couldn’t find it.</p>\n    <h2 id=\"p-6\">Useful?</h2>\n    <p>Wikipedia, in my mind, has two main purposes: A quick visit to find out the basics about some city or person or plant or\n    whatever, or a deep-dive to find out what we <em>really</em> know about genetic linkages to autism or Bach’s relationship with\n    Frederick the Great or whatever.</p>\n    <p>At the moment, Grokipedia doesn’t really serve either purpose very well. But, after all, this is release 0.1, maybe we\n    should give it a chance.</p>\n    <p>Or, maybe not.</p>\n    <h2 id=\"p-7\">Woke/Anti-Woke</h2>\n    <p>The whole point, one gathers, is to provide an antidote to Wikipedia’s alleged woke bias. So I dug into that. Let’s consider\n    three examples of what I found.  First, from that same paragraph about the FTC opinion quoted above:</p>\n    <blockquote>\n      <p>While Bray and aligned progressives contend that such dominance stifles innovation by enabling predatory acquisitions and\n      reduced rivalry—evidenced by fewer startup exits in concentrated sectors—counterarguments highlight that Big Tech's scale has\n      fueled empirical gains, with these firms investing over $240 billion in U.S. R&D in 2024 (more than a quarter of national\n      totals) and driving AI, cloud, and patent surges.[<a href=\"https://www.tbray.org/ongoing/When/202x/2020/06/08/Anti-monopoly\">128</a>]\n      [<a href=\"https://www.intereconomics.eu/contents/year/2025/number/2/article/big-tech-and-the-us-digital-military-industrial-complex.html\">131</a>] Six tech industries alone accounted for\n      over one-third of \n      U.S. GDP growth from 2012–2021, comprising about 9% of the \n      economy and sustaining 9.3 million jobs amid falling consumer prices and rapid technological diffusion.\n      [<a href=\"https://itif.org/publications/2023/05/30/six-tech-industries-accounted-for-more-than-one-third-of-gdp-growth-in-the-last-decade/\">132]</a> \n      [<a href=\"https://jamesmadison.org/the-united-states-is-the-leader-of-the-digital-revolution-pro-tech-policies-are-key/\">133</a>]\n      Right-leaning economists often defend consumer welfare metrics and market self-correction, warning that forced divestitures\n      risk eroding the efficiencies and investment incentives that have propelled sector productivity above 6% annual growth in key\n      areas like durable manufacturing tech.\n      [<a href=\"https://itif.org/publications/2025/09/19/five-persistent-myths-about-big-tech/\">134</a>]\n      [<a href=\"https://www.nber.org/digest/oct01/technology-and-productivity-growth?page=1&perPage=50\">135</a>]</p>\n    </blockquote>\n    <p>I’ve linked the numbered citations to the indicated URLs. Maybe visit one or two of them and see what you think? Four are\n    to articles arguing, basically, that monopolies must be OK because the companies accused of it are growing really fast and\n    driving the economy. They seem mostly to be from right-wing think-tanks but I guess that’s what those think-tanks are for.  One\n    of them, #131, <cite>Big Tech and the US Digital-Military-Industrial Complex</cite>, I think isn’t helpful to the argument at\n    all. But still, it’s broadly doing what they advertise: Pushing back against “woke” positions, in this case the position that\n    monopolization is bad.</p>\n    <p>I looked at a couple of other examples.  For example, this is from the header of the Greta Thunberg article:</p>\n    <blockquote>\n      <p>While credited with elevating youth engagement on environmental issues, Thunberg's promotion of urgent, existential climate\n      threats has drawn scrutiny for diverging from nuanced empirical assessments of climate risks and adaptation capacities, as\n      well as for extending her activism into broader political arenas such as anti-capitalist and geopolitical protests.[5][6]</p>\n    </blockquote>\n    <p>Somehow I feel no urge to click on those citation links.</p>\n    <p>If Ms Thunberg is out there on the “woke” end of the spectrum, let’s flit over to the other end, namely the entry for\n    J.D. Vance, on the subject of his book <cite>Hillbilly Elegy</cite>.</p>\n    <blockquote>\n      <p>Critics from progressive outlets, including Sarah Smarsh in her 2018 book <cite>Heartland</cite>, faulted the memoir for\n      overemphasizing personal and cultural failings at the expense of structural economic policies, arguing it perpetuated\n      stereotypes of rural whites as self-sabotaging.[71] These objections, often rooted in institutional analyses from academia and\n      media, overlooked data on behavioral patterns like opioid dependency rates—peaking at 21.5 deaths per 100,000 in Appalachia\n      around 2016—that aligned with Vance's observations of \"deaths of despair\" precursors.[72]</p>\n    </blockquote>\n    <p>I read and enjoyed <cite>Heartland</cite> but the citation is to a <cite>New Yorker</cite> article that doesn’t mention\n    Smarsh. As for the second sentence… my first reaction as I trudged through its many clauses, was “life’s too short”.\n    But seriously, opioid-death statistics weaken the hypothesis about structural economic issues? Don’t get it.</p>\n    <h2 id=\"p-8\">Take-away</h2>\n    <p>Wikipedia is,\n    <a href=\"/ongoing/When/202x/2024/06/15/Wikipedia-Pain\">to quote myself</a>, the encyclopedia that “anyone who’s willing to\n    provide citations can edit”.\n    Grokipedia is “the encyclopedia that Elon Musk’s LLM can edit, with sketchy citations and no progressive argument left\n    un-attacked.”</p>\n    <p>So I guess it’s Working As Intended?</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Publishing/Reference",
          "term": "Technology/Publishing/Reference",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Publishing",
          "term": "Publishing",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Reference",
          "term": "Reference",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/AI",
          "term": "Technology/AI",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "AI",
          "term": "AI",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/10/15/Current-Music",
      "title": "Recent Music",
      "description": "There are musical seasons where I re-listen to the old faves, the kind of stuff you can read about in my     half-year of “Song of the Day” essays from 2018. This autumn I find myself     listening to new music by living people.  Here’s some of it",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/10/15/Current-Music",
      "published": "2025-10-15T19:00:00.000Z",
      "updated": "2025-10-16T20:50:12.000Z",
      "content": "<p>There are musical seasons where I re-listen to the old faves, the kind of stuff you can read about in my\n    <a href=\"/ongoing/What/Song%20of%20the%20Day/\">half-year of “Song of the Day” essays</a> from 2018. This autumn I find myself\n    listening to new music by living people.  Here’s some of it.</p>\n    <p>The musical influx is directly related to my\n    <a href=\"/ongoing/When/202x/2025/06/22/Qobuz-and-Others\">adoption of Qobuz</a>, whose weekly editors’-picks are always worth a look\n    and have led me to more than half of the tunes in this post.  Qobuz, like me, still believes in the album as a useful unit of\n    music and thus I’ll cover a few of those.  And live-performance YouTubes of course.\n    You’ll spot a pattern: A lot of this stuff is African or African-adjacent with Euro angles and jazz flavors.</p>\n    <h2 id=\"p-2\">Ghana Downtown</h2>\n    <p>The\n    <a href=\"https://soundwayrecords.com/artists/kwashibu-area-band?lang=en_GB\">Kwashibu Area Band</a>, founded in Accra, have been\n    around for a few years and played in a few styles, sometimes as\n    <a href=\"https://en.wikipedia.org/wiki/Pat_Thomas_(Ghanaian_musician)\">Pat Thomas’</a> band.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/10/15/Kwashibu-Love-Warrior.png\" alt=\"Title of Love Warrior’s Anthem by Kwashibu Area Band\"></img>\n    <p>What happened was, Qobuz offered up\n    their recent\n    <a href=\"https://kwashibu.bandcamp.com/album/love-warrior-s-anthem\">Love Warrior’s Anthem</a> and there isn’t a weak spot on\n    it. Their record label says something about mixing\n    <a href=\"https://en.wikipedia.org/wiki/Highlife\">Highlife</a> and jazz; OK I guess. \n    Here’s\n    <a href=\"https://www.youtube.com/@KwashibuAreaBand\">their YouTube channel</a> but it doesn’t seem to have anything live from the\n    Love-Warrior material. It isn’t often that I listen to an entire album end-to-end more than once.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/10/15/The-New-Eves.png\" alt=\"The New Eves\"></img>\n    <div class=\"caption\"><p>Posted to Flickr by p_a_h, licensed under the  Creative Commons Attribution 4.0 International license.</p></div>\n    <h2 id=\"p-1\">Loud Rude Brits</h2>    \n<p><a href=\"https://en.wikipedia.org/wiki/The_New_Eves\">The New Eves</a> are from Brighton and Wikipedia calls them “folk punk”\n    which is weird because yeah, they’re loud and rude, but a lot of \n    the instrumental sound is cello/violin/flute. Anyhow, check out \n    <a href=\"https://www.youtube.com/watch?v=l9Q9ge6j_O4&list=RDl9Q9ge6j_O4&start_radio=1\">Mother</a>.\n    I listened to most of their recent LP <cite>The New Eve Is Rising</cite> while driving around town and that’s really a lot of\n    good and very intense music.</p>\n    <h2 id=\"p-3\">Rwanda Sings With Strings</h2>\n    <p>That’s the title of the latest from “The Good Ones”, here it is\n    <a href=\"https://thegoodonesband.bandcamp.com/album/rwanda-sings-with-strings\">on BandCamp</a>. Adrien Kazigira and Janvier\n    Havugimana are described as a “folk duo”; the songs are two-voice harmonies backed with swinging acoustic guitars. This record is\n    just like the title says:  They set up in a hotel room with a couple of string players and recorded these songs in a single take\n    with no written music and no overdubs.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/10/15/Good-Ones.png\" alt=\"Cover of Rwanda Sings With Strings by The Good Ones\"></img>\n    <p>It’s awfully sweet stuff and while none of the lyrics are in English, they offer translations of the song titles, which\n    include <cite>One Red Sunday, You Lied & Tried to Steal My Land</cite>, <cite>In the Hills of Nyarusange They Talk Too\n    Much</cite>, and <cite>You Were Given a Dowry, But Abandoned Me</cite>. This music does so much with so little.</p>\n    <h2 id=\"p-4\">Rapper Piano</h2>\n    <p><a href=\"https://alfamist.co.uk\">Alfa Mist</a> was a rapper who went to music school and learned to play keyboards as an adult.\n    The music’s straight-ahead Jazz but he still raps a bit here and there, it blends in nicely. If you get a chance to listen to an\n    interview with him you should, if only for his voice; he’s from South London and of Ugandan heritage, which results in an\n    accent like nothing I’ve ever heard before but makes me smile.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/10/15/Alfa-Mist.png\" alt=\"Alfa Mist\"></img>\n    <div class=\"caption\"><p>By Dirk Neven - Alfa Mist, Maassilo Rotterdam 20 November 2022 - Alfa Mist, CC0,\n    (<a href=\"https://commons.wikimedia.org/w/index.php?curid=133801400\">Wikimedia</a>).</p></div>\n    <p>The problem with AM’s music is that’s it’s extremely <em>smoooooooth</em>, to the point that I thought of it as sort of\n    pleasant-background stuff. Then I took in a YouTube of a live-in-studio session (maybe\n    <a href=\"https://www.youtube.com/watch?v=15Nqbic6HZs\">this one</a>?) and realized that I was listening to extremely\n    sophisticated soloing and ensemble playing that deserves to be foreground. But still sweet.</p>\n\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/10/15/Sora-Jobarteh.png\" alt=\"Sora Jobarteh\"></img>\n    <div class=\"caption\"><p>By World Trade Organization from Switzerland, cropped by User:HLHJ - Aid for Trade Global Review 2017 –\n    Day 1, CC BY-SA 2.0, (<a href=\"https://commons.wikimedia.org/w/index.php?curid=72151783 \">Wikimedia</a>).</p></div>\n    <h2 id=\"p-6\">Kora Magic</h2>\n    <p>The Kora is that Gambian instrument with a gourd at the botton and dozens of strings.\n    <a href=\"https://sonajobarteh.com\">Sona Jobarteh</a>, British-Gambian, plays Kora and guitar and sings beautifully and has a\n    great band. Here she is at <a href=\"https://www.youtube.com/watch?v=A78b9IgI3EU\">Jazz à Parquerolles</a>.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/10/15/Wagner-Glass.png\" alt=\"Vanessa Wagner Glass Etudes album cover\"></img>\n    <h2 id=\"p-7\">And now for something completely different</h2>\n    <p><a href=\"https://vanessawagner.net\">Vanessa Wagner</a> is a French classical pianist of whom I’d not heard. But Qobuz offered\n    a new recording of Phil Glass’s <cite>Piano Etudes</cite> which, despite being a big fan, I’d never listened to.\n    Here’s <a href=\"https://www.youtube.com/watch?v=mS0zt7tZYSE\">Etude No. 2</a>, which is pretty nice, as is the whole recording;\n    dreamy, shimmering stuff. I found myself leaning back with eyes closed.</p>\n    <h2 id=\"p-8\">It makes me happy</h2>\n    <p>That there’s plenty of music out there that’s new and good.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Arts/Music",
          "term": "Arts/Music",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Music",
          "term": "Music",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/09/26/GenAI-Predictions",
      "title": "GenAI Predictions",
      "description": "I’m going to take a big chance here and make predictions about GenAI’s future.     Yeah, I know, you’re feeling overloaded on this stuff and me too, but it     seems to have sucked the air out of all the other conversations. I would so like to return to     arguing about Functional Programming or Free Trade.  This is risky and there’s a pretty good chance that I’m     completely wrong. But I’ll try to entertain while prognosticating",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/09/26/GenAI-Predictions",
      "published": "2025-09-26T19:00:00.000Z",
      "updated": "2025-10-02T16:16:45.000Z",
      "content": "<p>I’m going to take a big chance here and make predictions about GenAI’s future.\n    Yeah, I know, you’re feeling overloaded on this stuff and me too, but it\n    seems to have sucked the air out of all the other conversations. I would so like to return to\n    arguing about Functional Programming or Free Trade.  This is risky and there’s a pretty good chance that I’m\n    completely wrong. But I’ll try to entertain while prognosticating.</p>\n    <h2 id=\"p-6\">Reverse Centaurs</h2>\n    <p>That’s the title of a\n    <a href=\"https://locusmag.com/feature/commentary-cory-doctorow-reverse-centaurs/\">Cory Doctorow</a> essay, which I think is spot\n    on. I’m pretty sure anyone who’s read even this far would enjoy it and it’s not long, and it’d help understand this.\n    Go have a look, I’ll wait.</p>\n    <h2 id=\"p-4\">Hallucinations won’t get fixed</h2>\n    <p>I have one good and one excellent argument to support this prediction. Good first: While my understanding of LLMs is not\n    that deep, it doesn’t have to be to understand that it’s really difficult (as in, we don’t know how) to connect the model’s\n    machinations to our underlying reality, so as to fact-check.</p>\n    <p>The above is my non-expert intuition at work. But then there’s\n    <a href=\"https://arxiv.org/pdf/2509.04664\">Why Language Models Hallucinate</a>, three authors from OpenAI and one from Georgia\n    Tech, which seems to show that hallucinations are an inevitable result of current training practices.</p>\n    <p>And here’s the excellent argument: If there were a way to eliminate the hallucinations, <em>somebody already would\n    have</em>. An army of\n    smart, experienced people, backed by effectively infinite funds, have been hunting this white\n    whale for years now without much success. My conclusion is, don’t hold your breath waiting.</p>\n    <p>Maybe there’ll be a surprise breakthrough next Tuesday. Could happen, but I’d be really surprised.</p>\n    <p>(When it comes to LLMs and code, the picture is different; see below.)</p>\n    <h2 id=\"p-1\">The mass layoffs won’t happen</h2>\n    <p>The central goal of GenAI is the elimination of tens of millions of knowledge workers.\n    That’s the only path to the profits that can cover the costs of training and\n    running those models.</p>\n    <p>To support this scenario the AI has to run in Cory’s “reverse centaur” mode, where the models do the work and the\n    humans tend them. This allows the production of several times more work per human, generally of lower quality, with inevitable\n    hallucinations. There are two problems here: First, that at least some of the output is\n    <a href=\"https://hbr.org/2025/09/ai-generated-workslop-is-destroying-productivity\">workslop</a>, whose cleanup costs eat away at\n    the productivity wins.\n    Second, that the lower quality hurts your customers and your business goes\n    downhill.</p>\n    <p>I just don’t see it. Yeah, I know, every CEO is being told that this will work and they’ll be heroes to their\n    shareholders. But the data we have so far keeps refusing to support those productivity claims.</p>\n    <p>OK then, remove the “reverse” and run in centaur mode, where smart humans use AI tools judiciously to improve productivity\n    and quality. Which might be a good idea for some people in some jobs.\n    But in that scenario neither the output boost nor the quality gain get you to where you can dismiss enough\n    millions of knowledge workers to afford the AI bills.</p>\n    <h2 id=\"p-2\">The financial damage will be huge</h2>\n    <p>Back to Cory, with <a href=\"https://pluralistic.net/2025/09/27/econopocalypse/#subprime-intelligence\">The real (economic) AI\n    apocalypse is nigh</a>. It’s good, well worth reading, but at this point pretty well conventional wisdom as seen by everyone who\n    isn’t either peddling a GenAI product or (especially) fundraising to build one.</p>\n    <p>To pile on a bit, I’m seeing things every week like for example this:\n    <a href=\"https://fortune.com/2025/09/23/ai-boom-unsustainable-tech-spending-parabolic-deutsche-bank/\">The AI boom is\n    unsustainable unless tech spending goes ‘parabolic,’ Deutsche Bank warns: ‘This is highly unlikely’</a>.</p>\n    <p>The aggregate investment is ludicrous. The only people who are actually making money are the ones\n    <a href=\"https://www.ft.com/content/e93e56df-dd9b-40c1-b77a-dba1ca01e473\">selling the gold-mining equipment</a> to the peddlers.\n    Like they say,\n    <a href=\"https://en.wikipedia.org/wiki/Herbert_Stein#Stein's_Law\">“If something cannot go on forever, it will stop.”</a> Where\n    by “forever”, in the case of GenAI, I mean “sometime in 2026, probably”.</p>\n    <h2 id=\"p-3\">… But the economy won’t collapse</h2>\n    <p>Cory forecasts existential disaster, but I’m less worried.\n    Those most hurt when the bubble collapses will be the investing classes who, generally speaking, can afford it. \n    Yeah, if the S&P 500 drops by a third, the screaming will shake the heavens, but I honestly don’t see it hitting as hard as\n    2008 and don’t see how the big-picture economy falls apart. That work that the genAI shills say would be automated away is still\n    gonna have to be done, right?</p>\n    <h2 id=\"p-5\">The software profession will change, but not <em>that</em> much</h2>\n    <p>Here’s where I get in trouble, because a big chunk of my professional peers, including people I admire, see\n    GenAI-boosted coding as pure poison:\n    <a href=\"https://anthonymoser.github.io/writing/ai/haterdom/2025/08/26/i-am-an-ai-hater.html\">“In a kind of nihilistic symmetry,\n    their dream of the perfect slave machine drains the life of those who use it as well as those who turn the gears.”</a> (The\n    title of that essay is “I Am An AI Hater.”)</p>\n    <p>I’m not a hater.\n    I argued above that LLMs generating human discourse have no way to check their output for consistency with\n    reality. But if it’s code, “reality” is approximated by what will compile and build and pass the tests. The agent-based systems\n    iteratively generate code, reality-check it, and don’t show it to you until it passes. One consequence is that the\n    quality of help you get from the model should depend on the quality of your test framework. Which warms my\n    <a href=\"/ongoing/When/202x/2021/05/15/Testing-in-2021\">testing-fanatic</a> heart.</p>\n    <p>So, my first specific prediction: Generated code will be a routine thing in the toolkit, going forward from here. It’s pretty\n    obvious that LLMs are better at predicting code sequences than human language.</p>\n    <p>In <a href=\"https://sourcegraph.com/blog/revenge-of-the-junior-developer\">Revenge of the junior developer</a>, Steve Yegge\n    says, more or less, “Resistance is useless. You will be assimilated.” But he’s wrong; there are going to be places where we\n    put the models to work, and others where we won’t. We don’t know which places those are and aren’t, but I have (weaker)\n    predictions; let’s be honest and just say “guesses”.</p>\n    <p>Where I suspect generated code will likely appear:</p>\n    <ul>\n      <li><p>Application logic: “Depreciate the values in the <code>AMOUNT</code> field of the <code>INSTALLED</code> table forward\n      ten years and write the <code>NAME</code> field and the depreciated value into a CSV.” Or “Look at JIRA ticket 248975 and\n      create a fix.”</p>\n      <p>(By the way, this is a high proportion of what actual real-world programmers do every day.)</p></li>\n      <li><p>Glorified StackOverflow-style lookups like I did in\n      <a href=\"/ongoing/When/202x/2025/07/01/First-AI-Code\">My First GenAI Code</a>.</p></li>\n      <li><p>Drafting code that needs to run against interfaces too big and complex to hold in your head, like for example the\n      Android and AWS APIs (“When I shake the phone, grab the location from GPS and drop it in the <code>INCOMING</code> S3 bucket”). Or\n      CSS (“Render that against a faded indigo background flush right, and hold it steady while scrolling so the text slides around\n      it”).</p></li>\n      <li><p>SQL. This feels like a no-brainer. So much klunky syntax and so many moving pieces.</p></li>\n    </ul>\n    <p>Where I suspect LLM output won’t help much.</p>\n    <ul>\n      <li><p>Interaction design. I mean, c’mon, it requires predicting how humans understand and behave.</p></li>\n      <li><p>Low level infrastructure code, the kind I’ve spent my whole life on, where you care a whole lot about about conserving\n      memory and finding sublinear algorithms and shrinking code paths and having good  benchmarks.</p></li>\n    </ul>\n    <p>Here are areas where I don’t have a prediction but would like to know whether and how LLM fits in (or not).</p>\n    <ul>\n      <li><p>Help with testing: Writing unit and integration tests, keeping an eye on coverage, creating a bunch of BDD tests from a\n      verbal description of what a function is going to do.</p></li>\n      <li><p>Infrastructure as code: CI/CD, Terraform and peers, all that stuff. There are so many ways to get it wrong.</p></li>\n      <li><p>Bad old-school concurrency that uses explicit mutexes and <code>java.lang.Thread</code> where you have to understand\n      language memory models and suchlike.</p></li>\n    </ul>\n    <h2 id=\"p-7\">The real reason not to use GenAI</h2>\n    <p>Because it’s being sold by a panoply of grifters and chancers and financial engineers who know that the world where their dreams\n    come true would be generally shitty, and they don’t care.</p>\n    <p>(Not to mention the environmental costs and the poor folk in the poor countries where the QA and safety work is\n    outsourced.)</p>\n    <p>Final prediction: After the air goes out of the assholes’ bubble, we won’t have to live in the world they imagine. Thank\n    goodness.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/AI",
          "term": "Technology/AI",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "AI",
          "term": "AI",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media",
      "title": "Social Media Provenance Challenge",
      "description": "At a     a recent     online conference, I said that we      can “change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers     to be believed.” I was talking about media — images, video, audio.      We can make it much easier to tell when media is faked and when it’s real.     There’s work to do, but it’s straightforward stuff and we could get there soon. Here’s how",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/10/01/C2PA-For-Social-Media",
      "published": "2025-10-01T19:00:00.000Z",
      "updated": "2025-10-01T19:00:00.000Z",
      "content": "<p>At a\n    <a href=\"https://iptc.org/news/iptc-photo-metadata-conference-2025-recordings-now-available/\">a recent\n    online conference</a>, I said that we \n    can “change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers\n    to be believed.” I was talking about media<span class=\"dashes\"> —</span> images, video, audio. \n    We can make it <em>much</em> easier to tell when media is faked and when it’s real.\n    There’s work to do, but it’s straightforward stuff and we could get there soon. Here’s how.</p>\n    <h2 id=\"p-8\">The Nadia story</h2>\n    <p>This is a vision of what success looks like.</p>\n    <p>Nadia lives in LA.\n    She has a popular social-media account with a reputation for stylish pictures of urban\n    life. She’s not terribly political, just a talented street photog. Her handle is “[email protected]”.</p>\n    <p>She’s in Venice Beach the afternoon of Sunday August 9, 2026, when federal agents take down a vendor selling\n    cheap Asian ladies’ wear. She gets a great shot \n    of an enforcer carrying away an armful of pretty dresses while two more bend the merchant over his countertop.\n    None of the agents in the picture are in uniform, all are masked.</p>\n    <p>She signs into her “CoolTonesLA” account on <code>hotpix.example</code> and drafts a post saying “Feds raid Venice\n    Beach”. When she uploads \n    the picture, there’s a pop-up asking “Sign this\n    image?” Nadia knows what this means, and selects “Yes”. By midnight her post has gone viral.</p>\n    <img src=\"cr.png\" alt=\"Content Credentials glyph\" class=\"inline\"></img>\n    <p>As a result of Nadia agreeing to “sign” the image, anyone who sees her post, whether in a browser or mobile app,  also\n    sees that little “Cr” badge in the photo’s top right corner. \n    When they mouse over it, a little pop-up says something like:</p>\n    <blockquote class=\"popup\"><p style=\"font-family: sans-serif\">Signature is valid.<br></br>Media was\n    <span class=\"fakelink\">posted</span> by\n    <span class=\"fakelink\">@CoolTonesLA</span><br></br>on \n    <span class=\"fakelink\">hotpix.example</span><br></br>at 5:40 PM PDT, August 9th, 2026.</p></blockquote>\n    <p>The links point to Nadia’s feed and her instance’s home page. Following them can give the reader a feeling\n    for what kind of person she is, the nature of her server, and the quality of her work. Most people are inclined to believe the\n    photo is real.</p> \n    <p>Marco is a troublemaker. He grabs Nadia’s photo and posts it to his social-media account with the caption\n    “Criminal illegals terrorize local business. Lock ’em up!”  He’s not technical and doesn’t strip the metadata. Since the\n    picture is already signed, he doesn’t get the “Sign this picture?” prompt.\n    Anyone who sees his post will see the “Cr” badge and mousing over it makes it pretty clear that it isn’t what he says it\n    is. Commenters gleefully point this out.  By the time Marco takes the post down, his credibility is\n    damaged.</p>\n    <p>Maggie is a more technical troublemaker. She sees Marco’s post and likes it, strips the picture’s metadata, and reposts it. \n    When she gets the “Sign this picture?” prompt, she says “No”, so it doesn’t get\n    a “Cr” badge. Hostile commenters accuse her of posting a fake, saying “LOL badge-free zone”. It is less likely that her\n    post will go viral.</p> \n    <p>Miko isn’t political but thinks the photo would be more dramatic if she Photoshopped it to add a harsh dystopian lighting\n    effect. When she reposts her version, the “Cr” badge won’t be there because the pixels have changed.</p>\n    <p>Morris follows Maggie. He grabs the stripped picture and, when he posts it, says “Yes”\n    to signing. In his post the image will show up with the “Cr” and credit it to him, with a “posted” timestamp later than Nadia’s initial\n    post. Now, the \n    picture’s believability will depend on Morris’s. Does he have a credible track record?\n    Also, there’s a chance that someone will notice what Morris did and point out that he stole Nadia’s picture.</p>\n    <p>(In fact, I wouldn’t be surprised if people ran programs against the social-network firehose looking for media signed by more than\n    one account, which would be easy to detect.)</p>\n    <p>That’s the Nadia story.</p>\n    <h2 id=\"p-2\">How it’s done</h2>\n    <p>The rest of this piece explains in some detail how the Nadia story can be supported by technology that\n    already exists, with a few adjustments. If jargon like “PKIX” and “TLS” and “Nginx” is foreign to you, you’re unlikely to\n    enjoy the following. Before you go, please consider: Do you think making the Nadia story come true\n    would be a good investment?</p>\n    <p>I’m not a really deep expert on all the bits and pieces, so it’s possible that I’ve got something wrong. Therefore, this\n    blog piece will be a living document in that I’ll correct any convincingly-reported errors, with the goal that it\n    accurately describes a realistic technical roadmap to the Nadia story.</p>\n    <p>By this time I’ve posted enough times about C2PA that I’m going to assume people know what it is and how it works. For my long,\n    thorough explainer, see\n    <a href=\"https://www.tbray.org/ongoing/When/202x/2023/10/28/C2PA-Workflows\">On C2PA</a>. Or, check out the\n    <a href=\"https://contentcredentials.org/\">Content Credentials Web site.</a></p>\n    <p>Tl;dr: C2PA is a list of assertions about a media object, stored in its metadata, with a digital signature that includes the\n    assertions and the bits of the picture or video.</p>\n    <p>This discussion assumes the use of C2PA and also an in-progress specification from the\n    <a href=\"https://cawg.io\">Creator Assertions Working Group</a> (CAWG) called\n    <a href=\"https://cawg.io/identity/1.2-draft\">Identity Assertion</a>.</p>\n    <p>Not all the pieces are quite ready to support the Nadia story. But there’s a clear path forward to closing each gap.</p>\n    <h2 id=\"p-3\">“Sign this picture?”</h2>\n    <p>C2PA and CAWG specify many assertions that you can make about a piece of media. For now let’s focus just on what we\n    need for provenance. \n    When the media is uploaded to a social-network service, there are two facts that the server knows,\n    absolutely and unambiguously: Who uploaded it (because they’ve had to sign in) and when it happened.</p>\n    <p>In the current state of\n    the specification drafts, “Who” is the <code>cawg.social_media</code> property from the draft\n    <a href=\"https://cawg.io/identity/1.2-draft/#vc-credentialsubject-verifiedidentity-type\">Identity Assertion spec, section\n    8.1.2.5.1</a>, and “When” is the <code>c2pa.time-stamp</code> property from the\n    <a href=\"https://spec.c2pa.org/specifications/specifications/2.2/specs/C2PA_Specification.html#_requirements_2\">C2PA\n    specification, section 18.17.3</a>.</p>\n    <p>I think these two are all you need for a big improvement in social network  media provenance,\n    so let’s stick with them.</p>\n    <h2 id=\"p-4\">What key?</h2>\n    <p>Let’s go back to the Nadia story.\n    It needs the Who/When assertions to be digitally signed in a way that will convince a tech-savvy human or a PKIX validation\n    library that the signature could only have been applied by the server at <code>hotpix.example</code>.</p>\n    <p>The C2PA people have been thinking about this. They are working on a\n    <a href=\"https://iptc.org/verified-news-publishers-list/\">Verified News Publishers List</a>, to be maintained and managed by,\n    uh, that’s not clear to me. The idea is that C2PA software would, when validating a digital signature, require\n    that the PKIX cert is one of those on the Publishers List.</p>\n    <p>This isn’t going to work for a decentralized social network, which has tens of thousands of independent servers\n    run by co-ops, academic departments, municipal governments, or just a gaggle of friends who kick in on Patreon. And anyhow,\n    Fediverse instances don’t claim to be “News Publishers”, verified or not.</p>\n    <p>So what key can <code>hotpix.example</code> sign with?\n    Fortunately, there’s already a keypair and PKIX certificate in place on every social-media server, the one it uses to\n    support TLS connections. The one at <code>tbray.org</code>, that’s being used right now to protect your interaction\n    with this blog, is in <code>/etc/letsencrypt/live/</code> and the private key is obviously not generally readable.</p>\n    <p>That cert will contain the public key corresponding to the host’s private key, the cert's ancestry, and the host name.\n    It’s all that any PKIX library needs to verify that yes, this could only have been signed by\n    <code>hotpix.example</code>. However, there will be objections.</p>\n    <p><b>Objection</b>: “<code>hotpix.example</code> is not a Verified News Publisher!” True enough, the C2PA validation libraries would\n    have to accept X.509 certs. Maybe they do already? Maybe this requires an extension of the current specs? In any\n    case, the software’s all open-source, could be forked if necessary.</p>\n    <p><b>Objection</b>: “That cert was issued for the purpose of encrypting TLS connections, not for some weird photo provenance\n    application. Look at the\n    <a href=\"https://en.wikipedia.org/wiki/Object_identifier\">OID</a>!” OK, but seriously, who cares?\n    The math does what the math \n    does, and it works.</p>\n    <p><b>Objection</b>: “I have to be super-careful about protecting my private key and I don’t want to give a copy to the hippies\n    running the social-media server.” I sympathize but, in most cases, social media is all that\n    server’s doing.</p>\n    <p>Having said that, it would be great if there were extensions to Nginx and Apache httpd where you could request\n    that they sign the assertions for you. Neither would be rocket science.</p>\n    <p>OK, so we sign Nadia’s Who/When assertions and her photo’s pixels  with our host’s TLS key, and ship it off into the\n    world. What’s next?</p> \n    <h2 id=\"p-5\">How to validate?</h2>\n    <p>Verifying these assertions, in a Web or mobile app, is going to require a C2PA library to pick apart the assertions and\n    a PKIX library for the signature check.</p>\n    <p>We already have\n    <a href=\"https://github.com/contentauth/c2pa-rs\">c2pa-rs</a>, Rust code with MIT and Apache licenses.\n    Rust libraries can be called\n    from some  other programming languages but in the normal course of affairs I’d expect there soon to be native implementations.\n    Once again, all these technologies are old as dirt, absolutely no rocket science required.</p>\n    <p>How about validating the signatures?  I was initially puzzled about this one because, as a\n    programmer, certs only come into the picture when I do something like <code>http.Get()</code> and the\n    library takes care of all that stuff. So I can’t speak from experience.</p>\n    <p>But I think the infrastructure is there.  Here’s a Curl blogger praising\n    <a href=\"https://eissing.org/icing/posts/curl-apple-sectrust/\">Apple SecTrust</a>. Over on Android, there’s\n    <a href=\"https://developer.android.com/reference/javax/net/ssl/X509ExtendedTrustManager\">X509ExtendedTrustManager</a>.\n    I assume Windows has something. And if\n    all else fails, you could just download a trusted-roots file from the\n    <a href=\"https://curl.se/docs/caextract.html\">Curl</a> or\n    <a href=\"https://android.googlesource.com/platform/system/ca-certificates/+/master/files/\">Android</a> projects and refresh it\n    every week or two.</p> \n    <h2 id=\"p-7\">What am I missing?</h2>\n    <p>This feels a little too easy, something that could be done in months not years. Perhaps I’m oversimplifying.\n    Having said that, I think the most important thing to get right is the scenarios, so we know what effect we want to achieve.</p>\n    <p>What do you think of the Nadia story?</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Identity",
          "term": "Technology/Identity",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Identity",
          "term": "Identity",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World/Social Media",
          "term": "The World/Social Media",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Social Media",
          "term": "Social Media",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/09/18/C2PA-Investigations",
      "title": "C2PA Investigations",
      "description": "This is the blog version of my talk at the IPTC’s online     Photo Metadata Conference conference.     Its title is the one the conference organizers slapped on my session without asking; I was initially going to     object but then I thought of the big guitar riff in Dire Straits’ Private Investigations and snickered.     If you want, instead of reading, to watch me present,     that’s on YouTube.     Here we go",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/09/18/C2PA-Investigations",
      "published": "2025-09-18T19:00:00.000Z",
      "updated": "2025-09-30T22:06:15.000Z",
      "content": "<p>This is the blog version of my talk at the IPTC’s online\n    <a href=\"https://iptc.org/events/photo-metadata-conference-2019/\">Photo Metadata Conference</a> conference.\n    Its title is the one the conference organizers slapped on my session without asking; I was initially going to\n    object but then I thought of the big guitar riff in Dire Straits’ <cite>Private Investigations</cite> and snickered.\n    If you want, instead of reading, to watch me present,\n    <a href=\"https://www.youtube.com/watch?si=BMfVGUQNcJOR1w2z&t=1610&v=wRjExw8OMUc&feature=youtu.be\">that’s on YouTube</a>.\n    Here we go.</p>\n    <p>Hi all, thanks for having me. Today I represent… nobody, <em>officially</em>. I’m not on any of the committees nor am I an\n    employee of any of the providers. But I’m a photographer and software developer and social-media activist and have written a lot about\n    C2PA. So under all those hats this is a subject I care about.</p>\n    <p>Also, I posted this on Twitter back in 2017.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/2017-twitter.png\" alt=\"Twitter post from 2017 presaging C2pA\"></img>\n    <p>I’m not claiming that I was the first with this idea, but I’ve been thinking about the issues for quite a while.</p>\n    <p>Enough self-introduction. Today I’m going to look at C2PA in practice right now in 2025. Then I’m going to talk about what I\n    think it’s for. Let’s start with a picture.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/L1000004.png\" alt=\"Picture of a shopping mall storefront\"></img>\n    <div class=\"caption\"><p>This smaller version doesn’t have C2PA,<br></br>but if you click on it, the larger version you get does.\n    <br></br>Photo credit: Rob Pike</p></div>\n    <p>I should start by saying that a few of the things that I’m going to show you are, umm, broken. But I’m still a C2PA fan. Bear\n    in mind that at this point everything is beta or preview or whatever, at best v1.0. I think we’re in glass-half-full mode.</p>\n    <p>This photo is entirely created and processed by off-the-shelf commercial products and has content credentials, and let me say\n    that I had a freaking hard time finding such a photo. There are very few Content Credentials out there on the Internet. That’s\n    because nearly every online photo is delivered either via social media or by professional publishing software. In both cases, the\n    metadata is routinely stripped, bye-bye C2PA. So one of the big jobs facing us in putting Content Credentials to work is to stop\n    publishers from deleting them.</p>\n    <p>Of course, that’s complicated. Professional publishers probably want the Content Credentials in place, but on social media\n    privacy is a key issue and stripping the metadata is arguably a good default choice. So there are a lot of policy discussions to\n    be had up front of the software work.</p>\n    <p>Anyhow, let’s look at the C2PA. </p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/ca-glyphs-1.png\" alt=\"Picture with two Content Credentials glyphs and one drop-down\"></img>\n    <p>I open up that picture in Chrome and there are little “Cr” glyphs at both the top left and top right corners; that’s because\n    I’ve installed multiple C2PA Chrome plug-ins. Turns out these seem to only be available for Chrome, which is irritating. Anyhow,\n    I’ve clicked on the one in the top left.</p> \n    <p>That’s a little disappointing. It says the credentials were recorded by Lightroom, and gives my name, but I think it’s hiding\n    way more than it’s revealing. Maybe the one on the top right will be more informative?</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/ca-glyphs-2.png\" alt=\"Picture with two Content Credentials glyphs and one drop-down\"></img>\n    <p>More or less the same info. A slightly richer presentation But both displays have an “inspect” button and both do the same\n    thing. Let’s click it!</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/broken-inspector.png\" alt=\"Content Credentials inspector page, failing to retrieve a page for review\"></img>\n    <p>This is the Adobe Content Credentials inspector and it’s broken. That’s disappointing. Having said that, I was in a Discord\n    chat with a senior Adobe person this morning and they’re aware of the problem.</p>\n    <p>But anyhow, I can drag and drop the\n    picture like they say.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/2-phase-c2pa.png\" alt=\"Content credentials as displayed by the Inspector\"></img>\n    <p>Much much better. It turns out that this picture was originally taken with a Leica M11-P. The photographer is a famous software\n    guy named Rob Pike, who follows me on Mastodon and wanted to help out.</p>\n    <p>So, thanks Rob, and thanks also to the Leica store in Sydney, Australia, who loaned him the M11. He hasn’t told me how he\n    arranged that, but I’m curious.</p>\n    <p>I edited it in Lightroom, and if you look close, you can see that I cropped it down and brightened it up. Let’s zoom in on\n    the content credentials for the Leica image.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/leica-cc.png\" alt=\"Leica-generated C2PA display\"></img>\n    <p>There’s the camera model, the capture date (which is wrong because Rob didn’t get around to setting the camera’s date before\n    he took the picture.) The additional hardware (R-Adapter-M), the dimensions, ISO, focal length, and shutter speed.</p>\n    <p>Speaking as a photographer, this is kind of cool. There’s a problem in that it’s partly wrong. The focal length isn’t zero,\n    and Rob is pretty sure he didn’t have an adapter on. But Leica is trying to do the right thing and they’ll get there.</p>\n    <p>Now let’s look at the assertions that were added by Lightroom.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/lr-cc.png\" alt=\"Lightroom-generated C2PA display\"></img>\n    <p>There’s a lot of interesting stuff in here, particularly the provenance. Lightroom lets you manage your identities, using\n    what we call “OAuth flows”, so it can ask Instagram (with my permission) what my Instagram ID is. It goes even further with\n    LinkedIn; it turns out that LinkedIn has an integration with the Clear ID people, the ones who fast-track you at the airport. So\n    I set up a Clear ID, which required photos of my passport, and went through the dance with LinkedIn to link it up, and then with\n    Lightroom so it knew my LinkedIn ID. So to expand, what it’s really saying is: “Adobe says that LinkedIn says that Clear says\n    that the government ID of the person who posted this says that he’s named Timothy Bray”.</p>\n    <p>I don’t know about you, but this feels like pretty strong provenance medicine to me. I understand that the C2PA committee and\n    the\n    <a href=\"https://cawg.io\">CAWG</a> people are re-working the provenance assertions. To them: Please don’t screw this particular\n    style of provenance up.</p>\n    <p>Now let’s look at what Lightroom says it did. It may be helpful to know what I in fact did.</p>\n    <ol>\n      <li><p>Cropped the picture down.</p></li>\n      <li><p>Used Lightroom’s “Dehaze” tool because it looked a little cloudy.</p></li>\n      <li><p>Adjusted the exposure and contrast, and boosted the blacks a bit.</p></li>\n      <li><p>Sharpened it up.</p></li>\n    </ol>\n    <p>Lightroom knows what I did, and you might wonder how it got from those facts to that relatively content-free\n    description that reads like it was written by lawyers.\n    Anyhow, I’d like to know. Since I’m a computer geek, I used the open-source “c2patool” to dump what the assertions\n    actually are.  I apologize if this hurts your eyes.</p>\n    <p>It turns out that there is way more data in those files than the inspector shows. For example, the Leica claims included 29\n    EXIF values, here are three I selected more or less at random:</p>\n    <div class=\"highlight\"><pre><span></span><span class=\"p\"></span><span class=\"w\">          </span><span class=\"nt\">\"exif:ApertureValue\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"2.79917\"</span><span class=\"p\">,</span>\n<span class=\"w\">          </span><span class=\"nt\">\"exif:BitsPerSample\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"16\"</span><span class=\"p\">,</span>\n<span class=\"w\">          </span><span class=\"nt\">\"exif:BodySerialNumber\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"6006238\"</span><span class=\"p\">,</span>\n</pre></div>\n    <p>Some of these are interesting: In the Leica claims, the serial number. I could see that as a useful provenance claim. Or as a\n    potentially lethal privacy risk. Hmmm.</p>\n        <div class=\"highlight\"><pre><span></span><span class=\"p\"></span><span class=\"w\">            </span><span class=\"p\">{</span>\n<span class=\"w\">              </span><span class=\"nt\">\"action\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"c2pa.color_adjustments\"</span><span class=\"p\">,</span>\n<span class=\"w\">              </span><span class=\"nt\">\"parameters\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">              </span><span class=\"nt\">\"action\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"c2pa.color_adjustments\"</span><span class=\"p\">,</span>\n<span class=\"w\">              </span><span class=\"nt\">\"parameters\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"nt\">\"com.adobe.acr.value\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"60\"</span><span class=\"p\">,</span>\n<span class=\"w\">                </span><span class=\"nt\">\"com.adobe.acr\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Exposure2012\"</span>\n<span class=\"w\">              </span><span class=\"p\">}</span>\n<span class=\"w\">            </span><span class=\"p\">},</span>\n<span class=\"w\">            </span><span class=\"p\">{</span>\n<span class=\"w\">              </span><span class=\"nt\">\"action\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"c2pa.color_adjustments\"</span><span class=\"p\">,</span>\n<span class=\"w\">              </span><span class=\"nt\">\"parameters\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"nt\">\"com.adobe.acr\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Sharpness\"</span><span class=\"p\">,</span>\n<span class=\"w\">                </span><span class=\"nt\">\"com.adobe.acr.value\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"52\"</span>\n<span class=\"w\">              </span><span class=\"p\">}</span>\n<span class=\"w\">            </span><span class=\"p\">},</span>\n<span class=\"w\">            </span><span class=\"p\">{</span>\n<span class=\"w\">              </span><span class=\"nt\">\"action\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"c2pa.cropped\"</span><span class=\"p\">,</span>\n<span class=\"w\">              </span><span class=\"nt\">\"parameters\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"p\">{</span>\n<span class=\"w\">                </span><span class=\"nt\">\"com.adobe.acr.value\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Rotated Crop\"</span><span class=\"p\">,</span>\n<span class=\"w\">                </span><span class=\"nt\">\"com.adobe.acr\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"Crop\"</span>\n<span class=\"w\">              </span><span class=\"p\">}</span>\n<span class=\"w\">            </span><span class=\"p\">}</span>\n</pre></div>\n    <p>And in the Lightroom section, it actually shows exactly what I did, see the sharpness and exposure values.</p> \n    <p>My feeling is that the inspector is doing either too much or too little. At the minimal end you could just say “hand\n    processed? Yes/No” and “genAI? Yes/No”.  For a photo professional, they might like to drill down and see what I actually did. I\n    don’t see who would find the existing presentation useful. There’s clearly work to do in this space.</p>\n    <p>Oh wait, did I just say “AI”? Yes, yes I did. Let’s look at another picture, in this case a lousy picture.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/TXT55638.png\" alt=\"Picture of an under-construction high-rise behind leaves\"></img>\n    <p>I was out for a walk and thought the building behind the tree was interesting. I was disappointed when I pulled it up on the\n    screen, but I still liked the shape and decided to try and save it.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/TXT55638-good.png\" alt=\"Picture of an under-construction high-rise behind leaves, improved\"></img>\n    <p>So I used Lightroom’s “Select Sky” to recover its color, and “Select Subject” to pull the building details out of the\n    shadows. Both of these Lightroom features, which are pretty magic and I use all the time, are billed as being AI-based. I\n    believe it.</p>\n    <p>Let’s look at what the C2PA discloses.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/lr-tower.png\" alt=\"Lightroom C2PA assertions with automation AI\"></img>\n    <p>Having said all that, if you look at the C2PA (or at the data behind it) Lightroom discloses only “Color or Exposure”,\n    “Cropping”, and “Drawing” edits. Nothing about AI.</p>\n    <p>Hmm. Is that OK? I personally think it is, and highlights the distinction between what I’d call “automation” AI and\n    Generative AI. I mean, selecting the sky and subject is something that a skilled Photoshop user could accomplish with a lot of\n    tinkering, the software is just speeding things up. But I don’t know, others might disagree.</p>\n    <p>Well, how about that generative AI?</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/chatgpt.png\" alt=\"Turtle in shallow water, generated by ChatGPT\"></img>\n    <div class=\"caption\"><p>Fails <code>c2patool</code> validation, “DigitalSourceType” is <code>trainedAlgorithmicMedia</code></p></div>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/budai.png\" alt=\"Desktop with decorations, Magic Erase has been applied\"></img>\n    <div class=\"caption\"><p>“DigitalSourceType” is <code>compositeWithTrainedAlgorithmicMedia</code></p></div>\n    <p>The turtle is 100% synthetic, from ChatGPT, and on the right is a Pixel 10 shot on which I did a few edits including “Magic\n    Eraser”.  Both of these came with Content Credentials; chatGPT’s is actually invalid, but on the glass-half-full front, the\n    Pixel 10’s were also invalid up until a few days ago, then they fixed it. So this stuff does get fixed.</p>\n    <p>I’m happy about the consistent use of C2PA terminology, they are clearly marking the images as genAI-involved.</p>\n    <p>I’m about done talking about the state of the Content Credentials art generally but I should probably talk about this\n    device.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/pixel-10.png\" alt=\"Blue Pixel 10\"></img>\n    <p>Because it marks the arrival of Content Credentials on the mass consumer market. Nobody knows how many Pixels Google actually\n    sells but I guarantee it’s a lot more than Leica sells M11’s. And since Samsung tends to follow Google pretty closely, we’re\n    heading for tens then hundreds of millions of C2PA-generating mobile devices. I wonder when Apple will climb on board?</p>\n    <p>Let’s have a look at that C2PA.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/p10-c2pa.png\" alt=\"C2PA associated with Magic Eraser image\"></img>\n    <p>This view of the C2PA is from the Google Photos app.  It’s very limited.  In particular, there is nothing in there to support\n    provenance. In fact, it’s the opposite, Google is bending over backward to avoid anything that could be interpreted as breaking the\n    privacy contract by sharing information about the user.</p>\n    <p>Let’s pull back the covers and dig a little deeper. Here are a few notes</p>\n    <ul>\n      <li><p>The device is identified just as “Pixel camera”. There are lots of different kinds of those!</p></li>\n      <li><p>The C2PA inclusion is Not optional!</p></li>\n      <li><p>DigitalSourceType:  <code>computationalCapture</code>
(if no genAI)</p></li>\n      <li><p>Timestamp is “untrusted”</p></li>\n    </ul>\n    <p>The C2PA not being optional removes a lot of UI issues but still, well, I’m not smart enough to have fully thought through\n    the implications. That Digital Source Type looks good and appropriate, and the untrusted-ness of the timestamp is\n    interesting.</p>\n    <p>You notice that my full-workflow examples featured a Leica rather than the Pixel, and that’s because the toolchain is\n    currently broken for me: Neither Lightroom nor Photoshop can handle the P10 C2PA. I’ll skip the details, except to say that\n    Adobe is aware of the bug, a version mismatch, and they say they’re working on it.</p>\n    <p>Before we leave the Pixel 10, I should say that there are plenty of alternate camera apps in Android and iOS, some quite\n    good, and it’d be perfectly possible for them to ship much richer C2PA, notably including provenance, location, and so on.</p>\n    <p>I guess that concludes my look at the current state of the Content Credentials art. Now I’d like to talk about what Content\n    Credentials are for.  To start with, I think it’d be helpful to sort the assertions into three baskets.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-1.png\" alt=\"C2PA assertions in Capture, Processing, and Provenance baskets\"></img>\n    <p>Capture, that’s like that Leica EXIF stuff we showed earlier. What kind of camera and lens, what the shooting parameters\n    were. Processing, that’s like the Lightroom report: How was the image manipulated, and by what software. Provenance: Which\n    person or organization produced this?</p>\n    <p>But I think this picture has an important oversimplification, let me fix that.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-2.png\" alt=\"C2PA assertion baskets with the addition of GenAI\"></img>\n    <p>Processing is logically where you’d disclose the presence of GenAI.  And in terms of what people practically care about,\n    that’s super important and deserves special consideration.</p>\n    <p>Now I’m going to leave the realm of facts and give you opinions. As for the Capture data there on the left… who cares?\n    Really, I’m trying to imagine a scenario in which anyone cares about the camera or lens or F stop.  I guess there’s an exception\n    if you want to prove that the photo was taken by one of Annie Liebowitz’s cameras, but that’s really provenance.</p>\n    <p>Let’s think about a professional publication scenario. They get photos from photographers, employees or agencies or\n    whatever. They might want to be really sure that the photo was from the photographer and not an imposter. So having C2PA\n    provenance would be nice. Then when the publisher gets photos, they do a routine check of the provenance and if it doesn’t check\n    out, they don’t run the picture without a close look first.</p>\n    <p>They also probably want to check for the “is there genAI?” indicator in the C2PA, and, well, I don’t know what they might do,\n    but I’m pretty sure they’d want to know.</p>\n    <p>That same publisher might want to equip the photos they publish with C2PA, to demonstrate that they are really the ones who\n    chose and provided the media. That assertion should be applied routinely by their content management system.  Which should be\n    easy, on the technology side anyhow.</p> \n    <p>So from the point of view of a professional publisher, provenance matters, and being careful about GenAI matters, and in the\n    C2PA domain, I think that’s all that really matters.</p>\n    <p>Now let’s turn to Social Media, which is the source of most of the images that most people see most days.  Today, all the\n    networks strip all the photo metadata, and that decision involves a lot of complicated privacy and intellectual-property\n    thinking.  But there is one important FACT that they know: For any new piece of media, they know which account uploaded the damn\n    thing, because that account owner had to log in to do it. So I think it’s a no-brainer that IF THE USER WISHES, they can have a\n    Content Credentials assertion in the photo saying “Initially uploaded by Tim Bray at LinkedIn” or whoever at wherever.</p> \n    <p>What we’d like to achieve is that if you see some shocking or controversial media, you’d really want to know who originally\n    posted it before you decided whether you believed it, and if Content Credentials are absent, that’s a big red flag. And if the\n    picture is of the current situation in Gaza, your reaction might be different depending on whether it was originally from an\n    Israeli military social-media account, or the Popular Front for the Liberation of Palestine, or by the BBC, or by\n    [email protected].</p>\n    <p>Anyhow, here’s how I see it:</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/18/3-baskets-3.png\" alt=\"C2PA assertion baskets inflated according to their relative importance\"></img>\n    <p>So for me, it’s the P and A in C2PA that matter – provenance and authenticity. I think the technology has the potential to\n    change the global Internet conversation for the better, by making it harder for liars to lie and easier for truth-tellers to be\n    believed. I think the first steps that have been taken so far are broadly correct and the path forward is reasonably clear. All\n    the little things that are broken, we can fix ’em.</p>\n    <p>And there aren’t that many things that matter more than promoting truth and discouraging lies.</p>\n    <p>And that’s all, folks.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Identity",
          "term": "Technology/Identity",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Identity",
          "term": "Identity",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/09/13/Maritime-Wrap",
      "title": "Maritime Wrap-up",
      "description": "Only a few more pictures to share from     our vacation, which I’ll wrap up in conventional tourism     advice",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/09/13/Maritime-Wrap",
      "published": "2025-09-13T19:00:00.000Z",
      "updated": "2025-09-16T05:22:33.000Z",
      "content": "<p>Only a few more pictures to share from\n    <a href=\"/ongoing/When/202x/2025/08/27/Maritime-Vacation\">our vacation</a>, which I’ll wrap up in conventional tourism\n    advice.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55876.png\" alt=\"Looking down off a cliff at a tiny boat far below\"></img>\n    <div class=\"caption\"><p>It’s mostly about the oceanfront, and what you can see from it.</p></div>\n    <h2 id=\"p-1\">Food and drink</h2>\n    <p>I recommend all of the following.</p>\n      <p><a href=\"https://www.schoolhousebrewery.ca\">Schoolhouse Brewery</a> in Windsor, NS; nice space, decent food, the Vice Principal is\n      a good IPA.  Maybe the  beer that I enjoyed most was “Exile on North Street” from\n      <a href=\"https://unfuckingfiltered.com/beer/\">unfiltered brewing</a>; you might want to follow that link and also check out\n      the URL.</p>\n      <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250815_230941783.png\" alt=\"sunset through grasses\"></img>\n      <p>I didn’t love Halifax that much but it has this charming little neighborhood called\n      <a href=\"https://en.wikipedia.org/wiki/Hydrostone\">Hydrostone</a>, where\n      <a href=\"https://www.thebrownhound.ca\">The Brown Hound</a> offered very solid food and beer.\n      We didn’t spend that much time in New Brunswick, but Moncton’s\n      <a href=\"https://www.pumphousebrewpub.ca\">Pump House</a> was cheery and competent; a cool space; I can’t remember which of\n      their IPAs I had, but it was good. The other peak New Brunswick goodness was\n      <a href=\"https://www.adorablechocolat.ca\">Adorable Chocolat</a> in Shediac, where everyone was effortlessly bilingual and the\n      pastries just divine. Don’t miss it if you’re anywhere near.</p>\n      <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55910.png\" alt=\"Cape Breton coastline, people swimming, houses on the slopes\"></img>\n      <div class=\"caption\"><p>People live by the sea, and swim in it.</p></div>\n      <p>Charlottetown’s not that rich in dining options, but got a really excellent lunch at\n      <a href=\"https://www.thecorkandcast.com\">The Cork & Cast</a>.\n      Maybe our best meal of the trip was at\n      <a href=\"https://wheelhouseseafoodpasta.ca/menu#SEAFOOD\">The Wheelhouse</a>, in Digby. Scallops all around, seared is the best\n      option.\n    </p>\n    <h2 id=\"p-5\">Cities, towns, and other tourists</h2>\n    <p>Every good tourist spot in the world seems to suffer from increasingly intense and persistent overcrowding, and the Maritimes\n    are no exception.  On top of which, they’re thinly populated, fewer than two million souls in three provinces. The biggest city,\n    Halifax (and the entire province of Prince Edward Island) are both smaller than individual Vancouver suburbs. It’s not a place\n    for savouring urban flavors.</p>\n    <p>In Nova Scotia, Halifax has too many cruise ships; stay away from its so-called “farmers market” unless you love cruise\n    culture. Lunenberg is big enough to soak up its waves of visitors and still offer unique visuals.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55847.png\" alt=\"Tourists at Peggy’s Cove\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55848.png\" alt=\"The cove at Peggy’s Cove\"></img>\n    <div class=\"caption\"><p>Overcrowded but has nice bits.</p></div>\n    <p>Peggy’s Cove I just can’t recommend; beautiful but jam-packed\n    with cars looking for parking and people risking their lives on the rocks.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250822_163228719.png\" alt=\"Fort Anne in Annapolis Royal\"></img>\n    <div class=\"caption\"><p>These were once defences but now just a pleasant walk.</p></div>\n    <p>I do recommend visiting <a href=\"https://en.wikipedia.org/wiki/Annapolis_Royal\">Annapolis Royal</a>; it’s got that great garden\n    and Fort Anne, despite its lengthy and chequered military history, is lovely and peaceful.</p> \n    <p>In PEI, Charlottetown makes an effort and it has a beautiful basilica, but just isn’t big enough to reward a whole day’s\n    visit.</p>\n    <p>In NB, Moncton is OK but its biggest tourist attraction is the tide going in and out.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55961.png\" alt=\"Crowded tidal flat at Hopewell Provincial Park\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT55966.png\" alt=\"Clifftop forest at Hopewell Provincial Park\"></img>\n    <div class=\"caption\"><p>Hopewell Provincial Park, NB. The clifftop trees are exceptional.</p></div>\n    <h2 id=\"p-3\">Lodging</h2>\n    <p>The hotels and Airbnbs and VRBOs were OK, mostly. The\n    <a href=\"https://www.theharbourviewinn.com\">Harbourview Inn</a>, near Digby, is a charmingly-traditional guest-house. The rooms\n    are OK, but the downstairs is warmly welcoming, drinks available when the host’s there to man the bar, lots of space to sink\n    into a comfy chair and conversation or your laptop. Also the breakfast was solid.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250813_113114060.png\" alt=\"Sky drama over Lake Ainsley\"></img>\n    <div class=\"caption\"><p>Excited clouds over Lake Ainsley, NS.</p></div>\n    <p>But the trip’s lodging highlight was this VRBO called\n    <a href=\"https://www.vrbo.com/en-ca/cottage-rental/p9830781\">Forest Lake House</a> on Lake\n    Ainsley, the Maritimes’ biggest. Isolated, comfortable, outstanding grounds, your own private forest walk; everything anyone\n    could want. We stopped traveling and had a chill-out day there, enjoying every minute of it.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250817_152127492.png\" alt=\"Swimming at Cavendish, PEI\"></img>\n    <div class=\"caption\"><p>Lots of people but plenty at room at Cavendish beach.</p></div>\n    <h2 id=\"p-4\">Otherwise</h2>\n    <p>We only swam once, at Cavendish Beach in PEI’s Anne of Green Gables territory, very nicely set up.  But what looked\n    most appealing to me was \n    <a href=\"https://www.lockeport.ns.ca/index.php/tourism-recreation/crescent-beach-vic\">Crescent Beach</a> in Lockeport, Nova\n    Scotia; I wish we’d made time to have a swim there.</p>\n    <p>Turns out all three vacationers had farming or agriculture-adjacent roots. If you care about that stuff, driving around PEI\n    is a treat; the agriculture is super-intensive and, to my eye, pleasingly well-done.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56060.png\" alt=\"A farm field with hay bales by the seaside\"></img>\n    <div class=\"caption\"><p>The farmlands extend to the seaside.</p></div>\n    <p>But if you have the time, get away from PEI’s farms and head northwest, drive\n    down the coast from Tignish to West Point; that ride is full of colors and sea-fronts that aren’t like anywhere else I’ve\n    seen.</p>\n    <p>Since it’s the New World there’s plenty of nasty history around the indigenous folk, the\n    <a href=\"https://en.wikipedia.org/wiki/Mi%27kmaq\">Mi'kmaq</a> nation. But you really have to look to find it. We visited the\n    <a href=\"https://www.millbrookheritagecentre.ca\">Millbrook Cultural & Heritage Centre</a> in Truro, which is much better\n    than nothing.</p>\n    <p>You gotta drive; we put 3,742km on a basic rented Kia. The roads are way better taken care of than here out West.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56014.png\" alt=\"Maritime sunset\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/PXL_20250824_214226484.png\" alt=\"The ocean near Liverpool, NS\"></img>\n    <div class=\"caption\"><p>Bye-bye, Maritimes.</p></div>\n    <p>We didn’t run across a single human Maritimer who was anything less than friendly and welcoming.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/13/TXT56069.png\" alt=\"A white house perched on rocks above the sea-side\"></img>\n    <p>Nice people living along\n    beautiful oceanfronts, plenty good enough for me.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Places/Maritimes",
          "term": "The World/Places/Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Places",
          "term": "Places",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Maritimes",
          "term": "Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/09/01/Maritime-Colors",
      "title": "Maritime Colors",
      "description": "When someone (like us)     comes back from a trip to the Maritimes, they’re apt to have pictures of     brightly-colored houses. This is to show those colors off and not just in houses. Plus a camera color     conundrum",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/09/01/Maritime-Colors",
      "published": "2025-09-01T19:00:00.000Z",
      "updated": "2025-09-06T05:48:59.000Z",
      "content": "<p>When someone (<a href=\"/ongoing/When/202x/2025/08/27/Maritime-Vacation\">like us</a>)\n    comes back from a trip to the Maritimes, they’re apt to have pictures of\n    brightly-colored houses. This is to show those colors off and not just in houses. Plus a camera color\n    conundrum.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55945.png\" alt=\"A trailer park with small building covered by bright colored fenders\"></img>\n    <div class=\"caption\"><p>On the northwest coast of PEI, probably near Cape Wolfe.</p></div>\n    <p>In that picture above, glance at the bit of beach showing left of the little lighthouse. There’s a color story there\n    too.</p>\n    <h2 id=\"p-1\">Residentials</h2>\n    <p>As it happens, our very first outing on the vacation was to\n    <a href=\"https://en.wikipedia.org/wiki/Lunenburg,_Nova_Scotia\">Lunenberg</a>, which features those cheerful houses.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55826.png\" alt=\"Brightly colored houses in Lunenberg\"></img>\n    <p>It wasn’t just tourist magnets like Lunenberg; anywhere in the Maritimes you’re apt to see exuberantly-painted\n    residences, a practice I admire. While the Maritimes are a long way from my home in Vancouver, we share a long, dim, grey\n    winter, and any splash of color can help with that Seasonal Affective Disorder.</p>\n    <p>Also, we\n    <a href=\"/ongoing/When/202x/2025/02/28/Moved\">recently bought a house</a> and, while we like it, it’s an undistinguished\n    near-grey, so we’re looking for color schemes to steal.\n    Thus I took lots of pictures of bright houses.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/PXL_20250822_180516990.png\" alt=\"Apricot-and-brown house\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55828.png\" alt=\"Blue house in Lunenberg\"></img>\n    <p>A couple years back we painted our cabin a cheery blue based on sampling photos of the shutters on Mykonos. A few \n    neighbors rolled their eyes but nobody’s actually complained.</p>\n    <h2 id=\"p-2\">Red</h2>\n    <p>That’s the other color you have to talk about down east; I mean the color of the soil and sand and rocks. PEI in\n    particular is famous for its red dirt, when you come in the on the ferry from Nova Scotia the first thing you notice is the\n    island’s red fringe. I took a million pictures and maybe this is the closest to capturing it.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55948.png\" alt=\"Red sand and dirt on a PEI beachfront\"></img>\n    <div class=\"caption\"><p>Not far from that first picture.</p></div>\n    <h2 id=\"p-3\">Green Conundrum</h2>\n    <p>One of Nova Scotia’s attractions is the\n    <a href=\"https://en.wikipedia.org/wiki/Cabot_Trail\">Cabot Trail</a>, a 300km loop around Cape Breton, stretching northeast out\n    into the Atlantic. This one scenic turn-off has you looking at a big, densely-forested mountainside. \n    It’s more chaotic than our West-Coast temperate rain forests, with many tree species jumbled together. The\n    spectrum of greens under shifting clouds was a real treat for the eyes. Here are two of the pictures I came away with.\n    Have a look at them for a moment.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/PXL_20250813_161053505.png\" alt=\"Forested mountainside\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/09/01/TXT55881.png\" alt=\"Forested mountainside\"></img>\n    <p>Above is by my Pixel 7, below a modern Fujifilm camera.  When I unloaded them on the\n    big outboard screen, I was disappointed with the Fujifilm take, which seemed a little flat and boring; was thinking the Pixel had\n    done better. But then I started feeling uneasy; my memory kept telling me that that mountainside just\n    didn’t include that yellow flavor in the Pixel’s highlights. I mean, those highlights look great, but I’m pretty sure they’re lies.</p>\n    <p>After a while, I edited the Fujifilm version just a teeny bit, gently bumping Lightroom’s “exposure” and “Vibrance” sliders, and\n    I thought what \n    I got was very close to what I remembered. The Pixel photo is entirely un-touched.</p>\n    <p>I’m not sure what to think. Mobile-phone cameras in general and the Pixel in particular proudly boast their “computational\n    photography” and “AI” chops and, yeah, the Pixel produced a photo that it’s hard not to like.</p>\n    <p>And quite a few of the pictures I publish in this space have have been adjusted pretty heavily in Lightroom. I stand by my\n    claim that I’m mostly trying to make something that looks like what I saw. But increasingly, I suspect the Pixel is showing\n    colors people like, as opposed to what’s real.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Places/Maritimes",
          "term": "The World/Places/Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Places",
          "term": "Places",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Maritimes",
          "term": "Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts/Photos/Cameras",
          "term": "Arts/Photos/Cameras",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Arts",
          "term": "Arts",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Photos",
          "term": "Photos",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Cameras",
          "term": "Cameras",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/08/30/Maritime-Wildlife",
      "title": "Maritime Birds and Bees",
      "description": "Nova Scotia and New Brunswick each have plenty of wilderness; PEI not so much. So pictures of bears and cougars and so on     would be plausible, as would marine mammals. But no. Herewith, from our     recent vacation, birds and bees, with a little     lens-geek side trip",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/08/30/Maritime-Wildlife",
      "published": "2025-08-30T19:00:00.000Z",
      "updated": "2025-08-31T16:05:08.000Z",
      "content": "<p>Nova Scotia and New Brunswick each have plenty of wilderness; PEI not so much. So pictures of bears and cougars and so on\n    would be plausible, as would marine mammals. But no. Herewith, from our\n    <a href=\"/ongoing/When/202x/2025/08/27/Maritime-Vacation\">recent vacation</a>, birds and bees, with a little\n    lens-geek side trip.</p>\n    <h2 id=\"p-1\">Birds</h2>\n    <p>Having touristed around Charlottetown, we drove down a series of smaller and smaller back roads and ended up\n    at Canceaux Cove near Rocky Point, which I thought might present a nice vista of the city. It did, but the city looks boring.\n    By way of consolation, there were these cute little birds running around on the beach and then flying loops in formation over the\n    water.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55982.png\" alt=\"Small birds on a beach\"></img>\n    <div class=\"caption\"><p>Pretty sure these are\n    <a href=\"https://en.wikipedia.org/wiki/Semipalmated_plover\">Semipalmated plovers</a>.</p></div>\n    <p>I wanted to get a picture of them in the air so I sauntered down the beach, assuming\n    they’d fly away picturesquely. They studiously ignored me and eventually I had to jump and down and wave my arms and even then\n    they took off grudgingly.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55984.png\" alt=\"small birds flying over the ocean\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT55987.png\" alt=\"small birds flying over the ocean\"></img>\n    <p>They were graceful and did this mysterious thing that birds can do, staying in formation with no obvious leader.\n    I’ve had the pleasure, very occasionally, of being in engineering teams like that.</p>\n    <h2 id=\"p-2\">Bees</h2>\n    <p>We went to\n    <a href=\"https://en.wikipedia.org/wiki/Annapolis_Royal\">Annapolis Royal</a> because of its\n    <a href=\"https://historicgardens.wordpress.com\">Historic Gardens</a> and wow, what a treat. I think even those who don’t see\n    themselves as garden fans would enjoy an hour or more sauntering around in there.  I like taking pictures of flowers and a lot\n    of these flowers had bees in them.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56034-2.png\" alt=\"Three orange flowers, one with bee\"></img>\n    <p>This one was cute enough to reward a close-up.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56034.png\" alt=\"Close-up of bee in orange flower.\"></img>\n    <div class=\"caption\"><p>Aren’t her wings cute?</p></div>\n    <p>And I ask, what could be better than a cute bee in a pretty flower? Obviously, <em>two</em> bees.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56040.png\" alt=\"Two bees in an orange flower\"></img> \n    <p>And again, a closer look.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56040-2.png\" alt=\"Two bees in an orange flower, close-up\"></img>\n    <p>Bees are admirable creatures and I don’t want to make fun of them, but this surprised-looking little citizen makes me\n    laugh. (She’s just navigating from one blossom to the next.)</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56045.png\" alt=\"bee caught in flight among the blossoms\"></img>\n    <h2 id=\"p-3\">Lens</h2>\n    <p>All of these are shot with Fujifilm’s\n    <a href=\"https://www.fujifilm-x.com/en-ca/products/lenses/xf55-200mmf35-48-r-lm-ois/\">55-200mm</a> lens, which I’ve had for at\n    least eleven years. Up till now, I’ve always pointed it at faraway things, but wow, I think I’ll be taking this to more gardens\n    in future.</p>\n    <p>I mention the lens partly so I can link to this\n    <a href=\"https://www.lensrentals.com/blog/2016/02/the-long-awaited-scary-and-amazing-fuji-lens-teardown/?srsltid=AfmBOorQfgob6drIXwtTJ9xuixBbnSvZE2F8x7Jba0AA3U60uoFAB3gY\">awesome\n    (and funny) teardown piece</a> from Lensrentals.</p>\n    <p>And, on the way out, let’s let that lens show off with a couple of roses.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56057.png\" alt=\"Yellow rose and bud\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/30/TXT56058.png\" alt=\"Pink roses, black background\"></img>\n    <p>Remember, pink and black are the colors of rock & roll.\n    And if you’re anywhere near Annapolis Royal, stop and visit that garden.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Places/Maritimes",
          "term": "The World/Places/Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Places",
          "term": "Places",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Maritimes",
          "term": "Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/08/27/Maritime-Vacation",
      "title": "Maritime Vacation",
      "description": "The sound of the wind surging through birchy Eastern woods isn’t like the same coastal gusts in my own Pacific rain     forest; around you not above you, alto not baritone. The colors differ too: Forests, houses, soil, and sea. And everywhere     little white churches, each with its cemetery. A scattering of forts, far too many cannons.  And everything faces the sea",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/08/27/Maritime-Vacation",
      "published": "2025-08-27T19:00:00.000Z",
      "updated": "2025-08-28T19:36:15.000Z",
      "content": "<p>The sound of the wind surging through birchy Eastern woods isn’t like the same coastal gusts in my own Pacific rain\n    forest; around you not above you, alto not baritone. The colors differ too: Forests, houses, soil, and sea. And everywhere\n    little white churches, each with its cemetery. A scattering of forts, far too many cannons.  And everything faces the sea.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250814_142523016.png\" alt=\"Cape Breton forest\"></img>\n    <div class=\"caption\"><p>Birchy Cape Breton forest.</p></div>\n    <p>For the first time since Covid and, more important, since Lauren’s 2½-year battle with Long Covid, we went on the road for\n    pleasure; Lauren and I and our dear friend Sally from Warragul, Australia. To my shame, all my decades’ travel had never taken\n    me to Canada east of Montreal, so we spent a couple of weeks poking around Nova Scotia and Prince Edward Island, plus a bit of\n    New Brunswick. I took many pictures and it’ll take a few blog pieces to share those that I think deserve it.</p>\n    <p>No part of Canada’s settler culture is old by European or Asian standards, but ten generations of white people\n    lived and died here before the first rough town organized itself near what’s now Vancouver. They had to be buried someplace, thus the\n    graveyards everywhere you go. These were captured near Whycocomagh.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55871.png\" alt=\"Gravestone of Lillian S. DeWolfe, 1876-1958\"></img>\n    <div class=\"caption\"><p>Lillian S. DeWolfe, Oct 1876 Sept 1958.</p></div>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55874.png\" alt=\"A simple grave marker saying only “sleeping”\"></img>\n    <p>How long will it still matter that my hometown is one of the world’s youngest big cities?</p>\n    <p>Many graveyards are church attachments, but many more greet you at a random turn in the road; always framed by forest.\n    The density of churches is remarkable; all built of wood, mostly white, mostly well-kept. This one was attached to the graves\n    above and is untypically faded (but lovely inside).</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55869.png\" alt=\"Square white wooden church, it needs a paint job\"></img>\n    <p>Some of the churches have become boutiques and breweries, but those that haven’t still occur more densely than in any other\n    New World jurisdiction I’ve seen. Why should faith hold stronger down East?</p>\n    <p>Another church, St Dunstan’s Basilica in Charlottetown, offered perhaps the most intense experience of the whole trip,\n    because a singer and organist were practicing elaborate hymn treatments. Both were great, the organ is a magnificent Casavant,\n    and parish organist\n    <a href=\"https://en.wikipedia.org/wiki/Leo_Marchildon\">Leo Marchildon</a> was having fun, putting lots of wind through those\n    pipes including the 32’ bass monsters.  My ears and I were smiling when we left.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55925.png\" alt=\"Stained glass in St. Dunstan’s Basilica, Charlottetown\"></img>\n    <div class=\"caption\"><p>The stained glass is nothing special<br></br>but I liked the opened panes at the bottom.</p></div>\n    <p>Forts and cannons, I said; the Maritimes’ messy history included repeated captures and recaptures by the forces of France and\n    Britain and the USA, and quite a few of the forts had been put to their intended use, repelling or falling to one invader or\n    another.</p>\n    <p>The locals, at least the ones who set things up for tourists, seem to take their history seriously; I don’t pretend\n    expertise or even much interest in it, but I have to say that some cannons have good typography.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250824_214613137.png\" alt=\"Engraving on metal: Crown and “VR”\"></img>\n    <div class=\"caption\"><p>“VR” is Victoria Regina of course,<br></br>so sometime in the second half of the 19<sup>th</sup>\n    century.</p></div>\n    <p>The colors are different, and an entry later in this series will dip in gleefully and give me a platform for camera geekery.\n    One expects changes in houses and vegetation when you travel four timezones away, but nothing prepared\n    me for the shockingly red soil in Prince Edward Island (hereinafter PEI).</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT55937.png\" alt=\"red and blue see, red soil, wind turbines\"></img>\n    <div class=\"caption\"><p>Past Tignish at PEI’s northern extremity,<br></br>well off the paved-roads part.</p></div>\n    <p>I opened with words about everything facing the sea. Not entirely true, sometimes you’re looking at a lake.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250823_162017189.png\" alt=\"Kids in a large calm lake, circular ripples\"></img>\n    <div class=\"caption\"><p>Those kids don’t know how lucky they are.</p></div>\n    <p>This is in the wonderful Kejimkujik National Park in central Nova Scotia, mostly closed due to extreme wildfire peril.</p>\n    <p>All across the Maritimes, drought was in effect; crops failing, forest trails closed. Which reminds me; near that lake there was a\n    birch-bark-canoe workshop. I asked the guy making the canoe how long it took. He said “My great-grandpa could do it in seven days,\n    because back then there were birch trees big enough that you could make the whole hull out of a single piece.”  It’s very\n    difficult to find any aspect of life on earth that isn’t exhibiting Anthropocene damage.</p>\n    <p>Usually, it’s the sea that you’re looking at.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/TXT56066.png\" alt=\"Nova Scotia coastline near Annapolis Royal\"></img>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250822_223613924.png\" alt=\"rocky beach at low tide\"></img>\n    <div class=\"caption\"><p>Above, coastline near Annapolis Royal.<br></br>Below, low tide near Chipman Brook.</p></div>\n    <p>From one end of Canada to the other; to me, the surprise was not so much the difference in the landscapes but the similarity\n    of the people; they spoke my accent, shopped in my stores, obeyed my road signs. More on that later. For now, this.</p>\n    <img src=\"https://www.tbray.org/ongoing/When/202x/2025/08/27/PXL_20250825_141305938.png\" alt=\"Trees frame the seawater and a couple of oceanfront houses\"></img>\n    <div class=\"caption\"><p>On Bell Island, among the LaHaves.</p></div>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Places/Maritimes",
          "term": "The World/Places/Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Places",
          "term": "Places",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Maritimes",
          "term": "Maritimes",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/08/14/RFC9839",
      "title": "RFC 9839 and Bad Unicode",
      "description": "Unicode is good. If you’re designing a data structure or protocol that has text fields, they should contain     Unicode characters encoded in UTF-8. There’s another question, though:     “Which Unicode characters?” The      answer is “Not all of them, please exclude some.”",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/08/14/RFC9839",
      "published": "2025-08-14T19:00:00.000Z",
      "updated": "2025-08-23T10:17:06.000Z",
      "content": "<p>Unicode is good. If you’re designing a data structure or protocol that has text fields, they should contain\n    Unicode characters encoded in UTF-8. There’s another question, though:\n    “<em>Which</em> Unicode characters?” The \n    answer is “Not all of them, please exclude some.”</p>\n    <p>This issue keeps coming up, so Paul Hoffman and I put together an individual-submission draft\n    to the IETF and now (where by “now” I mean “two years later”) it’s been published as\n    <a href=\"https://www.rfc-editor.org/rfc/rfc9839.html\">RFC 9839</a>. It explains which characters are bad, and why, then offers\n    three plausible less-bad subsets that you might want to use.\n    Herewith a bit of background, but…</p>\n    <h2 id=\"p-2\">Please</h2>\n    <p>If you’re actually working on something new that will have text fields, please read the RFC. It’s only ten pages long, and that’s\n    with all the IETF boilerplate. It’s written specifically for software and networking people.</p>\n    <h2 id=\"p-3\">The smoking gun</h2>\n    <p>The badness that 9839 focuses on is “problematic characters”, so let’s start with a painful example of what that means.\n    Suppose you’re designing a protocol that uses JSON and one of your constructs has a <code>username</code> field.\n    Suppose you get this message (I omit all the non-<code>username</code> fields). It’s \n    a perfectly legal JSON text:</p>\n    <div class=\"highlight\"><pre><span></span><span class=\"p\">{</span>\n  <span class=\"w\">  </span><span class=\"nt\">\"username\"</span><span class=\"p\">:</span><span class=\"w\"> </span><span class=\"s2\">\"\\u0000\\u0089\\uDEAD\\uD9BF\\uDFFF\"</span>\n<span class=\"p\">}</span>    </pre></div>\n    <p>Unpacking all the JSON escaping gibberish reveals that the value of the <code>username</code> field contains four \n    numeric “code points” identifying Unicode characters:</p>\n    <ol>\n      <li><p>The first code point is zero, in Unicode jargon <code>U+0000</code>. In human-readable text it\n      has no meaning, but it will interfere with the operation of certain programming languages.</p></li>\n      <li><p>Next is Unicode <code>U+0089</code>, official name “CHARACTER TABULATION WITH JUSTIFICATION”. It’s what Unicode calls a\n      <a href=\"https://en.wikipedia.org/wiki/C0_and_C1_control_codes\">C1\n      control code</a>, inherited from ISO/IEC 6429:1992, adopted from \n      <a href=\"https://www.ecma-international.org/wp-content/uploads/ECMA-48_5th_edition_june_1991.pdf\">ECMA 48</a> (1991), which calls it\n      “HTJ” and says: <i>HTJ causes the contents of the active field (the field in the presentation component that contains the\n      active presentation position) to be shifted forward so that it ends at the character position preceding the\n      following character tabulation stop. The active presentation position is moved to that following character\n      tabulation stop. The character positions which precede the beginning of the shifted string are put into the\n      erased state.</i></p>\n      <p>Good luck with that.</p></li>\n      <li><p>The third code point, <code>U+DEAD</code>, in Unicode lingo, is an “unpaired surrogate”.  To understand,\n      you’d have to learn how Unicode’s much-detested\n      <a href=\"https://en.wikipedia.org/wiki/UTF-16\">UTF-16</a> encoding works.\n      I recommend not bothering.</p>\n      <p>All you need to know is that surrogates are only meaningful when they come in pairs in UTF-16 encoded text. There is\n      effectively no such text on the wire and thus no excuse for tolerating surrogates in your data. In fact, the UTF-8 specification\n      says that you mustn’t use UTF-8 to encode surrogates. But the real problem is that different libraries in different\n      programming languages don’t always do the same things when they encounter this sort of fœtid interloper.</p>    </li>\n      <li><p>Finally, <code>\\uD9BF\\uDFFF</code> is JSON for the code point <code>U+7FFFF</code>.\n      Unicode has a category called “noncharacter”, containing a few dozen code points that, for a variety of\n      reasons, some good, \n      don’t represent anything and must not be interchanged on the wire. <code>U+7FFFF</code> is one of those.</p></li>\n    </ol>\n    <p>The four code points in the example are all clearly problematic. \n    The just-arrived RFC 9839 formalizes the notion of “problematic” and\n    offers easy-to-cite language saying which of these problematic types you want to\n    exclude from your text fields. Which, if you’re going to use JSON, you should probably do.</p>\n    <h2 id=\"p-6\">Don’t blame Doug</h2>\n    <p>Doug Crockford I mean, the inventor of JSON.  If he (or I or really anyone careful) were inventing JSON now that Unicode is\n    mature, he’d have been fussier about its character repertoire. Having said that, we’re stuck with JSON-as-it-is forever, so we\n    need a good way to say which of the problematic characters we’re going to exclude even if JSON allows them.</p>\n    <h2 id=\"p-5\">PRECISion</h2>\n    <p>You may find yourself wondering why the IETF waited until 2025 to provide help with Bad Unicode.\n    It didn’t; here’s\n    <a href=\"https://www.rfc-editor.org/rfc/rfc8264.html\">RFC 8264</a>: <cite>PRECIS Framework: Preparation, Enforcement, and\n    Comparison of Internationalized Strings in Application Protocols</cite>; the first PRECIS predecessor was published in 2002.\n    8264 is 43 pages long, containing a <em>very</em>\n    thorough discussion of many more potential Bad Unicode issues than 9839 does.</p>\n    <p>Like 9839, PRECIS specifies subsets of the Unicode character repertoire and goes further, providing a mechanism for defining\n    more.</p>\n    <p>Having said that, PRECIS doesn’t seem to be very widely used by people who are defining new data structures and protocols. My\n    personal opinion is that there are two problems which make it hard to adopt. First, it’s large and \n    complex, with many moving parts, and requires careful study to understand. Developers are (for good reason) lazy.</p>\n    <p>Second, using PRECIS ties you to a specific version of Unicode. In particular, it forbids the use of the (nearly a million)\n    unassigned code points. Since each release of Unicode includes new code point assignments, that means that a sender and receiver\n    need to agree on exactly which version of Unicode they’re both going to use if they want reliably interoperable behavior. This\n    makes life difficult for anyone writing a general-purpose code designed to be used in lots of different applications.</p>\n    <p>I personally think that the only version of Unicode anybody wants to use is “as recent as possible”, so they can be confident\n    of having all the latest emojis.</p>\n    <p>Anyhow, 9839 is simpler and dumber than PRECIS. But I think some people will find it useful and now the IETF agrees.</p>\n    <h2 id=\"p-7\">Source code</h2>\n    <p>I’ve written a little Go-language library to validate incoming text fields against each of the three subsets that 9839\n    specifies,\n    <a href=\"https://github.com/timbray/RFC9839\">here</a>.  I don’t claim it’s optimal, but it is well-tested.</p>\n    <p>It doesn’t have a version number or release just yet, I’ll wait till a few folk have had a chance to spot any dumb mistakes I\n    probably made.</p>\n    <h2 id=\"p-9\">Details</h2>\n    <p>Here’s a compact summary of the world of problematic Unicode code points and data formats and standards.</p>\n    <table>\n      <tr valign=\"top\" align=\"center\"><td class=\"empty\"></td><th colspan=\"3\">Problematic classes excluded?</th></tr>\n      <tr valign=\"top\"><td class=\"empty\"></td><th>Surrogates</th><th>Legacy controls</th><th>Noncharacters</th></tr>\n      <tr align=\"center\"><td>CBOR</td><td class=\"happy\">yes</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td></tr>\n      <tr align=\"center\"><td>I-JSON</td><td class=\"happy\">yes</td><td class=\"unhappy\">no</td><td class=\"happy\">yes</td></tr>\n      <tr align=\"center\"><td>JSON</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td></tr>\n      <tr align=\"center\"><td>Protobufs</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td></tr>\n      <tr align=\"center\"><td>TOML</td><td class=\"happy\">yes</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td></tr>\n      <tr align=\"center\"><td>XML</td><td class=\"happy\">yes</td><td class=\"neutral\">partial [1]</td><td class=\"neutral\">partial [2]</td></tr>\n      <tr align=\"center\"><td>YAML</td><td class=\"happy\">yes</td><td class=\"neutral\">mostly [3]</td><td class=\"neutral\">partial [2]</td></tr>\n      <tr valign=\"top\" align=\"center\"><td class=\"empty\"></td><th colspan=\"3\">RFC 9839 Subsets</th></tr>\n      <tr align=\"center\"><td>Scalars</td><td class=\"happy\">yes</td><td class=\"unhappy\">no</td><td class=\"unhappy\">no</td></tr>\n      <tr align=\"center\"><td>XML</td><td class=\"happy\">yes</td><td class=\"neutral\">partial</td><td class=\"neutral\">partial</td></tr>\n      <tr align=\"center\"><td>Assignables</td><td class=\"happy\">yes</td><td class=\"happy\">yes</td><td class=\"happy\">yes</td></tr>\n    </table>\n    <p>Notes:</p>\n    <p><b>[1]</b> XML allows C1 controls.</p>\n    <p><b>[2]</b> XML and YAML don’t exclude the noncharacters outside the Basic Multilingual Pane.</p>\n    <p><b>[3]</b> YAML excludes all the legacy controls except for the mostly-harmless <code>U+0085</code>, another version of\n    <code>\\n</code> used in IBM mainframe documents.</p>\n    <h2 id=\"p-8\">Thanks!</h2>\n    <p>9839 is not a solo production. It received an extraordinary amount of discussion and improvement from a lot of smart and\n    well-informed people \n    and the published version, 15 draft revisions later, is immensely better than my initial draft. My sincere thanks go to my\n    co-editor Paul Hoffman and to all those mentioned in the RFC’s “Acknowledgements” section.</p>\n    <h2 id=\"p-4\">On individual submissions</h2>\n    <p>9839 is the second “individual submission” RFC I’ve pushed through the IETF (the other is\n    <a href=\"https://datatracker.ietf.org/doc/html/rfc7725\">RFC 7725</a>, which registers the HTTP 451 status code).  While it’s nice\n    to decide something is worth standardizing and eventually have that happen, it’s really a lot of work. Some of that work is\n    annoying.</p>\n    <p>I’ve been involved in\n    other efforts as Working-Group member, WG chair, and WG specification editor, and I can report authoritatively that creating an\n    RFC the traditional way, through a Working Group, is easier and better.</p>\n    <p>I feel discomfort advising others not to follow in my footsteps, but in this case I think it’s the right advice.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Text",
          "term": "Technology/Text",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Text",
          "term": "Text",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/08/04/Long-Links",
      "title": "Long Links",
      "description": "All of these Long Links pieces have begun with more or less the same words, so why     stop now?  This is an annotated parade of links to long-form pieces. Most people won’t have the time     (nor the weird assortment of interests) to consume them all, but I hope that most readers will find one     or two      reward a visit",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/08/04/Long-Links",
      "published": "2025-08-04T19:00:00.000Z",
      "updated": "2025-08-07T18:14:33.000Z",
      "content": "<p>All of these <cite>Long Links</cite> pieces have begun with more or less the same words, so why\n    stop now?  This is an annotated parade of links to long-form pieces. Most people won’t have the time\n    (nor the weird assortment of interests) to consume them all, but I hope that most readers will find one\n    or two \n    reward a visit.</p>\n    <h2 id=\"p-2\">Radisson (and Groseilliers)</h2>\n    <p>I don’t know if it is still the case, but in my youth, Canadian elementary education included several overexcited units\n    about the\n    <a href=\"https://en.wikipedia.org/wiki/Coureur_des_bois\"><i>Coureurs des bois</i></a>, early European settlers \n    in “New France” (now Québec) who ventured, by foot and canoe, far to the north and west, mostly engaged in trading with the\n    indigenous peoples: trinkets (and later, serious hardware including guns) for furs.</p>\n    <p>The names I remembered were Radisson and Groseilliers, but I don’t recall learning much about who they were and what\n    they did. Then I ran across the 2019 book\n    <a href=\"https://www.biblioasis.com/shop/non-fiction/bush-runner-the-life-and-times-of-pierre-esprit-radisson/\">Bush Runner:\n    The Adventures of Pierre-Esprit Radisson</a> and, wow… The writing is pedestrian but who cares because what a\n    story! Radisson lived an absolutely astonishing life. He went as deep into the bush as anyone of his era, interacted intensely\n    with the indigenous people as business partner, friend, and foe, worked for Charles of England and Louis of France (changing\n    sides several times), in 1670 founded the Hudson’s Bay Company (recently, 355 years later, deceased), and fortunately took\n    notes, a copy of which was preserved by Samuel Pepys.</p>\n    <p>I learned more from this book’s pages about the early history of Upper and Lower Canada than all those elementary-school\n    units had to offer, and had loads of fun doing so.  I guess this is a fairly Canadian-specific Long Link, but I think anyone\n    interested in the early history of Europeans in North America would find much to enjoy.</p>\n    <h2 id=\"p-4\">Music</h2>\n    <p>It’s rare these days that I discover interesting new musicians, but here are two of those rarities.</p>\n    <p><a href=\"https://luciehorsch.com\">Lucie Horsch</a> plays recorder, you know, the cheap plastic thing they use to introduce\n    second-graders to music. It’s actually a lovely instrument and I wish we would switch to its German name, \n    “Blockflöte”, which to my ear sounds a bit like the instrument does. Anyhow, check out this YouTube entitled only\n    <a href=\"https://www.youtube.com/watch?v=LJyl2D16PZY&list=RDLJyl2D16PZY&start_radio=1\">Lucie Horsch - Bach</a>,\n    annoyingly omitting any mention of <em>which</em> Bach. Annoyance aside, it’s a pretty great performance, Ms Horsch is the real\n    deal, full of virtuosity and grace.</p>\n    <p>I got an unusual mid-week message from Qobuz, all excited about \n    <a href=\"https://transgressiverecords.com/artist/the-new-eves/\">The New Eves’</a> new record <cite>The New Eve Is\n    Rising</cite>. So I played it in the car on a long crosstown drive and now I’m all excited too. The New Eves are\n    talented, musically surprising, and above all, insanely brave.</p>\n    <p>Their music doesn’t sound like anything else and\n    flies in the face of all conventional wisdom concerning popular music. They take absurd chances and yeah, the album has klunkers\n    amid the bangers, but when I got to its end I went back and started at the beginning again. I found myself\n    smiling ear-to-ear over and over. Maybe I’m being a bit over-the-top here, but check them out: \n    <a href=\"https://www.youtube.com/watch?v=l9Q9ge6j_O4&list=RDl9Q9ge6j_O4&start_radio=1\">Mother</a> is live.\n    <a href=\"https://www.youtube.com/watch?v=MovNWuNPXXE&list=RDMovNWuNPXXE&start_radio=1\">Cow Song</a> is off the new\n    album and strong albeit with forgettable video.</p>\n    <h2 id=\"p-3\">Life online</h2>\n    <p>Every Long Links has hardcore-geek threads and there is no harder core imaginable than Filippo Valsordi’s\n    <a href=\"https://words.filippo.io/assembly-mutation/\">Go Assembly Mutation Testing</a>. I have always admired (but never\n    actually used) mutation testing, and Filippo offers a convincing argument that it moves catching certain classes of bug from\n    nearly impossible to pretty easy. Good stuff!</p>\n    <p>And of course we can’t ignore genAI and programming. Most of you are likely aware of \n    <a href=\"https://metr.org/blog/2025-07-10-early-2025-ai-experienced-os-dev-study/\">Measuring the Impact of Early-2025 AI on\n    Experienced Open-Source Developer Productivity</a>, but I’m linking again to boost its visibility, because hard\n    quantitative research on methodology is damn rare in our profession. I will confess to being a little (but just a little)\n    surprised at the conclusions.</p>\n    <p>It is apparently quite possible that Intel will exit the business of making high-end chips, leaving TSMC with a global\n    monopoly:\n    <a href=\"https://d2d.substack.com/p/d2d-contd-intel-and-the-wide-open\">Intel and the Wide Open Barn Doors</a>.\n    This is an unsettling prospect.\n    Not, I have to say, surprising though. I’ve sneered at Intel leadership cluelessness for years and years, see\n    <a href=\"/ongoing/When/200x/2006/01/14/On-Intel\">here</a> and\n    <a href=\"/ongoing/When/200x/2006/02/16/Viiv-Jive\">here</a>.</p>\n    <p>Finally, here’s the charmingly-titled\n    <a href=\"https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/\">How to Surf the Web in 2025, and\n    Why You Should</a>. I love this piece.</p>\n    <h2 id=\"p-1\">Class Reductionism</h2>\n    <p>The news keeps making me want to build something around the <code>classreductionist.org</code> domain name I’ve owned for\n    years.</p>\n    <p>The tl;dr on Class Reductionism is something like “In the best possible world it’ll take generations to disassemble the\n    global tangle of intersectional oppression, but we could treat the symptoms effectively <em>right now this year</em> by sending\n    money to the poor. I’m talking about Universal Basic Income or suchlike. I wrote a\n    <a href=\"/ongoing/When/202x/2023/01/16/Class-Reductionism\">couple thousand words</a> on the subject back in 2023, and there are\n    complexities, and I probably won’t put up that site. But I still do maintain that a very high proportion of our societal pain is\n    rooted in the egregious inequality, and consequent poverty, that seems a baked-in feature of Late Capitalism.</p>\n    <p>Let’s start with Nobelist Paul Krugman, who’s been writing an “Understanding Inequality” series on his paywalled newsletter\n    and then republishing a gratis version, start\n    <a href=\"https://stonecenter.gc.cuny.edu/tag/focus-inequality/\">here</a>.  Very data-dense and educational.\n    Hmm, that site is slow; there’s a livelier table of contents\n    <a href=\"https://paulkrugman.substack.com/p/i-coulda-made-a-better-deal\">here</a>.</p>\n    <p>Don’t kid yourself that this is just an American problem, see\n    <a href=\"https://www.nytimes.com/2025/06/23/business/china-upward-mobility-inequality.html?unlocked_article_code=1.cE8.Ptfc.XicZ0XVgHPsJ&smid=url-share\">‘The Better Life Is Out of Reach’: The Chinese Dream Is Slipping Away</a>.</p>\n    <p>Let’s pull the impersonal veil of facts and figures aside and focus on the human experience of what we used to call Class Struggle.\n    <a href=\"https://macleans.ca/society/confessions-of-the-working-poor/\">Confessions of the Working Poor</a> is beautifully\n    written and opened my eyes to lifestyle choices that I didn’t even know some people have to make.</p>\n    <p>But hey, there are people who are just fine with this: \n    <a href=\"https://finance.yahoo.com/news/deltas-premium-play-is-taking-advantage-of-the-growing-economic-split-100044776.html\">Delta's\n    premium play is taking advantage of the growing economic split</a>.</p>\n    <p>Look, being class-determinist-adjacent doesn’t mean you should ignore intersectional awfulness: \n    <a href=\"https://www.newyorker.com/magazine/2025/08/04/the-plunder-of-black-america-calvin-schermerhorn-book-review\">What We\n    Miss When We Talk About the Racial Wealth Gap</a>.</p>\n    <h2 id=\"p-5\">No more sections</h2>\n    <p>The remaining Long Links refused to be organized so I had to turn them loose; call it the Long Tail.</p>\n    <p><a href=\"https://articles.c-a-s-t.com/the-venetian-origins-of-roman-type-a856eb3f0cb\">The Venetian origins of roman\n    type</a>. You might think you don’t care about typography but still enjoy the pictures and descriptions here.</p>\n    \n    <p>This guy is a full-time\n    <a href=\"https://urbancoyoteresearch.com/researcher/stanley-d-gehrt-phd\">Coyote researcher</a>. What a great gig! I’m an admirer\n    of those animals and how they’ve carved themselves a comfy niche in most of North America’s big cities.  (Even if it means that\n    you better not let your cat out at night.) They’re also remarkably attractive.</p>\n    <p>Here’s another long list of Long Links, and many of you will wonder why anyone would choose to browse it:\n    <a href=\"https://petapixel.com/2025/07/18/the-best-camera-stores-in-tokyo-the-ultimate-guide/\">The Best Camera Stores in\n    Tokyo: The Ultimate Guide</a>. Some of the interiors are remarkable.</p>\n    <p>Oh, while we’re on the subject of photography: \n    <a href=\"https://petapixel.com/2025/07/22/a-photojournalist-took-a-fujifilm-instax-camera-to-a-cartel-wedding/\">A\n    Photojournalist Took a Fujifilm Instax Camera to a Mexican Cartel Wedding</a>.</p>\n    <p>GLP-1’s (i.e. Ozempic and friends) would probably dominate a large section of the news if weren’t for all the political\n    craziness. Here’s one small example: \n    <a href=\"https://www.glp1digest.com/p/how-glp-1s-are-breaking-life-insurance\">How GLP-1s Are Breaking Life Insurance</a>.</p>\n    <p>Science is hard. There are lots of largely-unsolved areas, and “gap-map.org” tries to organize them:\n    <a href=\"https://www.gap-map.org/?sort=rank&utm_source=substack&utm_medium=email&fields=astrophysics\">Fundamental\n    Development Gap Map v1.0</a>. The UI is a little klunky but the thing still sucked me right in.</p>\n    <p>I’m going to give the last word to Laurie Penny. I don’t know what we’d do without her.\n    <a href=\"https://lauriepenny.substack.com/p/in-a-time-of-monsters-do-we-have\">In a time of monsters: do we have any ideas for\n    surviving the zombie apocalypse that aren’t nightmare patriarchy?</a></p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/07/29/DeGoogling",
      "title": "De-Google Project Update",
      "description": "I     introduced this family project in the spring of 2024.     I won’t reproduce those arguments for why we’re working on this, but in the current climate I feel like I hardly need to.     Since that post, our aversion to Google dependency has only grown stronger. Progress has been non-zero but not fast",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/07/29/DeGoogling",
      "published": "2025-07-29T19:00:00.000Z",
      "updated": "2025-07-31T19:06:18.000Z",
      "content": "<p>I\n    <a href=\"/ongoing/When/202x/2024/03/09/DeGoogling\">introduced this family project</a> in the spring of 2024.\n    I won’t reproduce those arguments for why we’re working on this, but in the current climate I feel like I hardly need to.\n    Since that post, our aversion to Google dependency has only grown stronger. Progress has been non-zero but not fast.</p>\n    <p>Here’s the table, with progress notes below.</p>\n    <table>\n      <tr valign=\"top\"><th>Need</th><th>Supplier</th><th>Alternatives</th></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-3\">Office</a></td>\n\t<td class=\"unhappy\">Google Workspace</td>\n\t<td>Proton?</td>\n      </tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-17\">Data sharing</a></td>\n\t<td class=\"happy\">Dropbox</td>\n      <td></td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-17\">Photos</a></td>\n\t<td class=\"unhappy\">Google Photos</td>\n      <td>Dropbox?</td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-16\">Video meetings</a></td>\n\t<td class=\"unhappy\">Google\n\tMeet</td>\n      <td>Jitsi, Signal?</td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-10\">Maps</a></td>\n\t<td class=\"unhappy\">Google Maps</td>\n      <td>Magic Earth, Here, something OSM-based?</td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-4\">Browser</a></td>\n\t<td class=\"happy\">Safari, Firefox, Vivaldi, LibreWolf</td>\n      <td></td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-12\">Search</a></td>\n\t<td class=\"unhappy\">Google</td>\n      <td>Bing-based options, Kagi?</td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-5\">Chat</a></td>\n\t<td class=\"happy\">Signal</td>\n      <td></td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-6\">Photo editing</a></td>\n\t<td class=\"neutral\">Adobe\n\tLightroom & Nik</td>\n      <td>Capture One, Darktable, ?</td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-7\">In-car interface</a></td>\n\t<td class=\"neutral\">Google Android Auto</td>\n      <td>Automaker software</td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-8\">Play my music</a></td>\n\t<td class=\"happy\">Plex, USB</td>\n      <td></td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-9\">Discover music</a></td>\n\t<td class=\"happy\">Qobuz</td>\n\t<td></td></tr>\n      <tr valign=\"top\">\n\t<td><a href=\"/ongoing/When/202x/2024/03/09/DeGoogling#p-13\">TV</a></td>\n\t<td class=\"neutral\">Roku, Apple, migration</td>\n      <td></td></tr>\n    </table>\n    <p>Pink indicates a strong desire to get off the incumbent service, green means we’re happy-ish with what we’re using, and blue\n    means that, happy or not, it’s not near the top of the priority list.</p>\n    <p>I’ll reproduce the metrics we care about when looking to replace Google products, some combination of:</p>\n    <ol>\n      <li><p>Not ad-supported</p></li>\n      <li><p>Not VC-funded</p></li>\n      <li><p>Not Google, Microsoft, or Amazon</p></li>\n    </ol>\n    <p>The list used to include “Open Source” but I decided that while that’s good, it’s less important than the other three criteria.</p>\n    <p>Now let’s walk down the chart.</p>\n    <h2 id=\"p-3\">Office</h2>\n    <p>This is going to be a wrenching transition; we’ve been running the family on Google stuff forever, and I anticipate\n    muscle-memory pain. But increasingly, using Google apps feels like being in enemy territory. And, as I said last time, I\n    will not be sorry to shake the dust of Google Drive and Docs from my heels, I find them clumsy and am \n    always having trouble finding something that I know is in there.</p>\n    <p>While I haven’t dug in seriously yet, I keep hearing reasonably-positive things about Proton, and nothing substantive to\n    scare me away.  Wish us luck.</p>\n    <h2 id=\"p-17\">Data sharing (progress!)</h2>\n    <p>Dropbox is, eh, OK. It doesn’t seem actively evil, there’s no advertising, and the price is low.</p>\n    <h2 id=\"p-21\">Photos</h2>\n    <p>We’re a four-Android family including a couple of prolific photographers, and everything just gets pumped into Google and\n    then it fills up and then they want more money.  If we could configure the phones to skip Google and go straight to Dropbox,\n    that would be a step forward.</p>\n    <h2 id=\"p-16\">Video meetings</h2>\n    <p>Google meet isn’t painful but I totally suspect it of data-mining what should be private conversations. I’m getting the\n    feeling that the technical difficulty of videoconferencing is going steadily down, so I’m reasonably optimistic that\n    something a little less evil will come along with a fair price.</p>\n    <h2 id=\"p-10\">Maps</h2>\n    <p>The fear and loathing that \n    <a href=\"/ongoing/When/201x/2017/06/29/Fear-Google-Reviews\">I started feeling in 2017</a> grows only stronger.  But replacements\n    aren’t obvious.\n    It’s a pity, maps\n    and directions and reviews feel like a natural monopoly that should be a public utility or something, rather than a corporate moat.</p>\n    <h2 id=\"p-4\">Browser (progress!)</h2>\n    <p>Chrome has seriously started making my flesh crawl; once again, enemy territory. Fortunately, there are lots of good options.\n    Even people like us who have multiple lives we need to keep separate can find enough better browsers out there.</p>\n    <p>Maybe I’ll have a look at one of the new genAI-company browsers ha ha just kidding.</p>\n    <h2 id=\"p-12\">Search</h2>\n    <p>The reports on Kagi keep being positive and giving it a try is definitely on the To-Do list.</p>\n    <h2 id=\"p-5\">Chat</h2>\n    <p>Signal is the only sane choice at this point in history for personal use.</p>\n    <h2 id=\"p-6\">Photo editing</h2>\n    <p>Adobe’s products are good, and I’m proficient and happy with Lightroom, but they are definitely suffering from bad genAI\n    craziness. Also the price is becoming unreasonable.</p>\n    <p>I’ve had a few Lightroom software failures in recent months and if that\n    becomes a trend, looking seriously at the alternatives will move to the top of the priority list.</p>\n    <h2 id=\"p-7\">In-car interface</h2>\n    <p>It’s tough, Android Auto is a truly great product. I think I’m stuck here for now, particularly given that I plan to be\n    driving a <a href=\"/ongoing/What/The%20World/Jaguar%20Diary/\">2019-model-year car</a> for the foreseeable future. Also, it\n    supports my music apps.</p>\n    <h2 id=\"p-9\">Discover music and play mine (progress!)</h2>\n    <p>Progress here. I’ve almost completely stopped using YouTube Music in favor of Plex and Qobuz. Really no downside; YTM has\n    more or less completely lost the ability to suggest good new stuff.</p>\n    <h2 id=\"p-13\">TV</h2>\n    <p>Video continues morphing itself into Cable TV redux. We have an old Roku box that works fine and I think I’ve managed to find\n    its don’t-spy-on-us settings. We’ll keep subscribing to Apple+ as long as they keep shipping great shows.  I have zero regrets\n    about having\n    <a href=\"/ongoing/When/202x/2025/03/06/Canceled-Prime\">left Prime behind</a>.</p>\n    <p>As for the rest, we’ve become migrants,\n    exclusively month-at-a-time subscriptions for the purpose of watching some serial or sports league, unsubscribe after the season\n    finale or championship game. The good news is that I\n    haven’t encountered much friction in unsubscribing, just a certain amount of earnest pleading.</p>\n    <h2 id=\"p-20\">Looking forward</h2>\n    <p>I have yet to confront any of the really hard parts of this project, but the sense of urgency is increasing. Let’s see.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "The World/Life Online/De-Google",
          "term": "The World/Life Online/De-Google",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "The World",
          "term": "The World",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Life Online",
          "term": "Life Online",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "De-Google",
          "term": "De-Google",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    },
    {
      "id": "https://www.tbray.org/ongoing/When/202x/2025/07/21/Automaton-merge-war",
      "title": "QRS: Finite-state Struggles",
      "description": "I just posted a big     Quamina PR representing months of work, brought on     by the addition of a small basic regular-expression feature.  This ramble doesn’t exactly have a smooth story arc but I’m     posting it anyhow because I know there are people     out there interested in state-machine engineering and they are my people",
      "url": "https://www.tbray.org/ongoing/When/202x/2025/07/21/Automaton-merge-war",
      "published": "2025-07-21T19:00:00.000Z",
      "updated": "2025-07-22T16:10:25.000Z",
      "content": "<p>I just posted a big\n    <a href=\"https://github.com/timbray/quamina\">Quamina</a> PR representing months of work, brought on\n    by the addition of a small basic regular-expression feature.  This ramble doesn’t exactly have a smooth story arc but I’m\n    posting it anyhow because I know there are people\n    out there interested in state-machine engineering and they are my people.</p>\n    <p>As far as I can tell, a couple of the problems I’m trying to solve\n    haven’t been addressed before, at least not by anyone who published their findings.\n    Partly because of that, I’m starting to wonder if all\n    <a href=\"/ongoing/What/Technology/Quamina%20Diary/\">these disorderly Quamina postings</a> might\n    be worked into a small book or monograph or something. State machines are really freaking useful software constructs!\n    So yeah, this is a war story not an essay, but if you like finite automata you’ll likely be interested in bits of it.</p>\n    <h2 id=\"p-1\">The story thus far</h2>\n    <p>Prior to beginning work on Regular Expressions, I’d already wired shell-style “<code>*</code>” wildcards into Quamina, which\n    forced me to start working with NFAs and ε-transitions. The implementation wasn’t crushingly difficult, and\n    the performance was… OK-ish.</p>\n    <p>Which leads me to The Benchmark From Hell.\n    I wondered how the wildcard functionality would work under heavy stress, so I pulled in a list of 12,959 five-letter strings\n    from the Wordle source code, and inserted a “<code>*</code>” at a random position in each. Here are the first ten:</p>\n    <blockquote><pre><code>aalii*\n*aargh\naar*ti\nabaca*\na*baci\na*back\nab*acs\nab*aft\nabak*a</code></pre></blockquote>\n    <p>I created an NFA for each and merged them together\n    <a href=\"/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata\">as described here</a>. Building and merging the automata were\n    plenty fast enough, and the merged NFA had 46,424 states, which felt reasonable.\n    Matching strings against it ran at under ten thousand per second, which is pretty poor given that Quamina can do a million or\n    two per second on patterns encoded in a DFA.</p>\n    <p>But, I thought, still reasonably usable.</p>\n    <h2 id=\"p-2\">The cursed “<code>?</code>”</h2>\n    <p>Last year, my\n    <a href=\"/ongoing/When/202x/2024/12/12/Quamina-Regular-Expression-Series\">slow grind through the regexp features</a> had led me\n    to the zero-or-one quantifier “<code>?</code>”.  The state machine for these things is not rocket science; there’s a discussion\n    with pictures in my recent\n    <a href=\"/ongoing/When/202x/2025/07/07/Epsilon-Wrangling#p-3\">Epsilon Wrangling</a>.</p>\n    <p>So I implemented that and fired off the unit tests, most of which\n    <a href=\"/ongoing/When/202x/2024/12/12/QRS-Parsing-Regular-Expressions#p-1\">I didn’t have to write</a>, and they all failed.\n    Not a surprise I guess.</p>\n    <p>It turned out that the way I’d implemented ε-transitions for the wildcards\n    <a href=\"/ongoing/When/202x/2024/07/28/Union-of-Finite-Automata#p-9\">was partially wrong</a>, as in it worked for the tight-loop\n    state-to-itself ε-transitions, but not for more general-purpose things like “<code>?</code>” requires.</p>\n    <p>In fact, it turns out that merging NFAs is hard (DFAs are easy), and I found precious little help online.\n    <a href=\"https://en.wikipedia.org/wiki/Thompson%27s_construction\">Thompson’s construction</a> does give an answer: Make an\n    otherwise-empty state with two ε-transitions, one to each of the automata, and it’ll do the right thing. Let’s call that\n    a “splice state”. It’s easy to implement, so I did. Splicing is hardly “merging” in the Quamina sense, but still.</p>\n    <p>Unfortunately, the performance was hideously bad, just a few matches per second while pegging the CPU.\n    A glance at the final NFA was sobering; endless chains of splice states, some thousands long.</p>\n    <p>At this point\n    I became very unhappy and got stalled for months dealing with real-life issues while this problem lurked at the back\n    of my mind, growling for attention occasionally.</p>\n    <p>Eventually I let the growler out of the cave and started to think through approaches. But first…</p>\n    <h2 id=\"p-4\">Worth solving?</h2>\n    <p>Is it, really? What sane person is going to want to search for the union of thousands of regular expressions in general or\n    wild-carded strings in particular?</p>\n    <p>I didn’t think about this problem at all, because of my experience with Quamina’s parent,\n    <a href=\"https://github.com/aws/event-ruler\">Ruler</a>. When it became popular among several AWS and Amazon teams, people\n    sometimes found it useful to match the union of not just thousands but a million or more different patterns. When you write\n    software that anyone actually uses, don’t expect the people using it to share your opinions on what is and isn’t\n    reasonable. So I wasn’t going to get any mental peace until I cracked this nut.</p>\n    <p>I eventually decided that three approaches were worth trying:</p>\n    <ol>\n      <li><p>Figure out a way really to merge, not just splice, the wildcarded patterns, to produce a simpler automaton.</p></li>\n      <li><p>Optimize the NFA-traversal code path.</p></li>\n      <li><p>Any NFA can be transformed into a DFA, says computer-science theory. So do that, because Quamina is really fast at\n      DFA-based matching.</p></li>\n    </ol>\n    <h2 id=\"p-5\">Nfa2Dfa</h2>\n    <p>I ended up doing all of these things and haven’t entirely given up on any of them.\n    The most intellectually-elegant was the transform-to-DFA approach, because if I did that, I could remove the fairly-complex\n    NFA-traversal logic from Quamina.</p>\n    <p>It turns out that the Net is rich with textbook extracts and YouTubes and slide-shows about how to do the NFA-to-DFA\n    conversion. It ended up being quite a pleasing little chunk of code, only a couple hundred lines.</p>\n    <p>The bad news: Converting each individual wildcard NFA to a DFA was amazingly fast, but then as I merged them in one by one,\n    the number of automaton states started increasing explosively and the process slowed down so much that I never had the patience\n    to let it finish. Finite-automata theory warns that this can happen, but it’s hard to characterize the cases where it does.\n    I guess this one of them.</p>\n    <p>Having said that, I haven’t discarded the <code>nfa2Dfa</code> code, because perhaps I ought to offer a Quamina option to\n    apply this if you have some collection of patterns that you want to run really super fast and are willing to wait for a while\n    for the transformation process to complete. Also, I may have missed opportunities to optimize the conversion; maybe it’s making\n    more states than it needs to?</p>\n    <h2 id=\"p-6\">Faster NFA traversal</h2>\n    <p>Recently in\n    <a href=\"/ongoing/When/202x/2025/07/07/Epsilon-Wrangling\">Epsilon wrangling</a> I described how NFA traversal has to work,\n    relying heavily on implementing a thing called an ε-closure.</p>\n    <p>So I profiled the traversal process and discovered, unsurprisingly, that most of the time was going into memory allocation\n    while computing those ε-closures. So now Quamina has an ε-closure cache and will only compute each one once.</p>\n    <p>This helped a lot but not nearly enough, and the profiler was still telling me the pain was in Go’s allocation and\n    garbage-collection machinery. Whittling away at this kind of stuff is not rocket science. The standard Go trick I’ve seen over\n    and over is to keep all your data in slices, keep re-using them then chopping them back to <code>[:0]</code>\n    for each request.  After a while they’ll have grown to the\n    point where all the operations are just copying bytes around, no allocation required.</p>\n    <p>Which also helped, but the speed wasn’t close to what I wanted.</p>\n    <h2 id=\"p-7\">Merging wildcard automata</h2>\n    <p>I coded multiple ways to do this, and they kept failing. But I eventually found a way to build those\n    automata so that any two of them, or any one of them and a DFA, can merged and generate dramatically\n    fewer ε-transition chains.  I’m not going to write this up here for two reasons: First of all, it’s not <em>that</em>\n    interesting, and second, I worry that I may have to change the approach further as I go on implementing new regxp operators.</p>\n    <p>In particular, at one point I was looking at the code while it wasn’t working, and I could see that if I added a particular\n    conditional it would work, but I couldn’t think of a principled reason to do it. Obviously I’ll have to sort this out\n    eventually. In the meantime, if you’re the sort of um special person who is now burning with curiosity, check out my branch from\n    that PR and have a look at the <code>spinout</code> type.</p>\n    <p>Anyhow, I added that conditional even though it puzzled me a bit, and now you can add wildcard patterns to Quamina at 80K/second,\n    and my 12.9K wildcards generate an NFA with with almost 70K states, which can scan events at almost 400K/second. And that’s good\n    enough to ship the <code>“?”</code> feature.</p>\n    <p>By the way, I tried feeding that 70K-state automaton to the DFA converter, and gave up after it’d burned an hour of CPU and\n    grown to occupy many GB of RAM.</p>\n    <h2 id=\"p-8\">Next steps</h2>\n    <p>Add “<code>+</code>” and “<code>*</code>”, and really hope I don’t have to redesign the NFA machinery again.</p>\n    <p>Also, figure out the explanation for that puzzling <code>if</code> statement.</p>\n    <h2 id=\"p-9\">And I should say…</h2>\n    <p>Despite the very narrow not to say obsessive focus of this series, I’ve gotten a few bits and pieces of positive feedback. So\n    there are a few people out there who care about this stuff. To all of you, thanks.</p>",
      "image": null,
      "media": [],
      "authors": [
        {
          "name": "Tim Bray",
          "email": null,
          "url": null
        }
      ],
      "categories": [
        {
          "label": "Technology/Quamina Diary",
          "term": "Technology/Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology",
          "term": "Technology",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Quamina Diary",
          "term": "Quamina Diary",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Technology/Software",
          "term": "Technology/Software",
          "url": "https://www.tbray.org/ongoing/What/"
        },
        {
          "label": "Software",
          "term": "Software",
          "url": "https://www.tbray.org/ongoing/What/"
        }
      ]
    }
  ]
}
Analyze Another View with RSS.Style