---
title: "Blaugust 2026: Thoughts Beside the Numbers"
date: "2026-09-22T13:39:17Z"
mat: "2026-09-22T13:39:17Z"
keywords:
  - Blaugust
  - Blaugust 2026
  - quantitative analysis
---

What we bumped into while preparing the Blaugust 2026 numbers.

The quantitative report is [over here](../iwcensus/state_of_the_blaugust_2026).

## A Note from The Author

We talk in first person plural because this is a pile of qualitative analysis about some quantitative things, and, more importantly, it makes it easier to digest. Author is lazy. Deal with it.

## We Did Something New

The _State of the Blaugust_ is something new that we're doing:
- new in the sense that we have never participated in Blaugust before (and, just for the record, we managed to squeeze out four public posts while simultaneously being on vacation, completing some Ingress challenges, and writing a bunch of other things that we can't talk about)
- new in that we got distracted updating some tooling and building out a quadstore and SPARQL engine and wanted to give it a good shakedown, so we came up with the notion of throwing Blaugust at it
- new in that we have never done a census of Blaugust before, and, as far as we can tell, nobody else has attempted quite this sort of census either (and we're probably going to get a few things wrong which is very much not new)
- new in the sense that we're making the results public and have donned our asbestos underpants

### The Small Print

What follows are our observations, which concentrate on the act of doing a census and analyzing the results, and some snarky asides or commentary from our resident BOFH. The split-personality approach to the narrative allows the narrator to have fun and should not otherwise be taken as a statement of fact or editorial position. In fact, feel free to completely disagree with anything anyone says. But, do remember: the numbers do not lie, except when they are wrong. Our crawl mechanism is hardened against real life and the general nonsense that we have encountered in the internet, but still, we always encounter things that either raise our eyebrows, or mean we have to build it yet another heuristic gate against bad netiquette and/or humanity doing its best to be silly.

The results are real. Our interpretation of them is imaginary. Therefore, while the numbers are what they are, our explanations and interpretation of why they are what they are, and what we can glean from them is what it is, it is far more casual interpretation of what the data is showing our eyes and how we perceive what is happening for why reasons, i.e. we are making a first-order guesstimate of what our gut is telling us and how the numbers smell to our nose. Any causal relationships or inferences that you pick up are on you. If in doubt, ask a statistician to crunch the data. For the avoidance of doubt, by statistician, we mean a real-life one: do not shove the data into an LLM and prompt "Hey Claude, explain these numbers in plain English for me please".

### See also

Other people have also looked at Blaugust 2026, in particular, and in alphabetical order:
- [Contains Moderate Peril: Blaugust 2026 Group Project: Lessons Learned](https://www.containsmoderateperil.com/blog/2026/8/31/blaugust-2026-group-project-lessons-learned)
- [Nerd Girl Thoughts: Blaugust 2026 In Review](https://nerdgirlthoughts.game.blog/2026/09/05/blaugust-2026-in-review)
- [TAGN: The Labors of Blaugust 2026](https://tagn.wordpress.com/2026/09/05/the-labors-of-blaugust-2026)

Kindly note that we started our census with the list of participants per [owlblog's OPML](https://godless-internets.org/blaugust-2026.opml), so N is different. As always, YMMV.

## We Found Things and Had A Think About Them

BOFH: Remember kids, there are lies, damn lies, and statistics.

### Feeds

Most sites provide a feed.

One site does RSS 1.0, and only RSS 1.0.

BOFH: We are shocked that somebody actually emitted an rdf-formatted feed like it's 1999, and more shocked that we were able to successfully parse it.

RSS 1.0, RSS 2.0, and ATOM are all that need to be parsed for 100% feed coverage, which is good, because we totally ignore JSON and h-feed flavors.

### Sitemaps

As feeds are transient, we also looked at any sitemaps to help backfill entries.

Sitemaps are less supported, particularly on some static sites like Neocities, or where it appears to be a freshly minted WordPress site where the sitemap plugin is not installed and/or enabled.

One site has the weirdest sitemap.xml ever, with thousands of pages having a `<lastmod>` of 2026-08-22. Unfortunately, 2026-08-22 fell within the census period (2026-08) which meant we had to consider 4000+ pages. The SNAFU was because, as best we can determine, they pulled in a bunch of historical entries from elsewhere into their site and forgot that `lastmod` should respect the original metadata, not when they did the ingest; this is somebody from the IndieWeb doing backfill badly, viz., they correctly preserved the published time and modified time in the mf2 data on the pages, but screwed up the metadata sitemap.xml discloses.

The cleanest solution was to read every darn page and use the embedded mf2 instead of the sitemap as the truth. And all because somebody thought that the world would care about their historical fitness data. Nobody cares. Fix your `<lastmod>`.

To be blunt, it was a detour we could have done without, and it consumed about half the crawl budget (time, space, etc), for data that turned out to be 99% historical data that was completely irrelevant for the census period. Unfortunately, there were some genuine Blaugust posts amongst the hay stack, so a robust fix had to be done so we could cope with this foolery.

### Neither feed nor a sitemap to guide us

There are a minority of sites with neither a feed nor a sitemap, so we had to resort to an old-fashioned shallow-ish crawl to see what we could find in those cases.

Neocities hosts, being primarily static things, are awkward even when they have a feed or a sitemap that somebody has generated somehow. So, a slightly deeper crawl got triggered by some heuristics that are very much of the suck-it-and-see category.

### Are you human (asks Cloudflare)

We encountered one site which had enabled Cloudflare's "Are You Human" protection, so we could not automatically fetch anything from the site.

BOFH: There is a certain irony in Cloudflare gating access to a machine-readable resource with an "are you human" discriminator. Which part of machine-readable do they not get? We could have simply gotten around this gate by doing some shenanigans, but we could not be bothered to spend the 4 minutes and 20 seconds it would take to do it. Such whack-a-mole is really tedious.

### Via Cloudflare

Just over a quarter of sites are "protected" by Cloudflare. At the risk of donning a tin-foil hat, we don't like that so much traffic goes via one actor because the SPOF factor makes us concerned; the advisories and assessments from elsewhere make an interesting read that nightmares are made of.

### Borked compression (was us)

We had difficulty with one site, and it was due to a lot of things aligning in just the wrong way to expose an obscure bug in some of our code. Fixed, and now everything is great until something else breaks despite all the testing and real life data we throw at it.

### Rate limits and short TTLs

Another weirdness which broke things was an impedance mismatch between what a self-hosted app was trying to do, what the server that hosted it was trying to do, and what Cloudflare that was sitting in front of it was trying to do, and a bug in our code. Essentially, rate limiting was being triggered because of cache control mismatch, and the bug in our local cache did not help. Throwing up a tranche of fixes eventually meant peace and tranquility and everything was super green.

It's always cache. And a 30s TTL is just asking for things to go wrong.

### Aliases

When a website is an alias to another website, things get confusing. Our position is that we normalize to the vanity name, not the origin name. We had one instance of this and we learned the hard way which way to normalize.

### Gone

Some participant sites have just disappeared with a 404. The OPML still lists a feed URL, so a naïve read is that “they had a feed but we could not list anything.” 

If the homepage and sitemap and/or feed 404, we assume you are gone.

### "bit rot" or "bit-rot" or "bitrot"

There was one site that could be diplomatically described as bit rot. It was a participant in Blaugust (because it was in the OPML), but the site was last updated many, many, many years ago (yes, that long ago). Signing up for a daily blogging event when your last post is from the previous decade is either optimism that 2026 will be the year that you'll make a comeback, or an administrative hiccup in the OPML. Either way, the definition of who qualifies to be labelled a "participant" needs to be better established.

### Zonelets

A few Neocities-shaped blogs use [Zonelets](https://zonelets.net/). There is no `sitemap.xml`. What looks like an archive page is an empty HTML shell, because, the sitemap is instantiated in the DOM using JavaScript magic. Using JavaScript to build the DOM is a choice, just not a good one. We did some anti-magic to extract the sitemap from the raw JavaScript. What we did was something that we are never going to talk about because it was such a quick-and-dirty thing that we're not proud of doing (even though it does work).

### Dates are difficult

Over the years we've seen a lot of things on the Internets, and one thing is constant: no matter how accepting your date/time parser is, somebody will manage to break it. We had some sites do something really _novel_ with dates because following [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339) or [RFC 9557](https://datatracker.ietf.org/doc/html/rfc9557) is clearly too much to ask for.

BOFH: Being _novel_ is not good (unless you are a writer). There should be a law about this, or at least some sane standard (ahem, [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html)), and ideally an [xkcd DateTime](https://xkcd.com/2867/) to ram the point home.

### Bad AltSvc

Two websites had messed up their HTTP alt-svc header by pointing to a port that was not open, which meant that while they thought they were http/h3 compliant, any fetches would fallback to http/h2. Closer analysis revealed that there were probably fat fingers mistakes because instead of saying “443” it was “4430” and “4443”

We have a hierarchical cache sub-system, and we had to tweak it so when the h3 `altsvc` does not answer, the fail-safe is h2: this is how browsers behave, but it's not strictly conforming, however, when pragmatism butts heads with real world stupidity, we work around stupidity (unless we feel like tilting at windmills).

The issue here is that somebody thinks their site is being all forward looking and at the Zeitgeist of shuffling HTTP and data around using H3, whereas it's falling back to H2. There are enough plugins for browsers that can show what actual flavor of H that you are using, so there really is no excuse for not noticing something isn't working as expected. This presumes somebody knows what they are doing and they aren't blindly copy-paste some configuration they got from the Google.

### Stupidly Small cache periods

We encountered sites that set a stupidly small cache time. The whole point of providing sensible cache headers is that you get a sensible cache implemented in the pipeline so everybody saves bandwidth and things happen a lot faster. Otherwise, and to hammer the point home: any benefit of caching is lost, and you can even make things worse than having no caching and letting actor do their default thing. Sure, the HTTP caching headers are a bit of a black box, and something too impractical to get practically right that it feels like something that W3C could have come up with instead of the IETF, but still.

BOFH: An historic page does not need `cache max-age=30`.

### More cache stupidity

And so it continues.

Take this example, according to its embedded mf2 metadata, it was created in April 19, 2015, updated in August 22, 2026, and yet the server sends this HTTP response header:

```http
Cache-Control: public, max-age=300
Content-Encoding: br
Content-Length: 10335
Content-Type: text/html; charset=UTF-8
Date: Thu, 10 Sep 2026 10:37:46 GMT
ETag: "4acfb10741c3cba2ea7e"
Expires: Thu, 19 Nov 1981 08:52:00 GMT
permissions-policy: geolocation=(), camera=(), microphone=(), payment=(), interest-cohort=()
Pragma: no-cache
Referrer-Policy: strict-origin-when-cross-origin
Server: LiteSpeed
Strict-Transport-Security: max-age=31536000; includeSubDomains
Vary: Cookie,Accept-Encoding,User-Agent
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN
```

The `cache-control` is stupidly small on a post that 10+ years old. Throwing in `pragma: no-cache` is pure contradiction, as is that suspicious `Expires`. There is no `Last-Modified` either. And is that `Expires` a joke? It must be because relative to metadata on the page, it is nonsense. Is it their birthday?

BOFH: If you recognize that this is your site, kindly fix it, especially the `Expires`-as-a-birthday which is not funny and breaks caching even more than it is already broken.

### Content in \<title\>

This was one of the weirdest things that we encountered. Somebody had put, what smelt like "note" into an unclosed `<title>`. We can only guess that their bespoke template was borked somewhere.

BOFH: WTF do you mean that `title` element is unclosed and the document is semantically beyond weird. Does "View Source". Dammit, what a mess. The sweet irony: the person whose blog that this is happening at, is heavily into telling people that HTML is everything, be semantic, and "View Source". Clearly, they don't follow their own advice. For a good time, use [Nu Html Checker](https://validator.w3.org) to check the wire!

Browsers can render this mess because they manipulate and fix the DOM when the HTML is broken to avoid GIGO situations. The lesson here is just because it looks good in a browser it doesn't necessarily mean it's good on the wire. Somebody needs to stop trusting Firefox and actually look (i.e verify) what they are sending down the wire.

We did a fix to our engine and we feel dirty.

### てがろぐ [Tegalog]

Somebody uses てがろぐ ([Tegalog](https://www.nishishi.com/cgi/tegalog/)). This is a self-hosted CMS written in Perl, from [long ago](https://www.nishishi.com/blog/2017/12/tegalog_microbl.html). We're not familiar with it (it seems to be targeted at users in Japan), but a little research suggests it is still maintained.

Keep the web weird, even if it means using Perl.

### WordPress

The juggernaut that powers too much of the web powers just over a quarter of the Blaugust cohort. We wonder what the situation will be like next year?

### English

Most of the posts are written in English. It's the _de facto_ language on the Internets. We were pleasantly surprised to find that a few other languages were used too. We were even more surprised to find no French or German. Only five writers published in two languages, so while the cohort contains a multitude of languages, multilingual writers themselves are a rare breed.

The 5% who aren’t sure what language they’re using are worth some deeper linguistic analysis (which involves a whole bunch of heuristics looking at letter frequencies and other exciting things of that ilk). Given the cohort, we expected to come across Esperanto and Klingon. Hint: lang="eo" and lang="tlh". Go on, dare you. In fact, double dare you.

### Word Counts, and Multilingual Posts

We need more fingers. Counting is hard, depends on the script: counting words written in Latin or Cyrillic script is easy; counting words in CJK languages is harder. Some of the numbers were suspiciously wrong, and some seem wrong despite applying mitigating fudge. Some deeper investigation is needed, but that's for another time. Until then, apply pinch of salt where obviously wrong.

The word counting for CJK is naïve (it treats one rune as one word) which can inflate the numbers. This is where we freely admit that we could do better for CJK. However, we are more interested in length indicators as opposed to super-precise numbers, and that is how we treat "word counts". Consider English, French, and German, you can translate the same sentence between them and the word counts would be different, but the meaning is the same. CJK takes it to a different level (because you need to use a dictionary to convert the stream of runes into a stream of lexical units to be counted because it could be one rune or many).

What we can say: we're confident that the distribution is relatively correct, and that the word counts are good enough (accurate enough that reducing the margin of error will not move the numbers too much) but not good enough to settle a bet when the difference is marginal.

### How many ways can I say that I love you?

Or, let's talk about tagging.

If we look at the tags that were applied to the posts, it's simultaneously wide and deep. Or, to be more precise, a lot of people are talking about a lot of things, and nobody can really get the taxonomy right. About a third of the cohort didn't bother with tags at all.

The tags follow a very obvious long-tail pattern.

There are a lot of tags all trying to say "blaugust-2026" (or should it be normalized to "Blaugust 2026" ?!) and nobody can agree:

- blaugust2026
- Blaugust 2026
- blaugust-2026
- #Blaugust2026

BOFH: This is why the timBL concept of the semantic web is a bit of a fever-dream: you cannot rely on people to agree and get things right. Even applying some Postel-like logic and attempting to normalise things is very much open to interpretation.

The more interesting set of tags are those used by multiple writers, implying cross-cohort interest. No surprise, it was #AI, which has been somewhat controversial this year, and we suspect next year will bring more of the same (unless the AI overlords have enslaved humankind, or the crops have failed even more due to the weather).

BOFH: We do not fear the AI. We're more worried about the weather, and that we can't afford to refill the diesel tank for the backup generator since last month's annual "cut main breaker and see what fails" procedure.

### It's a Sprint

Looking at how often people posted, the picture matches what people were talking about. The start is strong because the previous participants and some of the fresh blood (who knew what they were getting into) had posts ready to go and a stack of drafts to polish off and publish. The middle was where the fatigue set in. And on the last day, a mass of "How I survived Blaugust, and this post conveniently gets me my 31 post achievement".

### The Long or The Short

There is a continuum that includes micro-blogging, notes, posts, and essays, and where things lie on that continuum is up for debate, as are the names themselves. We eschew that debate by simply using word count as indicator for something that is either a short note vs something far longer. The biggest hiccup was running out of fingers and toes to help us count. Statistics are hard.

A quick look at the quartiles and the 95th percentile outlier (200/500/900/2K) and mean (~700, σ≈1K) indicates long-tailed (exponential-to-log-normal family) distribution, and a mixed bag of reading lengths (because σ > µ). The micro entries are about 200-words pieces (and presumably this is the tweet/toot influence on what is considered contemporary micro-length communication). In the middle, people write shortish 500-word pieces. Getting longer, it's 900-word pieces. The outliers are those who do what we'd call essay-length pieces (and the bar to get there is 2K words).

The gaps between those quartiles (the IQR) are more useful than σ for describing the shape. From p25 to p50 is ~300 words; from p50 to p75 is a bit more (~400). So the middle half of posts (roughly 200 to 900 words) is only mildly lopsided toward longer pieces. The drama is past p75: p75 to p95 is over 1K words. That is the essay tail, and why the mean sits above the median while σ looks alarming.

When the standard deviation is greater than the mean (σ > µ), the average is less interesting as a quick way to answer "how long is a Blaugust post", and instead the percentiles become the point of interest. Throwing up a chart of the distribution vs log word count, everything appears to be the classic and boring long-tail distribution that we expected to see. Go read some Albert-László Barabási for readable discourse on long-tail distributions (specifically [_Linked_](https://search.worldcat.org/title/859186455)).

### The daily grind

A few people posted every day, whereas most people spread the load across the month. The posts-per-writer numbers put receipts under that gut feel. Typical load is about 15 posts (mean ~19, σ≈17). Quartiles land at roughly 5 / 15 / 31 / 54, and the busiest went past 100.

p75 sitting on 31 is the interesting bit for a 31-day challenge. That is the post-a-day / achievement culture showing up in the distribution, not only in the last-day "I survived Blaugust" pile from the sprint story above. Half the writers never hit that pace. A thinner slice went well past it.

Same long-tail family as word counts, different story. For length, the tail is essays. For load, the tail is content machines. Mean above median, σ in the same ballpark as the mean: the average is a poor answer to "how much did people post," so lean on the percentiles. The middle half (about 5 to 31 posts) is only a bit busier above the median; the drama is past 31.

Some people are verging on being a content machine, churning out rather more posts than might be considered healthy. We know who they are. They know who they are.

## Does it mean anything?

In all the analysis, we've taken an intentional quantitative approach. When, how much, how many, etc. What we have deliberately omitted is the squishy and subjective thing that is the qualitative aspect. Sure, somebody can spit out a 500-word to a 10K-word post, but is it any good? Is it on topic? What even is "on topic"? Word count is not an approximation for quality: you could write 10K-words-of-garbage vs 500-words-of-pure-gold. Also, talking of quality, hashtags are, even if we normalized them, a blunt instrument for topic matching.

## Epilog

Well, that was fun, except when it wasn't because of some foolery. And the more the foolery, the more IndieWeb (capital-I, capital-W) adjacent the webmaster/blogmaster/whatever turned out to be. That's one causality we can't ignore because of the amount of effort we had to expend to work around their boo-boos. And caching: too many people set stupidly inappropriate TTL and scope.

iwcensus started as a quick and fun way to get some statistics on the Blaugust 2026 cohort's posts. iwcensus is based on a previous tool that was a bit naïve, but this is the turbo-charged edition ("better, stronger, faster") that gained some serious quality of life improvements: concurrent crawling, concurrent analysis, and the potential for trend analysis between "runs". 

The biggest improvement was shifting to using a quadstore with SPARQL engine to extract the necessary numbers from all the data we got. This had the side-effect of being a proving ground for the quadstore and SPARQL engine (a _small_ side-project which took yak shaving to a new extreme, and we ended up with an engine that puts others to shame). It also made reporting so much easier as it could shift from hard-coded brute-force math to writing SPARQL. The reporting facet moved from a CLI dump to gaining a full pipeline that rendered HTML or markdown that was fit for human consumption: a lot of time was spent tweaking the reporting pipeline so it could spit out data accompanied with a plain English explanation or interpretation of the data where appropriate; not much time was spent on the graphs because embracing a brutal aesthetic is how it is. The net effect was that we did a lot more slicing-and-dicing because we could do a lot more slicing-and-dicing, and the report is far broader and deeper than originally envisioned. It reveals a story, and the initial question of "how many posts and words did people write" ended up asking (and, we hope, answering) a lot more questions. The numbers may not be wholly accurate, but they are good enough (because we did enough, possibly too much, iteration to gently nudge the margin of error towards zero).

The story is that the weird web, and in the part that of the web that is the Blaugust, is very much alive and very much still weird.

We can't wait for next year to see how things (d)evolve.
