📚 Sweating Bullets: Notes about Inventing PowerPoint

Finished reading Sweating Bullets: Notes about Inventing PowerPoint by Robert Gaskins. I’m a big fan of dissections of all things pop, and although the topic of this book isn’t quite the same as a music documentary or a look back at 1980s UK TV programmes, the backstory of PowerPoint is in the same wheelhouse for me. It’s played a big role in my life and feels like a part of mainstream culture. The book scratched exactly the same itch.

The author was hired by Forethought, Inc. in 1984 as Vice President of Product Development, a year after the company was founded. The company had investors but little direction, and needed a reboot. Gaskins brought into the company his idea of developing a tool for creating both overhead transparencies and 35mm slides for the nascent GUI-based desktop computer platforms, Macintosh, Windows and OS/2, some of which hadn’t been released yet. His view was that commodity personal computers would get better over time and that these GUI-based platforms would be the future. Throughout the book, it becomes clear that this belief and his strong views on what platforms to develop for (and not develop for) and in what order were core components of the product’s success. PowerPoint for Windows only started to outsell its Macintosh counterpart in 1991; Windows took so long to gain traction that early versions of Excel and Word were shipping with Windows runtimes included as there was no expectation that the consumer would have Windows already installed on their computer.

Gaskins’ father knew many people in the audio-visual industry who were able to give him insight into how many overheads and 35mm slides were created every year. This data wasn’t widely known or available to people in the technology industry, but it helped to make the business case for the software product which eventually became PowerPoint.

In his previous roles, he travelled around the world and received pitch decks from many vendors. He collected the handout versions of the slides, building a library that served as input into the functionality that the software required:

They were made in all kinds of ways—handwritten, on a typewriter, drawn on an old pen plotter, or made on many kinds of large computers. But I was struck by how they were very much the same all over the world. The basic style was essentially uniform everywhere, indicating that there was an international style for overheads. This meant that a single application to make presentation visuals would be saleable worldwide.

Overheads and 35mm slides were originally two very different paradigms. Overheads were usually created by the person presenting them, sometimes in the meeting itself. (I sat in many classrooms and lecture theatres where the person leading the room wrote directly on a scroll of transparent film as they went.) It was a lights-on approach that invited discussion and narrative. In contrast, 35mm slides were usually professionally created, typically by a company such as Genigraphics, and would be presented in a darkened room. I started work in 1999 and never saw an overhead projector in a corporate setting. I also never saw a 35mm slide presentation; the transition had already happened. Through PowerPoint, both of these formats collapsed into the same thing and ultimately became something new — ‘slides’ delivered through video screens. Arguably this has directly led to some of the ‘Death by PowerPoint’ narrative, where some people deliver their presentations with slide after slide filled with tons of information.

The application, initially developed for Macintosh to create black-and-white slides that could be printed and transferred to transparencies for overhead projection, was originally called ‘Presenter’. The name ‘PowerPoint’ came to Gaskins while he was in the shower one morning, the place where many good ideas are born, about three months before the product was released to the public.

Although PowerPoint and applications like it, such as Google Slides and Apple’s Keynote, are ubiquitous now, during the late 1980s the idea wasn’t obvious to everyone. Gaskins had to “pitch the idea repeatedly, hundreds of times, without getting much response, and to keep refining the idea in the face of prolonged skepticism.” He even had to lobby Apple to let the application run in full-screen mode, as it was against their own design guidelines at the time.

One of the most fascinating insights was how you don’t (or, perhaps more correctly, he didn’t) need to closely guard your plans. He went from trying to keep it a secret to telling everyone, and didn’t need to worry about someone else developing the idea too. I wonder if this is still true today, given how quickly information travels in the Internet age.

In the early months of working on PowerPoint, I felt very protective about the idea; it seemed so obviously great that anyone who heard of it would copy it immediately. Over the three years of pitching the idea hundreds of times, I more or less came to the opposite conclusion: that no one would want to copy it, and I would talk about it to almost anyone for a business reason.

In those days, I first heard a line attributed to Howard Aiken (designer of IBM’s Harvard Mark I computer during World War II):

“Don’t worry about people stealing your ideas. If your ideas are any good, you’ll have to ram them down people’s throats.”

[…]

The ideas that everyone recognizes immediately as worth stealing are going to be just barely in front of the current commercial frontier and can’t be successfully stolen quickly enough, while an idea just a little further away in time will seem to have objections that make it appear a bad idea to most people.

On the journey to releasing PowerPoint 1.0, Forethought went through very tough times. For three years in a row, the management teams only allowed staff a week off over Christmas once they had calculated that they had enough cash to get through the period as well as to pay minimal severances if they had to liquidate in the New Year.

Gaskins looks back to a time when the final ‘golden master’ build of the software was critical. There were no automatic updates via the Internet, so it had to be as complete and bug-free as possible in order to avoid costly recalls and reissuing of the application on a new set of disks, something that could put a small company out of business. The whole concept of creating a ‘minimum viable product’ and getting software into the hands of users as quickly as possible in order to get feedback just wasn’t a thing. It’s the total opposite of the evergreen nature of application software today. As I sit and type this, my iPhone has three apps that are ready to install an update and 15 that have already updated today. If any of these updates introduces a bug, it can simply be patched with another update, probably without me even knowing about it. The process of creating the ‘golden master’ sounds a lot like pressing a vinyl record:

When the creation of precisely one perfect disk was verified, this became the “Golden Master.” Quality Assurance would hand-deliver this master to manufacturing. At the manufacturing plant, the single master received would be used only on specialized duplicating machines to make further masters, called “silvers”; the Golden Master was then locked up in a secure cabinet. The silver masters were used on duplicating machines to manufacture product disks, which were verified against silvers. If more silvers were needed, they were made from the unique Golden Master. Golden Masters were never de-accessioned, but remained permanently in secure storage, so later questions about what was on them could always be answered with assurance. The whole Golden Master process helped to prevent errors, and also made it easy to assign responsibility for any mistakes discovered in products.

But they added some ceremonial steps, as quoted from Dennis Austin, the original architect and developer of the software:

“We first recognized that two people were required to do the work. One would follow the steps on paper and the other carry out the instructions. The two would monitor one another’s actions to be sure no one slipped up. (The two people were generally Bob and I.) We donned special robes to signify that we were engaged in a solemn rite. (Our robes were actually some old purple T-shirts from Bell-Northern Research, but it’s the idea that’s important.) Step by step we soberly followed the instructions to guarantee the perfection of our master.”

Gaskins adds:

The precautions we took were extreme, but so were the risks. In fact, we never made a mistake in preparing a Golden Master. In later years, the same ceremonial rituals (including wearing special costumes) were taught to everyone in the GBU [Graphics Business Unit] who made masters, eventually usually a pair consisting of a Program Manager and a Quality Assurance Engineer, and our perfect record continued.

There are some lovely technical details about how the software worked. The computers of the mid-1980s didn’t yet have true multitasking capability. The ‘slide sorter’ feature, which allowed you to interact with small thumbnail representations of the slides in the deck, created them in the background when PowerPoint was idle, with the routine constantly checking for user input. If it detected any, the process would be abandoned.

In the days before version control systems such as Git, working with multiple developers on a project was non-trivial. After the company hired Tom Rudkin to join Dennis Austin in development, the team of two bought a wall rack that was typically used to hold punch cards for employees clocking in and out. Each card represented a file in the code base; if you wanted to modify it, you would take the card from the rack to your office, and then add details of your changes to the card when you were ready to upload the updated file to the server.

Gaskins covers the hand-porting of clip art from the Genigraphics library into files compatible with Windows. They thought that this would be a useful income stream for Genigraphics; it cost Microsoft USD 250,000, but took place at a time when everyone started producing clip art and end-user prices were racing to the bottom. The main legacy was the preservation of this artwork that might otherwise have been lost to obscurity as the use of PowerPoint and the rise of self-produced video slide projections eventually forced Genigraphics out of business.

Forethought represented a first for both Apple and Microsoft — the first company that Apple’s Strategic Investment Group took a stake in, and the first company that Microsoft bought outright, for USD 14m in 1987, a number that feels like a rounding error today. At the time of the Microsoft sale, they were simultaneously considering an IPO of the company, but given the stock market crash of Black Monday and subsequent poor environment in which to go public, they made the right choice.

The deal to join Microsoft didn’t include the need for Forethought staff to relocate to Redmond, Washington, where Microsoft’s headquarters are based. Instead, the team were allowed to stay in Silicon Valley. The geographic distance probably also played a part in them keeping a logical and procedural distance. They were allowed to operate somewhat autonomously, including not being forced to use the internal Microsoft software development tools. I love the insight about how Gaskins assumed responsibility for things:

Early in September, we had a couple of very senior Human Relations people come down from Redmond to explain recruiting to us and answer any other HR questions in an all-hands meeting. Someone from the GBU asked about signing authorities, and one of the Microsoft HR people explained to our group that “BillG is the ultimate authority for everything in Redmond, and in the same way, BobGa [me—Microsoft people often talked in email aliases] is the ultimate authority for everything in Silicon Valley.” When I heard that, I realized that I should take exactly that attitude, about everything, until I was challenged on something. I already understood that how much authority you have in any business largely depends on how much authority you assume you have. I had started out by being a bit tentative, while finding out how Microsoft worked, but no one in Redmond seemed to be trying to tell me what to do—at all. I should start immediately to assume all the authority I could, however unreasonable it might seem.

He also has some nuggets of wisdom about hiring. Bill Gates encouraged him to never hire a less-than-great person, no matter how desperate the team is to fill the role — this is something I’ve tried to practise myself for many years. Interestingly, Gates also said to never fail to hire a great person, whether there is budgeted headcount or not; this one I would struggle much more with in the companies I have worked for. Gaskins also notes that he felt strongly that he should never hire anyone into a role that had no significant internal career path; these jobs should be outsourced to companies that did have career paths for people in these roles.

The book covers how Microsoft changed between the Forethought acquisition in 1987 and Gaskins’ departure in 1993. During this time, the company increased in size from 1,200 to 12,000 staff. Once it was released for Windows, PowerPoint was soon bundled with Excel and Word to create the first version of Microsoft Office. However, it was credited with only 12% of the revenue from the bundle, with the two others receiving 44% each. Microsoft said this split was based on historical sales, but Gaskins believes it was due to the larger sizes of their teams and the lobbying by their team leaders, made easier through their proximity to decision-makers in Redmond.

Gaskins writes wistfully about how meetings and presentations have changed during his lifetime. Giving a pitch in the mid-1980s involved creating slides, but they would typically be accompanied by a written document and spreadsheets that gave the detail. By the end of the first decade of the 2000s, people like Marc Andreessen and investment firms such as Sequoia Capital were asking for no more than 20 slides for a pitch, without any accompanying material.

There is some repetition in the book, but I didn’t get bored, particularly where the author covers the differences between types of presentation at the time that PowerPoint was released.

Gaskins left Microsoft in 1993 after PowerPoint 3.0 was released. He considered the product to be “finished”. I know what he means, but as a long-time PowerPoint user, I can definitely say that some small improvements since then have made a massive difference. For example, Smart Guides that appear when dragging objects, allowing you to quickly align the components of a slide, eliminated many hours of nudging and distributing objects into place. The innovative move to Office Open XML formats such as .pptx and .pptm means that I can’t remember the last time one of my PowerPoint files got into an unrecoverable pickle.

If computing culture is your thing, this is an excellent read. I really enjoyed it.

Bringing a 27-year-old programming project back to life with Claude Code

A big chunk of my final year at university, studying for my Computer Science degree, was spent working on a project. That last year counted for 60% of my overall grade, and the project contributed half of that. So the mark that I obtained could make a significant difference to my overall result for my degree.

Every student on my undergraduate course had to pick a project and find a supervisor amongst the teaching staff who would be willing to support them. I had the idea of building a BBC Micro emulator, getting into the weeds of the computer that kickstarted my love of technology. But for specific reasons that are lost to me now, my tutor nudged me away from this and instead encouraged me to look at the work of Donald Knuth.

Knuth is a well-known computer scientist and mathematician. One of his major life works is a series of books called The Art of Computer Programming (TAOCP). Originally conceived as a single book of 12 chapters when he started it in 1962, four volumes (with Volume 4 split into sub-volumes) have now been published, with more planned. In the books, Knuth wanted to illustrate computing concepts on paper but did not want to tie the text to any specific real-world machine. From my final project report:

Algorithms and programs presented by Knuth in TAOCP are written in the language MIXAL and intended for execution on MIX, a hypothetical machine. MIX was formulated specifically for use with this work for a number of good reasons. The use of an existing language and machine would have given readers the impression that the books were just for users of those particular systems. Also, the rapid advancements in technology would mean that the system would very likely become obsolete over a relatively short period of time. Furthermore, idiosyncrasies of a chosen machine and language would have to be explained to the reader, confusing the issues at hand. All of these problems are avoided by the formulation of a near-‘ideal’ machine (Knuth, 1997, page ix).

Knuth’s approach was understandable, but it had the drawback that the reader would not be able to use an actual computer to experiment with the concepts outlined in the book. This was something that he recognised. Again, from my report:

The advantages gained from using a hypothetical machine are clear. However, since the machine does not exist, it is not possible for a user to ‘run’ the algorithm and view its performance in real-time. Knuth states himself that “[u]nder favorable [sic] circumstances the reader will have access to a MIX assembler and a MIX simulator, on which various exercises in this book can be worked out” (Knuth, 1997, page 153). MIX simulators are already available in various forms, the most recent being MIX Builder 98 by Bill Menees, and vary in their degree of usability and performance (see section 7). All of them are currently platform-dependent. It is the intent of this project to provide a working MIX machine upon which programs from the book can be viewed, run and analyzed by users, in a (relatively) platform-independent environment. This platform independence will give maximum access to potential readers of TAOCP (see section 2.1.1).

My idea was to create a MIX emulator that would be as widely accessible as possible.1 Back in my university days, Java was considered to be the cutting edge of programming languages. Small Java applications, known as applets, could be delivered by embedding a ‘half-compiled’ version of the program (known at the time as ‘Java bytecode’) into a web page. When downloaded via a web browser, the program would then finish compilation and run on a Java Virtual Machine (JVM) specific to the computer that accessed it. The web had already brought a quiet revolution of interoperability between different types of computer, allowing you to access web pages from PCs, UNIX workstations or anything else that had implemented a web browser. But the functionality of the web in the 1990s was limited. Java applets took the capabilities of the browser to another level.

I’d never done any object-oriented programming before, so I bought a paperback copy of Bruce Eckel’s Thinking In Java and started to work my way through the text. The book was a brilliant introduction, both to the programming language as well as thinking in an object-oriented way. At some point, something clicked in my brain and I understood how I would tackle the architecture of the system. I felt I’d read enough and started coding.

Knuth’s text is super dense. I found myself poring over the few pages that outlined the specification of the system, reading the same sentences and paragraphs over and over again to try to understand the design. It’s hard to remember all the details of that final year in 1998–1999, but it feels as though I spent every significant chunk of my free time, including evenings and weekends, working on the Sun SPARCstations in the Computer Science block on campus. The code was written by hand in a text editor, and the accompanying report was written up in Adobe FrameMaker.

Coding in an object-oriented fashion was so much better than using a procedural language. Breaking down the problem into smaller and smaller components seemed natural once I had got the hang of it. I am sure that this contributed to the quality of my code. I distinctly remember the first time I attempted to run one of the example programs from the book on my emulator, which calculated and ‘printed out’ the first 500 prime numbers, and it working on the first go. I couldn’t believe it. I went to the vending machine in the common room and bought something for everyone who was in the computer lab that night.

Many years later, Java applets were deprecated in web browsers. As a result, my emulator, which I’d hosted on my website for the past dozen years, stopped working. My career took me into technical analysis work, project and programme management and now a general manager of a technology team. I haven’t done any ‘proper’ programming in decades. After leaving university, I never did finish the work on the emulator.

This past Christmas, I was reading Simon Willison’s summary of 2025 in the world of large language models, and pondering what this all means for the remainder of my career as a technology manager. From Willison’s summary:

The most impactful event of 2025 happened in February, with the quiet release of Claude Code.

I’d been reading about Claude Code for a few months and had planned to try and find the time to explore it. Given my lack of knowledge of modern software development using GitHub and the command line, I knew it might take some time to get up to speed. But then I read on. From Willison’s summary again:

In October they repurposed that container sandbox infrastructure to launch Claude Code for web, which I’ve been using on an almost daily basis ever since.

Now I had no excuse.

I signed up to an £18/month Claude Pro plan, the minimum required to get access to Claude Code. I’d been thinking about a small change I wanted to make to the WB-40 Album Club website. Because of some missing data on the original Album Club site, the code was just using the year in its date calculations instead of the full date. Using the Claude Code web interface, I connected it to my GitHub account, ‘installed’ Claude Code and gave it access to my code repository for the WB-40 Album Club project.

The first thing I did was to use one of the built-in canned prompts to create a CLAUDE.md file, a Markdown text file written as an explanation of the code. My understanding is that this file is then used by Claude Code in subsequent sessions so that it knows what’s what without having to spend time (and tokens) analysing everything again. It finished writing the file, and then let me send it as a pull request (i.e. a request from the developer, in this case Claude, to add this file) to the code repository:

Creating my first CLAUDE.md file
Creating my first CLAUDE.md file

I then started a new ‘session’, in the context of the same GitHub repository, and stated in English exactly what I was trying to achieve:

The single prompt that I used in Claude Code to update the WB-40 Album Club site.
The single prompt that I used in Claude Code to update the WB-40 Album Club site.

I sat there fascinated, watching it post messages about the progress of the work. Suddenly, it finished and told me the code was ready. The ‘+9 -14’ indicator shows that it had added nine lines of code and removed 14, which I could review if I wanted to. I created a pull request, merged it into the project and the site rebuilt itself with the changes.

It all worked. From opening Claude Code for the first time to updating the website had taken all of 45 minutes.

I went to bed that night, as I am sure many other people have who have used tools like this, thinking about the possibilities. I’m not a programmer and don’t have lots of existing codebases, but then I remembered that I did have my MIX project. I wondered what Claude Code could do with that? The next day was Monday, so I’d have to wait until work was over for the day before I could try it out.

For years the raw code for my MIX emulator had been available in a ZIP file on my website. The first step was to create a new GitHub repository and upload all of the files to it. From there, I could then connect Claude Code and get to work.

It was fascinating to read the CLAUDE.md file that Claude Code generated after it analysed this new repository. It outlines the project’s architecture, explains the known limitations (particularly that it is old and no longer works) and leaves instructions for how developers should approach updating the codebase.

My idea was to recreate the application using a modern technology stack. So, starting a new session, this is exactly what I asked it to do. My prompt was:

I’d like to bring this project back to life. This code used to run in a webpage as a Java Applet, but it will no longer work in modern browsers. Can you please suggest how this can be rewritten in a modern codebase/tech stack where it will be functionally identical to how it was written originally?

Claude responded:

Here’s my analysis and recommendation based on a thorough review of the codebase.

Current State

The simulator has two distinct layers:

  1. Simulation engine (~2,500 lines): MIX word/byte/sign data model, full instruction executor (64 opcodes), assembler (incomplete), clock timing, comparison/overflow state
  2. GUI layer (~3,600 lines): AWT Canvas-based custom rendering of registers, memory cells, indicators; Frame-based windows for the editor, line printer, control console, clock; GridBagLayout positioning; menu bars with keyboard shortcuts

The original runs as a Java Applet embedded in an HTML page. Applets were removed from browsers years ago and from the JDK itself in Java 17.

Recommended Approach: TypeScript + React Web Application

A single-page web app is the natural successor to the applet — it runs in the browser, requires no installation, and can be hosted as a static site (GitHub Pages, etc.).

It then gave a full account of the planned architecture, why it had chosen this technology stack, what alternatives had been considered etc. It was fascinating to read through. And then:

Want me to start implementing this?

For me, this was mind-blowing. Before it got started, I wanted to make sure that it wasn’t going to do something too off-piste. So I asked:

Will you preserve the look and feel of the original? I realise that it won’t look exactly the same, but the same in spirit (at least) would be good.

Would you also code tests to ensure that the logic is working correctly, such as the program counter, memory management etc.?

To which Claude Code responded “Yes to both.” I didn’t explicitly ask it to start, but it got going.

After chugging away, things ground to a halt with a note that “You’ve hit your limit · resets 3am (UTC)”. Argh. I wasn’t sure what to do next, but I knew I didn’t want to pay more than the £18 I’d signed up to. I found out that once your account has exited the usage limit limit sin-bin, you can just prompt Claude Code with a simple ‘Continue’ and it will wake up and continue from where it got to. As I clicked around the Claude website, I found the Billing and Usage pages, where I learned that you can buy API credits to continue your work even when you’ve hit the limit. Not only that, but there was an offer to add £38 to my account that day for free. Of course I clicked it, made sure that auto-top-up was turned off, flicked the switch to allow this extra usage, and started Claude Code running again.

My ‘Extra usage’ screen in Claude. Finishing off the initial conversion of my application to a modern web stack probably cost about £4, with the additional money spent tweaking things.
My ‘Extra usage’ screen in Claude. Finishing off the initial conversion of my application to a modern web stack probably cost about £4, with the additional money spent tweaking things.

It worked away for a long time, and I ended up going to bed. In the morning, I found that it had completed its first attempt. Not only that, it told me that it had implemented features such as the assembler which I had never got round to finishing back in 1999:

All done. Here’s a summary of what was accomplished:

Modernized MIX 1009 Simulator

Ported the original 1999 Java AWT MIX simulator to a modern web application in mix-sim/.

Technology Stack

  • Vite 7 + React 19 + TypeScript for the frontend
  • Vitest for testing (64 passing tests)

Architecture

Core Engine (src/core/):

  • MIXWord.ts — Fundamental 5-byte + sign data unit
  • MIXMachine.ts — Full simulation engine (~1,060 lines) with:
  • All 63 MIX instruction opcodes (arithmetic, loads, stores, jumps, shifts, comparisons, I/O, conversions)
  • MIXAL assembler with label resolution, directives (ORIG/CON/ALF/EQU/END), field specs, and expression evaluation
  • Event system for UI reactivity
  • MIXInstructions.ts — Complete instruction set definitions
  • types.ts — Shared enums and the MIX character table

UI Components (src/components/):

  • Register panel (A, X, I1-I6, J)
  • Memory viewer with scrollbar and PC highlighting
  • Comparison and overflow indicators
  • MIXAL program editor with sample program loader
  • Line printer output display
  • Control console (Step/Go/Reset) with clock display

Tests (src/test/core.test.ts):

  • 64 tests covering MIXWord operations, all instruction types, assembler, and integration scenarios

Committed and pushed to claude/modernize-java-applet-YrOmV.

A few more prompts helped me to understand how I could get the project to build and publish itself to GitHub Pages, a free hosting site. The first build attempt resulted in errors, which I copied and pasted back into Claude Code. It investigated and fixed them, explaining to me what the problems were. Pulling the code into the main branch got things up and running.

Loading and running the program to calculate the first 500 prime numbers was thrilling all over again. This time it wasn’t with the sense that I had brought something to life, like it had felt the first time back in 1999, but with the feeling of what it meant for the future of programming.

You can find the converted version of the emulator here. I used a few more prompts for some minor tweaks, cleaning up some of the formatting, adding a link to the original project report from the ‘Info’ pop-up box, and getting it to display the machine in a usable way on a phone screen. I’ve also added a speed slider which allows you to see the computer in action as it processes.

I’m completely blown away by how easy this was. The irony is not lost on me that this project originated in a series of books called The Art of Computer Programming. Does the invention of tools like this mean that it will soon be a lost art? I have mixed feelings — pun not intended — that something I spent nine months on can now be created at the drop of a hat. It’s simultaneously liberating, unsettling and fun.

  1. These days there are many such MIX emulators available. Knuth’s own webpage for The Art of Computer Programming lists lots of examples.

Something big is happening; but it doesn’t add up

This week, multiple people sent me a link to Matt Shumer’s post that Something Big Is Happening. In the post, he sounds the alarm that AI is coming for most white-collar jobs. It’s definitely worth reading:

If you extend the trend (and it’s held for years with no sign of flattening) we’re looking at AI that can work independently for days within the next year. Weeks within two. Month-long projects within three.

[Dario] Amodei [(CEO of AI company Anthropic)] has said that AI models “substantially smarter than almost all humans at almost all tasks” are on track for 2026 or 2027.

Let that land for a second. If AI is smarter than most PhDs, do you really think it can’t do most office jobs?

Think about what that means for your work.

[…]

I think the honest answer is that nothing that can be done on a computer is safe in the medium term. If your job happens on a screen (if the core of what you do is reading, writing, analyzing, deciding, communicating through a keyboard) then AI is coming for significant parts of it. The timeline isn’t “someday.” It’s already started.

His advice, which is to start paying for Claude or ChatGPT and using it to do more than search for information, is not bad guidance, but it seems disproportionate to the threat that he covers in the first part of the article. There is, Shumer implies, a short window of time in which you can be “the most valuable person in the room” by supercharging your productivity with these tools. Most people won’t do this, of course. He argues — correctly, I think — that if you spend an hour a day experimenting with the software you will gain a significant advantage over your peers:

One hour a day, every day. If you do this for the next six months, you will understand what’s coming better than 99% of the people around you. That’s not an exaggeration. Almost nobody is doing this right now. The bar is on the floor.

The terrifying stuff is where he talks about needing to “get your financial house in order”, building up savings and avoiding “taking on new debt that assumes your current income is guaranteed”, presumably because of the coming wave of job losses.

However, there’s something about where all this is headed at a macroeconomic level that doesn’t add up for me. The massive investment in the technology, specifically processors and data centres for both AI training and inference, is largely funded by debt. Companies like OpenAI and Anthropic are losing money. Fortune reported in November that:

OpenAI is plotting a dramatic arc toward profitability through the end of the decade, but that growing won’t come without some pain. The company reportedly expects to rack up massive annual losses each year, including roughly $74 billion in operating losses in 2028 alone, then pivot to meaningful profits by 2030, according to financial documents obtained by The Wall Street Journal.​

In December, they wrote about Anthropic:

To be sure, Anthropic is nowhere near profitable today: It was pacing to end 2025 having consumed $2.8 billion more cash than it took in, according to recent news accounts citing forecasts provided to investors. But the company is also on track to break even in 2028, according to those projections—two years ahead of OpenAI.

If a bunch of us pay $20/month for premium access, with a tiny few paying $200/month for the highest tier, I don’t see how this goes anywhere near covering the costs. (Yes, I realise that there are Enterprise plans and paid tiers for API access, but the point still stands.) If this tsunami of AI turns up and eventually takes on most white-collar jobs, making loads of us redundant, there will be even fewer of us able to pay. OpenAI are testing adverts in ChatGPT and they may help, but I don’t see how displaying them to people who are asking the computer to do something and then coming back days later to see what it did will fund the operation either. Microsoft Copilot, which leverages AI technology from OpenAI and Anthropic, is paid for on a per-seat basis. Job losses would mean fewer seats and less revenue. Maybe the people that are left with jobs will find the cost of their licences increasing in response.

Even Google, which can use its vast ad revenue to fund Gemini, its own AI product, and keep it ad-free, would likely have its revenues go down if there is a seismic economic downturn. If people can’t afford things because they are unemployed, what’s the point of advertising something to them?

Maybe I’m looking for logic that doesn’t exist. Like Bill Joy said in his Wired magazine article 26 years ago1, people will invent technology and do things without understanding the consequences, just because they can:

Perhaps it is always hard to see the bigger impact while you are in the vortex of a change. Failing to understand the consequences of our inventions while we are in the rapture of discovery and innovation seems to be a common fault of scientists and technologists; we have long been driven by the overarching desire to know that is the nature of science’s quest, not stopping to notice that the progress to newer and more powerful technologies can take on a life of its own.

At this point, while we don’t know exactly where we’re going, I can’t disagree with Shumer’s advice: start using the tools in more advanced ways, figuring out what does and doesn’t work in your context. As for the bigger picture, I guess we’ll just have to cross our fingers and hope?

  1. Joy’s article is something that I’ve come back to more than anything else I’ve read in my life.

📚 Indie Microblogging

I’ve just finished reading Indie Microblogging by Manton Reece. This book covers a lot of ground, including plenty of detail on the philosophy behind the Micro.blog platform, as well as broader IndieWeb thinking more generally. Reading about these ideas a few years ago, and setting up an account on Micro.blog, helped me get back into a regular blogging habit after a long period lost to posting directly to social media. The book is free, and well worth reading if you are curious about having a place where your thoughts to live in public that is truly your own. If you’re already doing that, there are some good details and links on how the IndieWeb tools can be used to make the web itself one giant social network.

The book has made me think a lot about my relationship with social media. Over the past week, I’ve spent time browsing blog posts directly on sites that I’ve found interesting. It felt so much more rewarding than scrolling through an endless stream of posts on Bluesky or Mastodon. It was more like dipping in and out of a book. There was much less news, but I felt as though I got to know a little bit about the person behind each site. Even using my feed reader, a quieter way to consume information, isn’t the same as reading through the old posts on someone’s site. This is how it used to feel in the early days when blogs first appeared on the Internet. The good news is that it never went away; blogs and websites were just drowned out by the clamour of attention from social media. You can choose to move your attention back to the web.

The Micro.blog platform is both a fully-fledged blog host and a layer of interaction between blogs. It has been put together with such thoughtfulness and care, as Reece outlines in this book. Features that would drive engagement have been ignored when they are considered harmful to users in the long term. Discovery is filled with friction, and there is no popularity contest for likes and reposts. It’s all very deliberate.

When we launched Micro.blog, we got pushback on the lack of likes and reposts and follower lists and trends and global firehose. Eight years later, I’m confident our approach is an important niche on the social web. We do lose customers who drift away because of lack of engagement. So be it. If they want the dopamine hit of notifications and a more active timeline, pulling them back in, there is literally every other platform for that.

This is a worthwhile read if you are even remotely interested in blogging, or trying to step away from publishing your thoughts and posts on other people’s platforms.

Tools for discovering the IndieWeb

Over the past few years, I’ve seen some wonderful tools sprout up that encourage and facilitate the exploration of independent websites and blogs. These are fun and useful places to explore, helping you to dig around corners of the Internet that otherwise may not be surfaced through the big search engines or AI chatbots. Browsing these sites, finding interesting feeds to add to my RSS reader, feels like a healthier way of spending time than scrolling through social media.

Here’s a list of the sites I’ve been enjoying, in no particular order:

ooh.directory

ooh.directory
ooh.directory

Currently, ooh.directory has collected “2,356 blogs about every topic”. The main index is presented in a Yahoo!-style taxonomy (if you are old enough to remember this), allowing you to dig into, for example, ‘Economics and business’ and then further down into ‘Companies’, ‘Personal finance’, ‘Venture capital’ etc. Kids — this is one of the main ways that we used to find websites before Google showed us what a good search algorithm could do.

The front page highlights blogs that have reached a significant birthday, have posted for the first time in a long while, or have recently been added to the database. You can browse blogs by how recently they have been updated or by how new they are to the directory.

Every blog has its own listing with useful information, such as when it was last updated, roughly how many posts are made per week, where the blogger is based and a link to the RSS feed.

The ooh.directory page for this website.
The ooh.directory page for this website.

powRSS

powrss.com
powrss.com

powRSS is another directory of blogs. It doesn’t have a taxonomy like ooh.directory, but it does have some unique features which make it interesting.

The homepage shows a list of the latest posts from the 331 blogs in the database, along with a list of blogs that have recently been added. Pressing ‘shuffle’ randomises this list, and hitting the ‘random’ button will result in you being taken to a post from all of the sites in the directory, from any time in history — not just the latest from a particular blog.

Ye Olde Blogroll

blogroll.org
blogroll.org

Blogs sometimes include a ‘blogroll’ on their site, which lists other blogs that the author enjoys. In the sidebar on my site, I’ve listed a few blogs that I follow, as well as fellow weeknoters and some blogs that I enjoy so much that I’d like to read them in their entirety. Ye Olde Blogroll, at blogroll.org, takes this concept and makes a whole site out of it, listing 1,067 blogs in a big list. You can filter by some broad topics to find some interesting places to visit. It’s a beautiful-looking site.

Some of the blogs are flagged as ‘supporters’, contributing $1/month to the site. Many of them are flagged as ‘interviews’. Site host Manuel ‘Manu’ Moreale is curating a newsletter series called People and Blogs where he interviews bloggers about their sites. They are posted to his own blog as well as the dedicated newsletter site.

All of his work is gorgeously designed and is a joy to read on the web.

searchmysite.net

searchmysite.net
searchmysite.net

For as long as I can remember, I’ve always reached for a search engine that prioritises results from blogs and the IndieWeb. I’d regularly use tools such as Technorati or Daypop to hone in on articles written on small websites. Google used to provide its own blog search tool, until they killed it like so many of their products. searchmysite.net gives you the ability to search posts from all of the 3,455 sites in its index.

indieblog.page

indieblog.page
indieblog.page

Similar to the ‘random’ button on powRSS, indieblog.page gives you a button to click that will take you to a random blog post. It also keeps track of posts that you recently saw, in case you want to revisit them or subscribe. At the time of writing there are 4,955 sites in the database and over half a million posts. You can also search these posts in a similar way to searchmysite.net.

Scour

Scour
Scour

Scour is an interesting tool that asks you to state your interests and then surfaces posts from web feeds that are related to these topics. It goes beyond the IndieWeb but is useful at surfacing posts and articles that might not be that visible or popular.

Topics are free-form and don’t need to come from a list. The site uses a large language model to interpret what it is you’re looking for and how well blog posts match those phrases. So, for example, I can just as easily say that I am interested in ‘AI use in investment banking’ as I can ‘weeknotes’, ‘internet culture’ or anything else I can think of.

It does an excellent job of finding posts to read based on your interests. All of the content is assembled into a personal ‘Top Finds’ page which you can filter by what’s ‘hot’ now, or has been posted in the past hour, day, week or month. You also get a weekly ‘digest’ email with your Top Finds.

Scour lets you add any interest that you want; you don’t have to pick from a predefined list.
Scour lets you add any interest that you want; you don’t have to pick from a predefined list.

You can also browse other people’s pages — here’s mine, for example — and even ingest those pages as RSS feeds into your feed reader. You can also see popular posts and interests across the whole tool. Other features allow you to hide paywalled content and exclude domains. It’s very cool, and a great use of AI.

Solving a micro.blog and Cloudflare connectivity issue

I’m a big believer in the philosophy of ‘Post (on) Own Site, Syndicate Elsewhere’, or POSSE, as it has come to be known. My website is the canonical place where I post anything I want to get out into the world. The syndication takes place via micro.blog — it reads the main RSS feed and then does an excellent job of posting the content to my Bluesky, Mastodon and micro.blog accounts. The implementation is very elegant; it got me into the concept of posting small ‘snippets’ or status updates without titles to this blog, which get intelligently posted in full (if small) or in a truncated form to those other sites. I post to my site and it then gets relayed to all of the places I want the content to go to.

I use a free Cloudflare account to accelerate how my site loads for anyone who visits it. Cloudflare serves cached pages and images — i.e., content that other visitors have already requested — from its large content delivery network all over the globe.

A couple of years ago, I started to experience a problem where micro.blog was reporting errors as it tried to read the feed. My suspicion is that when micro.blog polled my website for the feed, Cloudflare was responding with a ‘prove you are human’ challenge or some kind of ‘wait while we verify you’ screen, which isn’t the same as RSS content and therefore caused a failure. What made this difficult to understand was that when I asked for the RSS feed myself, or used another tool such as Feedbin to read the data, everything worked fine. The problem was very specific to wherever micro.blog was sending the request from.

This became a pain in the butt that I’ve lived with for months. Every time I was ready to publish something to my blog, I had to:

  1. Log into Cloudflare (which is very aggressive in logging you out after a short period)
  2. Disable Cloudflare for the DNS A record for my website, changing it from ‘proxied’ to ‘DNS only’
  3. Publish my post
  4. Go to micro.blog and force a read of my feed
  5. Check the logs to see if the post had been syndicated
  6. Go back to Cloudflare and re-enable proxying for the website’s A record, so that anyone visiting my site would be able to load the pages with good performance

This routine made me think twice before posting content, particularly short updates, as the effort required was so great.

I’d contacted the micro.blog team a few times and also looked around the web to see if anyone had a solution. I saw that fellow blogger Scott Yoshinaga had been experiencing the same issue. He had decided to stop worrying about it, knowing that his posts probably wouldn’t be syndicated via micro.blog.

This week, with some help from ChatGPT, I came up with a solution that seems to be working. It’s a bit convoluted, but it does the job. In short: I created a feeds.andrewdoran.uk subdomain that bypasses Cloudflare, then used a WordPress plugin to rewrite only media URLs in my feeds to use that subdomain. Here’s how I did it.

Step 1: Create a non-proxied feeds subdomain

Cloudflare has all of the DNS records for my site. I added an additional A record called ‘feeds’, with the same IP address as the main record for andrewdoran.uk. This gives me a new subdomain of feeds.andrewdoran.uk. This A record in Cloudflare is set to ‘DNS only’, i.e. it is not proxied through Cloudflare. When a request comes in to an address at this subdomain, Cloudflare just passes it along to the origin server.

Step 2: Map the subdomain in cPanel

I then had to log into my website’s cPanel, an administrative tool provided by my host, and create a new domain called feeds.andrewdoran.uk. This also has the same details as the main domain entry, with the same ‘document root’. This makes feeds.andrewdoran.uk a mirror/alias of andrewdoran.uk.

Step 3: Enable SSL/TLS for the feeds subdomain

The next step was to ensure that SSL/TLS worked for this new subdomain. In cPanel I went to the SSL/TLS Status administration page and clicked ‘Run AutoSSL’. This applied an SSL/TLS certificate for feeds.andrewdoran.uk.

I updated the feed in micro.blog and could see that it was working — it was downloading the feed with no errors. However, there was one more step.

Step 4: Rewrite media URLs in the feed with a WordPress plugin

When micro.blog reads a feed entry, it will post it to the requested services in a well-thought-out way. This includes images from the post, if any are available. However, the RSS feed entries referred to those images at the main domain, which meant that they were unreachable by the micro.blog service. I needed to find a way to ensure that the images referenced in the feed used the URLs at the mirrored/aliased DNS only subdomain. This can be done by ‘rewriting’ the URLs at the time they are published. But I didn’t want to rewrite all of the URLs published in the RSS feed; sometimes a post contains links to other posts that I have previously written, and I want those links to be to the versions of the posts at the main domain, not the subdomain. The solution to this is a WordPress plugin:

<?php
/**
 * Plugin Name: AD Feed Image Domain Rewrite
 * Description: In feeds only, rewrite media URLs (uploads) from andrewdoran.uk to feeds.andrewdoran.uk so external consumers bypass Cloudflare.
 * Author: Andrew Doran
 * Version: 1.1
 */

function ad_feed_image_domain_swap( $content ) {
    // Only touch RSS/Atom feeds, never normal page views.
    if ( ! is_feed() ) {
        return $content;
    }

    // Get the base URL for media uploads, e.g.
    // https://andrewdoran.uk/blog/wp-content/uploads
    $uploads = wp_upload_dir();

    if ( empty( $uploads['baseurl'] ) ) {
        // If for some reason WordPress can't tell us, bail out safely.
        return $content;
    }

    $origin_base = $uploads['baseurl'];

    // Build the equivalent base URL on feeds.andrewdoran.uk,
    // keeping the path (/blog/wp-content/uploads) the same.
    $feeds_base = str_replace(
        'https://andrewdoran.uk',
        'https://feeds.andrewdoran.uk',
        $origin_base
    );

    // If there's no media URL in this content, don't do any string work.
    if ( strpos( $content, $origin_base ) === false ) {
        return $content;
    }

    // Replace only the uploads base URL.
    // This affects img/src, srcset, <picture> sources, etc. that point
    // into /wp-content/uploads, but leaves normal links to posts alone.
    return str_replace( $origin_base, $feeds_base, $content );
}

add_filter( 'the_content',      'ad_feed_image_domain_swap', 9999 );
add_filter( 'the_excerpt_rss',  'ad_feed_image_domain_swap', 9999 );
add_filter( 'the_content_feed', 'ad_feed_image_domain_swap', 9999 );

This ensures that images in the feeds are referred to at feeds.andrewdoran.uk, whilst regular on-site links continue to point at andrewdoran.uk.

I used cPanel to add this as a PHP file in my WordPress plugins directory. After installing the file and activating it via WordPress, it now checks content at the point of serving it. If the content is an RSS feed, it rewrites the URLs of images to start with feeds.andrewdoran.uk instead of andrewdoran.uk, whilst leaving all other URLs alone.

This feels like a lot of work, with a slightly complex setup. The biggest downside is that my website is directly reachable at the new subdomain without any of the protection that Cloudflare provides from distributed denial of service (DDoS) attacks and bots. But given that I host a tiny blog in a little corner of the web, I’m not a big target, so I’m not worried about this too much. The tradeoff works for me. I can already feel the relief of not having to go through all of the various steps to publish on my blog just to ensure that the posts turn up elsewhere.

ChatGPT image weirdness

About a year ago, I asked ChatGPT “Based on what you know about me, draw a picture what my current life is.” It came up with this:

A ChatGPT-generated image of a room in London near to the Westminster clock tower. Bare wooden floorboards are ringed by shelves and giant stacks of books. Vinyl records are on the floor. A small wooden desk, chair and reading lamp are in a bay window.

Aside from the fact that it has that typical AI feel about it, I was intrigued by the elements it contained. Last week, after another year of interactions, I wondered what that picture would look like now. The results weren’t quite what I was expecting:

A ChatGPT window showing a prompt that says "Draw a picture based on what you know about me." The output is a south Asian man with short haircut and a beard, in a blue polo top.

I figured that I must have got the prompt wrong, so I tried again:

A ChatGPT window showing a prompt that says "Based on what you know about me, draw a picture of what you think my current life looks like." The output is a smiling woman sitting at a MacBook, holding a young baby.

I have no idea what is going on, and can’t figure out what inputs I’ve given the system that resulted in these outputs.

Did ChatGPT lie to Sky News’ Sam Coates? No.

On Saturday a friend shared this video with me:

I love that this was broadcast on Sky News for two reasons:

  1. It reinforces that people should not trust the output of the ‘AI’ systems that we are using. Having such a stark example of this on a mainstream TV channel that will be picked up and shared by so many people is excellent.
  2. It is a fantastic, citable example of a fundamental misread of what this technology is. ChatGPT generated false statements, but it didn’t lie. It cannot. It isn’t a being. It is a non-deterministic tool that generates what the probable text output is based on its training data, and the combination of the user’s prompt and the system prompt that was submitted to it.

My guess is that as Sam Coates has been uploading transcripts of his previous podcast episodes and asking questions about them over a period of time, the chat history and context led ChatGPT’s statistical generation process to produce what it calculated to be the most likely response to the prompt — one that included a made-up reference to today’s episode, despite it not having been uploaded yet. It was incorrect information, but it was a plausible response to his prompt of “what date transcripts do you have access to”. It wasn’t going back and searching a database of previously submitted transcripts. It just doesn’t work like that.

This isn’t to take away from the usefulness of ChatGPT and other tools like it. I use generative AI all the time in a variety of ways, such as to proofread my writing. But the way in which we anthropomorphise these computer programs and words we use to describe what they do — learn, know, think, reason, understand, lie — make us walk into the trap of assuming that there is somehow a being, a person, on the other side of the chat box. There isn’t. This trap is only going to get worse the better these systems get.

Intentional YouTubing

I love YouTube. There are so many great channels and accounts on there to follow, publishing incredible videos. My family and I use it so much that we justify the £19.99 per month Family Premium service that removes all of the adverts and gives us a bunch of other features.

A conversation with some friends today made me remember that I use YouTube in a slightly optimised way. I hate getting drawn into whatever the algorithm thinks is hot, trending or likely to pull me in for a long ‘engagement’ session, where I open the app and later look up to find that hours have passed. I’ve found a simple way of reducing the likelihood of this.

I have all of my YouTube history turned off.

This is what I see when I open the app on my iPad:

A beautiful, blank YouTube home screen.

When I go to YouTube it is usually to do one of these things, which I can now achieve without getting distracted:

  1. Intentionally searching for something specific
  2. Going to my subscriptions feed, a chronological list of videos from channels that I follow
  3. Going to look at my ‘Watch Later’ playlist of long videos that I didn’t have time to watch when I first came across them

To set this up, press the settings cog in the YouTube app and go to ‘Manage all history’. Here you can go to the ‘Controls’ tab and turn off your YouTube history, to enjoy an almost1 algorithm-free existence:

YouTube history turned off.

One downside of turning off your YouTube history is that the service will never remember your place if you leave a video and come back to it later, as your progress is part of the history of what you watched. This is inconvenient, but I wouldn’t trade this feature for not having a zen-like home screen.

  1. You will still get suggested videos next to the one that you are watching. ↩︎

When good is the enemy of the perfect

I’ve been working with Microsoft Teams Premium for a couple of weeks and it has got me worried. Part of the Teams Premium bundle is the ability to summarise a meeting recording, giving you an AI-generated set of collapsible bullet points of the key things that were discussed. It’s neat, clever, and…a little underwhelming, particularly when compared to the promise of the Microsoft marketing videos.

From the meetings that I have recorded, the ‘AI notes’ seem to lose a certain essence of some parts of the discussion, and the suggested follow-up tasks often don’t make sense. Aside from the often hilarious Teams chat response suggestions that have been in the product for a while now1, Teams Premium is my first encounter with the new large language model-based AI products from Microsoft. What concerns me is not how poor the product is today, but how close to perfect it is going to get over time.

I think the most worrisome aspect of AI systems in the short term is that we will give them too much autonomy without being fully aware of their limitations and vulnerabilities.
(Melanie Mitchell, Artificial Intelligence: A Guide for Thinking Humans)

I see the output of these AI large language models on a spectrum. At one end, the tools may spit out complete and utter garbage, perhaps not even words. Their uselessness would be obvious to everyone who uses them. At the other end, the AI could output a perfect response (or summary of a meeting, in the case of Teams Premium) every single time. The problem lies in the middle, and gets worse the closer the system is to being consistently perfect:

Right now, I think that the quality of the Teams Premium ‘AI notes’ feature sits somewhere in the green area. It’s good and useful a lot of the time. For example, I can scan the notes and check whether a topic was mentioned. If that topic isn’t in the notes, it doesn’t mean that it wasn’t discussed; I’d have to watch the video back to check that the AI didn’t miss it. If the meeting was very important and needed to be formally minuted, I would still rely on the video.

As the product improves over time, we’ll move out of the green zone and into the yellow. At this point, I may consciously or subconsciously decide to stop routinely verifying the AI-generated output. It’s good enough, most of the time. Again, if a meeting is really important, I may watch the video.

The real danger comes in the red zone. Here, the AI output is superb most of the time, so much so that I never check it. I rely on the summary even for my important meeting minutes. But it’s not quite at the ‘completely perfect’ end of the spectrum. Occasionally it will trip up. Something will get missed — maybe one meeting in a hundred — and perhaps that something is critical to the conversation we’ve had. Perhaps it will attribute a comment to the wrong person, or miss the nuance of a discussion which was important to get exactly right. We may only find out that the AI produced flawed output for this meeting when an incident arises down the line.

This isn’t a concern about AI getting ‘too good’ and becoming ‘sentient’ in a general sense.2 It’s more that we have decided to stop thinking, that we have handed control of some part of our workflow over to the AI and no longer verify its output. For me personally, one bad output every 100 recorded meetings might be tolerable. But if we scale this across a large organisation where hundreds or thousands of meetings take place every day, we’re going to have problems.

Baldur Bjarnason explores this in his book The Intelligence Illusion:

I mentioned two of [the flaws] before, automation and anchoring biases. We, as human beings, have a strong tendency to trust machines over our own judgement. This kills people, as it’s been a major problem in aviation. Anchoring bias comes from our tendency to let the initial perceptions, thoughts, and ideas set the context for everything that follows. AI adds a third issue: anthropomorphism. Even the smartest people you know will fall for this effect as large language models are incredibly convincing. These biases combined lead people to feel even more confident in the AI’s work and believe that it’s done a better job than it has.

We’re using the AI tools for cognitive assistance. This means that we are specifically using them to think less. In every other industry this dynamic inevitably triggers our automation bias and compromises our judgement of the work done by the tools. We use the assistant to think less, so we do.

These models are incredibly fluent and—as we saw at the start of this book—are consistently presented by their vendors as near-AGI. This triggers our instinct towards anthropomorphism, making us feel like we have a fully human-level intelligence assisting us, creating an intelligence illusion that again hinders are ability to properly assess the work it’s doing for us.

AI-generated meeting summaries in Teams Premium is a useful starting point for thinking about this technology. There’s no user input beyond hitting the ‘record’ button during a meeting, and everyone with a Teams Premium licence gets access to exactly the same summary. The possibility for getting something wrong is limited to how good or bad the summary of the meeting is. So far, so harmless. But Microsoft 365 Copilot will be arriving soon, vastly expanding the problem space with its interactive, prompt driven approach. Where on the ‘useless to perfect’ spectrum will it land? What if just being ‘very good’ isn’t good enough?


  1. Superb Teams suggested chat responses.

    Superb Teams suggested chat responses.

  2. The more I learn, the less I’m worried about General AI being a problem any time soon. 

Get off of my cloud

David Heinemeier Hansson’s blog post on his company’s move from the cloud back to their own servers is an interesting read:

I also think that there are probably some companies that have such high variance in their loads that renting makes sense. If you only need a plough thrice a year, it doesn’t make much sense keeping it in the barn unused for the remaining 363 days.

Perhaps this will increase the volume and awareness of more nuanced conversations about choosing the right application and organisational architecture, beyond a binary choice of cloud vs on-premises for everything.

One of the best articulations I’ve seen of how a cloud environment can work for an application is Troy Hunt’s explanation from 2018 of how he optimised haveibeenpwned.com using Cloudflare Workers and Azure Functions:

It’s costing me 2.6c per day to support 141M monthly queries of 517M records.

Just taking an application that is running on your own hardware and dumping it into the cloud is highly unlikely to yield any cost benefit unless it is re-architected and optimised to take advantage of the features of the cloud platform.

Hunt wrote a follow-up post last year, outlining how he suddenly received an eye-watering Azure bill after breaching a file size limit for a Cloudflare cache on his service. So even when you’re optimised, you need to be highly aware of the limits that apply to your setup, as well as having early warning alarms in place to catch anything that has gone wrong.

Cost is a major factor in determining a cloud versus on-premises architecture but there are other considerations too. Finding the right people with the right skillsets to run your own infrastructure is not trivial.

Hopefully the post won’t signal the start of a cyclical movement to and from the cloud, like the others that we already have in ‘enterprise’ technology — outsourcing/insourcing, offshoring/onshoring, centralisation/decentralisation etc.

Given Hansson’s company runs a product called HEY, since reading his post I haven’t been able to get this earworm out of my head. I suspect that this will be on my ‘internal hi-fi’ quite a lot over the next few years.

In a world of AI, PSTN is dead

I’ve been thinking about this article all day. A woman received a call from her distraught, crying daughter, who said she had been kidnapped. The kidnappers then told the woman the terrifying things they would do to her daughter, unless she paid them a ransom. She called her daughter’s phone and found that she was actually fine — the ‘kidnappers’ had generated her voice using AI technology. It’s absolutely terrifying.

I think that calls over the public switched telephone network (PSTN) are now effectively dead. The traditional telephone system runs on a protocol where you can call any number in the world and start a conversation, but you do not need to verify who you are. In a world of AI, this is going to be unsustainable. I am guessing that rogue calls like the one in the article will become more ubiquitous in a similar way to the rise of phishing and spam emails. However, unlike with email there are no audio equivalents of looking for specific clues to reason that the call is fake.

Perhaps in the future we’ll need to use another protocol, one that uses authentication. Before picking up an incoming call, there should be a simple indicator showing that the call is authentic. We already have caller ID, but this is trivial to spoof. The solution needs to be so simple that everyone can understand it, and it needs to work seamlessly without anyone needing to jump through hoops to enable it.

We already authenticate to our smartphones and other devices via our biometric data — our faces or fingerprints — or by entering a passcode. Perhaps whatever system we use for voice calling can use this to ‘prove’ that a call is coming from an authenticated source. When a call comes in, it could have a red/amber/green rating along these lines:

  • 🟢 Green: The caller is in your contacts and they have authenticated themselves using their device biometrics or passphrase within the last n minutes.
  • 🟡 Amber: The caller has authenticated themselves with their device in the last n minutes, but is not in your contacts.
  • 🔴 Red: All bets are off, proceed with caution.

Taking it further, we would possibly need to have something in place that allows people to verify themselves. So, not only has Caller X’s device validated that they have unlocked it recently, but Caller X is definitely the Caller X. On my Mastodon profile, I can provide evidence that I am who I say I am by adding a link to my website and then entering code on my site that Mastodon can read. I’ve then ‘proved’ that this is my site because I was able to edit the code there. It looks like this:

My Mastodon profile on indieweb.social

My Mastodon profile on indieweb.social

I’m not sure a mechanism like this would go far enough to ‘prove’ I am who I claim to be when I call a new number for the first time, but perhaps there are other ways of doing something similar. Ideally with a solution that wouldn’t rely on a centralised verification/validation service.

It’s been interesting to read that Adobe, Arm, the BBC, Intel, Microsoft, Sony and Truepic are collaborating as the Coalition for Content Provenance and Authenticity. They are focused on providing evidence of the provenance of content, i.e. being able to trace back to the source of an image, a video or a document as well as what has been done to it since it was created. I don’t think this helps with real-time generated content such as fake voice and video.

I’ve heard people talk about the fact that authentication via voice, such as that used in telephone banking, is now completely broken because of AI. But I think the problem goes much deeper than this. Without authentication, how will you ever know who you are really speaking to?

Side-effects of technological change

This fascinating question was posted in a school governor webinar that I attended today, as we covered the services offered by the NSPCC:

With mobile phones being far more popular than landline phones, are children finding it more difficult to access Childline? What are their options?

I’d never thought about this before. It’s an example of a side-effect of technological change that I hadn’t considered. Like many other people I know, we ditched our home ‘land line’ phone some time ago. Fortunately, as one avenue of communication has closed down, others have opened up; children are now able to contact the service via other methods such as live chat and email.

When I started work almost 25 years ago, the big London train stations all used split-flap displays for their departure boards, like this one:

At some point they were replaced with digital dot matrix displays, which themselves have recently been superseded (at Euston at least) by new full-colour high-definition dashboards. A side effect of getting rid of the split-flap displays is that there is no longer any noise as they update, forcing people to keep looking at them as opposed to doing something else whilst listening for the audio cues.

I wouldn’t want to give up the benefits of new technologies — cheap mobile phone plans and information-rich dashboards in these two cases — but it’s interesting to see these side effects and note that not all of the progress is completely positive.

📚 New Dark Age: Technology and the End of the Future

For some reason my rate of reading has been very slow this year. This may explain the feeling I had when I finished New Dark Age: Technology and the End of the Future by James Bridle — that it hadn’t made a big impression on me. Looking back over the 150 highlights I made as I read the book, I think I am mistaken. Bridle covers a lot of ground, and I can see in the highlights the origins of ideas that have been buzzing around in my head over the past couple of months.

The fascinating premise of the book is that that the more technology seeps further into our world, the less we understand about it — we enter a collective ‘dark age’ of understanding. This is a paradox given that we now have greater access to knowledge than at any time in the past. It made me think of something else I read or heard — perhaps from Alain de Botton — that modern knowledge work is now largely invisible. You can stand in the middle of an office full of people and not be able to simply see or understand what everyone is doing. This wasn’t true back in the days when computers were human. Scaling this notion up from the level of a single office to our whole society, the premise still holds true.

It was fascinating to read about the SSEC, a working computer that went on show in the window of premises opposite IBM’s headquarters in Manhattan. It’s a perfect metaphor for us not being able to see what the technology is doing:

[…]the IBM Selective Sequence Electronic Calculator (SSEC), installed in New York in 1948, refused such easy reading. It was called a calculator because in 1948 computers were still people, and the president of IBM, Thomas J. Watson, wanted to reassure the public that his products were not designed to replace them. […] The SSEC was installed in full view of the public inside a former ladies’ shoe shop next to IBM’s offices on East Fifty-Seventh Street, behind thick plate glass. […] To the crowds pressed up against the glass, even with the columns in place, the SSEC radiated a sleek, modern appearance. It took its aesthetic cues from the Harvard Mark I, which was designed by Norman Bel Geddes, the architect of the celebrated Futurama exhibit at the 1939 New York World’s Fair. It was housed in the first computer room to utilise a raised floor, now standard in data centres, to hide unsightly cabling from its audience […] after the first couple of weeks, the machine was largely taken up by top secret calculations for a programme called Hippo, devised by John von Neumann’s team at Los Alamos to simulate the first hydrogen bomb. Programming Hippo took almost a year, and when it was ready it was run continuously on the SSEC, twenty-four hours a day, seven days a week, for several months. The result of the calculations was at least three full simulations of a hydrogen bomb explosion: calculations carried out in full view of the public, in a shopfront in New York City, without anyone on the street being even slightly aware of what was going on.

Bridle asserts that we have mistaken the collection of masses of data for increased information and knowledge, but this is misplaced. The more data we have, the harder it is to make sense of it:

And so we find ourselves today connected to vast repositories of knowledge, and yet we have not learned to think. In fact, the opposite is true: that which was intended to enlighten the world in practice darkens it. The abundance of information and the plurality of worldviews now accessible to us through the internet are not producing a coherent consensus reality, but one riven by fundamentalist insistence on simplistic narratives, conspiracy theories, and post-factual politics. It is on this contradiction that the idea of a new dark age turns: an age in which the value we have placed upon knowledge is destroyed by the abundance of that profitable commodity, and in which we look about ourselves in search of new ways to understand the world.

With the rapid deployment of large language models and other types of artificial intelligence, this issue is probably going to get worse. People are working on trying to understand why generative AI works as it does; as I learned recently, the history of AI contains a substantial amount of trial and error.

It was also shocking to me to read that the mass surveillance that came to light through the Edward Snowden revelations a decade ago have been collectively shrugged off and continue to this day:

Ultimately, the public appetite for confronting the insane, insatiable demands of the intelligence agencies was never there and, having briefly surfaced in 2013, has fallen off, wearied by the drip-drip of revelation and the sheer existential horror of it all. We never really wanted to know what was in those secret rooms, those windowless buildings in the centre of the city, because the answer was always going to be bad. Much like climate change, mass surveillance has proved to be too vast and destabilising an idea for society to really get its head around.

And this is despite there being evidence that this kind of mass surveillance doesn’t work very well:

Studies have repeatedly shown that mass surveillance generates little to no useful information for counterterrorism offices. In 2013, the President’s Review Group on Intelligence and Communications Technologies declared mass surveillance ‘not essential to preventing attacks’, finding that most leads were generated by traditional investigative techniques such as informants and reports of suspicious activities.

I think that people don’t understand, or don’t care, enough about surveillance. When I tell people that I have Siri turned off on my Apple devices, that I won’t have an Amazon Alexa or Google Home ‘smart speaker’ in my house, and wouldn’t install a Ring doorbell, I sound like a tin-foil hat-wearing crazy person. But I’m really not keen on everything I’m saying being recorded, stored on some random servers somewhere and available to engineers that work at the company that owns them.

I’ve also been thinking about how our 1990s-era visions of the Internet being a democratising, distributed force have not played out like that at all. The tendency of both IT services and infrastructure has been to move towards monopolies and oligopolies. And when regulations arrive, the incumbents are the beneficiaries; they are able to respond to the regulations and implement any required changes with their deep pockets. Conversely, the price of entry for new companies may then be too high. The rising tide of the proliferation of technology into everything doesn’t lift all boats equally.

Technology is in fact a key driver of inequality across many sectors. The relentless progress of automation–from supermarket checkouts to trading algorithms, factory robots to self-driving cars–increasingly threatens human employment across the board. There is no safety net for those whose skills are rendered obsolete by machines; and even those who programme the machines are not immune. As the capabilities of machines increase, more and more professions are under attack, with artificial intelligence augmenting the process. The internet itself helps shape this path to inequality, as network effects and the global availability of services produces a winner-takes-all marketplace, from social networks and search engines to grocery stores and taxi companies. The complaint of the Right against communism–that we’d all have to buy our goods from a single state supplier–has been supplanted by the necessity of buying everything from Amazon. And one of the keys to this augmented inequality is the opacity of technological systems themselves.

It’s a fascinating read. I was already some way through the book before realising that there is an updated edition available. I haven’t been able to find out what has changed with this new version, but I am sure it will only have enhanced what is already a very good book.

SomaFM on Sonos integration — beta

Great email from SomaFM today on setting up their radio stations as a Sonos service. I’ve never found anything better to work to than their Groove Salad station and have been tuning in — on and off — for over twenty years.

To get set up:

In the Sonos mobile app, look at “about my system” under Setting->System. Make a note of this.

Now, add a custom service by opening a web browser to http://[your sonos IP]:1400/customsd.htm

Then fill in the form with the following:

SID: 255 (or any other number in range 1-253 if you’ve added other custom integrations before)
Service Name: SomaFM Beta
Service Endpoint URL: https://sonos.somafm.com/
(make sure it starts with https:// or it won’t work)
Polling Interval: 10 seconds
Authentication SOAP policy: Anonymous

Click the ‘Submit’ button. You’ll get acknowledgement that the custom integration was added.

Now, in your Sonos app, browse the list of available content providers, and ‘SomaFM Beta’ should appear. Add it, and try to play a SomaFM channel. It should start playing without any of the annoying TuneIn ads.

It would be even better if the songs scrobbled to Last.FM as they played, but I haven’t seen this on any Sonos radio service so far.

Trying to understand how ChatGPT works

I finally got around to reading the Stephen Wolfram essay on What Is ChatGPT Doing … and Why Does It Work? Despite being written in relatively simple terms, the article still pushed the boundaries of my comprehension. Parts of it landed on my brain like an impressionist painting.

Things that stuck out for me:

  • In order to improve the output, a deliberate injection of randomness (called ‘temperature’) is required, which means that ‘lower-probability’ words get added as text is generated. Without this, the output seems to be “flatter”, “less interesting” and doesn’t “show any creativity”.
  • Neural networks are better at more complex problems than on simple ones. Doing arithmetic via a neural network-based AI is very difficult as there is no sequence of operations as you would find in a traditional procedural computer program. Humans can do lots of complicated tasks, but we use computers for calculations because they are better at doing this type of work than we are. Now that plugins are available for ChatGPT, it can itself ‘use a computer’ in a similar way that we do, offloading this type of traditional computational work.
  • Many times, Wolfram says something along the lines of “we don’t know why this works, it just does”. The whole field of AI using neural networks seems to be trial and error, as the models are too complex for us to fathom and reason about.

Particularly over the past decade, there’ve been many advances in the art of training neural nets. And, yes, it is basically an art. Sometimes—especially in retrospect—one can see at least a glimmer of a “scientific explanation” for something that’s being done. But mostly things have been discovered by trial and error, adding ideas and tricks that have progressively built a significant lore about how to work with neural nets.

  • People do seem to be looking at the output from ChatGPT and then quickly drawing conclusions of where things are headed from a ‘general intelligence’ point of view. As Matt Ballantine puts it, this may be a kind of ‘Halo effect’, where we are projecting our hopes and fears onto the technology. However, just because it is good at one type of task — generating text — doesn’t necessarily mean that it is good at other types of tasks. From Wolfram’s essay:

But there’s something potentially confusing about all of this. In the past there were plenty of tasks—including writing essays—that we’ve assumed were somehow “fundamentally too hard” for computers. And now that we see them done by the likes of ChatGPT we tend to suddenly think that computers must have become vastly more powerful—in particular surpassing things they were already basically able to do […]

But this isn’t the right conclusion to draw. Computationally irreducible processes are still computationally irreducible, and are still fundamentally hard for computers—even if computers can readily compute their individual steps. And instead what we should conclude is that tasks—like writing essays—that we humans could do, but we didn’t think computers could do, are actually in some sense computationally easier than we thought.

  • So my last big takeaway is that — maybe — human language is much less complex than we thought it was.

My friction-filled information workflow

Every 18 months or so I find myself feeling that my personal information workflow is working against me. Sometimes I end up diving into an inevitably fruitless quest to find an application that could be ‘the answer to everything’.

Last year I thought that some of the friction might have been coming from where I am able to access each application that I use. In my personal life I have an iPhone, an iPad and a MacBook, but at work I use a Windows laptop. I always prefer web applications as they can, in theory, be accessed from anywhere. However, it’s difficult to find web apps that have all of the features that I want.

My whiteboard from December 2021 trying to work all of this out.

My whiteboard from December 2021 trying to work all of this out.

Mapping out each of the applications was useful; it made me realise that I could move my old documents and notes archive in Evernote over to OneNote, saving money on a subscription. After wrestling with the migration over a few days, that was that. Things got busy and I didn’t look at my personal workflow again. Until now.

After getting ‘the itch’ again, this time I’ve tried to map out exactly what my current personal workflow looks like, regardless of where the applications are accessible. Here is the resulting mess:

My workflow, such as it is, today.

My workflow, such as it is, today. (Click to enlarge.)

I haven’t decided where to go from here. What I do know is that I need to ponder this for a bit before making any changes. Experience tells me that the problems I have (or feel that I have) are less about the applications and more about the purposeful habits that I need to form.

Some disorganised thoughts:

  • There is still definitely an issue with where I can access each of the components from. Every time I need to switch devices, there is friction.
  • Finding apps that are super secure — i.e. those that encrypt data locally before being sent to the application’s cloud storage — do exist, but at the moment they feel like using a cheese grater to shave your legs. Yes, I could use Standard Notes everywhere, but the friction of working with it is much higher than being forced onto my Apple devices to use Ulysses.
  • Some of the apps are replacements for each other in theory, but not in practice.
    • Readwise Reader can keep YouTube videos I want to watch later, but they then become slightly less accessible if I am sitting down to watch them in front of a TV.
    • Readwise Reader can also accept RSS feeds, but at the moment the implementation is nowhere near as good as Feedbin. I tried it through exporting my OPML file of feed subscriptions and importing it into Reader, but when it wasn’t working for me I found I had to painstakingly back out my RSS subscriptions one by one.
  • I’m still searching for a good way to curate my reading backlog. I estimate that I have over 1,000 ebooks1, hundreds of physical books, hundreds of PDFs and nearly 9,000 articles saved to my ‘read later’ app. I’ve already done the maths to work out that even if I live to a ripe old age, there is not enough time left to get through all of the books that I’ve bought. As Ben Thompson has been saying: in an age of abundance, the most precious and valuable thing becomes attention. I have lists of all my books in Dynalist, but still rely on serendipity when it’s time to pick up another one to read.
  • I need to work out the best way to distinguish between the things I have to do versus the things I want to do. Not that these are absolutes; the amount of things that I absolutely, positively have to do is probably minimal. I might save a YouTube video that would be super helpful for my job right now, and want to prioritise this above others that I have saved for broader learning or entertainment. What’s the easiest way to distinguish them and be purposeful about what I pick up next?
  • Similarly, where should a list of ‘check out concept x’ tasks go? These aren’t really ‘tasks’. When is the right time to pick one of these up?
  • I’m finding that using Kanban for projects is much easier than long lists of tasks in a to-do app. At work we use Planview AgilePlace (formerly known as LeanKit) which from what I can tell is the most incredible Kaban tool out there; if you can imagine the swimlanes, you can probably draw them in AgilePlace. But it’s difficult to justify the cost of $20/month for a personal licence. I’m using Trello for now.
  • Needing to look at different apps to decide what to do next is a problem. But how much worse is it than using one app and changing focus between project views and task views?
  • Are date-based reminders (put the bins out, clean the dishwasher, replace the cycle helmet, stain the garden fence) a different class of tasks altogether? Are they the only things that should be put in a classic ‘to do’ tool?
  • One of the main sticking points of my current workflow is items hanging around for too long in my capture tools (Drafts and Dynalist) when they should be moved off somewhere else. Taking the time to regularly review any of these lists is also a key practice. Sometimes I haven’t decided what I want to do with a thing so it doesn’t move on anywhere, which is also a problem. I need to get more decisive the first time I capture a thing.
  • Document storage is a lost art. After I drew the diagram above, I’ve consolidated all of my cloud documents onto one platform — OneDrive — but now need to go through and file what’s there.

I know that there are no right answers. However, now that I can see it all, hopefully I can start to work out some purposeful, meaningful changes to how I manage all of this stuff. I’m going to make sure that I measure twice, cut once.


  1. The consequence of slowly building up a library as Kindle books were discounted. Aside from checking the Kindle Daily Deal page, I’ve largely stopped now. Looking back, I don’t think this was a great strategy. It seems much better to be mindful about making a few well-intentioned purchases, deliberately paying full price for books from authors I like. 

Another view on The A.I. Dilemma

Interesting to read Nick Drage’s riposte to The A.I. Dilemma which I watched a few weeks ago. I agree with his points on the presentation in terms of lack of citations and extreme interpretations, which when scrutinised does the subject a disservice.

The presentation is worth watching just to see what they get away with. And because the benefits and threats of AI are worth considering and adapting to, and especially because the presenters are so right in encouraging us to think about the systemic changes taking place and who is making those changes, but I’m really not sure this presentation helps anyone in that endeavor.

This isn’t to say that the topics raised are not important ones. I’m currently a third of the way through listening to a very long podcast interview between Lex Fridman and Eliezer Yudkowsky on “Dangers of AI and the End of Human Civilization”. Both of them know infinitely more about the topic than I do. It’s very philosophical, questioning whether we’d know if something had become ‘sentient’ in a world where the progress of AIs is gradual in a ‘boiling frogs’ sense. The way they talk about GPT-4 and the emergent properties of transformers in particular makes it sound like even the researchers aren’t fully sure of how these systems work. Which is interesting to me, a complete layperson in this space.

📚 Book summaries — with and without AI

This is an excellent blog post on working with ChatGPT to generate insightful book summaries. It’s long, but it covers a lot of ground in terms of what the technology does well and what it struggles with right now. Jumping to the conclusion, it seems that you get much better results if you feed the tool with your own notes first; it isn’t immediately obvious that the model doesn’t have access to (or hasn’t been trained on) the contents of a particular book.

When I finish a book that I’ve enjoyed, I like to write a blog post about it. It’s this process of writing which properly embeds the book into my memory. It also gives me something that I can refer back to, which I often do. As I read, I make copious highlights — and occasionally, notes — which all go into Readwise. If the book has captured my imagination, I start writing by browsing through these highlights. Any that seem particularly important, or make or support a point that I want to make somewhere in the write-up, get copied into a draft blog post. From there I try to work out what I’m really thinking. I love this process. It takes a lot of effort, but the end result can be super satisfying.

The summary that I’ve shared most often is A Seat at The Table by Mark Schwartz, which seems to pop up in conversations at work all the time. Going back to my own blog post is a great way to refresh my memory on the key points and to continue whatever conversation I happen to be in.

My favourite write-up is Hitman by Bret Hart. I picked the book up this time last year as a holiday read. I had no idea it would have such a big impact on me, bringing back lots of childhood memories and getting me thinking about the strange ways in which the rise of the Internet has changed our world. Getting my thoughts in order after I put the book down was incredibly satisfying.

Using ChatGPT or another Large Language Model to generate a book summary for me defeats the point. The process of crafting a narrative, in my head and then on a digital page, is arguably more valuable than the output. Getting a tool to do this for me could be a shortcut to a write-up, but at the expense of me learning and growing from what I’ve read.

It’s all AI, all the time

All my feeeds seem to be full of reflections on the inevitability of the changes that will soon be brought about by artificial intelligence. After spending time thinking about this at length last week it may be my cognitive biases kicking in, but I’m pretty sure it’s not just me noticing these posts more.

Ton Zijlstra has an interesting view on today’s corporations as ‘slow AI’, and how they are geared to take advantage of digital AI:

…‘Slow AI’ as corporations are context blind, single purpose algorithms. That single purpose being shareholder value. Jeremy Lent (in 2017) made the same point when he dubbed corporations ‘socio-paths with global reach’ and said that the fear of runaway AI was focusing on the wrong thing because “humans have already created a force that is well on its way to devouring both humanity and the earth in just the way they fear. It’s called the Corporation”. Basically our AI overlords are already here: they likely employ you. Of course existing Slow AI is best positioned to adopt its faster young, digital algorithms. It as such can be seen as the first step of the feared iterative path of run-away AI.

Daniel Miessler conceptualises Universal Business Components, a way of looking at and breaking down the knowledge work performed by white-collar staff today:

Companies like Bain, KPMG, and McKinsey will thrive in this world. They’ll send armies of smiling 22-year-olds to come in and talk about “optimizing the work that humans do”, and “making sure they’re working on the fulfilling part of their jobs”.

So, assuming you’re realizing how devastating this is going to be to jobs, which if you’re reading this you probably are—what can we do?

The answer is mostly nothing.

This is coming. Like, immediately. This, combined with SPQA architectures, is going to be the most powerful tool business leaders have ever had.

When I first heard about the open letter published in late March calling on AI labs to pause their research for six months, I immediately assumed it was a ploy by those who wanted to catch up. In some cases, it might have been — but I now feel much more inclined to take the letter and its signatories at face value.