Foreground: The Fool—'Pam-A' tarot card from the Rider–Waite Tarot deck, 1910. | Source | Background: A Hare in the Forest (1585) by Hans Hoffmann | Source (edited by the Author)
The Fool's Autopsy
Yesterday, I posted a satirical article about me selling brennan.day, and having all of my work wholly acquired by BuzzFeed, along with a dozen other corporations sticking their fingers in the proverbial pie while annoying pop-ups and advertisements flooded the viewport.
I wrote this because it was a great way to be critical of many different big tech corporations all at once in a lighthearted, humorous way rather than my usual serious, furrowed-brow approach at writing.
Anybody that knows me in real life will tell you how I am an absolute jokester. I am a lover of tomfoolery and often have found myself wrapped up in chicanery. For example, a couple years ago I completely rebranded the Write Club Discord server aptly to Doki Doki Literature Club and earnestly roleplayed the position of Monika for the entire day, roping in three other members for the roles of Natsuki, Yuri, and Sayori. The year after that, I again rebranded the server and announced Write Club was being acquired by the cough lozenge company, Fisherman's Friend. There was no inside joke or clever connection there, it was completely random and unhinged on my part.
April Fools' Day is one of my favourite holidays. For what other holiday do we have that's focused on being silly and goofy? I've seen a lot of people who have a sincere dislike and contempt for this holiday, particularly in the past few years with the unceasing rise of disinformation and misinformation.
In truth, I think this comes down to the fact that a lot of people don't understand proper prank etiquette: if the person you're fooling is the butt of the joke, that's cruel and not fun! Where's the punchline in making someone else distressed or look like an idiot? That's just bullying with a thin veneer.
The point of April Fools' Day, and pranks in general, is that you should be the fool — the one pulling the prank. If the joke has to be at someone's expense, it has to be your own.
And that's exactly what I did with my prank! I proudly proclaimed and announced I was selling out and decided to be a foolish shill for the sake of making money.
...And it was quite alarming to see how many people thought it was true (including my own Mom, who said she supported me regardless of the choices I make 😭)! I boiled this down to two reasons:
-
People were just skimming. I totally understand this. You have hundreds of pieces of information coming at you non-stop, why focus on some random blogger whose site got bought out? Maybe you glanced a few paragraphs and the form of the writing seemed typical enough. That's fine!
-
People actually thought I was hypocritical enough (and a total asshole) to totally sell out after writing about the IndieWeb and my values for months. This one is a lot more unsettling to me, obviously.
So, let me make it explicitly clear here: I will never sell out. I will never take a sponsorship (I mean, I went scorched Earth on the biggest sponsorship brands in my previous post). I will never close-source my coding or take my writing out of the creative commons. I will never bend the knee to any entity. I don't say this to boast, I just want to make sure people who are reading my work know this to be true.
The Literacy Crisis
Overall, I'm concerned about satire literacy. I mean, I'm concerned about literacy in general. Let me take a detour here.
Some people might think that the shutdown of in-person schools and institutions during the COVID-19 lockdowns is to blame for the rise of illiteracy and the growing lack of reading comprehension, but that's only one piece of the puzzle.
Lucy Calkins popularized "Balanced Literacy" and a strategy called "three-cueing," which instructed children to guess at words using pictures and context clues instead of sound them out. This approach has been debunked by cognitive scientists as actively harmful. Stanford emeritus professor Claude Goldenberg said these were the habits of struggling readers.
65% of American fourth graders read at or below a basic level, according to the National Assessment of Educational Progress. At the peak of its adoption, Calkins' Units of Study was the 3rd most widely used reading curriculum in the country, and a 2019 survey found that 59% of all K-2 and special education teachers were her materials, or similarly discredited programs.
The reckoning was largely catalyzed by journalist Emily Hanford's 2022 investigative podcast Sold a Story. But a generation of readers have already learned to read this way.
Being Silly is Serious
If people are struggling to understand the words they're reading—the fundamental building blocks of writing—then how could it be expected that they would understand when that writing is performing a rhetorical device like satire?
And I do want to stress the importance of satire, as I've also seen many people say how it's become irrelevant due to the increasing absurdity of our real life events. I'd argue the opposite.
Satire is not parody and absurdity, it's about viewing reality in a radically different light, to the point of changing people's perspective. The satirist is not meant to be weirder than the news cycle. They're meant to reveal the embedded, underlying truths.
Take Jonathan Swift's A Modest Proposal. Written in 1729, the essay suggests that the Irish poor can ease their economic woes by selling their children as food to the wealthy. It's written with perfect bureaucratic composur, and is widely considered one of the best examples of satire.
Swift sets a trap. Scholar Charles K. Smith noted that Swift's rhetorical strategy creates a narrator so earnest, so rational, and so full of cold colonial logic that the reader is forced to confront what perverted values would allow such a reasonable-seeming man to propose something so monstrous.
The shock and joke is not in the cannibalism. The shock is in recognizing the cannibalism that was already happening as the British government's policies were devouring the Irish poor; Swift made the metaphor literal and undeniable.
I cannot think of a more effective method to grab people by their collar and shake them awake to the reality of poverty and class disparity. The purpose of satire is to not be funny about power, but to make power's logic inescapable. To put the readers in a position where they cannot skim, and the stakes of comprehension become visceral.
Satire and misinformation are entirely different. Fake news sets out to deceive, while satire sets out to expose. Satire isn't indistinguishable from disinformation. We've lost the muscle—the readerly muscle, the satirical literacy—to tell the difference. And that muscle, like phonics, is something that has to be taught.
Anyways, that's all the discourse I have in regards to being a silly jester. I hope I gave you a laugh and a chuckle while also pointing to the misdeeds and grievances of big tech corporations.
If you're going to be a fool, be the one in the motley. Be the jester, not the mark. Be the person willing to look ridiculous in order to say something true. That's what April Fools' Day is for. That's what satire is for. That's what writing is for.
Part Two: Pulling Back the Jester's Curtain
To go along with my post, I also added a set of client-side effects scoped to April 1st: an animated acquisition banner, a fake Monero miner, a Palantir "consent" toast, an NFT minting notification, fake ad blocks injected into the post feed, a BuzzFeed copyright watermark, and a corporate progress bar. They all auto-disabled after 25 seconds.
The whole thing is around 550 lines and adds zero overhead to the rest of the site on non-April-Fools days. Here's how it worked.
Lazy-Loading the Script
Rather than adding the April Fools code to main.js, I kept it in a separate april-fools.js and only injected it into the page when needed. The loader lives in base.njk:
const isAprilFools = new Date().getMonth() === 3 && new Date().getDate() === 1;
if (isAprilFools) {
const script = document.createElement('script');
script.src = '/assets/js/april-fools.js?v=d01229e3';
document.head.appendChild(script);
}
The Eleventy assetHash filter appends a content hash to the URL for cache busting. Just like an actual virus, the script won't load at all on any other date. No dead weight in the bundle for the other 364 days (this also means you can always set your device's time back to the day to view the effects).
Inside april-fools.js there's a second layer of checks ensures the payload only run on the homepage or the specific post:
const AF_IS_APRIL_FOOLS = (() => {
const d = new Date();
return d.getMonth() === 3 && d.getDate() === 1;
})();
// Load on the homepage
const AF_IS_HOMEPAGE = window.location.pathname === '/'
|| window.location.pathname === '/index.html';
// Load only on the specific post
const AF_IS_POST = window.location.pathname
.includes('great-news-brennan-day-is-being-acquired');
function initAprilFools() {
if (!AF_IS_APRIL_FOOLS) return;
if (!AF_IS_HOMEPAGE && !AF_IS_POST) return;
// ...
}
The Global Auto-Disable Timer
In order to be merciful, every effect (banner, miner, toasts, ads, watermark) is removed after 25 seconds by a single cleanup function:
let afDisableTimer = null;
// On init:
afDisableTimer = setTimeout(disableAllAprilFools, 25000);
function disableAllAprilFools() {
const elements = [
'#buzzfeed-banner', '#af-miner', '#af-palantir-toast',
'#af-nft-notif', '.af-fake-ad', '#af-watermark',
'#af-progress-bar', '#af-yt-audio', '#april-fools-styles'
];
elements.forEach(selector => {
const el = document.querySelector(selector);
if (el) {
el.style.transition = 'opacity 0.4s ease, transform 0.4s ease';
el.style.opacity = '0';
el.style.transform = 'translateY(1rem)';
setTimeout(() => el.remove(), 450);
}
});
document.title = 'brennan.day';
}
The styles are injected as a <style> tag at runtime (also in the elements list), so removing it undoes all the CSS in one shot as well.
The Fake Miner
The miner widget simulates accumulating XMR and climbing CPU usage using two setInterval loops, then flips to the punchline after 20 seconds:
let xmr = 0, cpu = 0;
const cpuTick = setInterval(() => {
cpu = Math.min(50, cpu + Math.floor(Math.random() * 6 + 2));
document.getElementById('af-cpu').textContent = cpu;
}, 250);
const xmrTick = setInterval(() => {
xmr += 0.00000015 * (0.8 + Math.random() * 0.4);
document.getElementById('af-xmr').textContent = xmr.toFixed(7);
}, 600);
setTimeout(() => {
clearInterval(cpuTick);
clearInterval(xmrTick);
miner.classList.add('af-punchline');
miner.innerHTML = '<div>😈 April Fools!</div>'
+ '<div>brennan.day still has zero ads, zero trackers, zero miners.</div>'
+ '<div>IndieWeb forever! 🌻</div>';
}, 20000);
The "Standard 4-min grace period after tab close" disclaimer was a deliberate nod to the actual background crypto miner debates of 2017.
The Palantir Consent Toast
The toast is styled to look like a GDPR cookie banner and uses the site's own CSS custom properties so it respects the user's colour scheme (light/dark):
toast.innerHTML =
'<p><strong>🔍 Data Notice</strong></p>' +
'<p>brennan.day™ (a BuzzFeed property) is now collecting your IP address, ' +
'geolocation, device fingerprint, and inferred behavioural profile ' +
'and selling them to Palantir Technologies.</p>' +
'<div id="af-consent-btns">' +
'<button id="af-accept-all">Accept All</button>' +
'<button id="af-decline">Decline (ineffective)</button>' +
'</div>';
document.getElementById('af-decline').addEventListener('click', () => {
console.log(
'%c"Decline" noted. Processing anyway. — Palantir Technologies',
'color:#e03131; font-style:italic;'
);
dismiss();
});
YouTube Autoplay
Harkening back to the days of Tumblr, there was audio hidden in a YouTube <iframe> embed. Modern browsers sadly block unmuted autoplay without prior user interaction, so it's more of an aspirational feature than a guaranteed one:
const ytAudio = document.createElement('iframe');
ytAudio.style.display = 'none';
ytAudio.src = 'https://www.youtube.com/embed/HMuYfScGpbE'
+ '?autoplay=1&mute=0&loop=1&playlist=HMuYfScGpbE&controls=0';
ytAudio.setAttribute('allow', 'autoplay; encrypted-media');
document.body.appendChild(ytAudio);
Comments
To comment, please sign in with your website:
How it works: Your website needs to support IndieAuth. GitHub profiles work out of the box. You can also use IndieAuth.com to authenticate via GitLab, Codeberg, email, or PGP. Setup instructions.
Signed in as:
No comments yet. Be the first to share your thoughts!