The IndieWeb Is Punk Manifesto

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

In 2025, I wrote:

Writing HTML is punk rock. A “platform” is the tool of the establishment.

And I’ve never seen anybody express what I was trying to say better than… this, stolen in almost its entirety:

Three chords and a domain name.

You don’t need a deal with a label. You don’t need a platform’s blessing. All you need is an out of tune guitar you can barely play, or a free text editor and a hosting bill. That’s it. That’s the whole scene.


I. We Are the DIY Kids

Punk didn’t wait for labels to say yes. It plugged in a blown out amp in someone’s basement and played anyway. Bad singer? Makes no difference. Three chords? You go. Own a drum kit but never had a lesson? You’re the drummer now.

The IndieWeb works the same way. Nobody’s waiting for permission to publish a website. You don’t need a “content strategy.” You don’t need a niche. You need a place that’s yours, and the nerve to hit publish.

Sometimes it’s ugly. It’s the wrong font. It’s a blog post about nothing at all. It works and it’s yours.

II. We Own the Masters Now

In the old days, the music industry owned the masters, the distribution, the airwaves. You made the music; they made the money and decided if anyone got to hear it.

Big platforms run the same racket. You write the posts, build the audience, generate the engagement, and they own the feed, the algorithm, and the right to bury you or boot you whenever it suits the shareholders.

Not here. Own your domain. Own your data. Own your identity. Your words live on infrastructure you control, not on borrowed servers that can evict you without notice.

III. No A&R, No Venture Capital, No Gatekeepers

No punk band was chasing a platinum record. Punk was about making music and getting it into people’s hands – that was the whole transaction.

No indie web builder is chasing Series A. We’re not optimizing for growth. We’re not selling your attention to advertisers. We charge a fair price for a real thing, if we even charge at all, and either way nobody’s pitching us to a boardroom.

Small. Sustainable. Answerable to no one but ourselves.

IV. The Zine Never Died, It Just Got a Domain

Punk had zines – cut, pasted, photocopied, and passed hand to hand because the real press wouldn’t cover it. That’s blogging before anyone even called it blogging.

We still do that. A blog is a zine with better uptime. An RSS feed is a mailing list that never asks for your email. Webmentions are show flyers stapled to telephone poles all over town, pointing back to each other, building the scene a link at a time.

Community over audience. Nobody in this room is just watching.

V. Make What You Need, Not What “Everyone” Needs

Stop designing for some hypothetical user that doesn’t exist. Build the thing that scratches your itch. Use it yourself – eat your own dog food. If you’re not depending on it, why would anyone else?

Do this enough, in the open, sharing your code and your notes and your half-finished ideas posted for all to see, and the rest of the scene will pick it up. That’s how it spreads: not top-down, but kid to kid, site to site.

VI. Weird Is a Feature

GeoCities had hideous backgrounds, animated GIFs, and a MIDI file that played on page load. It was ugly, but it was also alive in a way no template can ever be.

We’re not going for pixel-perfect. We’re not A/B testing a homepage. Have fun, or what’s the point? Keep the web weird. Keep it handmade. Keep the mohawks.

VII. It’s an All-Ages Show

Punk wasn’t always right about this. Each scene had its bouncers at the door and idiots in the pit. Bands worth remembering spent half their set shouting them back out – Rock Against Racism, Riot Grrrl, the Dead Kennedys writing a song to tell the Nazi punks exactly where to go. That wasn’t a side project. It was a full-time job.

So… Everybody gets a seat on the Indieweb. No matter your color, faith, gender, who you love, how your brain is wired, what your body can do, how old you are, where you were born, or which language you write in. Nobody at this door is taking a ticket.

No degree, no job title, no follower count, no years of experience, no permission from others who were on the scene first.

And if you’re already inside, hold the door open for others. Link to the new kids. Answer beginner questions without snark. Write the alt text, caption the video, keep it keyboard-reachable. A site nobody can use is a club with stairs at the doors and no accessibility ramp.

All are welcome on the Indieweb. It’s not a code of conduct bolted on after the fact. It’s the entire reason we’ve built our own places on the Web to begin with.

VIII. This Is the Counterculture Now

In the ’80s and ’90s, blasting Punk Rock was a way of telling the establishment where to stick it. Today, publishing on your own site instead of feeding the algorithm is the same middle finger, just a little quieter.

We opt out of the surveillance feed. We opt out of the engagement farm. We opt into a web made of small, stubborn, independent spaces that are loosely joined, built to last, and owned by those who make them.


We don’t need major platforms.

We have the Web, keyboards, tools, and community.

IndieWeb is Punk. Oi!

Is it time yet for me to go a step further and say this?

Stop fucking feeding the algorithms.
The Web belongs to humans. 🤘

Yeah, I think it’s time.

AI Software Development – What Does The Data Say?

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

  • The maximum effective context limits of LLMs… beyond which model outputs become unusably inaccurate is orders of magnitude smaller than advertised limits…
  • LLMs cannot distinguish between recent and out-of-date information in the context, and information in the model itself, learned during training (“dominant priors”), can often “outweigh” information we give it…
  • Repo-level .md files tend to make model performance worse…
  • LLMs struggle with negation…
  • LLM inference is more accurate when we give them examples (demonstrations) rather than just describing what we want…
  • Large/long-scale industry studies show a clear trend – output is up (more code, more commits, bigger diffs), but outcomes don’t reflect that trend. If anything, the average team is taking longer to ship worse software…
  • The psychological and cognitive factors in LLM use are a growing field of serious research. One study found a significant correlation between confidence in AI output and belief in the paranormal…
  • Deep neural networks, including LLMs, struggle to learn patterns with long-range dependencies, at any scale of model…
  • The energy and compute needed to train an LLM to be an order of magnitude more reliable – e.g., wrong 3% of the time instead of 30% – is 10^20 times what the current frontier models require. Don’t expect significantly more reliable models any time soon….
  • …many published benchmarks that do indeed show LLMs getting better and better. But other research finds that we might wish to be more skeptical of benchmark performance… they’re not really like real-world problems…  [and] increasingly models are being “trained to the test”.

This is a really great summary of the state of the art in research into the efficacy of AI-driven software engineering, and it parallels with much of my experience. In particular, my personal experience has been that, properly-used, LLMs can be…

  • great at summarisation, which can make them helpful at tasks like parsing a large codebase to “trace” inconsistent logic, or explaining how a bug report represents a condition that is not covered by an automated test. This is most-valuable for unfamiliar codebases, where the developer’s intuition might be slower than the LLM’s token analysis: however this does introduce a risk compared to a more-systematic debugging process that an edge case (or parallel functionality) might be missed.
  • good at extrapolation. Given a solid example of what you’re trying to achieve, it’s relatively simple for an LLM to extrapolate that to other cases throughout your codebase. This can be useful when switching between many cases with slightly-differing logic, or when mirroring front- and back-end functionality in different programming language, where the LLM’s extrapolation capability may outperform the developer’s context-switching capability.
  • mediocre at creation: greenfield development from a “spec” to “code” is something LLMs appear to do pretty well, particularly for common and well-understood concepts (or, for “deep thinking” models, for tasks that they’re able to summarise correctly as a series of well-understood concepts). But when extending existing functionality, or when implementing functionality that is not well-represented by examples in the training data (e.g. truly new concepts, or use of new features of programming languages), LLMs routinely get stuck in flip-flopping loops, produce invalid solutions, or otherwise cause significantly more harm than they do good.

(They’re also okay for rubberducking, but so’s a rubber duck so that’s not really a good comparison.)

Since I first echoed Molly White’s observations that AI isn’t useless… but I’m not certain that they’re “worth it” several years ago, I’ve continued to experiment with different AI-assisted coding methodologies and technologies, but my fundamental position hasn’t changed: there are clearly some things that a coding LLM can help with, as described above, but there are problems when they get used for other tasks (which they routinely do). And I’m still not convinced that they’re “worth it”, and I’m concerned by those whose anthropomorphise GenAI and by the fact that a lot of industry is being built upon technologies whose runway is running out…

Anyway: great summary, Jason; thanks!

They love RSS

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

“Thank you for using RSS.” “I love RSS.” A badge in the footer. A little heart, a blogroll. Community. Belonging.

I love TCP/IP. I love HTTP 1.1. I love DNS resolution. Where is my badge. Where is my directory. Nobody forms a tribe around plumbing. You use it. You don’t announce it. You don’t put a sticker in your footer that says “I love packet switching”.

RSS is plumbing. A transport format. XML with angle brackets and escaped HTML and a version attribute and the CDATA hack. You don’t love it.

I feel targetted (if you subscribe by RSS you’ll know that I share my enjoyment of the format in my <description>s!).

Actually, I do love RSS!

I love it despite its faults; and it’s got plenty of faults. Its brittleness, sure, as unstory observes. But also its insistence upon RFC 822 dates, which are almost the worst imaginable standardised Internet date format. Also the fact that things you wouldn’t want to use it without borrowing features from a different, one might say competing, standard. Also the excessive HTTP-centricity, which makes it theoretically a standards violation to, e.g. make a podcast that’s distributed by Gemini, for example.

But I love what it does. I love how it ties the Web together. And I love how it does it: just a resource, at a URL, that the subscriber can hit as frequently, or not, as they like.

Oh and:

The person with the heart in their footer would not survive writing one item by hand.

I totally would. I absolutely do. I rarely do, because I’m far more-inclined to write software to do it for me, but I still write “raw” RSS a couple of times in a typical year.

I also love HTTP. Maybe I should sing about that more often, too. And yes, I actually love HTTP in the way that unstory gatekeeps “love of a technology”, like I do RSS: I can “survive writing it by hand”.

I Regret To Say That GMail is Now a Spam Farm, or, Why You Should Really Get That Dedicated Email Address Now

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Aside from their predictable subject lines and verbiage, there’s also one other thing that these [recent, AI generated] spam emails have in common: 99.9% come from GMail accounts. Once in a blue moon one will come from yahoo or aol or some other general mail service, but they are a rarity. Almost all of them are GMail. One one hand, congrats to Google, I suppose, for cornering the stand-alone email market so completely that even scammers are impressed with its ease of use. Surely that is some sort of sign of success.

On the other hand, if you are a person who relies on GMail as your primary email, this means that if you are trying to send me mail, you now run a much higher chance of being deposited into my spam folder. So much of the email I get from GMail accounts at this point is spam that an actual Gmail email, from an actual person, is statistically relatively rare. To be fair, if you write that email to me yourself with your own little fingers, your chances of hitting my actual inbox are pretty decent. But if you used GMail’s onboard “AI” to “help” you write that email, you are likely going directly to the spam folder. The GMail spam filter is now trained to recognize “AI” slop sentences, even those written by GMail itself. Yes, there is probably irony there.

GMail’s been going gradually downhill for many years. It’s been a slow decline, compared to many enshittified services, but it’s still very-clearly happening. Aside from the long-established privacy/big data concerns – especially if you use any other Google services, or fail to block their Web trackers – they’ve just devolved into a service that doesn’t “wow” like it did when it was launched. It’s slow, it’s clunky, and it increasingly shovels AI down your throat, whether you want it or not.

If you own a domain name, you should already be using that as the domain of your email address, of course. This detaches your email address from any specific provider, which makes it much easier to change your email provider whenever you like: it puts the power in your hands. You can do this whether you’re using GMail or any other provider.

(If you don’t own a domain name, then perhaps you should.)

But beyond that: if you’re using GMail as your primary personal email service, you should shop around. Don’t let the weight of the inertia of your inbox stop you: there are plenty of ways to back that up, move it around, or just retain it as an archive in-place if you have no other choice.

I switched to Proton about ten or eleven years ago and I haven’t looked back. Are they perfect? No. Are they better than GMail? Absolutely; for me at least. But there are plenty of other options available for those for whom Proton is, perhaps, too-security-conscious. And switching to almost any of them reduces the risk that your messages start going to your recipients’ spam folders, as more and more spammers move to GMail for its AI features, which produce junk mail faster than ever before.

Why aren’t AI companies competing directly with their customers?

If the chatbot can do the job, and if the chatbot costs less than the worker who does the job today, then the chatbot company can profitably sell services more cheaply than anyone who presently employs that worker, because the chatbot company already owns the chatbot. If you were really on a glide path to creating an all-powerful deity and just needed cash to keep the venture going until the cancer-curing word-guesser awoke from its long slumber, then wouldn’t you want as much cash as possible?

An excellent counterpoint for anybody who claims that AI will become profitable eventually, and agrees with the hype assertion that the things that it’s capable of automating always represent better value than human workers doing the same tasks.

Why sell picks and shovels if you’ve already struck gold?

But of course you already know the answer. The big AI companies are currently funded by moving-money-around. They do not have a clear path to profitability, and it’s not certain whether or not they ever will. So selling their service, rather than competing with their customers, allows them to hedge their bets for as long as possible.

Maybe in that time they’ll find a way to bring their costs down. Maybe they won’t. But they’re clearly not confident enough that they will that they’ll bet on their own long-term future.

How to Set Up Windows 11 Without a Microsoft Account in 2026

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

When you reach the “Let’s sign in” screen (or any network/account screen during setup), press Shift + F10. This opens a Command Prompt window. Type the following and press Enter:

start ms-cxh:localonly

I hope to never need to install Windows again – I hope that part of my life has passed – but should I need to install Windows then, as usual, I’ll want to do so without a Microsoft account. And as that’s apparently become more-difficult now, I’ll be consulting this guide.

I bought a Sony Walkman

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

The Walkman is the Sony WM-EX521 from 2002, which is a pretty late model. It’s not one of the classics from the 80s, but I really like the design, the case is made out of metal so it looks and feels really solid and with it being relatively young, I don’t expect too many problems. In fact, I had a suspicion that the only thing that was wrong with it might be the belt. Tape drives have rubber belts in them which link the motor with the tape mechanism, and these wear out over time. They can become loose or lose their elasticity, some break and some also try to turn themselves back into crude oil, which leaves a giant mess behind.

So when the Walkman arrived, I opened the back to see how it looked on the inside, which required putting it on a heat plate for a few minutes to soften the adhesive, and then I could carefully insert a plastic tool between the frame and the back cover and start prying… nah, I’m kidding. This was made before all of that nonsense. You take out five screws and you’re in. Which is how it should be.

Anyway, I took the back off, stuck a battery in, pressed play and I could see that the motor was spinning, but the belt was loose and wasn’t moving. Suspicion confirmed, the belt was bad. Thankfully it was just worn out and hadn’t disintegrated yet, so that’s an easy fix.

I ordered a new belt here, which arrived a few days later from Portugal, and replaced the old one. I also sprayed some contact cleaner into the volume potentiometer while I was at it, because it sounded very noisy and scratchy. Here are some pictures, and you can see the old, worn out belt next to the new one. It’s literally twice as long! No wonder it wasn’t working anymore.

Two belts, one new, one worn out

This entire post is amazing. Every step Andreas takes, from selecting and buying an (old) Walkman, to repairing its belt, to using the (known) frequency of the first note of a song to “tune” it by recalibrating the speed control potentiometer while playing into a guitar tuner app… feels like you’re being taken along on the journey with him.

I really enjoy Andreas’ writing style and posts, so I’ll be adding him to the blogroll. A delightful and serendipitous find (courtesy of Bubbles).

British Columbia, Time Zones, and Postgres

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

On March 8, 2026, British Columbia moved their clocks to a year-round Pacific Daylight Savings Time. In March, they did the spring forward one hour with their clocks to UTC-7, but they won’t fall back to UTC-8 in November. Going forward, the UTC offset for America/Vancouver timezone is permanently UTC-7.

Let’s use this as an opportunity to talk about date and time zone storage. In the most basic examples, the default is to store the UTC value, then calculate local time relative to UTC. However, people using calendar systems think in terms of local time (i.e. wall clock time), and never consider UTC. After modifying time zone data, these time calculations from UTC for a region will differ from the user’s input value.

If you stored timestamps in a UTC-based column for British Columbia-based appointment in 2026 and beyond, your November through March appointments may be off by an hour!

A fascinating read into a problem that I knew existed… and fear!

This is the kind of thing that keeps me up at night every time I expand on Three Rings‘ timezone support. Right now, Three Rings stores the times of “shifts” (when volunteers do things) as UTC timestamps but treats them as “local time” to the voluntary organisation using them. If they say a shift starts at 8pm, that’s probably what they mean: they mean 8pm local time, no matter where they happen to be in the world and whether or not their region uses daylight saving time.

But this approach, while simple, has limitations:

  1. Three Rings doesn’t correctly respect shift duration variance as a result of daylight saving time clock changes. Suppose a Samaritans branch has a four-hour shift starting at midnight on Saturday night/Sunday morning. Twice a year, that shift will intersect with the clocks going forwards or backwards. Is it still a “four hour” shift? Well that depends: does the volunteer stay for four hours regardless of the clock change, or do they always go home at 4am? Three Rings assumes the former because it’s mathematically simpler, but in reality the latter is probably true (and the volunteer actually worked three or five hours).
  2. Three Rings isn’t suited to organisations that span multiple timezones. When an Australian charity started using Three Rings they were interested in getting an overview of how many of their helplines – which are spread across three to four timezones (depending on whether daylight saving is in effect: half of central Australia observes daylight savings and half doesn’t!) – are open at any given time. Three Rings currently isn’t designed in a way to make it easy to answer that question.
  3. Three Rings makes some suboptimal choices if you’re a long way from the Prime Meridian. This one’s easier to fix, and we probably will, but if you’re far from the UK and especially if you’re West of the UK then our scheduled tasks to e.g. “lock” shifts that appear to have “started” and prevent their easy modification… triggers at the wrong time.

Items 1 and 2 on that list are hard problems to solve, especially starting from where we are with our vast corpus of 24 years worth of “assumed local” time data. We’re improving on this kind of thing by increments, but it takes a while…

…and then, just sometimes, some country decides to fiddle with its timezone or its observance of daylight saving time and makes programmers’ lives hell.

Still; I’ll be referring to this blog post by Christopher Winslett the next time I’m working on a big set of timezone-related enhancements for Three Rings, for sure!

Taking A Dive

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

A traffic cone sits atop a diving board at an outdoor swimming pool.

I had another submission accepted to Curious Cones last month; it remains one of my favourite silly niche blogs. This time around, it was this traffic cone seemingly about to take a dive from the low board at an outdoor pool (at which the younger kid and I were taking a respite from the heat!).

Not-accepted, but shared here for your enjoyment, was a photo I took while at West End Live in London the other week. I spotted a traffic cone on a shelf in the left luggage room at our hotel! I took the pic quickly and the room was dark and the photo came out blurry, so it’s fair that it didn’t make it onto the blog, but it’ll remind me to keep an eye out for cones in the most-curious of places!

A cluttered left-luggage room with many suitcases stacked on shelves... and atop one set of shelves, a traffic cone.

×

Garbage for humans

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

On reflection of Cloudflare’s announcement of “Markdown for machines” in February, a feature that provides simple, clean Markdown versions of web pages to AI agents, unstory dryly observed:

You get HTML, trackers, cookie banners, popups, and JavaScript.

Machines get the clean version.

I enjoy this take. If there’s a “clean version”: something simpler, easier to read, lower-bandwidth… why aren’t we giving that to the humans in the first place!

Though I’ll tell you what: if this pattern becomes widespread, I’ll absolutely use (or implement!) a browser plugin that spoofs being an LLM, so that I can get the clean content, and then Markdown-to-HTML converts it back so my browser can display the “readable” version of the page.

And what a world that would be. Humans, pretending to be robots, that pretend to be humans! We live in interesting times.

Maybe “is AI a bubble?” is the wrong question

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

I’ve stopped thinking that’s the right question. The better one: do the cash flows arrive before the financing patience runs out?

  • Clock 1: can costs fall fast enough, soon enough?
  • Clock 2: will the money last long enough?
  • Clock 3: does real demand arrive fast enough to replace the circular kind?

Bull and bear mostly agree the technology is real. They disagree on the clocks.

A relatively balanced discussion on the economic prospects of GenAI. Of course, the author attracts responses on… 😬 Twitter… so I’m not replying there. But I enjoyed the relative neutrality of Emile’s piece.

I’m not sure, of course, whether asking about the economic stability of GenAI is the right question in the first place. It sort of presupposes that it’s a net good (note that I didn’t say “has value”: there are definitely things it’s useful for), right, to ask whether it’s something that we can afford to pay to keep around?

But sure: we can keep watching these super-long runways and wondering when they’ll run out (or somebody works out how to get the tech off the ground)!

What Was Matt Thinking?

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Around 1995 or so, a high schooler named Matt Wright decided to launch a website that shared some basic website tools that he programmed. Many of these were dead-simple, things like contact forms, guestbooks, and web counters.

Screenshot of a 90s-style website titled 'Matt's Script Archive', providing a variety of Perl CGI scripts including a guestbook, counter, search, and random link generator.

OMG I remember Matt’s Script Archive. I taught myself Perl with (among other things) his scripts.

I took his Counter/ImageCounter script and adapted it into my own FireCounter, which stitched together (non-animated) GIFs of digits (which I made using a filter in Corel Photo-Paint, I think) into the kinds of edgy hit counter I was into, back in the day.

"Flaming" black-on-black digits 0-9.
This is a recreation. It probably looks better than the original!

Later, I even added parameter handling to allow the webmaster to specify a different set of digit images, and referrer detection so that it could track different sites: each got its own text file with its count in it! For a while, a dozen or so of my friends had my counter visible on their Geocities and Angelfire pages!

I’m sure that my script had many, if not more, of the kinds of security vulnerabilities discussed in the linked article. But man, it felt like magic at the time!

×

Setting the width of selects to the width of the selected option

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

The field-sizing property is coming to Firefox 152, making it available across all major engines. It allows you to control the sizing behavior of elements with a default preferred size, such as form elements.

Sometimes a new CSS feature comes along and I immediately “get it”. Like: that’s a cool new feature, I can already see how it’ll save me time, or make things simpler, or improve accessibility, or allow me to do something new.

Other times, like this one, I initially shrug. What’s the point?, I think…

…and then later in the very same day find occasion to wish it was already mainstream. Hah!

Thanks for sharing, Manuel.

Elon Musk, Human Ponzi Scheme

This is a repost promoting content originally published elsewhere. See more things Dan's reposted.

Yesterday I took a short trip. I began with a ride on the local Hyperloop, which ran through a tunnel dug by Boring Company. Then I used my neural implant to summon a fully self-driving Tesla robotaxi. While enroute I read the latest news from the Mars colony.

OK, none of that actually happened, because those products don’t exist. There are no working Hyperloops. The Boring Company has not dug any commercial tunnels. Tesla has a few self-driving — though not fully self-driving — taxis in Austin and nowhere else. (Google’s Waymo driverless taxis are operational in several major hubs.) Neuralink, which is purportedly pioneering brain implants, has tested its products in a handful of patients but done no more than that. And of course there is no Mars colony: there have been no manned flights to Mars, nor the prospect of any for the foreseeable future.

Yet at various points over the past decade Elon Musk promised that each of these services would be available by 2025 if not sooner.

With thanks to Mark Palko for sharing: yes, this seems like a spot-on observation of Musk’s career:

  • a few unqualified successes (Tesla leading the charge on the EV rollout; Starlink providing widespread Internet), and
  • a lot more unfulfilled promises and vapourware (Twitter’s post-takeover nosedive, the failure to deliver anything-of-use by Neuralink, The Boring Company/Hyperloop, the worse-than-pointless Grokipedia, all the things SpaceX hasn’t yet done…).

The vast majority of his wealth comes from investment, not from returns: people buy his stock if they buy his hype. I’m not saying he’s producing nothing of value… but yeah: the “world’s first trillionaire” is… unfortunate.

But then again, I’d be quite happy for him to be the world’s last trillionaire, too.