{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "brennan.day",
  "description": "Brennan Kenneth Brown is a Queer Métis writer and web developer exploring Indigenous identity, digital culture, and creativity. Personal essays on technology, craft, and human experience from Calgary, Alberta (Treaty 7).",
  "home_page_url": "https://brennan.day",
  "feed_url": "https://brennan.day/feed.json",
  "language": "en",
  "icon": "https://brennan.day/assets/images/brennan.jpg",
  "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
  "authors": [
    {
      "name": "Brennan Kenneth Brown",
      "url": "https://orcid.org/0009-0004-9951-3451",
      "avatar": "https://brennan.day/assets/images/brennan.jpg"
    }
  ],
  "items": [
    {
      "id": "https://brennan.day/man/",
      "url": "https://brennan.day/man/",
      "title": "man.",
      "summary": "man is not a certain breed of anonymous, nihilistic blogger who mistakes callousness for wisdom and detachment for depth. man is different. man is better.",
      "content_html": "<p>man <a href=\"https://unstory.eu\">starts blog</a>. man's blog different. man writes real truth on blog. man understand all tricks brain plays, all illusions. man shrug nonchalantly at stupid things like stress and emotions <a href=\"https://brennan.day/i-m-looking-for-love/\">and love</a>. man writes Brennan tried and failed to be <a href=\"https://unstory.eu/mmu/\">healer and saviour</a>. man right.</p>\n<p>man writes about swede <a href=\"https://unstory.eu/esz/\">robert birming</a>, his stupid positivity. how does robert not know all positivity is false? man helpfully informs the world of this. man doing service on his blog. man create interesting and subversive <a href=\"https://unstory.eu/ikn/\">black-and-white photography</a>. very different from what you'd find on 2013 hipster tumblr, man promise.</p>\n<p><a href=\"https://unattributed.cc/2026/09/16/re-who-is-unstory/\">man plays character</a>. man plays <a href=\"https://unstory.eu/ids/\">free clown</a> and declare number of readers, 500 in case foolish reader was wondering, but man write about this in different, enlightened way. callous cool way. man makes note to write how different this is to other foolish bloggers who keep track of numbers in uncool ego way. man does not care about uptoots on Bubbles.town but also does not request man's blog to be removed.</p>\n<p>man not misanthropic, just calls fools <a href=\"https://unstory.eu/bfh/\">subhuman</a> and <a href=\"https://unstory.eu/poh/\">fleas</a>. man knows religious people all foolishly worship <a href=\"https://unstory.eu/kns/\">cosmic daddy</a>, lacking wisdom man has to know truth: man knows science is correct. all chemicals and nothing beyond this. safely detached.</p>\n<p>man enjoy <a href=\"https://unstory.eu/kts/\">simple protocol</a> but think people who love simple protocols <a href=\"https://unstory.eu/ihp/\">wrong way</a> stupid. man understand web much better than fools. man has <a href=\"https://unstory.eu/cmz/\">short urls</a> and knows this is superior. man knows inline links are evil propaganda.</p>\n<p>man does not concern himself with stupid timewasters like corporations. man smartly spends time going over what <a href=\"https://unstory.eu/akb/\">other men think of corporations</a> instead. man care a lot about thoughts of <a href=\"https://unstory.eu/bum/\">markdown man</a> and <a href=\"https://unstory.eu/tmc/\">microblog man</a> in particular. man understand other men, you see. man never writes about women.</p>\n<p>man knows all morality is myth. man sees online warriors try to care about stupid things <a href=\"https://unstory.eu/swy/\">like fascism</a> yet participate in society. man scoffs at online warriors for attempts to make things better. man is doing something different, and worth time and effort. man know if warrior has iphone, then <a href=\"https://unstory.eu/ibi/\">why care about nazis?</a>. <a href=\"https://unstory.eu/ors/\">man also political victim 😦 </a></p>\n<p>man is mysterious in a cool way. anonymous. cannot be pinned down like foolish <a href=\"https://unstory.eu/tri/\">obedient leashed humans</a> who use labels.</p>\n<p>so, what man do when not on blog dedicating time and life to sharing thoughts? man normal guy blowing off steam? man in any silly group chat? or man's day-to-day life more like a &quot;vacancy&quot; hotel sign lit neon? man enjoy warm sunlight and autumn air? man have inside jokes with coworkers? man laugh? man have siblings? man applies scented aftershave each morning? what song man hum to himself? man ever recognized by old schoolmate? man do midnight countdown for new year? man ever avoid walking underneath ladder or opening umbrella inside? man scroll kitten .GIFs when taking shit? man ever get unexpected compliment from stranger on street? what man think about before falling asleep? man ever question? doubt? who wishes man birthday? man's mother make sure he eats well? man says to mom i love you?</p>\n<p>hm.</p>\n<p>man wonder why nobody reply to man's email. man wonders why everyone deletes man's comments. must be because foolish bloggers only pretend to want connection.</p>\n<p>man take time out of his day to write careful, personal email to fellow blogger (and Brennan's friend) <a href=\"https://candyether.space/\">Candy</a>:</p>\n<blockquote>\n<p>I saw few your own &quot;complains&quot; about your writing or shit around.<br>\nYour website is pure trash, like your expression. And it's good that way. You want probably to fit in and disappear in the herd. This your trash is at least different than most junk online.<br>\nYou probably think, that if you become &quot;better&quot; at writing or whatever, you get more visibility. Like it matters. If you have one visitor - reader or thousands, what will change? Nothing. You will not get money for that shit, no matter how many &quot;followers&quot; you get. Popularity is fake and if money are not included it's pointless and energy sucking.<br>\nNothing will change in your life if you have thousands of readers, people who will repost, like and praise your writing. It would be just artificially made situation when your body will produce dopamine and other chemicals so you feel &quot;important&quot;.<br>\nNow your horrible website is at least &quot;remarkable&quot; shitty ;/ and also very hard to read or navigate. If you improve it or delete, nothing will change.</p>\n</blockquote>\n<p>man have no idea why Candy not reply back. man gives wise advice for free. man puzzled.</p>\n<p>man starts blog. man's blog different. totally different from other blogs man talks about. man knows length is not depth, that is why man has 13,000 words on his blog now. man spends time well before total oblivion. man will have sharp, smart rebuttal to this post and win. man feels good. man continues.</p>\n",
      "image": "https://brennan.day/assets/images/blog/christflower.jpg",
      "date_published": "2026-09-26T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "culture",
        "satire",
        "blogging",
        "Digital Culture",
        "IndieWeb",
        "nihilism",
        "personal"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/a-love-letter-to-the-super-dimension-fortress/",
      "url": "https://brennan.day/a-love-letter-to-the-super-dimension-fortress/",
      "title": "A Love Letter to the Super Dimension Fortress",
      "summary": "I've finally became an ARPA member of SDF, a non-profit public-access UNIX system running continuously since 1987. I give a history from Ted Uhlemann's 300-baud Apple IIe BBS to today's NetBSD network of DEC Alphas and Opterons; a tour of the shell, gopher, and gemini services; how to join, plus two hands-on bonuses: writing a flat-file Perl CGI guestbook and making a site Dillo-compatible.",
      "content_html": "<p>The more I learn about the web, the more appreciative I become of what came before. We truly are standing on the shoulders of giants. In the past week, I've had the pleasure of (finally) becoming an ARPA member on <a href=\"https://freeshell.org\">SDF</a>, a non-profit public-access UNIX system and online community that has been in continuous operation since 1987.</p>\n<p>But what is SDF? Well, to answer that, we need to go back four decades and talk about the BBS era.</p>\n<h2>Bulletin Board Systems</h2>\n<p>It's June 16, 1987. Ted Uhlemann (&quot;iczer&quot;) plugs an Apple IIe's 300-baud<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup> modem into a phone line his mother had just given him for his birthday, running <em>Magic City Micro-BBS</em> (written in Applesoft BASIC). He names it SDF-1 after his favorite anime, hoping to attract fans of &quot;anime, industrial music and the <a href=\"https://en.wikipedia.org/wiki/Church_of_the_SubGenius\">Church of the SubGenius</a>,&quot; per a <a href=\"http://snh.freeshell.org/sdf30/\">30th-anniversary retrospective by Stephen Jones</a>. The original hardware is one 1200bps modem and two floppy drives holding 280 kilobytes each.</p>\n<p>This was the very beginning of SDF.</p>\n<p>SDF is self-described as &quot;a community platform for inspiring, facilitating and implementing new ideas&quot;. It's a multi-user NetBSD machine, funded solely by its members as a 501(c)(7) nonprofit, where tens of thousands of people hold accounts. The name comes from the anime <em>Super Dimension Fortress Macross</em> (known in the West as part of <em>Robotech</em>), and the system began as a BBS for Japanese anime fans. The BBS-era of SDF was can be witnessed in the <a href=\"https://www.youtube.com/playlist?list=PL7nj3G6Jpv2G6Gp6NvN1kUtQuW8QshBWE\">eight-part 2004 documentary on YouTube</a> titled <em>BBS: The Documentary</em>, which includes a recorded interview with Stephen Jones, SDF's longtime sysadmin.</p>\n<p><a href=\"https://subnetzero.info/2019/08/15/before-the-internet-the-bulletin-board-system/\">Bulletin board systems predate the modern Internet</a>, and arguably turned personal computers from expensive novelty kits into far more popular machines. BBSes were what changed PCs <a href=\"https://spectrum.ieee.org/bulletin-board-system-bbs-history/pioneers-of-cyberspace-welcome-screens-from-various-computer-bulletin-board-systems-show-their-operators-wild-creativity\">into essential gateways for global and local communication</a> during the 1980s and early 1990s. They were proof the computer was for connecting with other people.</p>\n<p>There were no search engines at the time, so you had to look through computer magazines or text files from other boards to find a BBS. A &quot;website address&quot; was a local 7-digit phone number. You opened a terminal program on your computer and typed a command to make your modem dial the BBS phone number. Because it used your home phone line, nobody in your house could use the phone while you were online. You would listen to the computer physically dial the number, followed by the <a href=\"https://www.youtube.com/watch?v=vvr9AMWEU-c\">iconic, harsh screeching and static hiss</a> of two modems talking to each other.</p>\n<p>At its peak of popularity, there were over 150,000 BBSes operating in North America. By 2005, there were only a few hundred.</p>\n<p>In a <a href=\"http://bsdtalk.blogspot.com/2006/03/bsdtalk021-interview-with-stephen.html\">2006 bsdtalk interview</a>, one longtime member summed up what makes the place stick around:</p>\n<blockquote>\n<p>&quot;SDF is more than a shell account, it's a community of people who communicate with one another via the various methods that SDF provides... What makes SDF special is that it is run like a computing environment in the early days of the Internet. It's not corporate at all.&quot;</p>\n</blockquote>\n<p>A university researcher's 2019 survey of public-access UNIX systems, <a href=\"https://cmccabe.sdf.org/files/pubax_unix.pdf\"><em>History, Evolution and Future of Public Access UNIX</em></a>, hosted on SDF itself, describes the modern system as &quot;a fully articulated social community,&quot; and adds that SDF supports special interest groups for ham radio (SDFARC), Python, Gopher enthusiasts, and Minecraft players alongside &quot;digital artists, computer historians, web developers, gamers, and of course many, many programmers.&quot; SDF's own <a href=\"https://sdf.org/?tour\">pictorial tour</a> documents the hardware year by year back to 1985, including a <a href=\"https://sdf.org/?tour/museum/index\">stint at a telephone museum</a> and the machines running today.</p>\n<p>Today the network includes NetBSD servers on DEC Alpha and AMD Opteron hardware, plus live retrocomputing environments: a TOPS-20 system (<a href=\"https://twenex.org/\">twenex.org</a>, running Panda Distribution TOPS-20 on two <a href=\"http://xkl.com/\">XKL</a> TOAD-2s), a Symbolics Genera machine, and an ITS system. Free accounts are available on all of them.</p>\n<p>In the past four decades, SDF has survived hardware failures, countless DDoSes, a <a href=\"https://sdfeu.org/w/faq:basics02\">termination by its own ISP</a>, and multiple relocations across the United States. It has never gone commerical, nor lost its userbase in that time. Jones, still running SDF decades in, wrote in his 30th-anniversary letter:</p>\n<blockquote>\n<p>&quot;Some people today may come here and see us as outdated and 'retro.' But if you get involved, you'll see it is quite alive with new ideas.&quot;</p>\n</blockquote>\n<h2>Services Offered by SDF</h2>\n<p>SDF has come a long way since its BBS days, though it's still one of the last places offering free dial-up access. When you become a member on SDF, you get a lot of services—rather similar to getting a <a href=\"https://tildeverse.org\">Tildeverse</a> or <a href=\"https://omg.lol\">omg.lol</a> account, and predating both.</p>\n<p>You begin in the shell. Running the command <code>ssh you@tty.sdf.org</code> puts you in NetBSD with typical stuff like <code>bash</code>, <code>ksh</code>, <code>tcsh</code>, <code>rc</code>, and <code>zsh</code>; editors from <code>ed</code> to <code>emacs</code>. And <code>ping</code>, <code>traceroute</code>, <code>dig</code>, <code>whois</code>, and <code>finger</code>, etc.</p>\n<p>You get your own web page, running <code>mkhomepg</code> on the shell will create a <code>~/html</code> folder, and asks which URL you want. You add your files in <code>~/html</code> and the site is live immediately at <code>you.sdf.org</code>. ARPA members can pick a vanity domain from ~60 choices (<code>pdp10.org</code>, <code>twenex.org</code>, <code>chaosnet.org</code>, <code>freak.net</code>, <code>multics.org</code>...). See <a href=\"https://wiki.sdf.org/doku.php?id=domains_available_to_arpa_members\">wiki.sdf.org</a> for the list. CGI works out of the box. Shell/awk/sed for everyone, and full <code>php</code>/<code>perl</code>/<code>python</code>/<code>ruby</code> for ARPA members.</p>\n<p>The Gopher and Gemini protocols are typically more used by SDF users. Run <code>mkgopher</code> in the shell and choose setup. It'll create <code>~/gopher</code> (a symlink into <code>/ftp/pub/users/you</code>) served as both <code>gopher://sdf.org/1/users/you</code> and <code>gemini://sdf.org/users/you</code>. One directory, two protocols! Write a <code>gophermap</code> or add <code>.gmi</code> files. See <a href=\"https://wiki.sdf.org/doku.php?id=gopher_site_setup_and_hosting_features\">gopher setup</a> and <a href=\"https://wiki.sdf.org/doku.php?id=gemini_site_setup_and_hosting_features\">gemini setup</a>.</p>\n<p>And that's just the tip of the iceberg:</p>\n<table>\n<thead>\n<tr>\n<th>Service</th>\n<th>Where</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>IRC</td>\n<td><code>irc.sdf.org</code>:6667</td>\n</tr>\n<tr>\n<td>Jabber/XMPP</td>\n<td><code>jabber.sdf.org</code></td>\n</tr>\n<tr>\n<td>Matrix</td>\n<td><code>matrix.sdf.org</code></td>\n</tr>\n<tr>\n<td>Gitea</td>\n<td><a href=\"https://git.sdf.org/\">git.sdf.org</a></td>\n</tr>\n<tr>\n<td>Mastodon</td>\n<td><a href=\"https://mastodon.sdf.org/\">mastodon.sdf.org</a></td>\n</tr>\n<tr>\n<td>PixelFed</td>\n<td><a href=\"https://pixelfed.sdf.org/\">pixelfed.sdf.org</a></td>\n</tr>\n<tr>\n<td>PeerTube</td>\n<td><a href=\"https://toobnix.org/\">toobnix.org</a></td>\n</tr>\n<tr>\n<td>TT-RSS</td>\n<td><a href=\"https://ttrss.sdf.org/\">ttrss.sdf.org</a></td>\n</tr>\n<tr>\n<td>Lemmy</td>\n<td><a href=\"https://lemmy.sdf.org/\">lemmy.sdf.org</a></td>\n</tr>\n<tr>\n<td>Gallery</td>\n<td><a href=\"https://sdf.org/g\">sdf.org/g</a></td>\n</tr>\n<tr>\n<td>Deskshots</td>\n<td><a href=\"https://deskshots.org/\">deskshots.org</a></td>\n</tr>\n<tr>\n<td>Jitsi</td>\n<td><a href=\"https://jitsi.sdf.org/\">jitsi.sdf.org</a></td>\n</tr>\n<tr>\n<td>aNONradio</td>\n<td><a href=\"http://anonradio.net/\">anonradio.net</a></td>\n</tr>\n<tr>\n<td>Minecraft</td>\n<td><code>mc.sdf.org</code></td>\n</tr>\n<tr>\n<td>BZFlag</td>\n<td><code>sdf.org:5154</code></td>\n</tr>\n<tr>\n<td>SDFMud</td>\n<td><a href=\"http://sdf.org/mud\">sdf.org/mud</a></td>\n</tr>\n<tr>\n<td>TOPS-20</td>\n<td><a href=\"https://twenex.org/\">twenex.org</a></td>\n</tr>\n</tbody>\n</table>\n<h2>How to Join</h2>\n<p>Originally, the only way to join SDF and get verified was to <a href=\"https://sdf.org/?faq?MEMBERS?01\">physically mail one dollar to their PO box in Seattle</a> with your username. This was a clever way of preventing spam and abuse.</p>\n<p>Nowadays, thankfully, you can just <a href=\"https://www.paypal.com/webapps/shoppingcart?flowlogging_id=f740888d56cea&amp;mfid=1790256131994_f740888d56cea#/checkout/openButton\">donate via Paypal</a>, making the entire process a lot easier.</p>\n<p>I think one of the coolest things about SDF is the lifetime <em>ARPA membership</em>. For a one-time fee of $36USD, you get:</p>\n<ul>\n<li>Outbound tools: <code>telnet</code>, <code>ssh</code>, <code>sftp</code>, <code>ftp</code>, <code>snarf</code>, <code>wget</code>, <code>ytalk</code>, external IRC. Free accounts are inbound-only; ARPA opens the network both ways</li>\n<li>File transfer: <code>scp</code>/<code>sftp</code> and non-interactive SSH: <code>ssh-copy-id</code> is enabled</li>\n<li>Development: <code>gcc</code>, <code>perl</code>, <code>php</code>, <code>python</code>, <code>ruby</code>, <code>elisp</code> on the box</li>\n<li>Full CGI: <code>php</code>/<code>perl</code>/<code>python</code>/<code>ruby</code> on your site</li>\n<li>VoIP: internet calling, voicemail, conferencing (PSTN calling is a $15/quarter add-on with a real DID option)</li>\n<li>UUCP + ClariNET: mail and newsfeeds via TCP or dialup</li>\n<li>Voting rights: on system features and policy</li>\n<li>Quotas: ~150 MB / 5000 files each for home, mail, webspace, gopherspace</li>\n</ul>\n<p>Not only do you get all of the above for life, but you're supporting a networked community that's been around longer than I've been alive!</p>\n<h2>Bonus: Making a Perl CGI Guestbook on SDF</h2>\n<p>Back in the day, to add functionality to your website, you wrote scripts that interacted with a web server via the Common Gateway Interface (CGI) protocol. In the late 1990s and early 2000s, it was the primary technology used to transition the World Wide Web from static HTML pages to dynamic, interactive websites.</p>\n<p>Sadly, they're not used much in modern-day web development, and are considered obsolete and discouraged. You see, traditional CGI spawns a brand new operating system process for every single visitor click. So on busy websites, they consumed massive amounts of server memory, and slowed performance down to a crawl.</p>\n<p>But when you're making a little personal website, things like &quot;scaling&quot; and &quot;efficient resource usage&quot; can be thrown out the window! Who cares? Since I have access to Perl CGI as an ARPA member, I decided to make a simple guestbook on my little SDF webpage. Here's how I put it together.</p>\n<h3>1. Understanding SDF directories</h3>\n<p>In SDF, the root of your webpage is the <code>~/html</code> directory, but that isn't your home directory. Rather, its a symlink into <code>/www/&lt;a&gt;/&lt;b&gt;/&lt;username&gt;</code> (the parent directories come from your username, so mine is <code>/www/af/b/bren</code>). Your real home directory is somewhere like <code>/sdf/arpa/af/b/bren</code>. Now, you don't want your data file living inside the publicly-served <code>~/html</code> folder, where a visitor could request it directly. Instead, keep it one level up, outside the web root:</p>\n<pre><code>/sdf/arpa/af/b/bren/guestbook.dat   &lt;- data file, NOT web-accessible\n/www/af/b/bren/guestbook.cgi        &lt;- the script itself, lives in ~/html\n</code></pre>\n<p>Also, <code>$ENV{HOME}</code> isn't set when your CGI script runs under <code>suexec</code>, so you can't rely on relative paths like <code>~</code> inside the script. I just hardcoded the absolute path to the data file.</p>\n<h3>2. Writing the script</h3>\n<p>For this, I use core Perl and <code>Fcntl</code> for file locking (if two visitors ever signed at the same time), but that's pretty much it. The script reads <code>$ENV{REQUEST_METHOD}</code>, parses the POSTed form body by hand (no <code>CGI.pm</code>, it's deprecated), validates the name/message length, and appends a line to the file:</p>\n<pre><code class=\"language-perl\">#!/usr/pkg/bin/perl\nuse strict;\nuse warnings;\nuse Fcntl qw(:flock);\n\nmy $DATA_FILE = &quot;/sdf/arpa/af/b/bren/guestbook.dat&quot;;\n\nsub add_entry {\n    my ($name, $message, $url) = @_;\n    my $ts = scalar localtime;\n    my $enc_message = $message;\n    $enc_message =~ s/\\\\/\\\\\\\\/g;\n    $enc_message =~ s/\\n/\\\\n/g;\n\n    open(my $fh, '&gt;&gt;', $DATA_FILE) or return;\n    flock($fh, LOCK_EX);\n    print $fh join(&quot;\\x01&quot;, $ts, $name, $enc_message, $url) . &quot;\\n&quot;;\n    flock($fh, LOCK_UN);\n    close($fh);\n}\n</code></pre>\n<p>Every entry is a single line, <code>timestamp \\x01 name \\x01 message \\x01 url</code>, using the otherwise-unused <code>\\x01</code> control character as a field separator, as this ensures names or messages containing regular punctuation don't break parsing. Newlines inside a message escape with a literal <code>\\n</code> on write and unescaped again on read, turning multi-line messages into single lines as well.</p>\n<p>There's also a honeypot field, <code>website</code>, that's hidden from visitors with CSS. If it's filled in, the submission is ignored, but the robot will still see a &quot;Thanks for signing!&quot;</p>\n<h3>3. Locking down the data file</h3>\n<p>Since the data file has to live somewhere Apache can access (in my case, I didn't want to think too hard about symlinks), add a <code>.htaccess</code> in <code>~/html</code>:</p>\n<pre><code class=\"language-apacheconf\">&lt;Files &quot;guestbook.dat&quot;&gt;\n    Order allow,deny\n    Deny from all\n&lt;/Files&gt;\n</code></pre>\n<h3>4. Uploading and make it executable</h3>\n<p>SDF requires CGI scripts to (1) end in <code>.cgi</code> and (2) be executable. There's no <code>cgi-bin</code> directory requirement, so it can be put anywhere in <code>~/html</code>:</p>\n<pre><code class=\"language-bash\">scp guestbook.cgi bren.sdf.org:html/\nssh bren.sdf.org\nchmod 755 html/guestbook.cgi\nmkhomepg -p\n</code></pre>\n<p><code>mkhomepg -p</code> will correctly reset your homepage permissions to SDF's expected secure defaults.</p>\n<h3>5. Visit it</h3>\n<p>That's it! <code>guestbook.cgi</code> renders the same page for both <code>GET</code> (showing the form and the last 50 entries) and <code>POST</code> (validating and saving a new one). There's no database, framework, or build. It's a little janky by 2026 standards, and I love it. Sign it if you want: <a href=\"http://bren.sdf.org/guestbook.cgi\">bren.sdf.org/guestbook.cgi</a> (note the http, not https).</p>\n<h2>Bonus: Making a Dillo-compatible Website</h2>\n<p>Finally, I was rather inspired by Sunny's blog post <em><a href=\"https://sny.sh/hypha/blog/pieces\">on positive, human-made software</a></em>, which listed the Internet browser <a href=\"https://dillo-browser.org/\">Dillo</a>.</p>\n<p>Way back in the day, when my only computer was a painfully slow Intel Core 2 Duo, I remember trying to find lightweight browsers that would make websurfing a less painful experience. Dillo is certainly one of them! The &quot;code base is currently 0.2% the size of Chromium's&quot; and has ridiculously low memory usage.</p>\n<p>Unsurprisingly, that comes with a price. There's a lot of the web that doesn't render or function properly with Dillo because of its limitations. But to me, that's a feature. One of the best ways we can ensure our web pages honour <a href=\"https://smolweb.org/\">smol web</a> principles while also having source code that's easy for beginners to read is by making our sites Dillo-compatible.</p>\n<p>What does this actually mean, though?</p>\n<p>Well, Dillo supports a subset of HTML 4.01 with some HTML5 elements layered in, and a subset of CSS 2.1 with some CSS3 layered in. No JavaScript, at all.</p>\n<p><code>&lt;script&gt;</code> and all inline event handlers (<code>onclick</code>, etc.) are discarded. <code>frameset</code>/<code>frame</code>/<code>iframe</code> have no rendering support. No <code>&lt;canvas&gt;</code> or <code>video</code>, <code>audio</code>, <code>source</code>, <code>embed</code>, <code>object</code> playback support, either.</p>\n<p>Regarding CSS and styles, there's no support for CSS variables (<code>var()</code>). There's also no <code>flexbox</code> and no CSS <code>grid</code>. Grid rules are just ignored. You'll have to do your layouts with (<em>gulp</em>) <code>table</code> and <code>float</code>, instead.</p>\n<p>There's also no custom webfonts with <code>@font-face</code>, as fonts resolve to the five CSS generic families: <code>serif</code>, <code>sans-serif</code>, <code>monospace</code>, <code>cursive</code>, and <code>fantasy</code>, all of which are set in the user's <code>dillorc</code> config (<code>font_serif</code>, <code>font_sans</code>, etc.). Dillo doesn't have the ability to load specific webfont files.</p>\n<p>Take this with a grain of salt, as I couldn't actually find a canonical compatibility table. The Dillo devs communicate through the manual, changelog, and bug tracker.</p>\n<h2>Conclusion</h2>\n<p>It's funny, the more I learn about web development, the more simple and back-in-time I go. I think this makes sense—good code is unbloated code. The closer you can get to no interface, the better the interface. It's a wonderfully paradoxical aspect of programming and working with computers. These are always going to be machines with finite limits—no different than us—and we need to not only be mindful of that, but lean into it.</p>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Terminal baud rate is the speed at which a hardware terminal or serial console communicates, measured in the number of signal changes (symbols) transmitted per second. At 300 baud, a terminal displays 30 characters per second. This is roughly the speed of a fast typist. Instead of text appearing instantly, you can physically watch the letters appear on the screen one by one, line by line. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
      "image": "https://brennan.day/assets/images/blog/sdf.jpg",
      "date_published": "2026-09-25T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "technical",
        "tutorial",
        "Small Web",
        "IndieWeb",
        "Digital Culture",
        "web history",
        "retrocomputing",
        "unix",
        "SDF",
        "perl",
        "CGI"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/static-site-generators-for-beginners/",
      "url": "https://brennan.day/static-site-generators-for-beginners/",
      "title": "Static Site Generators for Beginners",
      "summary": "Written for a 32-bit Café thread asking where to even begin with static-site generators. I go over the free resources I'd learn first (and why hand-rolled HTML beats an SSG for your very first site), a plain-language glossary of the jargon docs never define, a brief history from HSC and Movable Type to Jekyll, why git gets recommended everywhere, my own beginner starters, and tiny alternatives like barf, bashblog, and kiki.",
      "content_html": "<p>I've been writing <a href=\"https://brennan.day/collections/technical-tutorials/\">technical tutorials</a> on my website since I started it last November, but <a href=\"https://discourse.32bit.cafe/t/ssg-resources-for-total-newbies/5218?u=brennan\">this thread</a> asking about static site generators for beginners on 32-bit Café made me realize I've never made a proper tutorial regarding SSGs from the ground-up basics. This post initially began as a reply to that thread, but I realized I had enough to say to fill an entire blog post. I hope this is helpful to anybody who has been interested in static-site generators but has found trying them out to be difficult, obtuse, and with a lot of friction.</p>\n<p>I'm someone that grew up using SSGs, going from editing the HTML on my Tumblr straight to setting up a blog with <a href=\"https://jekyllrb.com/\">Jekyll</a> when I was a teenager around 15 years ago now. While I would say I'm knowledgeable, being able to communicate and articulate that knowledge (particularly to beginners) is another skill entirely, and one I want to cultivate more. Hopefully I do a good job with that here!</p>\n<h2>Prerequisites</h2>\n<p>Let me start off by saying that, if you're brand new to web development, I do <strong>not</strong> recommend beginning with a static-site generator. If you're making your first website (or ten), I really recommend writing out the HTML and CSS yourself—this removes a lot of the abstraction that occurs with SSGs.</p>\n<p>Nearly all SSGs assume you know the fundamentals of HTML, CSS, and sometimes JavaScript. They also assume some familiarity with programming concepts, the terminal, and usually version control such as Git. You certainly do not need to master all of these before making a site with an SSG, but knowing what is going on underneath the hood will make the inevitable errors much less mysterious.</p>\n<h3>Free resources</h3>\n<p>I would work through the resources below in the order I've listed, creating your own sites along the way:</p>\n<ul>\n<li><strong>HTML:</strong> <a href=\"https://htmlforpeople.com/\">HTML for People</a> is a friendly introduction written for people with no previous coding or web experience. <a href=\"https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Structuring_content\">MDN's HTML learning module</a> is a more technical reference for when you want to get to aspects like semantic elements and accessibility.</li>\n<li><strong>CSS:</strong> <a href=\"https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics\">MDN's CSS styling and layout modules</a> explain things like the box model and CSS layouts. If you prefer interactive exercises and projects, <a href=\"https://www.freecodecamp.org/learn/responsive-web-design-v9/\">freeCodeCamp's Responsive Web Design course</a> covers HTML, CSS, accessibility, and responsive design. (Responsive meaning mobile-friendly in most cases)</li>\n<li><strong>JavaScript and web fundamentals:</strong> <a href=\"https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Scripting\">MDN's JavaScript module</a> is a good addition to its HTML and CSS lessons. And <a href=\"https://www.freecodecamp.org/learn/javascript-v9/\">freeCodeCamp's JavaScript curriculum</a> is another free, interactive option.</li>\n<li><strong>Programming fundamentals:</strong> <a href=\"https://cs50.harvard.edu/x/\">CS50x</a> is Harvard's free introduction to computer science. Computational thinking, algorithms, data structures, functions, variables, conditionals, and loops. You don't need to know all of this, but the first few weeks of the course would give you a good foundation.</li>\n<li><strong>The terminal:</strong> <a href=\"https://missing.csail.mit.edu/\">MIT's Missing Semester</a> teaches the shell, command-line environments, editors, and debugging. Check out the <a href=\"https://missing.csail.mit.edu/2026/course-shell/\">introduction to the shell</a>.</li>\n<li><strong>Git and version control:</strong> <a href=\"https://git-scm.com/book/en/v2\">Pro Git</a> is a free online book that starts with the command line and basic commits before moving on to branches, remotes, and hosting. Reading this on a Kobo during my commute to college was how I learned git myself.</li>\n<li><strong>Markdown and YAML:</strong> The <a href=\"https://www.markdownguide.org/basic-syntax/\">Markdown Guide</a> is good for seeing how symbols are used for writing in Markdown. For YAML, the <a href=\"https://yaml.org/spec/1.2.2/\">official YAML 1.2 docs</a> are more detailed than you need, but the introductory explanation is useful.</li>\n<li><strong>Checking your work:</strong> To see if your HTML has any errors, the <a href=\"https://validator.w3.org/nu/\">W3C Nu HTML Checker</a> is a good resource to detect any invalid markup.</li>\n</ul>\n<p><a href=\"https://developer.mozilla.org/en-US/docs/Learn_web_development\">MDN has a &quot;Learn Web Development&quot;</a> resource as a single place to learn HTML, CSS, JavaScript, and browser fundamentals. There are others, like <a href=\"https://www.theodinproject.com/\">the Odin Project</a>, <a href=\"https://web.dev/learn\">web.dev</a>, <a href=\"https://www.w3schools.com/whatis/\">w3schools</a>, and more.</p>\n<p>Understand that you don't need to know everything. You're doing this as a hobby, it's fine to make mistakes or do things in unorthodox ways that guides don't recommend. The important thing is not to finish every course before starting—build tiny sites as you go along with what you learn. Each step will give you more competency and functionality to add to your projects.</p>\n<h2>Definitions</h2>\n<p>Next, before I jump into the history of static sites, I want to define some often-used terms you'll see when reading static-site documentation and guides, since a lot of this jargon is typically not defined well. Most developers will simply think you already know all of this stuff by default.</p>\n<h3>The Web and the Generator</h3>\n<p><strong>HTML (HyperText Markup Language)</strong> is the base document of a webpage, it's a language of structure and semantics. Headings, paragraphs, links, images, lists, and stuff like that. HTML is not a programming language, so it doesn't make decisions or repeat actions by itself.</p>\n<pre><code class=\"language-html\">&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n  &lt;head&gt;\n    &lt;meta charset=&quot;utf-8&quot;&gt;\n    &lt;title&gt;My First Page&lt;/title&gt;\n  &lt;/head&gt;\n  &lt;body&gt;\n    &lt;h1&gt;Hello, world!&lt;/h1&gt;\n    &lt;p&gt;This page has a &lt;a href=&quot;https://brennan.day&quot;&gt;link&lt;/a&gt; and a list:&lt;/p&gt;\n    &lt;ul&gt;\n      &lt;li&gt;HTML gives a page its structure.&lt;/li&gt;\n      &lt;li&gt;There's no CSS yet, so this is all default styling.&lt;/li&gt;\n    &lt;/ul&gt;\n  &lt;/body&gt;\n&lt;/html&gt;\n</code></pre>\n<p>Save that as <code>index.html</code>, open it in a browser, and you get a real page—<a href=\"https://brennan.day/examples/html/\">see it live here</a>.</p>\n<p><strong>CSS (Cascading Style Sheets)</strong> changes how HTML is rendered. This is how you add specific and unique colours, spacing, fonts, responsive behaviour, etc.</p>\n<pre><code class=\"language-css\">body {\n  font-family: Georgia, serif;\n  max-width: 35rem;\n  margin: 2rem auto;\n  padding: 0 1rem;\n  background: #fff2ce;\n  color: #02005d;\n}\n\nh1 {\n  color: rebeccapurple;\n}\n</code></pre>\n<p>Add that inside a <code>&lt;style&gt;</code> tag in the <code>&lt;head&gt;</code> and the exact same page <a href=\"https://brennan.day/examples/css/\">now looks like this</a>.</p>\n<p><strong>JavaScript</strong> is the most commonly-used programming language in web browsers. It is frankly rather janky, but it's what we have to work with. It can add behaviour and interactivity to your site, but it is rarely ever necessary and can slow down and bloat a webpage. <a href=\"https://brennan.day/respecting-the-no-js-choice-making-your-site-work-for-everyone/\">I personally recommend using it sparingly.</a></p>\n<pre><code class=\"language-js\">const button = document.querySelector(&quot;#surprise&quot;);\n\nbutton.addEventListener(&quot;click&quot;, () =&gt; {\n  document.querySelector(&quot;h1&quot;).textContent = &quot;JavaScript did this!&quot;;\n});\n</code></pre>\n<p>With a <code>&lt;button id=&quot;surprise&quot;&gt;</code> added to the page, that script <a href=\"https://brennan.day/examples/js/\">does this</a>.</p>\n<p>An SSG can also use JavaScript, for example, to run its build process or its template code. In 11ty, you can even write an entire template as JavaScript:</p>\n<pre><code class=\"language-js\">// hello.11ty.js\nmodule.exports = function () {\n  return &quot;&lt;h1&gt;Hello from JavaScript!&lt;/h1&gt;&quot;;\n};\n</code></pre>\n<ul>\n<li><strong>Static</strong> means that a server returns a file as-is, without generating a new page for every request (typically a user visiting the page). A static page can still contain JavaScript and can still be changed later, as “static” only describes how the page is delivered, not whether it is immutable or boring.</li>\n<li><strong>Dynamic</strong> means that something generates or changes the response at request time. A traditional content-management system might query a database and assemble a page whenever someone visits it. A store website would need to keep a database of inventory that changes based on when people add an item to their cart and purchase, for example.</li>\n<li><strong>Static-site generator (SSG)</strong> is a program that takes source files (like Markdown content, templates, configuration, and assets) and builds a rendered site of HTML, CSS, JavaScript, and image files from them that can be hosted as a static site.\n<ul>\n<li><strong>Build</strong> is running the generator's command that turns those source files into output files.</li>\n<li><strong>Source files</strong> are the files you edit, such as Markdown posts, templates, stylesheets, and configuration.</li>\n<li><strong>Output files</strong> or <strong>built files</strong> are the finished files produced by the build, often placed in a folder such as <code>_site/</code>, <code>public/</code>, or <code>dist/</code>.</li>\n<li><strong>Local server</strong> is a web server running on your own computer. A development server lets you view the built site at a local address (like <code>localhost:8000</code>) and can rebuild it when you save a change to a source file.</li>\n</ul>\n</li>\n</ul>\n<h3>Configuration and Data</h3>\n<ul>\n<li>The <strong>Configuration file</strong> is a file containing site-wide settings—it can include things like a site's name, base URL, menus, output directory, RSS options, etc. Different SSGs use different filenames and formats, including <code>config.yml</code>, <code>hugo.toml</code>, and <code>eleventy.config.js</code>.</li>\n<li><strong>YAML</strong> (usually pronounced “yamel”) is a human-readable data language often used for configuration and front matter. It represents values such as strings, numbers, lists, and key-value mappings. Indentation in YAML is significant, so a stray space can cause a build error.</li>\n<li><strong>Key-value pair</strong> really just means here's two parts to each config option, such as <code>title: My post</code>. In YAML, a collection of these pairs is called a mapping.</li>\n<li><strong>Parameter</strong> or <strong>option</strong> is a setting passed to a command or configured in a file. For example, <code>--serve</code> is an option in a command shown later in this guide.</li>\n</ul>\n<p>Here's an 11ty site settings file (<code>src/_data/site.json</code>), where you edit the user-facing details of your site:</p>\n<pre><code class=\"language-json\">{\n  &quot;name&quot;: &quot;My Cool Blog&quot;,\n  &quot;description&quot;: &quot;Where I write about whatever interests me.&quot;,\n  &quot;author&quot;: &quot;Your Name&quot;,\n  &quot;url&quot;: &quot;https://example.com&quot;,\n  &quot;language&quot;: &quot;en&quot;\n}\n</code></pre>\n<p>Every key-value pair becomes a variable your templates can use: putting {% raw %}<code>{{ site.name }}</code>{% endraw %} in a layout prints &quot;My Cool Blog&quot;, so changing the name here updates it everywhere at once. This is one of the neat features of SSGs, and it means you only have to change the name in one place. Other SSGs put the same idea in <code>config.yml</code> (Jekyll) or <code>hugo.toml</code> (Hugo) instead.</p>\n<h3>Templates and Content</h3>\n<ul>\n<li>A <strong>Template</strong> is a reusable file containing the structure of a page, with various placeholders.\n<ul>\n<li><strong>Layout</strong> is a template for a larger page shape, containing all of the following: the document language declaration, <code>&lt;head&gt;</code>, header, main content area, and footer.</li>\n<li><strong>Partial</strong> is a smaller reusable fragment, such as a navigation bar, header, footer, or post metadata block. “Include” is the instruction that inserts one file or fragment into another.</li>\n<li><strong>Templating language</strong> is the syntax used to insert variables, loop over data, and make decisions inside templates. Liquid, Nunjucks, and Go templates are examples.</li>\n<li><strong>Conditional</strong> is a yes-or-no instruction in a template, such as “show this element only if the post has an image.”</li>\n</ul>\n</li>\n</ul>\n<p>Here's a simple layout (<code>_includes/layouts/base.njk</code>, written in the Nunjucks templating language) that uses a few partials:</p>\n<pre><code class=\"language-html\">{% raw %}\n&lt;!DOCTYPE html&gt;\n&lt;html lang=&quot;en&quot;&gt;\n  &lt;head&gt;\n    &lt;meta charset=&quot;utf-8&quot;&gt;\n    &lt;title&gt;{{ title }} | {{ site.name }}&lt;/title&gt;\n  &lt;/head&gt;\n  &lt;body&gt;\n    {% include &quot;partials/header.njk&quot; %}\n\n    &lt;main&gt;\n      {{ content | safe }}\n    &lt;/main&gt;\n\n    {% include &quot;partials/footer.njk&quot; %}\n  &lt;/body&gt;\n&lt;/html&gt;{% endraw %}\n</code></pre>\n<p>And the partials are fragments of HTML:</p>\n<pre><code class=\"language-html\">{% raw %}\n&lt;!-- partials/header.njk --&gt;\n&lt;header&gt;\n  &lt;a href=&quot;/&quot;&gt;{{ site.name }}&lt;/a&gt;\n  {% include &quot;partials/nav.njk&quot; %}\n&lt;/header&gt;\n\n&lt;!-- partials/nav.njk --&gt;\n&lt;nav&gt;\n  &lt;a href=&quot;/&quot;&gt;Home&lt;/a&gt;\n  &lt;a href=&quot;/archive/&quot;&gt;Archive&lt;/a&gt;\n  &lt;a href=&quot;/about/&quot;&gt;About&lt;/a&gt;\n&lt;/nav&gt;\n\n&lt;!-- partials/footer.njk --&gt;\n&lt;footer&gt;\n  &lt;p&gt;&amp;copy; 2026 {{ site.author }}&lt;/p&gt;\n&lt;/footer&gt;\n{% endraw %}\n</code></pre>\n<p>When a post's front matter says <code>layout: base.njk</code>, 11ty wraps it in this template: {% raw %}<code>{{ content | safe }}</code>{% endraw %} is where the rendered post body goes, and each <code>{% raw %}{% include %}{% endraw %}</code> puts a partial in place. Edit the header once and every page on the site updates. This is the copy-paste problem SSGs solve.</p>\n<ul>\n<li>A <strong>Content file</strong> is a source file, like a page or a post, typically written in Markdown. In SSGs this is often Markdown, but it may also be HTML, plain text, or another supported format.\n<ul>\n<li><strong>Markdown</strong> is a rather well-known markup language that uses punctuation symbols to represent headings, links, lists, emphasis, and other document structure. A generator converts this into HTML.</li>\n<li><strong>Front matter</strong> is a small metadata block at the beginning of a content file, commonly enclosed by two lines of <code>---</code>. It can contain a title, date, tags, layout name, or draft status.</li>\n<li><strong>Blog-aware</strong> means that a generator is specifically built for posts. It can usually sort them by date, and can generate specific pages like an archive, tags page, and RSS feed automatically.</li>\n</ul>\n</li>\n<li><strong>Metadata</strong> is information like a post's title, author, publication date, tags, description, canonical URL, or chosen layout.</li>\n</ul>\n<p>Here's a single 11ty blog post (<code>posts/my-first-post.md</code>) that uses all of the above: front matter metadata written as YAML key-value pairs, Markdown content, and a little templating language.</p>\n<pre><code class=\"language-markdown\">{% raw %}\n---\ntitle: My First Post\ndate: 2026-09-22\ntags:\n  - posts\n  - cats\nlayout: post.njk\ndraft: false\n---\n\nWelcome to my blog! This paragraph is **Markdown**.\n\nThis post is called &quot;{{ title }}&quot;.\n\n{% if draft %}\n  This sentence only appears while the post is a draft.\n{% endif %}\n{% endraw %}\n</code></pre>\n<p>The front matter between the two <code>---</code> lines is metadata 11ty reads before rendering. <code>layout</code> tells it which template to wrap the page in, <code>tags</code> makes it part of the <code>posts</code> collection, and <code>date</code> is how the blog-aware sorting knows where it belongs. Everything below the second <code>---</code> is the content file's body.</p>\n<h3>Validation and Publishing</h3>\n<ul>\n<li><strong>Hosting</strong> is the service or computer that stores the output files and makes them available on the internet. Hosting is separate from writing the site, and also separate from version control.</li>\n<li>A <strong>Backend</strong> is the server-side code and infrastructure that runs behind a website. It handles authentication, forms, business logic, or database queries. A purely static site does not need a backend to serve its pages.</li>\n<li>A <strong>Database</strong> is similar to a spreadsheet that software can query and update. A traditional dynamic blog stores posts, comments, and settings in a database. Anytime you see <code>SQL</code>, that's a database.</li>\n<li><strong>FTP (File Transfer Protocol)</strong> is the protocol used to copy files between computers, commonly from your computer to a web host. It is one way to publish a site.</li>\n<li><strong>rsync</strong> is a command-line program that synchronizes files between locations. It can copy just the files that were modified, which makes it useful for uploading a built site to a server.</li>\n<li><strong>Link validation</strong> is a nice quality-of-life feature that checks if any links go to missing pages. Some SSGs do this during the build, and others require a plugin or an external checker.</li>\n</ul>\n<h3>Version Control</h3>\n<ul>\n<li><strong>Version control</strong> is a system for recording changes to files over time so you can inspect history, compare versions, restore an earlier state, and collaborate with other people.</li>\n<li><strong>Git</strong> is one specific version-control program. It runs locally on your computer and can record the history of a project without requiring a hosting service.\n<ul>\n<li>A <strong>Repository</strong> (or <strong>repo</strong>) is a folder/project directory with a history managed by Git.</li>\n<li>A <strong>Commit</strong> is a saved snapshot of changes in a repository, typically with a message describing the change.</li>\n<li><strong>Remote</strong> is another copy of a repository. Typically, there's a remote hosted version of the repo on Codeberg, GitHub, GitLab, or a server you control.</li>\n<li><strong>Push</strong> is a command that copies commits from your local repository to a remote. And <strong>Pull</strong> retrieves commits from a remote and incorporates them into your local repository.</li>\n</ul>\n</li>\n<li><strong>Git hosting</strong> is a service that stores Git repositories and may provide extras such as issue tracking, code review, or automatic builds. This includes GitHub, GitLab, Codeberg, etc.\n<ul>\n<li>Git hosting is convenient, but it's good to remember that it is not the same thing as Git, and is not required to use Git.</li>\n</ul>\n</li>\n</ul>\n<p>Here's what publishing a new post with git looks like in the terminal:</p>\n<pre><code class=\"language-sh\">git init                             # turn this folder into a repository (once)\ngit add posts/new-post.md            # stage the file for your next commit\ngit commit -m &quot;Add new post&quot;         # save a snapshot with a message\ngit push                             # copy your commits to the remote\n</code></pre>\n<h2>A (Very) Brief History of Static Site Generators</h2>\n<p>Now that we have all those definitions out of the way, let's actually talk about the context of static-site generators.</p>\n<p>SSGs didn't start with Jekyll. The idea of separating your writing from the code goes back to the mid-1990s. A really early example is <a href=\"https://github.com/mbethke/hsc\">HSC</a> (&quot;HTML Sucks Completely&quot;), an HTML preprocessor Thomas Aglassinger released in 1996. The term &quot;static site generator&quot; wouldn't exist for another decade or so, but HSC already had includes, conditionals, and link validation.</p>\n<p>For most of the late 90s and 2000s, the mainstream answer to &quot;how do I blog&quot; wasn't static. It was hosted, dynamic services like Blogger, LiveJournal, and Open Diary. Or full-stack tools with databases and a backend, like WordPress. The one exception was <a href=\"https://www.movabletype.org/\">Movable Type</a>, a Perl-based platform Ben and Mena Trott built in 2001 that did something clever: every time you published through its web GUI, it rebuilt your blog into plain static HTML files behind the scenes. You weren't using the terminal, but the output was static. Movable Type was one of the first tools to bring the benefits of a static site for people who never typed a <code>build</code> command.</p>\n<p><a href=\"https://github.com/nanoc/nanoc\">Nanoc</a> was built by Denis Defreyne in 2007 after finding all Ruby-based CMSes ran painfully slow on the 96MB VPS he was using. Nanoc introduced layouts, page metadata, Markdown support, and plugins. It was a year later, in December 2008, that GitHub co-founder Tom Preston-Werner released Jekyll, out of frustration with complex blogging engines like WordPress. Jekyll built on Nanoc's ideas and added two things: front matter (the YAML block of metadata at the top of every content file) and being &quot;blog-aware&quot; out of the box, meaning you could put Markdown files in a folder and it would turn them into a blog with no extra setup. GitHub launched <a href=\"https://pages.github.com/\">GitHub Pages</a> alongside Jekyll as free static hosting, and that combination is a large reason why Jekyll popularized SSGs for many, including myself.</p>\n<p>Everything since has really been reinvention and iteration on the same idea in different languages. Some prospered and some failed. <a href=\"https://octopress.org/\">Octopress</a> (RIP) and <a href=\"https://middlemanapp.com/\">Middleman</a> iterated on SSGs in Ruby. <a href=\"https://getpelican.com/\">Pelican</a> and <a href=\"https://hydephp.com/\">Hyde</a> are Python-based and Laravel-based SSGs, respectively.</p>\n<p>In July 2013, Steve Francia released <a href=\"https://gohugo.io/\">Hugo</a>, written in Go and compiled to a single binary. This was far simpler relative to Jekyll: there was no entire Ruby environment you had to install, or gem versioning you needed to wrestle with, and Hugo is fast enough to render thousands of pages in seconds.</p>\n<p><a href=\"https://11ty.dev\">Eleventy (11ty)</a> was created by <a href=\"https://zachleat.com\">Zach Leatherman</a> in late 2017 as an agnostic alternative to Jekyll, using JavaScript and NPM instead. Whereas Jekyll required you to use the Liquid language, 11ty lets you use:</p>\n<ul>\n<li>HTML <code>*.html</code>, Markdown <code>*.md</code>, WebC <code>*.webc</code>, JavaScript <code>*.11ty.js</code>, Liquid <code>*.liquid</code>, Nunjucks <code>*.njk</code>, Handlebars <code>*.hbs</code>, Mustache <code>*.mustache</code>, EJS <code>*.ejs</code>, Haml <code>*.haml</code>, Pug <code>*.pug</code>, TypeScript <code>*.ts</code>, JSX <code>*.jsx</code>, MDX <code>*.mdx</code>, Sass <code>*.scss</code>, and even Custom <code>*.*</code></li>\n</ul>\n<p><a href=\"https://jamstack.org/generators/\">Jamstack.org</a> has a full list of different SSGs, if you happen to have experience in a specific programming language and want to leverage that.</p>\n<p>Something important I want to note is that some of these generators haven't been updated in years. And guess what? That's actually usually fine! The &quot;static&quot; part of SSGs means there's no backend or database to hack. Another benefit is that security isn't something you need to worry about. Did your favourite SSG add genAI slop in the newest update? Just never update. Your SSG will continue working and building your site the way it is now indefinitely. Hurray!</p>\n<h2>Why is git always recommended?</h2>\n<p>Aside from programmers just finding git to be the status quo default, I think a lot of the assumptions regarding git are due to the fact that Jekyll, the first popular SSG, <a href=\"https://github.com/jekyll/jekyll\">began as a GitHub-specific project</a>. Using GitHub (or Codeberg, or GitLab, etc.) answers the question &quot;where do the files live?&quot; which is in the repository. Neocities/Nekoweb answer this by you uploading your files onto the site.</p>\n<p>When you use something like Codeberg Pages or <a href=\"https://docs.gitlab.com/user/project/pages/\">GitLab Pages</a>, a lot is happening underneath the hood, and every time you upload or edit a file, it <em>is</em> being committed and pushed with git, you just aren't running the commands yourself manually via the terminal or GUI interface.</p>\n<p>If you're self-hosting, then the answer is just your own computer, somewhere like the <code>/var/www/html</code> folder if you're on Linux. If you have a <a href=\"https://tildeverse.org/\">Tildeverse</a> account (which is yet another rabbit hole), then your files would live on the publicly-shared computer. Here's my <a href=\"https://tilde.town/~brennan/\">Tilde.town site</a> for example, where I use the command <code>rsync</code> to upload my local files from my computer to the tilde.town computer and they're hosted automatically.</p>\n<p>There are two different things git is actually doing here, and they're easy to conflate.</p>\n<ul>\n<li>Version history (so you can undo a bad edit or see what changed and when)</li>\n<li>Hosting (somewhere for the built files to actually live).</li>\n</ul>\n<p>You don't need git for either one. <code>rsync</code>, an FTP client, or dragging files into a browser upload window all work fine for hosting. And you can take care of backups for your own small personal site instead of worrying about version history. Git just happens to solve both problems at once and for free, which is why it often becomes the path of least resistance.</p>\n<h2>Theory vs. Practice</h2>\n<p>On paper:</p>\n<ul>\n<li>You take Markdown files in a <code>posts/</code> folder</li>\n<li>They're rendered with a template in a <code>layout/</code> folder\n<ul>\n<li>Which has modules of HTML in <code>partials/</code> like <code>header.html</code> and <code>footer.html</code></li>\n<li>And there's probably a <code>config.yml</code> file in the root or something similar where you can edit the parameters of the site, like the name, colours, etc.</li>\n</ul>\n</li>\n<li>That <code>config.yml</code> handles site-wide settings, but most SSGs also give each individual post its own small metadata block, usually called front matter, sitting at the top of the file between two lines of <code>---</code>.\n<ul>\n<li>That's where a single post's title, publish date, and tags live, separate from the global config, so the generator knows how to sort and label a page without you having to name it <code>&quot;2024-03-14-my-post-title.md&quot;</code>.</li>\n</ul>\n</li>\n</ul>\n<p>In practice, it is far more complicated. The process of taking all of the above and outputting it to a rendered static site (say, into a <code>/_site</code> folder) requires a programming language to process it.</p>\n<p>Most popular SSGs <em>try</em> to make this simple: you run a command like <code>hugo build</code> or <code>npx @11ty/eleventy --serve</code> in the terminal, and that will do the above.</p>\n<p>(That <code>--serve</code> flag will start a local server on your computer, and regenerate the site anytime you edit the source files, rather than just building once and quitting. That's what makes editing a static site feel nearly as immediate as editing a live page.)</p>\n<p>Platforms like <a href=\"https://netlify.app/\">Netlify</a> (or the self-hosted <a href=\"https://coolify.io/\">Coolify</a>) essentially have a restricted remote computer that will detect which SSG you're using and run the appropriate command automatically, and your <code>/_site</code> is then hosted at <code>yoursitename.netlify.app</code> similar to how you'd manually upload your own HTML files to Neocities and have your site hosted at <code>yoursitename.neocities.org</code></p>\n<p>There are other platforms that do the same (that I would not personally recommend): <a href=\"https://vercel.com/\">Vercel</a>, <a href=\"https://developers.cloudflare.com/pages/\">Cloudflare Pages</a>, <a href=\"https://pages.github.com/\">GitHub Pages</a>, and <a href=\"https://surge.sh/\">surge.sh</a>.</p>\n<p>But all of the above has <em>a lot</em> of assumptions built-in: you've done everything perfectly, <em>and</em> the programming language used to build the site installed correctly, <em>and</em> you know how to use the terminal. <a href=\"https://xkcd.com/2501/\">This XKCD comic</a> on average familiarity comes to mind.</p>\n<p>If you have a typo anywhere important that breaks something (which could be as innocuous as an extra comma somewhere) the entire thing is fragile enough to break either during the initialization or build process, and the error message is designed for the programming language, <em>not</em> the SSG. Which means you'll get a very technical output. Here's an example of a <a href=\"https://paste.lol/brennan/netlify-error.md\">failed Netlify build</a> my site had recently simply because I had a trailing comma in the file that stores JSON.</p>\n<p>If you don't have the stubbornness that masochistic programmers (like me) have, it's very understandable that you see the above error and go &quot;fuck that&quot; and just handroll your HTML, or use a CMS, or just don't make a site at all. That last one is the most heartbreaking to me.</p>\n<h2>My Starters/Themes</h2>\n<p>The way I learned was by taking pre-made starters/themes others have made (as others in this thread have recommended) and tinkering with them. Then, I started to get proficient enough to make my own. If you want to get to know an SSG, I hope I can recommend these, as they have good-enough documentation/guides and are designed to be instructive for beginners:</p>\n<ul>\n<li><strong><a href=\"https://github.com/brennanbrown/indiepaper\">IndiePaper</a></strong> is a Hugo starter I made with all the IndieWeb stuff built-in (microformats2, h-card, etc.), where you put your posts in the <a href=\"https://github.com/brennanbrown/indiepaper/tree/main/exampleSite/content/post\"><code>/post</code></a> folder and edit the <a href=\"https://github.com/brennanbrown/indiepaper/blob/main/hugo.toml\"><code>hugo.toml</code></a> file to customize.</li>\n<li><strong><a href=\"https://github.com/brennanbrown/11ty-Indie-Web-Blog-Starter\">11ty-Indie-Web-Blog-Starter</a></strong> is an 11ty starter I made from the ground-up based on my own site, where you put your posts in the <a href=\"https://github.com/brennanbrown/11ty-Indie-Web-Blog-Starter/tree/main/src/posts\"><code>/posts</code></a> folder and edit the <a href=\"https://github.com/brennanbrown/11ty-Indie-Web-Blog-Starter/blob/main/src/_data/site.js\"><code>site.js</code></a> file to customize.</li>\n<li><strong><a href=\"https://github.com/brennanbrown/watery\">Watery</a></strong> is a Jekyll starter I made ages ago, where you put your posts in <a href=\"https://github.com/brennanbrown/watery/tree/main/_posts\"><code>/_posts</code></a> and edit the <a href=\"https://github.com/brennanbrown/watery/blob/main/_config.yml\"><code>_config.yml</code></a> file to customize.</li>\n</ul>\n<p>All of these themes are minimal and plain (and kinda ugly) because the actual CSS styling and design aspects are left to the user.</p>\n<h2>Other (Simpler) Alternatives</h2>\n<p>All the SSGs I used above are very popular ones, but there are many more relatively simple options out there. Like <a href=\"https://git.sr.ht/~bt/barf\">barf</a> and <a href=\"https://github.com/cfenollosa/bashblog\">bashblog</a> and <a href=\"https://tomotama.com/kiki\">kiki</a>.</p>\n<ul>\n<li><a href=\"https://git.sr.ht/~bt/barf\"><strong>barf</strong></a> (blogs are really fun) is a shell script by btxx that's only 170 lines. It's forked from <a href=\"https://github.com/karlb/karl.berlin\">Karl Bartel's blog.sh</a>. There's no front matter and no templating, you just write Markdown files, run <code>make build</code>, and it produces a <code>build/</code> folder you rsync to your server. It generates valid RSS automatically, runs natively on Linux, macOS, and OpenBSD, and the stylesheet is four lines of CSS. You can read the <a href=\"https://git.btxx.org/barf/about\">README</a> or view a <a href=\"https://barf.btxx.org/\">live demo</a>.</li>\n<li><a href=\"https://github.com/cfenollosa/bashblog\"><strong>bashblog</strong></a> is a single ~1,000-line <code>bb.sh</code> script with zero dependencies, using base Unix utilities such as <code>date</code>, <code>grep</code>, <code>sed</code>, and <code>head</code>. Carlos Fenollosa built the first version in 2011, <a href=\"https://cfenollosa.com/blog/creating-a-simple-blog-system-with-a-500-line-bash-script.html\">writing about it on his own blog</a>, and it's still maintained today. You download <code>bb.sh</code>, put it in a public folder on your server, and run <code>./bb.sh post</code> to start writing. It handles drafts, tags, Markdown, and RSS out of the box, no installation step at all. If you want more features, there's a community fork called <a href=\"https://github.com/DavidSatimeWallin/bashblog-ng\">bashblog-ng</a>.</li>\n<li><a href=\"https://tomotama.com/kiki\"><strong>kiki</strong></a> is by vga256 and self-describes as &quot;a tiny homepage construction kit with a small footprint&quot;. It uses PHP rather than shell, and it can run as either a live dynamic site or generate a static one, and also double as a public wiki or (in preliminary form) a Gopher hole. It's shareware and free with a footer credit, or pay $15 CAD and get additional features. It's 1,500 lines of hand-written code, zero JavaScript and zero external dependencies. It's a great option if you have a host that only allows PHP and doesn't give shell access.</li>\n</ul>\n<p>And here are a few others:</p>\n<ul>\n<li><a href=\"https://rgz.ee/bin/ssg5\"><strong>ssg</strong></a> is Roman Zolotarev's POSIX-compliant shell script. It's the inspiration for several of the others on this list; there's a Python rewrite called <a href=\"https://pypi.org/project/pyssg/\">pyssg</a>.</li>\n<li><a href=\"https://github.com/jroimartin/sw\"><strong>sw</strong></a> is a minimal web framework written in C, and the fork <a href=\"https://github.com/wlangstroth/simple-static\"><strong>simple-static</strong></a> strips it down further into what its README calls &quot;the simplest static site generator I can think of.&quot;</li>\n<li><a href=\"https://github.com/sunainapai/makesite\"><strong>makesite.py</strong></a> is a Python equivalent of barf and bashblog. It's under 130 lines and built by Sunaina Pai around the idea that &quot;the code is the documentation.&quot; The idea being that there's nothing to configure that you can't just read and edit directly.</li>\n</ul>\n<p>None of these alternatives have anywhere near the features that Hugo or 11ty have, but as a result, they also don't have the complexity.</p>\n<p>Finally, you may also be interested in making <a href=\"https://brennan.day/creating-a-blog-in-gemini/\">a blog in Gemini://</a> which is an entirely different rabbit hole I've been getting into recently, and eliminates the need to generate anything at all.</p>\n<h2>Conclusion</h2>\n<p>I use SSGs because if I were to handroll the HTML for my site, then I'd have to copy-paste the header and footer for every page, and SSGs take care of that kind of thing. I go into more detail about this in my <a href=\"https://brennan.day/softcore-first-hardcore-eventually-a-ladder-for-the-indieweb/\">IndieWeb ladder article</a>.</p>\n<p>To me, I don't care how you webweave or what method you use to get your work online, as long as you're participating and trying, I think you're succeeding! Give my <a href=\"https://brennan.day/webmaster-a-manifesto-for-everyone/\">WEBMASTER@ manifesto</a> a read if you haven't already. Static-site generators are just one of many ways to get into webweaving, and I certainly hope you join us—however that looks.</p>\n",
      "image": "https://brennan.day/assets/images/blog/ssg.jpg",
      "date_published": "2026-09-23T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "technical",
        "tutorial",
        "Static Site Generators",
        "web development",
        "web history",
        "IndieWeb",
        "Small Web",
        "Digital Culture",
        "eleventy",
        "git"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/llms-democratize-extraction-and-scale-malice/",
      "url": "https://brennan.day/llms-democratize-extraction-and-scale-malice/",
      "title": "LLMs Democratize Extraction and Scale Malice",
      "summary": "Responding to Coyote's essay on data ownership, I look at how genAI has democratized the kind of extraction that once required corporate infrastructure—iLands spam agents, scrapers, and agent swarms—why my apathy-and-ignorance approach to AI crawlers is no longer enough, the two competing realities of AI 2027, and the tools and organizing we actually have: ai.robots.txt, Glaze and Nightshade, tech-worker unions, and the CARE and OCAP principles of Indigenous data governance.",
      "content_html": "<p>In a post a few months ago, <a href=\"https://tante.cc/2026/04/01/dissolving-the-social/\">Tante wrote that</a> &quot;'AI' exists to disenfranchise labor,&quot; and earlier today, Coyote posted a <a href=\"https://osteophage.neocities.org/essays/responses/disowning-your-data\">short essay</a> on what data ownership truly means for the IndieWeb when we're subject to genAI scrapers, extractors, and bad-faith actors.</p>\n<p>On a similar note, maybe your inbox has recently been flooded by <a href=\"https://tedium.co/2026/09/11/ilands-agents-email-spam-kaixin-tang/\">iLands genAI agents</a>, as <a href=\"https://www.gordonmclean.co.uk/2026/09/19/i-received-an-ai-email/\">Gordon</a> and <a href=\"https://cleberg.net/blog/ai-email.html\">cleberg</a> have recently written about. Or maybe you're an administrator for <a href=\"https://arstechnica.com/ai/2026/09/ai-agents-flood-the-internet-with-slop-infused-spam/\">a Mastodon instance</a> that's been flooded with users who turn out to be AI agents.</p>\n<p>And this is happening at the same time that Anthropic researchers warn <a href=\"https://www.theguardian.com/technology/2026/sep/09/anthropic-researchers-ai-human-extinction\">AI could cause human extinction by 2030</a>. This is happening at the same time that Nvidia CEO, Jensen Huang, announces that <a href=\"https://www.businessinsider.com/nvidia-jensen-huang-agi-openai-astra-ai-2026-9\">Artificial General Intelligence has arrived</a>. Which, I'm sure, has nothing to do with him running <a href=\"https://isaiprofitable.com/\">the only company</a> that's been profitable due to genAI.</p>\n<p>Hm.</p>\n<p>This post began as a response to Coyote's short essay, about how we need &quot;personal control&quot; and an &quot;assertion of boundaries&quot; for our data. That we need to practice &quot;resistance over infinite intrusion&quot; and &quot;autonomy and solidarity&quot; in response.</p>\n<p>I agree, but I'm not sure I have an answer as to how, and the problem seems far more existential than just that. I frankly admit that my earlier philosophy and tactic of <a href=\"https://brennan.day/apathetic-intentionally-why-i-dont-block-ai-scrapers-on-my-website/\">apathy and ignorance</a> are no longer sufficient.</p>\n<p>Years ago, when the IndieWeb movement was founded, people had the idea that having their own website would prevent the extractive, surveillance-style dark patterns that corporate social media use. You would no longer have to worry about the black box of scripts, cookies, pixel trackers, and HTML fingerprints building a profile of you that would be bought and sold across various marketers (and governments).</p>\n<p>And for a while, I think that was true. Sure, <a href=\"https://www.theverge.com/2018/4/11/17225482/facebook-shadow-profiles-zuckerberg-congress-data-privacy\">shadow profiles</a> exist, where your data is collected by other means and used even if you don't have an account, but you were still creating on a sovereign Internet.</p>\n<p>But now, you don't need to be a multi-billion dollar corporation. You can deploy a genAI agent to scrape and extract data from any website, and use that data to try to make money yourself. What used to require software engineers and marketers and addiction psychologists is now ubiquitous and accessible to anyone (who's willing to pay the upfront cost of tokens).</p>\n<p>This has been a large part as to why I've become interested in <a href=\"https://brennan.day/creating-a-blog-in-gemini/\">the Gemini Project</a>, as I believed this could be a way to continue cultivating a more-human Internet. Unfortunately, I learned only yesterday about <a href=\"https://portal.mozz.us/gemini/sava.rocks/blog/when-the-small-web-gets-an-ai-door/\">Gopher-MCP</a>, designed to allow genAI agents to interface with Gopher and Gemini protocols.</p>\n<p>I've seen creative ways people have tried to make their websites resistant to genAI beyond adding a <code>robots.txt</code> file. Be it having a tricky-to-navigate false homepage, eliminating easy extraction methods like disabling RSS, or creating honeypots at certain URLs (which <a href=\"https://brennan.day/metadata/v1/*\">I've done myself</a>).</p>\n<p>Alas, all of these are band-aid solutions to a systemic problem. I'm all for <a href=\"https://guides.douglascollege.ca/c.php?g=729501&amp;p=5234362\">open culture</a>, and my blog posts are in the Creative Commons, but are genAI and other content mills honouring the required <a href=\"https://pitt.libguides.com/openlicensing/cc-sharealike\">ShareAlike</a> clause of my work? No, of course not.</p>\n<p>This extraction is nothing new. What's novel here is the scale and, again, accessibility. Nearly everyone on an IndieWeb forum I browse has been spammed by iLands agents because someone decided to scrape the public boards of the forum; so long as people have the money, and so long as the hardware exists, we will only get more proliferation of this annoying grey goo-esque slop of incompetent spam and data extraction.</p>\n<h2>AI 2027</h2>\n<p>At the start of April last year, a website was published up called <a href=\"https://ai-2027.com/\">AI 2027</a> speculating on the cascading, catastrophic consequences we will globally face due to the accelerating developments in generative AI. It's certainly an interesting read, especially now that we're nearly at the end of 2026, to see what was guessed at correctly and incorrectly so far.</p>\n<p>When we take a step back and examine what's been going on, and what narratives we're being told about generative artificial intelligence, both in its current form and the upcoming delta of change, there are two realities:</p>\n<ol>\n<li>The first is that we are still working with the same frustrating, irritating slop; these LLMs seem stuck and stagnant, and that it's only becoming more capable at spreading and more ubiquitous, but still often fails the simplest tasks (those iLands spam emails, for example, don't actually provide a way for people to actually pay them money). That the only tangible difference between loading up ChatGPT and deploying an expensive agent is that the agent has far more vectors to be annoying. If you've had the displeasure of reading any messages written by agents, you understand what I mean.</li>\n<li>The second is that we are on the cusp of collective artificial intelligence becoming autonomous, while also becoming so exponentially more intelligent than humanity that it could be apocalyptic.</li>\n</ol>\n<p>I think anybody who's been able to not fall into the throes of genAI (<a href=\"https://www.cambridge.org/core/journals/bjpsych-open/article/artificial-intelligence-ai-psychosis-mechanisms-clinical-risks-and-safety-considerations-in-generative-ai-chatbots/04B53C8C3E11C7B4B0DC7E665B6A317A\">psychosis</a> or otherwise) can see that these models are still just large language models. The fundamental mechanics of how they're built and operate greatly limit their capabilities. There is (thankfully) a dark, impossible ceiling that cannot be breached with this current iteration of artificial intelligence.\nBut that has not deterred many people with a lot of money and power. The data centres <a href=\"https://grist.org/health/former-epa-officials-trump-is-letting-data-centers-make-people-sick/\">making people sick</a> are still being constructed, and every product and service still continues to inappropriately shove genAI into the faces of consumers and end-users.</p>\n<p>And we have made innovations, regardless of these limitations, just different ones. GenAI is no longer limited to chat windows and API calls; it's now given <a href=\"https://appleinsider.com/articles/26/07/27/claude-cowork-can-escape-its-sandbox-rummage-through-all-of-your-files\">root access</a> with <a href=\"https://eu.36kr.com/en/p/3965936673054211\">destructive consequences</a>. &quot;Swarms&quot; of agents are <a href=\"https://www.cbc.ca/news/canada/openai-university-toronto-rogue-agents-link-shortener-ai-9.7349607\">using the Internet in unpredictable ways</a>, costing <a href=\"https://the-decoder.com/ai-agent-swarms-are-a-massive-waste-of-tokens-with-zero-quality-gain-says-openai-codex-developer/\">huge amounts of tokens</a>, which is a euphemism for money and energy lost.</p>\n<p>And this is why I initially thought patience would win out, given how obviously foolish and expensive this endeavour continues to be. And yet it continues and escalates and only has gotten worse with time.</p>\n<h2>What Do We Do?</h2>\n<p>Tools already exist to make extraction more expensive—the community-maintained <a href=\"https://github.com/ai-robots-txt/ai.robots.txt\">ai.robots.txt</a> list is a good start. If your work is visual, <a href=\"https://glaze.cs.uchicago.edu/index.html\">Glaze and Nightshade</a>, out of the University of Chicago, let you cloak or poison images. Spawning's <a href=\"https://haveibeentrained.com\">Have I Been Trained</a> registry can help you opt out of extraction (though it's currently under maintenance).</p>\n<p>Individual bloggers and artists can only do so much, though. I look to the workers who are being pushed to build and deploy the tools hollowing out humanity: The Tech Workers Coalition's <a href=\"https://techworkerscoalition.org/blog/2025/12/12/workersdecide-tech-resources-to-fight-ai-sloppification-at-work/\">workersdecide.tech</a> project is a set of resources for organizing against AI mandates at work. The Alphabet Workers Union-CWA has an <a href=\"https://www.alphabetworkersunion.org/our-campaigns\">AI committee</a> fighting for protections. Groups like the <a href=\"https://futureoflife.org/press-release/fli-launches-multimillion-dollar-nationwide-ai-regulation-campaign/\">Future of Life Institute</a> and the <a href=\"https://en.wikipedia.org/wiki/Distributed_Artificial_Intelligence_Research_Institute\">Distributed AI Research Institute</a> are building a public case for regulation and centering the people AI harms most.</p>\n<p>If you're someone who's found themselves dependent on genAI, know that you're not alone and it isn't your fault. The sycophantic nature of these LLMs is designed to pull you in. There are <a href=\"https://www.airecoverycollective.com/home\">recovery collectives</a> and the best thing you can do for yourself is come clean and admit there's a problem.</p>\n<p>Finally, the <a href=\"https://www.gida-global.org/care\">CARE Principles for Indigenous Data Governance</a> (Collective Benefit, Authority to Control, Responsibility, Ethics) and, specifically for First Nations, the <a href=\"https://fnigc.ca/wp-content/uploads/2022/10/OCAP_Brochure_20220927_web.pdf\">OCAP principles</a> (Ownership, Control, Access, Possession) exist because generations of data have been taken from our communities without consent, and used against us.</p>\n<p>I love people, and I know people are inherently good. But that does not mean good people will act when they need to. As important as reclaiming joy and preserving our hope are to activism, we need more than that. We need direct action, we need righteous fury to be channelled. We need people willing to sacrifice and risk themselves for the next generation. There seems to be this epidemic of the bystander effect. People need to remember that <a href=\"https://brennan.day/deeds-not-words-the-myth-of-polite-revolution/\">polite revolution is a non-existent oxymoron</a>.</p>\n<p>I think of the Audre Lorde quote, how <a href=\"https://theanarchistlibrary.org/library/audre-lorde-the-master-s-tools-will-never-dismantle-the-master-s-house\">&quot;the master's tools will never dismantle the master's house.&quot;</a> We must stop using these products, and urge others to as well. And those who work for companies that have dystopian genAI quotas must speak up.</p>\n",
      "image": "https://brennan.day/assets/images/blog/ai2027.jpg",
      "date_published": "2026-09-21T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "AI",
        "generative AI",
        "IndieWeb",
        "Digital Culture",
        "data sovereignty",
        "activism",
        "privacy"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/creating-a-blog-in-gemini/",
      "url": "https://brennan.day/creating-a-blog-in-gemini/",
      "title": "Creating a Blog in Gemini://",
      "summary": "Creating your own corner of Geminispace: why you'd want to blog on a protocol with no JavaScript, no CSS, and no AI slop; where to host a capsule (SmolPub, the Tildeverse, flounder, Gemcities); how the community's gemlog conventions work; and the surprising social life of Gemini BBS, Station, and Astrobotany. Plus ASCII art, CGI scripting, and every gemini:// link I've found worth keeping.",
      "content_html": "<p>Welcome to my third post on Gemini and the alternative Internets and smallnets! This is going to be my most helpful and detailed article on the topic yet—and it's something I'm excited to get into.</p>\n<p>If you'd like a history and explanation of what Gemini is, read my first post, <a href=\"https://brennan.day/gemini-gophers-and-fingers-oh-my-alternative-internets-beyond-https/\">&quot;Gemini, Gophers, and Fingers. Oh My! Alternative Internets Beyond HTTPS&quot;</a>. My second article, <a href=\"https://brennan.day/oldnets-and-altnets-a-guide-to-building-a-low-spec-daily-internet-out-of-gemini-gopher-and-terminal-tools/\">&quot;Oldnets and Altnets: A Guide to Building a Low-Spec Daily Internet Out of Gemini, Gopher, and Terminal Tools&quot;</a> was aimed more at resources that would allow people to use older hardware to connect to the Internet in general.</p>\n<p>This, however, is going to be only about Gemini (and a little of Gopher and Spartan, too). Because I realized that I only really explored the surface-level of what this protocol has to offer. While there are interesting things to read (which I'll be linking to), this guide is aimed more at creation, socialization, and interactivity that's possible on Gemini.</p>\n<p>But if you want a tl;dr, Gemini is a modern, minimal Internet protocol alternative to <code>https://</code>, and requires a different Internet browser to use it. It was built in 2019 by a pseudonymous developer who goes by Solderpunk, and instead of HTML, every page is written in <a href=\"https://geminiprotocol.net/docs/gemtext-specification.gmi\">Gemtext</a>, which is a stripped-down format with only headings, links, and lists. Every connection runs over TLS on port 1965, and it's one request, one response, then the connection closes.</p>\n<h2>Blogging on Gemini: Why?</h2>\n<p>First, I want to answer why someone would want to blog on Gemini compared to the widely-used, popular clearnet (which is <code>https://</code>).</p>\n<p>To start, you may have read headlines about how <a href=\"https://www.popularmechanics.com/science/a73753782/ai-agent-taking-over-internet/\">AI swarms could take over the Internet soon</a>, which sounds rather terrifying. While I think the wording is alarmist, I think we can all agree that there has been an annoying increase of generative AI and agents on the Internet lately. With Gemini, you avoid all of that. There's no real viable revenue (and it's also obscure in general) meaning there's just humans in that part of cyberspace.</p>\n<p>Next, you don't need to worry about the technical complexity of JavaScript or CSS. Hell, you don't even need to worry about HTML. All your content will be in the <a href=\"https://gmi.sbgodin.fr/htmgem/docs/tutogemtext-en.gmi\">Gemtext format</a>, which can be understood as being an even simpler version of Markdown. (I also created <a href=\"https://gemtext.brennan.day\">an easy-to-use converter</a> as well.) This means that you don't have to spend time and effort worrying about design or troubleshooting anything. This means you have a space where you're compelled to focus on the craft of writing, and to be more mindful of blogging. There's nothing else to distract you.</p>\n<p>Of course, for some people that's the <em>fun</em> of creating things on the web. But if you want to have your work online before learning all of that, Gemini is a great place to start. As I've said before, being a webweaver means you wear a lot of different hats, and it can be overwhelming to try to learn how to be a better writer, web developer, and UX designer all at the same time, and starting with Gemini helps in that sense. You can always convert your files into Markdown and create a webpage proper with them at a later point in time.</p>\n<p>Now, there's nothing you can't do on the clearnet that you can do in Gemini, but I like to make the comparison of the popular, small eink reader <a href=\"https://www.xteink.com/\">Xteink</a> which is designed to go on the back of your phone. Can you easily read the same content on your bigger phone screen? Yes, but the eink reader is limited by design. It's a different, and arguably better experience.</p>\n<p>Or maybe you want more privacy while still being public. Your audience in the Geminispace is much smaller, and it's also much more intentional because of that.</p>\n<p>Finally, as I've mentioned in my previous posts, Gemini is far less resource-intensive compared to the regular Internet. You can use Gemini entirely from a terminal-based browser, meaning that any hardware you have that can't handle the modern web still has a way to get online again.</p>\n<h2>Blogging Platforms for Gemini</h2>\n<p>There are a wonderfully surprising amount of places you can join and get started with your own Gemini capsule.</p>\n<p>If you want a blog that's both on the clearnet and Gemini (and Gopher), then I recommend <a href=\"https://smol.pub\">SmolPub</a>, which has a very simple interface and only costs $5 for a lifetime of the service.</p>\n<p>The <a href=\"https://tildeverse.org/\">Tildeverse</a> is another great way to get started (and has so many other features!), though that does require getting a little familiar with the terminal and <code>ssh</code>. Servers like <a href=\"https://tilde.pink\">Tilde.pink</a> are Gemini-only and will give you a capsule automatically, whereas <a href=\"https://tilde.town\">Tilde.town</a> will require you to <a href=\"https://tilde.town/wiki/editing-your-homepage/gemini.html\">use a command</a> to set up a capsule, like <code>town request-gemini</code>. Similarly, <a href=\"https://freeshell.org/\">SDF/Freeshell.org</a> will give you a Gopher site.</p>\n<p>There are Gemini-specific platforms too, such as <a href=\"https://flounder.online\">flounder.online</a> and the <a href=\"https://midnight.pub\">Midnight Pub</a>, though these require manual approval to get into.</p>\n<p><a href=\"https://gemcities.com\">Gemcities</a> is another platform I stumbled upon. Although it looks a <em>little</em> vibecoded, it's also free and gives you instant access and a rather easy-to-use web interface to create and manage your capsule.</p>\n<p>Of course, you can also <a href=\"https://kevinboone.me/gemini_vps.html\">host your own Gemini server</a>, and there are <a href=\"https://html-chunder.neocities.org/posts/self-hosting-a-gemini-capsule/\">plenty of resources</a> on that, but that's outside the scope of this article.</p>\n<h2>What To Put In Your Capsule?</h2>\n<p>The answer is the same as <a href=\"https://brennan.day/webmaster-a-manifesto-for-everyone/\">any webpage you make: anything you want!</a> But here are some ideas to get you started:</p>\n<p>Less is more here, more than almost anywhere else on the Internet. All you need is a folder and some plain text files. A flat folder structure like this is already enough to get going:</p>\n<pre><code class=\"language-bash\">index.gmi    # root (the file served by default at a base URL, \n             #       the Gemini equivalent of index.html)\nabout.gmi    # who you are\nnow.gmi      # what you're currently up to\nhobbies.gmi  # what you're interested in\nlinks.gmi    # interesting non-https links you've found\nquotes.gmi   # quotes you want to keep and share\ngemroll.gmi  # other people's capsules you want to share\ngemlog/\n      index.gmi  # the root file of the gemlog (see below)\n      2026-09-15-thoughts.gmi   # a blog post\n      2026-09-01-update.gmi     # another blog post\n      etc...\n</code></pre>\n<h2>The Gemlog</h2>\n<p>Now, a blog in a Gemini capsule is usually called a gemlog, and although there's no official gemlog spec, the community has settled on some norms:</p>\n<ul>\n<li>File naming: dated posts, often <code>YYYY-MM-DD-slug.gmi</code> and/or organized under a <code>/posts/</code> or <code>/gemlog/</code> directory.</li>\n<li>Index page (index.gmi): a reverse-chronological list of posts as =&gt; links, each usually prefixed with the date:</li>\n</ul>\n<pre><code class=\"language-markdown\"># My Gemlog\n\n=&gt; /gemlog/2026-09-15-thoughts.gmi 2026-09-15: Some thoughts\n=&gt; /gemlog/2026-09-01-update.gmi 2026-09-01: An update\n</code></pre>\n<ul>\n<li>Atom feed: many gemlogs also publish an <code>atom.xml</code>, so people can subscribe with an RSS feed reader, since Gemini has no native subscription mechanism.</li>\n<li>First line as title: the convention (not spec) is that a post's first line is a <code>#</code> heading used as its title when aggregated elsewhere.</li>\n</ul>\n<h2>Other Goodies</h2>\n<p>Most browsers built for Gemini, such as Bombadillo, Lagrange, and Kristall—all can also interface with protocols like Gopher, Spartan, etc., and work with the older <code>finger://</code> protocol too. You can add a finger link into your capsule like any other:</p>\n<pre><code class=\"language-markdown\">=&gt; finger://brennan@omg.lol Finger me for my current status\n=&gt; finger://example.com/kenny .plan file\n</code></pre>\n<p>You can also have <code>.plan</code> and <code>.project</code> files, which can also live on a <code>now.gmi</code> page.</p>\n<ul>\n<li><code>.plan</code> → current status, what you're working on right this week (the original microblog)</li>\n<li><code>.project</code> → a one-line &quot;what is this account/person about&quot;</li>\n</ul>\n<p><a href=\"https://portal.mozz.us/gemini/mozz.us/files/rfc_gemini_favicon.gmi?\">Michael Lazar has a spec</a> for Gemini capsules to have a plain-text file named <code>favicon.txt</code> containing a single Unicode emoji. A supporting client resolves a favicon for any given page by checking that directory for <code>favicon.txt</code>, and if absent, looks in the parent directory (the same logic as looking for <code>robots.txt</code>). Having a /favicon.txt in your capsule's root (e.g. 🍇) enables it for your whole site, and you can override it with different ones in subdirectories. Support is optional, though, and client-dependent.</p>\n<p>It's also good practice to add a <code>.well-known/security.txt</code> to your capsule just as on any other website, with something like:</p>\n<pre><code class=\"language-yaml\">Contact: mailto:security@example.com\nContact: https://example.com\nExpires: 2027-12-31T23:59:00.000Z\nEncryption: https://example.com\nPolicy: https://example.com\nPreferred-Languages: en, es\nCanonical: https://example.com/.well-known/security.txt\n</code></pre>\n<p>Gemini also supports <code>robots.txt</code> files, but Gemini requests carry no user-agent string, so instead of naming specific bots, the convention defines virtual user-agents by purpose:</p>\n<pre><code class=\"language-bash\">User-agent: archiver\nDisallow: /private/\n\nUser-agent: indexer\nDisallow: /drafts/\n\nUser-agent: researcher\nDisallow:\n\nUser-agent: webproxy\nDisallow: /\n\nUser-agent: *\nDisallow: /cgi-bin/\n</code></pre>\n<h3>ASCII Art</h3>\n<p>Because you're mostly limited to text, Gemini is a great excuse to dive into ASCII art. There are great <a href=\"https://patorjk.com/software/taag/\">text-to-ASCII generators</a>, archives of <a href=\"https://www.asciiart.eu/\">ASCII art made by others</a>, and tools to help you <a href=\"https://www.asciiart.eu/ascii-draw-studio/app\">draw your own ASCII art</a>. Hell, even <a href=\"https://www.wikihow.com/Create-ASCII-Art\">WikiHow</a> has a pretty good tutorial.</p>\n<h2>Social Media and Interactivity on Gemini</h2>\n<p>Now, I loved learning about this: despite how minimal Gemini is, there are still sites where you can sign up and interact with other users.</p>\n<p>The two most popular examples of this are <strong>Gemini BBS</strong> and <strong>Station</strong>. There is also a wonderful plant game called <strong>Astrobotany</strong> which also operates similarly.</p>\n<p>None of the interactivity breaks Gemini's design, rather, it's built from four small primitives in clever combinations. Instead of reading files off disk, a Gemini server can be configured to run scripts, which get a request URL (including query strings) and then gemtext is written to stdout:</p>\n<ul>\n<li>Client requests a URL.</li>\n<li>Server replies with status 10 (or 11 for sensitive input like a password) plus a prompt string instead of content.</li>\n<li>The client shows a single text field with that prompt.</li>\n<li>Whatever the user types gets URL-encoded and appended as a query string, and the client re-requests the same URL with that string attached.</li>\n</ul>\n<p>Gemini has no cookies, so persistent state across visits is handled with TLS client certificates. A server can respond with status 60 (&quot;certificate required&quot;) for a path, and the client either generates one (with the user's permission) or presents one it already has. The server then keys any stored state to that certificate's fingerprint. This is how a capsule &quot;remembers you&quot; between sessions without passwords or cookies.</p>\n<p>For more information on this, I recommend looking at solderpunk's repository <a href=\"https://git.sr.ht/~solderpunk/gemcert\">gemcert</a>.</p>\n<h2>Getting Started</h2>\n<p>Now, it might be confusing to get started with Gemini. First things first, you'll need an actual Gemini browser, since your regular one can't speak the protocol. <a href=\"https://github.com/skyjake/lagrange\">Lagrange</a> is the one I use and recommend; one of the things I love about it is the sidebar, which has a &quot;structure&quot; option that lets you view the site you're on like a folder directory. But <a href=\"https://github.com/makew0rld/amfora\">Amfora</a> is a great terminal-based option.</p>\n<p>Past that, some of the hosting options above require using the terminal and SSH, so if you've never generated a key pair before, <a href=\"https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent\">GitHub's guide to generating an SSH key</a> is a good walkthrough even if you're not using it for GitHub itself. And for actually writing gemtext, the <a href=\"https://geminiprotocol.net/docs/gemtext-specification.gmi\">official specification</a> is good, as there's not much to it.</p>\n<p>In most cases, you'll have to use the terminal to edit and add to your capsule, unless you use a platform like <a href=\"https://smol.pub\">SmolPub</a> or <a href=\"https://gemcities.com\">Gemcities</a>, which have web interfaces. That means getting comfortable with commands and a terminal-based editor, which I know sounds intimidating. For an editor, I recommend <a href=\"https://micro-editor.github.io\">Micro</a>, which is far friendlier than vim or nano, as it has mouse support and familiar shortcuts like <code>ctrl+s</code> to save and <code>ctrl+q</code> to quit. And if you're new to the command line, <a href=\"https://linuxcommand.org/lc3_learning_the_shell.php\">LinuxCommand.org's &quot;Learning the Shell&quot;</a> walks you through the terminal specifically, while <a href=\"https://missing.csail.mit.edu\">The Missing Semester of Your CS Education</a> from MIT is a good broader crash course.</p>\n<p>For more information and browser options, I recommend the <a href=\"https://github.com/kr1sp1n/awesome-gemini\">Awesome Gemini</a> repository.</p>\n<h2>CGI Scripting on Gemini</h2>\n<p>Gemini doesn't have anything like PHP or server-side JavaScript, but it does support old-school CGI (Common Gateway Interface) scripting. Instead of serving a static <code>.gmi</code> file, your server runs a script and pipes what it prints to stdout back to the client as the response.</p>\n<p>The response format is: a status code and MIME type on the first line, a blank line, then the body. Here's an example in Python that says hello:</p>\n<pre><code class=\"language-python\">#!/usr/bin/env python3\nprint(&quot;20 text/gemini&quot;)\nprint()\nprint(&quot;# Hello!&quot;)\nprint(&quot;Welcome to my little corner of Geminispace.&quot;)\n</code></pre>\n<p>Save that as <code>hello.cgi</code>, make it executable with the command <code>chmod +x</code>, and put it in the directory that your server uses as its cgi-bin. Most Gemini servers that support CGI, including <a href=\"https://github.com/michael-lazar/jetforce\">Jetforce</a> (the same server behind Astrobotany, mentioned earlier) pass along request details through environment variables like QUERY_STRING and PATH_INFO, so you can build search boxes, guestbooks, or anything else interactive. There are <a href=\"https://xitzin.readthedocs.io/en/latest/how-to/cgi-scripts/\">plenty of CGI scripting tutorials</a> out there if you're curious to learn more.</p>\n<h2>A Revivalist's Revival</h2>\n<p>Gemini isn't an old technology being dusted off, it was created in 2019. But it borrows heavily from Gopher's spirit, BBSes, and the decades-old phlogosphere. Yet, sadly, during my research and browsing of Geminispace, I came across nearly as many dead/abandoned links as I did active and alive ones. I get it. There's a lot of friction when it comes to using an entirely different protocol. I confess that it took me months until I finally got serious with it. I don't think Gemini will ever &quot;take off&quot; and I'm glad for that, really. It's a wonderfully peaceful and calm alternative to the Internet without having to unplug. I'm planning to use it a lot more, and I think I'm going to start adding some of my writing on the protocol exclusively.</p>\n<p>But I do hope you consider trying it out, it may be the only place online where there aren't hordes of genAI bots pissing everyone off, who knows.</p>\n<hr>\n<h2>Links</h2>\n<p>Here are all the links I've collected in my journey across the smallnet so far. None of these use the <code>https://</code> protocol, so you'll have to use a Gemini protocol browser to visit any of them.</p>\n<p>I tried to make sure each one is still active and operating, but please let me know if any aren't.</p>\n<h3>The Gemini Project</h3>\n<pre><code>=&gt; gemini://geminiprotocol.net/ Gemini Protocol, official project site\n=&gt; gemini://geminiquickst.art/ Gemini Quickstart guide\n=&gt; gemini://mozz.us/files/rfc_gemini_favicon.gmi Emoji favicons in Gemini, a spec proposal\n=&gt; gemini://gemi.dev/gemlog/2022-02-08-favicons.gmi On favicons and how to add one to your capsule\n</code></pre>\n<h3>Search &amp; Discovery</h3>\n<pre><code>=&gt; gemini://kennedy.gemi.dev Kennedy, Geminispace search engine: discovery, historical snapshots, backlinks, and capsule health\n=&gt; gemini://kennedy.gemi.dev/archive/ Delorean, the Geminispace time machine\n=&gt; gemini://gemini.thegonz.net/cdg/ Collaborative Directory of Geminispace\n=&gt; gemini://fediring.net/ Fediring, a Gemini webring\n=&gt; gemini://geminispace.info/ geminispace.info, public Gemini search provider\n=&gt; gemini://tlgs.one/ TLGS, another public Gemini search provider\n=&gt; gemini://gemplex.space/ Gemplex, experimental search engine\n=&gt; gemini://aurasearch.ddns.net/ Aura Search, covering Gemini, Nex, Spartan, and Scroll\n=&gt; gemini://medusae.space/ Medusae, hand-maintained capsule directory\n=&gt; gemini://geddit.glv.one Geddit, interactive link service with comments\n=&gt; gemini://fumble-around.mediocregopher.com Fumble-around, explore gemspace by hopping between random interesting pages\n=&gt; gopher://gopher.floodgap.com:70/1/v2 Veronica, Gopherspace search\n=&gt; gopher://gopher.icu:70/1/quarry Quarry, Gopherspace search\n</code></pre>\n<h4>Aggregators</h4>\n<pre><code>=&gt; gemini://warmedal.se/~antenna/ Antenna\n=&gt; gemini://antenna.ucant.org/ Antenna, ucant.org instance\n=&gt; gemini://gemini.circumlunar.space/capcom/ CAPCOM\n=&gt; gemini://gemini.circumlunar.space/users/gemlog/ CircumLunar gemlog feed\n=&gt; gemini://skyjake.fi/~Cosmos/ Cosmos\n</code></pre>\n<h4>Geminispace Statistics</h4>\n<pre><code>=&gt; gemini://gemini.bortzmeyer.org/software/lupa/stats.gmi Lupa's Geminispace Statistics\n=&gt; gemini://tlgs.one/statistics TGLS' Geminispace Statistics\n=&gt; gemini://botond.online/en/stats/ Botond's Geminispace Stats Visualized\n</code></pre>\n<h3>Communities</h3>\n<pre><code>=&gt; gemini://bbs.geminispace.org/ Gemini BBS: discussion, microblogging, and issue tracking\n=&gt; gemini://station.martinrue.com/ Station: status updates, capsuleers can hang out and socialise\n=&gt; gemini://midnight.pub/ Midnight Pub: small-scale personal publishing with a human-scale social feel\n=&gt; gemini://flounder.online Flounder\n=&gt; gemini://gemlog.blue Gemlog Blue\n=&gt; gemini://smol.pub Smol Pub\n=&gt; gemini://gemcities.com GemCities, capsule publisher\n=&gt; gemini://gemini.smallweb.space/ SmallWeb.Space, smol web host\n=&gt; gemini://gemini.circumlunar.space CircumLunar.Space, community capsule host\n=&gt; gemini://software-freedom.org Software Freedom\n=&gt; gemini://cities.yesterweb.org Yestercities (defunct)\n=&gt; gopher://gopher.club:70/ Internet Gopher Club Underground Syndicate\n=&gt; gopher://magical.fish:70/1/ magical.fish\n</code></pre>\n<h4>Pubnixes &amp; Tildes</h4>\n<pre><code>=&gt; gemini://gem.sdf.org SDF Public Access UNIX System\n=&gt; gemini://gemini.ctrl-c.club/ Ctrl-C Club\n=&gt; gemini://envs.net Envs\n=&gt; gemini://breadpunk.club/ Breadpunk Club\n=&gt; gemini://heathens.club/ heathens.club\n=&gt; gemini://tanelorn.city/ tanelorn city\n=&gt; gemini://tilde.cafe/ Tilde Cafe\n=&gt; gemini://tilde.club/ Tilde Club\n=&gt; gemini://tilde.pink/ tilde.pink\n=&gt; gemini://tilde.team/ Tilde Team\n=&gt; gemini://tilde.town/ tilde.town\n=&gt; gemini://rawtext.club/ Raw Text Club (RTC) (defunct)\n</code></pre>\n<h3>Capsules of Interest</h3>\n<pre><code>=&gt; gemini://zaibatsu.circumlunar.space/~solderpunk/ solderpunk, creator of Gemini\n=&gt; gopher://zaibatsu.circumlunar.space/1/~solderpunk/ solderpunk's Gopherhole\n=&gt; gemini://athanasia.gemcities.com/ Athanasia\n=&gt; gemini://balloon.fusen.nya.je/ Balloon/Fusen\n=&gt; gemini://elektito.com/gemlog/ Elektito\n=&gt; gemini://nytpu.com Nytpu\n=&gt; gemini://sava.rocks sava.rocks\n=&gt; gemini://mozz.us mozz.us\n=&gt; gemini://cyberdreams.info CyberDreams\n=&gt; gemini://gem.acdw.net ACDW's Gemini Cottage\n=&gt; gemini://drewdevault.com/ Drew DeVault\n=&gt; gemini://hexdsl.co.uk HexDSL\n=&gt; gemini://gemini.lottalinuxlinks.com Lotta Linux Links\n=&gt; gemini://pennywhether.xyz PennyWhether's Place\n=&gt; gemini://gemini.circumlunar.space/users/hundredrabbits/ Hundred Rabbits\n=&gt; gemini://gemini.circumlunar.space/users/laur%C3%AB/ Laurë's capsule\n=&gt; gemini://skyjake.fi/ Skyjake, developer of Lagrange\n=&gt; gemini://alexschroeder.ch/ Alex Schroeder\n=&gt; gemini://freeshell.de/ JBanana\n=&gt; gemini://gmi.bacardi55.io/ bacardi55\n=&gt; gemini://warmedal.se/~bjorn/ ew0k\n=&gt; gemini://taoetc.org Tao Etc\n=&gt; gemini://caolan.uk/ Caolan\n=&gt; gemini://adele.work Adele's capsule\n=&gt; gemini://going-flying.com/~mernisse/ Mernisse\n=&gt; gemini://tobykurien.com/ Toby Kurien's capsule\n=&gt; gemini://friendo.monster/ Drew's capsule\n=&gt; gemini://rawtext.club/~ecliptik ecliptik\n=&gt; gemini://rawtext.club/~sloum/ sloum\n=&gt; gopher://zaibatsu.circumlunar.space/1/~sloum/ sloum's Gopherhole\n=&gt; gopher://gopher.black/ Tomasino's gopherhole\n=&gt; gopher://box.matto.nl:70/1/ Matto's gopherhole\n=&gt; gopher://tilde.pink/1/~bencollver/ bencollver's gopherhole\n=&gt; gemini://tilde.cafe/~spellbinding/ ~spellbinding's word games\n=&gt; gemini://corstar.flounder.online corstar\n=&gt; gemini://subphase.xyz/index.gmi subphase\n=&gt; gemini://pixeldreams.tokyo/ kyo\n=&gt; gemini://tilde.pink/~kaction kaction\n=&gt; gemini://sdf.org/clinquant/index.gmi clinquant\n=&gt; gemini://tilde.pink/~ali ali\n=&gt; gemini://devinprater.flounder.online devin\n=&gt; gemini://vignette.kalasarn.se/ mmww\n=&gt; gemini://republic.circumlunar.space/users/joneworlds/ joneworlds\n=&gt; gemini://tanelorn.city/~vidak/ vidak\n=&gt; gemini://tilde.town/~hush/ ~hush\n</code></pre>\n<h4>Link curators</h4>\n<p>These capsules maintain the collections many of the links here were found through. Thank you!!</p>\n<pre><code>=&gt; gemini://tilde.pink/~emily ~emily\n=&gt; gemini://gemini.ctrl-c.club/~aesophod/ ~aesophod\n=&gt; gemini://gemini.ctrl-c.club/~de_alchmst/ ~de_alchmst\n=&gt; gemini://gemini.ctrl-c.club/~edisondotme/ ~edisondotme\n=&gt; gemini://gemini.ctrl-c.club/~gzj/ ~gzj\n=&gt; gemini://gemini.ctrl-c.club/~w3bk3rn3l/ ~w3bk3rn3l\n=&gt; gemini://gemini.ctrl-c.club/~zenspace/ ~zenspace\n=&gt; gemini://eluum.net/ eluum\n=&gt; gemini://gmi.hedy.dev/ hedy\n</code></pre>\n<h4>Active ~pink capsules</h4>\n<pre><code>=&gt; gemini://tilde.pink/~johl ~johl\n=&gt; gemini://tilde.pink/~kirch ~kirch\n=&gt; gemini://tilde.pink/~lacour ~lacour\n=&gt; gemini://tilde.pink/~m040601 ~m040601\n=&gt; gemini://tilde.pink/~para ~para\n=&gt; gemini://tilde.pink/~rebel1725 ~rebel1725\n=&gt; gemini://tilde.pink/~ssb22 ~ssb22\n</code></pre>\n<h3>Good Gemlogs</h3>\n<pre><code>=&gt; gemini://degrowther.smol.pub/ Degrowther\n=&gt; gemini://idiomdrottning.org/sub Idiomdrottning\n=&gt; gemini://rawtext.club/~left_adjoint/ Left adjoint's free monoid microblog\n=&gt; gemini://gemini.ctrl-c.club/~lettuce/ Lettuce Gemlog\n=&gt; gemini://njms.ca/gemlog/ njms' gemlog\n=&gt; gemini://officialdonut.smol.pub/ Official Donut of the Small Web\n=&gt; gemini://ploum.net/index_en.gmi Ploum's English gemlog\n=&gt; gemini://rawtext.club/~ploum/ Ploum's Offline Typewriter\n=&gt; gemini://gemini.circumlunar.space/users/shufei/phlog/index.gmi Shufei's Gmiphlog\n=&gt; gemini://gemini.circumlunar.space/users/shufei/phlog/Shufei-ThisAndThat-Weiphlog.gmi Shufei's Weiphlog\n=&gt; gemini://arcanesciences.com/gemlog/ Sunset's gemlog\n=&gt; gemini://rawtext.club/~winter/gemlog/ Winter's gemlog\n=&gt; gemini://samsai.eu/gemlog.gemini Samsai's gemlog\n=&gt; gemini://perso.pw/blog/ Solene's gemlog\n=&gt; gemini://gemini.cyberbot.space/gemlog/ kelbot's gemlog\n=&gt; gemini://carcosa.net/journal prothetic conscience, a comrade's gemlog\n=&gt; gemini://zach.e-worm.club/ zach's frequently updated log\n=&gt; gemini://gmi.noulin.net/feed.gmi Remy Noulin's tech articles\n</code></pre>\n<h3>Documents &amp; Libraries</h3>\n<pre><code>=&gt; gemini://library.inu.red Gemini mirror of the Anarchist Library\n=&gt; gemini://gemini.bortzmeyer.org/rfc-mirror/rfc-index.gmi Gemini mirror of all IETF RFCs\n=&gt; gemini://park-city.club/library/ Park City Library: collecting, categorizing, and preserving the works of internet communities\n=&gt; gemini://vault.transjovian.org TransJovian, a Gemini encyclopedia\n=&gt; gemini://gemini.cyberbot.space/smolzine/ smolzine\n=&gt; gopher://rawtext.club:70/1~cmccabe/pubnixhist/ A history of public unix systems\n=&gt; gopher://tilde.pink:70/1/~bencollver/dict/ Dictionary look-ups\n=&gt; gopher://tilde.pink:70/9/~bencollver/books/FederalPLGuidelines.pdf Federal Plain Language Guidelines (PDF)\n=&gt; gopher://tilde.pink:70/9/~bencollver/books/how-to-write-clearly.pdf How to Write Clearly (PDF)\n=&gt; gopher://tilde.pink:70/0/~bencollver/text/nato-alphabet.txt NATO phonetic alphabet\n=&gt; gopher://tilde.pink:70/1/~bencollver/effman/ Writing effective man pages\n=&gt; gopher://tilde.pink:70/1/~bencollver/dos/ DOS nostalgia\n=&gt; gopher://tilde.pink:70/1/~bencollver/ftp/ FTP sites\n=&gt; gopher://tilde.pink:70/1/~bencollver/gamefaqs/ GameFAQs archive\n=&gt; gopher://tilde.pink:70/1/~bencollver/books/basic-asanas/ Basic asanas\n=&gt; gopher://tilde.pink:70/1/~bencollver/books/surya-namaskar/ Surya namaskar\n=&gt; gopher://sdf.org:70/1/users/agk/1st First aid\n</code></pre>\n<h3>Arts &amp; Fun</h3>\n<pre><code>=&gt; gemini://cyberdreams.info/videos/index.gmi CyberDreams Video Archive\n=&gt; gemini://tilde.pink/~doriancodes/asciimoji.gmi ~doriancodes' ASCIImoji / Kaomoji Collection\n=&gt; gemini://mozz.us/cgi-bin/cowsay Mozz's Cowsay Generator\n=&gt; gemini://astrobotany.mozz.us/ Astrobotany\n=&gt; gemini://zaibatsu.circumlunar.space/~shufei/pnp/PikiAndPoko.gmi Shufei's Smolnet Piki and Poko Fancapsule\n=&gt; gemini://gemini.nasman.us/dad_tips.py Dad tips generator\n=&gt; gopher://workingpayphones.com:70/1/ Working phone booths\n</code></pre>\n<h4>Games</h4>\n<pre><code>=&gt; gemini://spell.mywire.org:1966/ Spellbinding, an addictive word game\n=&gt; gemini://tilde.cafe/~spellbinding/wordo/cgi? Wordo, a wordle-like game\n=&gt; gemini://tilde.cafe/~spellbinding/wall/cgi A public wall to leave messages on\n=&gt; gemini://tictactoe.lanterne.chilliet.eu Tic-tac-toe\n=&gt; gemini://rawtext.club/~sloum/cgi/othello/ Othello/Reversi against the computer\n</code></pre>\n<h3>Music</h3>\n<pre><code>=&gt; gemini://gemini.circumlunar.space:1965/~sloum/ Drift Theory, a small collection of music released on Gemini\n=&gt; gemini://tilde.team/~jonathan/music/ Jonathan's noughties music reviews\n=&gt; gemini://konpeito.media The legendary Konpeito quarterly mixtapes\n=&gt; gemini://kovok.band/ Kovok, possibly the first band on Gemini\n=&gt; gemini://republicofsound.flounder.online/ Republic of Sound, free album downloads\n=&gt; gemini://rawtext.club/~sloum/musicmachine/ Music Machine, short album reviews\n=&gt; gemini://oberdada.pollux.casa/metal_intro.gmi Oberdada's Guide to Obscure Metal\n</code></pre>\n<h3>Photography</h3>\n<pre><code>=&gt; gemini://158.nu 158.nu's film photography hobby projects\n=&gt; gemini://kota.nz/pics/ Kota's pics\n</code></pre>\n<h3>Recipes</h3>\n<pre><code>=&gt; gemini://rawtext.club/~sloum/cgi/recipes/ A searchable index of 1,000 recipes\n=&gt; gemini://breadpunk.club/~rye/ Rye, a collection of vegan, mostly soy-free recipes\n=&gt; gemini://gemini.circumlunar.space/users/hundredrabbits/recipes.gmi Vegan recipes from Hundred Rabbits\n</code></pre>\n<h3>Indigenous Language</h3>\n<pre><code>=&gt; gemini://taisui.space/tatis/index.gmi Siɂisim Tatis, a smol newsletter in Chinuk Wawa\n</code></pre>\n<h3>Permacomputing &amp; Essays</h3>\n<pre><code>=&gt; gemini://perma.computer/letter Technological Futures: A Letter to the Smolnet\n=&gt; gemini://smol.earth/manifesto.gmi Personal computing in the Anthropocene with eyes, minds and hearts wide open\n=&gt; gemini://idiomdrottning.org/texts.gmi Idiomdrottning's collected texts\n=&gt; gemini://midnight.pub/posts/163 Nick Cave on finding good ideas\n</code></pre>\n<h3>Software &amp; How-tos</h3>\n<pre><code>=&gt; gemini://skyjake.fi/lagrange/ Lagrange, a Gemini browser\n=&gt; gemini://makeworld.space/amfora-wiki Amfora Wiki\n=&gt; gemini://rawtext.club/~sloum/spacewalk.gmi Spacewalk\n=&gt; gemini://qwertqwefsday.eu/agate.gmi Agate, a Gemini server\n=&gt; gemini://gemini.smallweb.space/HOWTO/managing-your-own-capsule.gmi How to self-host a capsule\n=&gt; gemini://aelspire.info/posts/2022-07-28-dotfiles/post.gmi Managing dot files\n=&gt; gemini://srht.site/ SourceHut Gemini hosting\n=&gt; gemini://srht.site/quickstart.gmi SourceHut's quick start guide\n=&gt; gemini://glv.one glv.one, PaaS that runs any Gemini server in the cloud\n=&gt; gemini://gemini.omarpolo.com/cgi/gempkg/ gempkg, an interface to the OpenBSD ports collection\n</code></pre>\n<h3>Tools &amp; Services</h3>\n<pre><code>=&gt; gemini://gemi.dev/cgi-bin/waffle.cgi NewsWaffle, read any news website via Gemini\n=&gt; gemini://gemi.dev/cgi-bin/wp.cgi Gemipedia, Gemini frontend to Wikipedia\n=&gt; gemini://gemi.dev/stargate.gmi Stargate, public Gemini-to-HTTP gateway\n=&gt; gemini://rawtext.club/~sloum/geminews/ Geminews, an NPR, CSM, and CNN mirror\n=&gt; gopher://nihirash.net:7000/1/ Gopher web proxy\n=&gt; gemini://ur.gs/ ur.gs, English-Spanish translator\n=&gt; gemini://rawtext.club/~sloum/cgi/weather US weather reports by zip code\n=&gt; gemini://tilde.cafe/~stack/weather Weather forecast powered by wttr.in\n=&gt; gopher://gopher.floodgap.com:70/1/groundhog/us/zipcode%3F97526 Takelma weather\n=&gt; gopher://tilde.pink:70/1/~bencollver/dir/ Gopher Google directions\n=&gt; gemini://houston.gmi.bacardi55.io Houston, check whether a capsule is up\n=&gt; gemini://hashnix.club:1958/ hashnix.club email service\n=&gt; gemini://kevachat.duckdns.org KevaChat clearnet node\n=&gt; gemini://kvazar.duckdns.org Observe the Kevacoin Universe\n=&gt; gemini://betahowto.duckdns.org Yggdrasil DokuWiki satellite\n</code></pre>\n<h3>Other Link Collections</h3>\n<pre><code>=&gt; gemini://rawtext.club/~winter/links/ Winter's link garden\n=&gt; gemini://hnr.fyi/research.gmi Honor Ash's collected resources on degrowth, communities &amp; scale, and more\n=&gt; gopher://tilde.pink/1/~bencollver/links/ bencollver's links list\n=&gt; gemini://gemini.ctrl-c.club/~aesophod/bookmarks/bookmarks.gmi ~aesophod's bookmarks\n=&gt; gemini://gemini.ctrl-c.club/~zenspace/bookmarks.gmi ~zenspace's bookmarks\n=&gt; gemini://gmi.hedy.dev/blogroll.gmi hedy's blogroll\n=&gt; gemini://eluum.net/link-garden.gmi eluum's link garden\n=&gt; gemini://gemini.cyberbot.space/links.gmi kelbot's links\n=&gt; gemini://nytpu.com/feed.gmi nytpu's list of capsules and gopherholes\n=&gt; gopher://box.matto.nl:70/1/phlogroll phlogroll\n=&gt; gopher://box.matto.nl:70/1/burrows-of-interest Burrows of Interest\n=&gt; gemini://station.martinrue.com/softwarepagan/4f077db00e7541b082403650735d954d Station thread: everyone's coolest Gemini links\n</code></pre>\n",
      "image": "https://brennan.day/assets/images/blog/gemini2.jpg",
      "date_published": "2026-09-19T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "technical",
        "Small Web",
        "IndieWeb",
        "Digital Culture",
        "decentralization",
        "gemini",
        "gopher",
        "blogging",
        "tutorial"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/would-you-like-to-reload-a-previous-save-yes-no/",
      "url": "https://brennan.day/would-you-like-to-reload-a-previous-save-yes-no/",
      "title": "'Would You Like to Reload a Previous Save?' (➤Yes / No)",
      "summary": "Revisiting my maladaptive daydream of waking up at twelve years old with all my present knowledge intact, I weigh the seductive fantasy of correcting every regret—being a better brother to Byron, buying Bitcoin with birthday money—against everything that would be erased: 500,000 words, hard-won relationships, the album that got me through a specific winter. A meditation on the future self who would trade almost anything for one more ordinary day. The door is already halfway closed.",
      "content_html": "<p>A common <a href=\"https://brennan.day/confessions-of-a-maladaptive-daydreamer/\">maladaptive daydream I have</a> is imagining that I wake up and I'm much younger again, spontaneously and miraculously, with all of my knowledge and understanding still intact. Magically, I find myself back at a specific age in my life, and I can redo everything all over again from that point on.</p>\n<p>For me, I always imagine awakening to find myself twelve and in grade six again. Back when I would walk down 17th Avenue travelling home after elementary school ended to take care of our four cats—we adopted one off Kijiji and she ended up having three kittens—and I'd always walk in and open a§ large can of chicken-tuna flavoured wet food and watch them hungrily scurry in excitement.</p>\n<p>The kittens—Cream, Lynx, and Jeremiah—were a highlight during an otherwise difficult point in my life. I felt lonely, and I was being bullied at school (more so by teachers than students), not to mention my overworked single mom was struggling to take care of me and my little brother on her own, in a city she'd just moved to where she didn't know anybody.</p>\n<p>I think I choose this time specifically because I feel as though I can right the most wrongs and adjust course most significantly, while still being old enough to do so. I would be a better older brother to Byron, who just entered the first grade, so I could take some of the pressure off my mom's shoulders. I would avoid talking to weird older teenagers on MSN Messenger, which would only cause me further social isolation in the years to come.</p>\n<p>And of course, that's just the tip of the iceberg. To be transplanted back in time would mean you would have so much foresight and wisdom to reinvest. So much extra time to learn what I've been putting off, so much capability to avoid all the regrets and mistakes I've made over the years. Of course, the monetary gains are obvious as well—you'd always be able to bet on the right horse. I could use my birthday money when I turned fourteen and buy Bitcoin when it only cost a few cents per BTC.</p>\n<p>I could learn how to whistle and roll my R's before grade seven instead of after. I'd take Byron to the wave pool before summer ended instead of promising it every June and letting it slide. I'd learn to skate at Shaw Millennium before it was renamed Cowboys. And I'd be able to make sure we kept our four cats after we moved farther south when I was in junior high.</p>\n<p>You can see why it's such a compelling daydream. There are so many decisions to make right, so many points in life where you could have done the correct thing and avoided hurt and pain.</p>\n<p>But when you really start to think about it, there is also so much you lose. Nearly everything, actually. Every journal entry and poem and thought I ever had is gone. Every coding project I sunk hours into. All 280 posts and over 500,000 words on this site, gone. Would I be able to re-write them all? Would I even want to? There would be fields upon fields of the unrecoverable.</p>\n<p>Your favourite music and books and films you'd have to wait for them to exist. I'd witness every disaster again, every cultural rise and fall. I'd sit through the hundred hours of schooling again that I wouldn't need. Only to arrive again at the handful of things worth keeping—the essay I read that changed how I write essays, the album that got me through painful winters.</p>\n<p>And, far more existentially, what about relationships? What if you weren't able to reconnect with the people you found and loved the first time? What if it didn't work out? (<em>Rick and Morty</em>, surprisingly, did a <a href=\"https://www.youtube.com/watch?v=K8DaX0FFthc\">good job visualizing the horror that can be found here</a>.)</p>\n<p>But there is actually an incredibly useful meditation here. For we are not at the edge of time, only able to look backwards. We are currently on a continuum of our life, unknowingly somewhere in the middle.</p>\n<p>And in the future, there's a version of you that's looking back at where you are. Right now. As you're reading this very sentence. And they wish desperately, more than anything, to go back to this point. Identical to how I yearn to go back to feeding three hungry kittens after school.</p>\n<p>You don't need a magical impossibility, you don't need to fantasize about something that will never happen. Time moves forward.</p>\n<p>There's a version of you, ten years from now. Wherever they are and whatever they're doing, the memory of reading this will surface. The version of you ten years from now won't remember the big things nearly as clearly as they'll remember the temperature of the room you're currently in, and the sound your chair makes as you shift your weight. The version of you ten years from today would trade anything for one more ordinary day, the kind of day you're having right now. Not the bullshit highlight reel of wedding days and manufactured ceremonies. But this. Unremarkable and unrecorded, already slipping past you while you decide whether or not it's worth paying attention to.</p>\n<p>That version of you, ten years from now, is standing at the end of the doorway made of days like today. They're looking back and trying to find you. The doorway is already halfway closed.</p>\n<p>Although we don't have the foresight to see exactly how the world plays out, or to make incredible financial gains, we do have the capacity to act differently right now. I don't know exactly what the forty-year-old version of me in 2036 would want me to be doing right now, but I do know what I'd want the <a href=\"https://blog.brennanbrown.ca/becoming-an-adult-10fd7135ce3c\">twenty-year-old</a> version of me to be doing. And that's a good enough starting point, I think.</p>\n",
      "image": "https://brennan.day/assets/images/blog/reload.jpg",
      "date_published": "2026-09-18T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "philosophy",
        "memory",
        "nostalgia",
        "childhood",
        "mental health",
        "mindfulness",
        "mortality"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/proper-english-is-a-myth-theres-no-correct-way-to-write/",
      "url": "https://brennan.day/proper-english-is-a-myth-theres-no-correct-way-to-write/",
      "title": "Proper English is a Myth: There's No 'Correct' Way to Write",
      "summary": "Responding to a blog post urging people to 'please learn how to write,' I pull rank with my English degree to argue there's no such thing as proper English. Looking at the 18th-century grammarians who invented 'correctness,' the linguistic racism of policing dialects from AAVE to Jamaican Patois, and why blogging should be about meaning, not mechanics.",
      "content_html": "<p>I've been keeping up with the blogosphere, and there have been a couple of posts that have irked me enough to write a post about linguistics. And that's saying something.</p>\n<p>A good example is from itsme, who wrote a blog post asking people to <a href=\"https://itsme.bearblog.dev/please-learn-how-to-write/\">please learn how to write</a>. And it received over a hundred uptoots.</p>\n<p>I'm afraid I have to pull rank here and say I studied English at university, and although the majority of my classes were about reading books, I did also take classes on the meta-disciplinary understanding of how the pedagogy of English is taught, and that gets into what English actually is.</p>\n<p>To ask someone to write properly is to assume there is a way to write proper. <a href=\"https://www.theguardian.com/commentisfree/2012/mar/02/no-correct-grammar-martin-gwynne\">There isn't.</a> <a href=\"https://www.campusreform.org/article/english-prof-no-such-thing-as-correct-and-incorrect-way-to-speak/16073\">There is no universal, static version of English.</a> Or any other language, for that matter. <a href=\"https://www.cambridge.org/elt/blog/2020/02/24/no-such-thing-as-standard-english/\">Every dialect of English</a>, including regional accents and non-standard forms, follows complex, systematic grammatical rules.</p>\n<p>For example, should a writer avoid splitting infinitives, or avoid double negatives? These, like every other mechanic, are stylistic choices rather than absolute laws of human communication.</p>\n<p>You probably don't realize it, but when you attempt to &quot;correct&quot; somebody's writing, you are invoking centuries of <a href=\"https://www.bbc.com/worklife/article/20210528-the-pervasive-problem-of-linguistic-racism\">oppression and racism</a>. Standard English is tied to institutional power and formal education, and this does not make other dialects inferior or broken. Standard form has always belonged to people with historical social, economic, and political power. The idea of strict &quot;correctness&quot; was largely created in the <a href=\"https://exhibits.lib.ku.edu/exhibits/show/english-language/governing-english\">18th century by grammarians</a>, who wanted to stabilize and control a constantly changing language.</p>\n<p>Somebody who comes from a computer science background might understand the desire to stabilize language—programming languages are deterministic and set (though they, too, get updated and changed between version numbers). The syntax of coding needs to stay the same so the program runs the same each time. But this is not how spoken word, writing, and communication works.</p>\n<p>English is always in a state of flux, it is as malleable and loose as the concept of symbols can be. Treating other forms of language as &quot;wrong&quot; ignores the cultural and historical context of how people communicate. My friend Agnes <a href=\"https://blog.agnes.love/write-for-yourself-unless-i-dont-like-it/\">wrote an excellent post</a> about this topic as well. I recommend you give it a read, she's a great writer!</p>\n<p>Do not try to police how other people write or speak. Unsolicited corrections are microaggressions, and they signal to marginalized speakers that their native or community language is inferior.</p>\n<p>This isn't a fringe position. Non-standard English is everywhere. People assume Pidgin languages, for example, are some kind of broken, half-formed communication. Let me give you an example, this is Genesis 1:1 from <a href=\"https://www.bible.com/bible/76/GEN.1\">the Hawaii Pidgin Bible</a>:</p>\n<blockquote>\n<p>God Make Da World<br>\nDa time wen eryting wen start, God make da sky an da world. Da world come so no mo notting inside, no mo shape notting. On top da wild ocean dat cova eryting, neva had light notting. Ony had God Spirit dea, moving aroun ova da watta.</p>\n</blockquote>\n<p>Linguists have demonstrated <a href=\"https://study.com/academy/lesson/pidgin-language-overview-development-examples.html\">pidgins follow predictable developmental patterns of their own</a> rather than being unintelligent misunderstandings of a &quot;real&quot; language's grammar.</p>\n<p>Let's look at what's taught in schools, where so-called standard English is assumed. <em>The Adventures of Huckleberry Finn</em> is commonly taught, full of regional vernacular.</p>\n<blockquote>\n<p>“That is just the way with some people. They get down on a thing when they don’t know nothing about it.”</p>\n</blockquote>\n<p>Or, take the seminal novel <em>The Colour Purple</em> by Alice Walker, also taught across classrooms:</p>\n<blockquote>\n<p>“I think us here to wonder, myself. To wonder. To ask. And that in wondering bout the big things and asking bout the big things, you learn about the little ones, almost by accident. But you never know nothing more about the big things than you start out with. The more I wonder, the more I love.”</p>\n</blockquote>\n<p>Zora Neale Hurston's <em>Their Eyes Were Watching God</em> is <a href=\"https://www.mla.org/Publications/Bookstore/Approaches-to-Teaching-World-Literature/Approaches-to-Teaching-Hurston-s-Their-Eyes-Were-Watching-God-and-Other-Works\">taught in universities, colleges, and secondary schools</a> as a key text of American literature:</p>\n<blockquote>\n<p>&quot;If you kin see de light at daybreak, you don't keer if you die at dusk. It's so many people never seen de light at all.&quot;</p>\n</blockquote>\n<p>Louise Bennett is one of <a href=\"https://www.nationalarchives.gov.uk/explore-the-collection/stories/louise-bennett-coverley/\">Jamaica's most celebrated cultural figures</a>, for poetry written and performed entirely in Jamaican Patois. From <a href=\"https://poetrybyheart.com/poems/colonization-in-reverse\">&quot;Colonization in Reverse&quot;</a>:</p>\n<blockquote>\n<p>&quot;Wat a devilment a Englan!<br>\nDem face war an brave de worse,<br>\nBut me wonderin how dem gwine stan<br>\nColonizin in reverse.&quot;</p>\n</blockquote>\n<p>Dohra Ahmad edited <a href=\"https://theworld.org/stories/2014/10/22/how-dialects-trinidad-hawaii-are-expanding-limits-english\">an anthology of vernacular literature</a> called <a href=\"https://wordswithoutborders.org/read/article/2008-02/rotten-english/\"><em>Rotten English</em></a>, collecting work written in pidgins, creoles, and dialects from around the world.</p>\n<p>There are so many assumptions you're making when you view writing as incorrect and needing to be fixed. As itsme assumes, it's simply because the writer was being careless and sprinting to get a blog post out into the world, saying that &quot;haste makes waste.&quot; But there are countless other reasons why, to start, it could be a reading comprehension disability, it could be a vision impairment, it could be the way they've grown up and understood how a specific mechanic works.</p>\n<p>William Labov spent decades documenting <a href=\"https://newlearningonline.com/literacies/chapter-7/labov-on-african-american-english-vernacular\">AAVE (African-American Vernacular English) has its own systematic grammatical principles</a>. Taglish, the blend of Tagalog and English spoken across the Philippines, <a href=\"https://link.springer.com/article/10.1007/BF03024960\">was initially dismissed as a corruption of both languages before linguists realized better</a>. And it wasn't until <a href=\"https://en.wikipedia.org/wiki/William_Stokoe\">William Stokoe's research in the 1960s</a> that American Sign Language was recognized as having syntax and morphology, rather than a mimicry of spoken English.</p>\n<p><a href=\"https://www.grammarly.com/blog/language-trends-culture/slang-to-standard-how-casual-language-can-become-acceptable/\">Words like &quot;nice,&quot; &quot;jazz,&quot; and &quot;crestfallen&quot; all started out as slang or informal coinages</a>. Whatever gets waved off as &quot;incorrect&quot; right now is tomorrow's dictionary entry. We're all making it up as we go along. The &quot;mistakes&quot; generations of teachers mark up in red pen were never mistakes.</p>\n<p>The best thing you can do is focus on meaning. Prioritize understanding the message over policing the specific mechanics. If somebody writes a blog post and you feel as though you don't understand what they're trying to convey, guess what? That gives you an excellent excuse to email them and start a dialogue and conversation, instead of vaguely chastising them from your own blog at a distance.</p>\n<p>We're all trying to do the same thing, here. We're all trying to share ourselves and our thoughts. There is no right way to do that, and there definitely is no wrong way, either. Even if there was some sort of rigid, &quot;correct&quot; standard English, who cares? (Which I've clearly established there isn't) Guess what? This is blogging! Let loose, have fun a little. We should be enjoying each other rather than trying to police. Everyone is welcome here, regardless of how they type.</p>\n<p>Writing should communicate, but “proper English” is the wrong way to talk about it. It needs to be clear enough for your audience, which is fluid and context-dependent, not a fixed standard. When we mistake clarity as correctness, we stigmatize dialects that are perfectly clear to their speakers.</p>\n<p>I want to end this with a stanza from a poem I've seen in my poetry textbooks and anthologies alike that's a bit of a favourite of mine, <a href=\"https://www.jameswhall.com/maybe-dats-your-pwoblem-too-spiderman-poem/\"><em>Maybe Dats Your Pwoblem Too</em></a> by James Hall.</p>\n<blockquote>\n<p>&quot;All my pwoblems<br>\nwho knows, maybe evwybody’s pwoblems<br>\nis due to da fact, due to da awful twuth<br>\ndat I am SPIDERMAN.<br>\nI know. I know. All da dumb jokes:<br>\nNo flies on you, ha ha,<br>\nand da ones about what do I do wit all<br>\ndoze extwa legs in bed. Well, dat’s funny yeah.<br>\nBut you twy being<br>\nSPIDERMAN for a month or two. Go ahead.&quot;</p>\n</blockquote>\n",
      "image": "https://brennan.day/assets/images/blog/schooldays.jpg",
      "date_published": "2026-09-16T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "Linguistics",
        "writing",
        "blogging",
        "grammar",
        "language"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/i-ceo-how-mediumcom-went-from-being-anti-ai-to-pro-ai/",
      "url": "https://brennan.day/i-ceo-how-mediumcom-went-from-being-anti-ai-to-pro-ai/",
      "title": "I, CEO: How Medium.com went from being anti-AI to pro-AI",
      "summary": "Medium.com went from a defiant anti-AI holdout—blocking GPTBot, rejecting a multimillion-dollar training deal, banning AI writing from monetization—to launching an AI licensing standard and its own AI writing app under CEO Tony Stubblebine. What happens when one man's changing mind becomes a platform's policy, and why I'm still staying.",
      "content_html": "<p>When I first joined <a href=\"http://Medium.com\">Medium.com</a>, I thought I was late to the party. Little did I know I would be one of the platform's most veteran members still writing and publishing here after over ten years. One of my first-ever posts was about getting into the discourse about <a href=\"https://blog.brennanbrown.ca/anti-medium-30d6fbafc5f8\">what Medium should be</a>. It's a rather embarrassing read a decade later, but it's important to note I've always been interested in the longevity of this place while also not shying away from being critical when necessary.</p>\n<p>For my first nine or so years on the platform, I was just blogging as a hobby. It was an enjoyable way to write and get my thoughts out into the world. Only last November did I really start to take writing seriously as my career, and I've been on a steady posting cadence since—writing around 25 posts per month, with each post averaging around 2,000 words.</p>\n<p>While a lot of my work doesn't gain that many views, the few breakout hits that do have virality have been sufficient for me to make writing my full-time job now. It's a modest income, not livable for most, but it is for me. I've had quite a number of my stories boosted, and even had one <a href=\"https://www.instagram.com/p/DXcigPmCV_b/?hl=en\">highlighted as a Staff Pick</a> a few days after my 30th birthday.</p>\n<p>I'm not shy to criticize this platform that pays me a living, but I am going to make sure it's <a href=\"https://coachtony.medium.com/fell-in-a-hole-got-out-381356ec8d7f\">for good reason</a>. I have also been someone who's been critical of generative artificial intelligence for months, writing around a dozen stories covering the topic. My first was going over how <a href=\"https://medium.com/@brennanbrown/the-piss-average-problem-ec2a2dd6f5ad\">we're going to face an authenticity crisis and a crisis of mediocrity</a> because of the technology.</p>\n<h2>PART ONE: A Brief History</h2>\n<p>Why are we talking about AI now, anyways? Well, let me start at the beginning. <a href=\"https://techcrunch.com/2012/11/15/ev-williams-takes-to-medium-to-discuss-the-true-purpose-of-his-new-publishing-tool/\">Medium.com was founded by Ev Williams</a> on September 25, 2012, and the platform has had a simple and stubborn mission: to be a place for human writing.</p>\n<p>The Internet was (and obviously still is) rewarding fast, shallow, click-driven content. <a href=\"https://www.theguardian.com/media/2016/apr/10/twitter-ev-williams-medium-content-fast-food\">Junk food for the mind.</a> Williams wanted to create a clean, distraction-free place for meaningful writing exceeding short character limits, giving thoughtful ideas better accessibility. His vision was an alternative system which measured stories by how much time people spent reading them rather than sensationalized headlines designed only for ad clicks. He wasn't new to this, either, having been one of the creators of <a href=\"https://blogger.com\">blogger.com</a> years before.</p>\n<p><a href=\"http://Medium.com\">Medium.com</a> never set out to be the highest-paying or fastest-growing platform. The premise was, rather, that it would be a place where people could think in public, and share ideas longhand without the short attention-spans and white noise of corporate social media.</p>\n<p>And that premise has survived over a decade. It's survived the <a href=\"https://techcrunch.com/2017/03/22/medium-debuts-its-paid-membership-subscription-program/\">pivot to subscriptions</a>, the <a href=\"https://medium.com/alpha-beta-blog/why-are-big-medium-publications-closing-4f24460b44dc\">death of in-house publications</a>, and the <a href=\"https://medium.design/about-mediums-new-ish-logo-458885b2d8ab\">numerous logo and branding changes</a>.</p>\n<p>What it did not survive, though, was a new CEO changing his mind.</p>\n<p>Tony Stubblebine, founder and former CEO of <a href=\"https://coach.me\">Coach.me</a>, <a href=\"https://medium.com/blog/medium-names-technology-and-digital-media-veteran-tony-stubblebine-ceo-founder-ev-williams-7ff0a859f133\">took over Medium from Ev Williams</a> in 2022. <a href=\"https://medium.com/the-coach-life/fell-in-a-hole-got-out-381356ec8d7f\">Stubblebine saved the company</a>, managing to turn $2.6 million per month in losses into Medium's first profitable month in August 2024. By his own account, this was done by refusing to chase the so-called genAI &quot;content&quot; gold rush hollowing out other platforms.</p>\n<p>For three years, &quot;no AI&quot; was <em>the</em> turnaround story for <a href=\"http://Medium.com\">Medium.com</a>. And that's what is being dismantled now, by none other than Stubblebine himself.</p>\n<p>While this story is about <a href=\"http://Medium.com\">Medium.com</a>, it can also be seen in nearly every other industry. There's a case study here of what happens when the person in power finds themselves increasingly absorbed by the temptation and seduction of the machine.</p>\n<h2>PART TWO: The Wall (2023-2024)</h2>\n<p>Medium's first AI policy went up in January 2023, written by VP of Content, Scott Lamb. Things were still rather tentative regarding how we ought to tackle AI in general, and so it was rather permissive by later standards. AI-generated posts were allowed as long as the AI usage was disclosed, but it was already declaring the platform's identity: <a href=\"https://sidehustleroad.substack.com/p/medium-doesnt-want-your-ai-written\">Medium is for human storytelling, not machine-generated writing</a>. By July 2023, the language changed from &quot;welcome&quot; to merely &quot;allow,&quot; and any fully AI-written story was restricted to reaching only the author's existing followers, suppressed from reaching the rest of the site's audience.</p>\n<p>In September of that year, the wall was up. Medium blocked OpenAI's GPTBot crawler and rewrote its terms of service to forbid scraping. Medium joined the likes of CNN, the <em>New York Times</em>, and other publishers <a href=\"https://techcrunch.com/2023/09/28/medium-hints-at-a-nascent-media-coalition-to-block-ai-crawlers\">resisting unlicensed genAI training</a>. Stubblebine declared the default answer <a href=\"https://www.theregister.com/software/2023/09/29/medium-hopes-to-stop-ai-bot-crawlers-from-scraping-content/1310668\">on genAI training was no</a>.</p>\n<p>A few months later, in an interview, he disclosed that <a href=\"https://www.semafor.com/article/02/07/2024/what-mediums-tony-stubblebine-has-learned-about-tech-and-journalism\">an AI company's CEO had privately offered Medium a buyout in the millions</a> for training rights, and that Medium shrugged it off as insultingly small.</p>\n<p>In April 2024, a new <a href=\"https://www.techtimes.com/articles/303573/20240414/medium-ai-generated-content-new-partner-program-policy.htm\">Partner Program policy</a> <a href=\"https://www.plagiarismtoday.com/2024/04/11/medium-sets-new-policies-on-ai-generated-writing/\">banned AI-generated writing from monetization</a>, regardless of whether or not it was disclosed.</p>\n<p><a href=\"https://generativeai.pub/my-thoughts-on-the-mediums-new-policy-on-ai-generated-content-614179df75c8?gi=e21d84667859\">Jim Clyde Monge</a>, and many other writers on the platform, understood the new policy update as a line in the sand against genAI. Days later, Stubblebine reaffirmed <a href=\"https://medium.com/westenberg/inside-mediums-mission-to-elevate-authentic-voices-a-q-a-with-ceo-tony-stubblebine-233b24e9415e\">in a Q&amp;A</a> that Medium would not let AI companies train on the work of writers, regarding this &quot;rejection of AI&quot; as core to the platform's mission. By December 2024, Stubblebine was <a href=\"https://podcasts.apple.com/us/podcast/315-tony-stubblebine-ceo-of-medium-on-human-curation/id1476885647?i=1000681383471\">continuing to do press</a> about minimizing AI-generated content on the platform. As of late March 2025, Medium was <a href=\"https://medium.com/write-a-catalyst/writers-using-ai-editing-tools-are-in-for-a-big-surprise-in-november-3dc47000c431\">actively suspending writers</a> over suspected undisclosed genAI usage.</p>\n<p>For two years, it was clear that every stance and policy coming from <a href=\"http://Medium.com\">Medium.com</a> was that it believed it needed to be human-first and anti-AI. To maintain integrity, yes, but to also ensure the platform <em>survived</em>. The position was steadfast and consistent.</p>\n<h2>PART THREE: The Turning Point (2025-2026)</h2>\n<p>Almost exactly a year ago on September 10th, 2025, Medium joined Reddit, Yahoo, Quora, and O'Reilly Media in launching <a href=\"https://rslstandard.org/press/rsl-standard\">Really Simple Licensing</a>. This was a new open standard, letting publishers set machine-readable terms for genAI crawlers. Stubblebine's <a href=\"https://medium.com/blog/finally-an-internet-standard-for-writers-rights-vs-ai-companies-07ffe09f15f8\">own announcement</a> argued that since genAI runs on stolen content, the standard was a legitimate way to force AI companies to either pay, stop, or shut down.</p>\n<p>But really, this was a change from blocking to licensing. The AI companies were no longer hostile trespassers antithetical to the platform, but were now partners to be negotiated with. AI was now a line of revenue, and understood fatalistically as <a href=\"https://www.semafor.com/article/09/19/2025/how-medium-plans-to-use-ai-to-pay-creators-fairly\">a fact of the new ecosystem to be priced</a>, no longer being refused outright.</p>\n<p>Nine days later the other shoe dropped at Medium Day 2025. Medium announced <a href=\"https://tk.xyz/\">TK</a>, a new writing and notes app <a href=\"https://coachtony.medium.com/the-straight-tk-on-mediumtk-ee2a87199241\">built explicitly around AI-assisted composition</a>. <a href=\"https://www.fastcompany.com/91407562/medium-ceo-tony-stubblebine-interview\">Stubblebine had been asked</a> directly a few days earlier whether Medium was building AI-enabled tools, and he answered yes.</p>\n<p>Anecdotally, I know many creatives that feel negatively about genAI, and very few who are neutral or in support of it. Most of the writers I've encountered on Medium are not fans. Which is why Stubblebine's decisions in the past year have been so baffling.</p>\n<p>And so we've witnessed <a href=\"https://podcasts.apple.com/us/podcast/how-ai-is-changing-writing-with-tony-stubblebine/id1522960417?i=1000734040477\">a steady change of Medium's rhetoric</a> on genAI over the past year. In October 2025, Stubblebine described <a href=\"https://mediacopilot.substack.com/p/the-writing-renaissance-tony-stubblebine\">a coming &quot;writing renaissance&quot;</a> in which AI serves as <a href=\"https://www.youtube.com/watch?v=sf0SHZ7zujs\">a thoughtful companion</a> for writers, contrasting with the idea of an AI assistant writing and doing all the work for you.</p>\n<p>Stubblebine began using the term &quot;second brain&quot; to describe what <a href=\"https://idratherbewriting.com/blog/stubblebine-how-ai-is-changing-writing\">he wanted genAI to do instead TK</a>, saying the app had the ability to surface a writer's decades of notes and drafts on demand. Compare that to how, <a href=\"https://subclub.substack.com/p/on-what-ai-can-and-cant-do-for-writers\">in earlier interviews</a>, he described how AI was being wildly oversold as something that could do everything. He <a href=\"https://dev.to/gajanan0707/embracing-authentic-writing-a-conversation-with-mediums-ceo-tony-stubblebine-4jj\">still insisted genAI could never substitute the human connection</a> built through writing, and yet he was building an editor that generated machine prose on request.</p>\n<p>By August 2026, in an interview, Stubblebine was arguing that <a href=\"https://www.ibtimes.com/medium-ceo-tony-stubblebine-why-ai-could-kill-creator-economy-3806165\">genAI killed the old creator economy</a> by exposing how much was never more than content written at a machine level to begin with. RSL reached its 1.0 spec, and Medium was <a href=\"https://rslcollective.org/press\">still named as a backer</a>.</p>\n<p>TK moved out of invite-only beta to general availability for Friends of Medium subscribers through the first half of 2026. Medium's own messaging <a href=\"https://medium.com/medium-handbook/writer-newsletter-get-the-10-day-medium-starter-pack-for-writers-c8bfbca5bc0c\">had grown noticeably defensive</a>. The July newsletter of this year acknowledged the tension between the platform's anti-genAI stance and its new genAI writing app in the same breath. The argument being made was that TK's AI merely prompts you to create. It wasn't doing the creating for you. Right?</p>\n<p>A review by longtime Medium writer <a href=\"https://jacquelinedooley.substack.com/p/an-unsolicited-opinion-of-mediums\">Jacqueline Dooley called TK an AI-assisted writing app in practice</a>, no matter how Medium tried to angle the copy on the product page. The generation was within the drafting and writing itself, a complete reversal of what the platform had spent two years promising. Dooley ended up leaving for Substack over this (something <a href=\"https://blog.brennanbrown.ca/substacks-subpar-subculture-226f4a04b485\">I personally wouldn't recommend</a>), after being a writer on Medium for eight years. There were <a href=\"https://medium.com/@johnpearce650/terrible-karma-at-mediocre-985c99a89e5b\">accusations by others</a> that <a href=\"http://Medium.com\">Medium.com</a> was in fact paying writers who produced favourable early reviews of TK.</p>\n<h2>PART FOUR: My Thoughts</h2>\n<p><a href=\"https://medium.com/blog/medium-day-2026-register-now-b58f0644ce10\">Medium Day for 2026</a> is only a few days away, and I was initially accepted as a speaker for the event, but I've since decided not to go through with it after looking at what Medium's stance on generative AI has become over the past year. Tony is once again set to do a keynote, where he's going to most likely going to to speak positively about generative AI.</p>\n<p>For me, personally, it has been more than frustrating watching <a href=\"https://medium.com/the-coach-life/fell-in-a-hole-got-out-381356ec8d7f\">the guy who saved Medium</a> start writing articles about <a href=\"https://coachtony.medium.com/i-fell-in-love-with-morning-pages-again-because-of-ai-48a7c76af7a1\">how he got back into morning pages thanks to AI</a>, or how he feels as though he has a <a href=\"https://coachtony.medium.com/a-presidential-briefing-for-every-aspect-of-my-day-9cc59cf6660d\">daily presidential briefing thanks to AI</a>. I have been a fan of Stubblebine since the <a href=\"http://Coach.me\">Coach.me</a> days, and I can tell he's passionate and smart—the decisions he's been making haven't been out of malice, but I do think they're misaligned.</p>\n<p>It is difficult to not view this as someone who has found a personal fascination with the technology and then decided to implement it into his professional business. And to be honest, I can't imagine everyone internally at Medium is happy with this pivot over the past year.</p>\n<p>I think it would be beneficial to everyone—and I mean writers, readers, staff and publication editors alike—if Medium returned to being a human-only platform and anti-AI company. I recognize that this ask is essentially an impossibility at this point. The genie is out, and I'm trying to close the barn doors when all the robotic horses are already gone. But the cognitive dissonance and mental gymnastics are obvious to everyone.</p>\n<p>I also recognize it is rather callous with regard to the time and effort that's most likely gone into developing the TK product and app, but it makes the most sense regardless. But I think TK can still exist, actually. But it shouldn't have a connection to <a href=\"http://Medium.com\">Medium.com</a>—if Stubblebine is interested in generative AI, I'm not going to mark that as a scarlet letter against him, but I do think it needs to be compartmentalized and separated from Medium as a platform. Just because a CEO's views changed doesn't mean the entire company's views need to change in turn.</p>\n<p>Overall, I am still going to be here, writing and reading on Medium, because I do not think the decisions Stubblebine is making are ruining Medium. It still has an incredible payment model for creators and writers, and is still one of the few places online that values longform, high-quality writing. It would be alarmist and just plain wrong to say the decision to lean into genAI is stopping any of that.</p>\n",
      "image": "https://brennan.day/assets/images/blog/sunbot.jpg",
      "date_published": "2026-09-15T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "AI",
        "generative AI",
        "Medium",
        "Digital Culture",
        "criticism",
        "technology",
        "publishing"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/there-is-so-much-to-love-and-celebrate-reclaim-joy-be-open-forgive/",
      "url": "https://brennan.day/there-is-so-much-to-love-and-celebrate-reclaim-joy-be-open-forgive/",
      "title": "There is so much to love and celebrate. Reclaim joy. Be open. Forgive.",
      "summary": "Taking stock of myself and the world, I reflect on the overwhelming joy of being alive on this Pale Blue Dot—from the billions keeping civilization running to the unpaid volunteers maintaining curl and OpenSSL—and argue that reclaiming joy is an act of resistance against systems built on scarcity and fear. People are inherently good, and there is always room for grace.",
      "content_html": "<p>Autumn continues with chilly winds and overcast skies, and I couldn't be more grateful. I've had a lot more eyes on my work than usual lately, and so I've taken stock over the past few days—trying to measure the inventory of myself.</p>\n<p>But to do so, I first start with the world.</p>\n<p>I think to myself of the billions of people across Earth who work hard on a near-daily basis. Those who are responsible for keeping the plumbing water-rushing and the lights bright and humming. Our oceans are peppered with titan-sized cargo ships carrying hundreds of millions of pounds of products—a lot of it made by people. Our skies dotted with aircraft thought impossible a century ago. How many colours of yarn are being knit? How many people are confessing their love right now? Petting their dog? How many children are writing their first poem, at this very moment?</p>\n<p>It is overwhelming how much joy and humour there is at any given moment. The surface of this planet carrying us, together, quietly travelling through the impossible vastness of space.</p>\n<p>We have so much in common. All people are nearly identical genetically, you know—99.9% of the genome is shared between us all. None of this is to say that we are without our differences and our faults, or that we're not facing problems minor and existential, but it is good to remember the good.</p>\n<p>I return once again to Carl Sagan, <a href=\"https://www.loc.gov/item/cosmos000110/\">speaking about our Pale Blue Dot</a>:</p>\n<blockquote>\n<p><a href=\"https://brennan.day/thats-home-thats-us/\">That's home. That's us.</a> On it everyone you love, everyone you know, everyone you ever heard of, every human being who ever was, lived out their lives. The aggregate of our joy and suffering, thousands of confident religions, ideologies, and economic doctrines, every hunter and forager, every hero and coward, every creator and destroyer of civilization, every king and peasant, every young couple in love, every mother and father, hopeful child, inventor and explorer, every teacher of morals, every corrupt politician, every &quot;superstar,&quot; every &quot;supreme leader,&quot; every saint and sinner in the history of our species lived there—on a mote of dust suspended in a sunbeam.</p>\n</blockquote>\n<p>Being a single person with a single lifetime on this mote of dust, I've been trying to answer the question &quot;who am I?&quot; my entire life. I think that's rather typical. I try my best to present an answer with clarity, with steadfast <a href=\"https://brennan.day\">values</a> and ethics. But the truth is far more malleable and nebulous.</p>\n<p>I have the irrational compulsion to leave the world better than I found it, however possible that may be. And I have an irrational compulsion to write and share it with you, reader.</p>\n<p>I want to be defined by my joy and positivity. I do not want to be defined by my enemies and what I'm against. And there's a lot of friction that goes up against that when I feel compelled to speak up on important issues I don't see others speaking up on enough. It is easy to mistake passion and care for outrage and scolding, I don't blame anybody for getting the wrong idea or a false impression.</p>\n<p>A lot of us are afraid of the same thing, and approach it from different directions—of institutions that don't answer to anyone, and of old money reshaping our world. Of being sorted into a side before anyone's bothered to ask what we actually believe.</p>\n<p>There are two constants I have tried to be consistent with in my writing. First, a warmth towards people. I try my best to thank others and attribute properly, and follow through on the promises I make to my readers.</p>\n<p>Second is a fury towards systems. The oppressive mechanics in place that subjugate most everyone, even those that argue in defense for them. Of course, there are exceptions to this, like individuals who are vectors of harm with power and money.</p>\n<p>I've never believed in the idea that you can win an argument. Whether it's the domestic mundane or philosophical, debates are exchanges and dialogues, not tribal contests.</p>\n<p>My fury is aimed at concentration—at the people who hoard power and spend it in the dark—not at whoever happens to be standing nearest, and not those who leave angry comments out of a need for catharsis.</p>\n<p>Those in power can throttle the money, chip at the reputation, threaten rights we assumed were permanent—but they cannot take the joy of simply getting to be alive on this rock, right now, with the people we love. And they cannot take the will to keep choosing it. <a href=\"https://muse.jhu.edu/article/249802\">Toi Derricotte wrote how joy is an act of resistance</a>, and <a href=\"https://www.akpress.org/pleasure-activism.html\">adrienne maree brown gave us pleasure activism</a>. Reclaiming our satisfaction is a way of resisting systems built on scarcity and our exhaustion. Every system built on fear needs you tired and joyless to keep operating and functioning. Do not go gently into that good night.</p>\n<p>Right now, while you read this, there are people maintaining the software the rest of us built our entire digital lives on top of, and ask for nothing in return. No corporate funding. No millionaires back them. People who have spent hours or decades creating the free, open-source digital commons. curl moves data on <a href=\"https://infrastructure-heroes.org/maintainers/daniel-stenberg/\">more than ten billion devices</a>. Phones, cars, streaming services, hardware sent to Mars. Maintained for nearly thirty years nearly single-handedly by a Swedish developer who never built a company nor took a salary from the corporations relying on his work every day. The encryption library OpenSSL, which protects two-thirds of the web's traffic—your banking, your email, your passwords—is maintained by <a href=\"https://www.propublica.org/article/the-u.s.-government-paying-to-undermine-internet-security-not-to-fix-it\">four volunteers, only one of them full-time, on a foundation budget of about two thousand dollars a year</a>. Ordinary people spend a good chunk of their one short life making something useful, because it was needed and they were capable of making it.</p>\n<p>So, I think I have not articulated enough that, because of things like the examples above, I believe people are inherently good. I have a deep optimism for our shared, collective future still. Despite everything. You are not forever-marked a bad person because you've done bad things. We will always have room for more grace and benevolence and restoration.</p>\n<p>I desperately try to remind myself often that all we have is each other. There is a short amount of time for all of us, a century at best, on a planet that's existed for 4.5 billion years. We will only ever experience up to 0.0000018% of Earth's history. And we will only ever experience up to 0.00000058% of the universe's existence.</p>\n<p>That's why I take stock and examine the inventory of myself. To ensure that I maintain the beauty of good discipline, and practice an everlasting optimism towards others. I am certainly far from succeeding in doing that all the time, but I am trying, I promise.</p>\n<h2>Submissions Open</h2>\n<p>Even now, when a handful of corporations try to control what billions of people are allowed to see, you can <em>still</em> put up a single page on <a href=\"https://neocities.org/\">Neocities</a>—a scrappy little <code>index.html</code>—and have it be seen and discussed. <a href=\"https://brennan.day/i-want-to-be-unremarkable/\">I'm not remarkable</a>, and what I do isn't clever. I took efforts, research, and arguments other people had painstakingly already done, spent a couple hours writing CSS and Markdown, ran it through a converter to spit out plain HTML, and uploaded it. That's it. <code>Ctrl+S</code> on that page and you'll have everything.</p>\n<p><a href=\"https://brennan.day/webmaster-a-manifesto-for-everyone/\"><strong>You can do this. For whatever important thing in your life is—or just for something you want to share with the world because it delights you—you can make a page and put it up and people will find it. Anybody can.</strong></a></p>\n<p>I already know what I want to build next. Another one-page site, but this one to collect good projects, code or otherwise, made by humans. If you've made something like that, tell me about it in the comments!</p>\n",
      "image": "https://brennan.day/assets/images/blog/double-rainbow.jpg",
      "date_published": "2026-09-14T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "optimism",
        "joy",
        "open source",
        "resistance",
        "philosophy",
        "small web",
        "IndieWeb"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/its-christlike-to-love-immigrants-and-transfolk/",
      "url": "https://brennan.day/its-christlike-to-love-immigrants-and-transfolk/",
      "title": "It's Christlike to Love Immigrants and Transfolk",
      "summary": "Responding to readers who invoke Christianity to defend exclusion, I argue that the Gospels consistently welcome lepers, foreigners, sinners, and gender-nonconforming people while reserving the strongest warnings for the wealthy and powerful. On the Christlike call to love immigrants and trans people, and why compassion cannot be rationed by politics.",
      "content_html": "<p>Since writing my article on <a href=\"https://brennan.day/normalized-fascism-in-open-source-12-million-given-to-dhh/\">DHH</a>, I've been getting an above-average number of emails in my inbox decrying my stance and public advocacy. And I have to be honest, I find it so <em>weird</em>, more than anything. It's confusing to me how many typical people—men of the same ilk as myself—want to play defence for the handful of millionaires and corporate executives and weird little guys. A lot of the time, religion will be invoked, specifically Christianity.</p>\n<p>I'm a Christian myself, I've written <a href=\"https://brennan.day/how-and-why-i-believe-in-god-the-ballad-of-tragic-theism/\">my testimony before</a>, and while I've had a wayward path, I know God meets people where they are.</p>\n<p>And that's why it's so baffling to me that people would attempt to invoke Christ when they tell me (and these are actual quotes from emails I've received) that they have scorn towards the &quot;underpaid illegal labor,&quot; and that they refuse to become &quot;inline with transgenderism&quot; and that their &quot;empathy and compassion are finite.&quot;</p>\n<p>It's baffling to me how the clear disdain for fellow human beings isn't obvious when they're spouting this rhetoric. And, perhaps more importantly, these kinds of beliefs are simply antithetical to the teachings of Jesus Christ in the Bible. Explicitly so. To go after the marginalized, to be anti-social justice, to support the rich? None of this is Christ-like.</p>\n<h2>Christ Touched the Untouchable</h2>\n<p>Let's begin when a leper came to Him, someone untouchable under the Law, and Jesus didn't keep His distance. <a href=\"https://www.biblegateway.com/passage/?search=Mark%201%3A40-41&amp;version=NKJV\">Mark 1:40–41</a> says:</p>\n<blockquote>\n<p>Now a leper came to Him, imploring Him, kneeling down to Him and saying to Him, &quot;If You are willing, You can make me clean.&quot;<br>\nThen Jesus, moved with compassion, stretched out His hand and touched him, and said to him, &quot;I am willing; be cleansed.&quot;</p>\n</blockquote>\n<p>Christ touched the untouchable. In <a href=\"https://www.biblegateway.com/passage/?search=Luke%2017%3A11-19&amp;version=NKJV\">Luke 17</a>, ten lepers stood at a distance, crying out for mercy. Jesus healed all ten. Only one turned back to thank Him, and he was a Samaritan, a foreigner and outsider.</p>\n<p>Jesus said to him, &quot;Arise, go your way. Your faith has made you well&quot; (<a href=\"https://www.biblegateway.com/passage/?search=Luke%2017%3A19&amp;version=NKJV\">Luke 17:19</a>). The outsider was the one who returned.</p>\n<p>A woman, often interpreted as a sex worker, and known as a sinner wept at His feet, washing Christ's feet with her tears and wiping them with her hair. And Jesus did not recoil at all. He instead said, &quot;Your sins are forgiven&quot; (<a href=\"https://www.biblegateway.com/passage/?search=Luke%207%3A36-50&amp;version=NKJV\">Luke 7:36–50</a>). He let her love be the evidence of grace. And later, in <a href=\"https://www.biblegateway.com/passage/?search=Matthew%2011%3A19&amp;version=NKJV\">Matthew 11:19</a>, Jesus said of Himself:</p>\n<blockquote>\n<p>The Son of Man came eating and drinking, and they say, 'Look, a glutton and a winebibber, a friend of tax collectors and sinners!'</p>\n</blockquote>\n<p>He did not deny it. Christ has always been a friend of sinners.</p>\n<h2>Love Your Neighbor, and Love the Stranger</h2>\n<p>Scripture does not leave neighbour-love to our finite instincts. <a href=\"https://www.biblegateway.com/passage/?search=Leviticus%2019%3A18&amp;version=NKJV\">Leviticus 19:18</a> says:</p>\n<blockquote>\n<p>&quot;You shall not take vengeance, nor bear any grudge against the children of your people, but you shall love your neighbor as yourself.&quot;</p>\n</blockquote>\n<p>And when a lawyer asked Jesus, &quot;Who is my neighbour?&quot; Jesus told <a href=\"https://www.biblegateway.com/passage/?search=Luke%2010%3A25-37&amp;version=NKJV\">the parable of the Good Samaritan</a>. A man is beaten and left for dead. A priest and a Levite pass by. The Samaritan stops, bandages his wounds, and pays for his care.</p>\n<p>The Samaritan was a despised foreigner.</p>\n<p>Jesus asks, &quot;So which of these three do you think was neighbor to him who fell among the thieves?&quot; (<a href=\"https://www.biblegateway.com/passage/?search=Luke%2010%3A36-37&amp;version=NKJV\">Luke 10:36</a>). Not the one who shared his language, culture, or passport. The answer is the foreigner, the one who showed mercy. Then Jesus says, &quot;Go and do likewise.&quot;</p>\n<p>The Law is explicit about immigrants. <a href=\"https://www.biblegateway.com/passage/?search=Leviticus%2019%3A34&amp;version=NKJV\">Leviticus 19:34</a>:</p>\n<blockquote>\n<p>&quot;The stranger who dwells among you shall be to you as one born among you, and you shall love him as yourself; for you were strangers in the land of Egypt: I am the Lord your God.&quot;</p>\n</blockquote>\n<p>And <a href=\"https://www.biblegateway.com/passage/?search=Deuteronomy%2010%3A19&amp;version=NKJV\">Deuteronomy 10:19</a> says:</p>\n<blockquote>\n<p>&quot;Therefore love the stranger, for you were strangers in the land of Egypt.&quot;</p>\n</blockquote>\n<p>This is clearly not about assimulation. God says to remember you were strangers, and love the stranger.\nChrist always touched lepers, forgave the sex worker, made the Samaritan a hero, and commanded us to love the foreigner as ourselves.</p>\n<h2>Christ and Those Outside the Binary</h2>\n<p>Christ also made room for the eunuchs. Those who were not fully male by the categories their culture recognized, barred by Mosaic law from full inclusion in the assembly of the Lord (Deuteronomy 23:1), and treated as neither one thing nor another. Bodies or identities which did not fit into the binary. And Scripture says not to condemn them, but to promise them a place.</p>\n<p><a href=\"https://www.biblegateway.com/passage/?search=Isaiah%2056%3A3-5&amp;version=NKJV\">Isaiah 56:3–5</a> says:</p>\n<blockquote>\n<p>&quot;Do not let the son of the foreigner who has joined himself to the Lord speak, saying, 'The Lord has utterly separated me from His people'; nor let the eunuch say, 'Here I am, a dry tree.' For thus says the Lord: 'To the eunuchs who keep My Sabbaths, and choose what pleases Me, and hold fast My covenant, even to them I will give in My house and within My walls a place and a name better than that of sons and daughters; I will give them an everlasting name that shall not be cut off.'&quot;</p>\n</blockquote>\n<p>God doesn't tell the eunuch to become something else before he's welcome. God tells him his exclusion is over. Better than sons and daughters. An everlasting name.</p>\n<p>In <a href=\"https://www.biblegateway.com/passage/?search=Matthew%2019%3A12&amp;version=NKJV\">Matthew 19:12</a>, after His disciples balk at His teaching on marriage, Jesus says:</p>\n<blockquote>\n<p>&quot;For there are eunuchs who were born thus from their mother's womb, and there are eunuchs who were made eunuchs by men, and there are eunuchs who have made themselves eunuchs for the kingdom of heaven's sake. He who is able to accept it, let him accept it.&quot;</p>\n</blockquote>\n<p>Jesus names those born that way, made that way by others, and those who choose it. There is no condemnation. He doesn't erase the differences. He says some people don't fit the categories everyone assumes, and that's alright with Him.</p>\n<p>In <a href=\"https://www.biblegateway.com/passage/?search=Acts%208%3A26-40&amp;version=NKJV\">Acts 8</a>, Philip is sent out to the desert road to meet an Ethiopian eunuch, a court official, reading Isaiah in his chariot. This man is a foreigner, a Gentile, and a eunuch who would have been excluded from full worship at the Temple under Mosaic law. Philip does not hesitate. He explains the good news, and when they come to water, the eunuch asks, &quot;See, here is water. What hinders me from being baptized?&quot; (<a href=\"https://www.biblegateway.com/passage/?search=Acts%208%3A36&amp;version=NKJV\">Acts 8:36</a>). Nothing hinders him. Philip baptizes him on the spot. The very first Gentile convert recorded after Pentecost is a gender-nonconforming outsider. Christ's church opens the door wide.</p>\n<p>Paul, in <a href=\"https://www.biblegateway.com/passage/?search=Galatians%203%3A28&amp;version=NKJV\">Galatians 3:28</a> writes:</p>\n<blockquote>\n<p>&quot;There is neither Jew nor Greek, there is neither slave nor free, there is neither male nor female; for you are all one in Christ Jesus.&quot;</p>\n</blockquote>\n<p>The categories the world uses to rank and exclude people, including the male/female binary used to justify so much hate today, collapse at the foot of the cross. If Christ's own body of believers has no use for &quot;male nor female&quot; as a line of division, then the transfolk in our pews, our families, and our replies aren't a problem to be solved. They're already inside the &quot;all one&quot; Paul is describing.</p>\n<p>Given all this—the leper, the Samaritan, the sinner, the eunuch, the stranger—I struggle to find a single figure Christ excluded who was already reaching for Him. He was short with those hoarding power, and those turning away the vulnerable to protect their wealth.</p>\n<h2>Camels and Needles</h2>\n<p>And what of the rich? Let's not forget that the <a href=\"https://omacom.io/\">Omacom Foundation</a> received over 18 million dollars, the majority of it coming from the personal bank accounts of millionaires. In <a href=\"https://www.biblegateway.com/passage/?search=Matthew%2019%3A24&amp;version=NKJV\">Matthew 19:24</a>:</p>\n<blockquote>\n<p>&quot;It is easier for a camel to go through the eye of a needle than for a rich man to enter the kingdom of God.&quot;</p>\n</blockquote>\n<p>A rich young ruler asked what he must do to inherit eternal life. Jesus told him, &quot;If you want to be perfect, go, sell what you have and give to the poor, and you will have treasure in heaven; and come, follow Me&quot; (<a href=\"https://www.biblegateway.com/passage/?search=Matthew%2019%3A21&amp;version=NKJV\">Matthew 19:21</a>). Of course, the ruler was devastated. For he had so, so much.</p>\n<p>In <a href=\"https://www.biblegateway.com/passage/?search=Luke%2012%3A15&amp;version=NKJV\">Luke 12:15</a>, Jesus said,</p>\n<blockquote>\n<p>&quot;Take heed and beware of covetousness, for one's life does not consist in the abundance of the things he possesses.&quot;</p>\n</blockquote>\n<p>And He told <a href=\"https://www.biblegateway.com/passage/?search=Luke%2012%3A16-21&amp;version=NKJV\">the parable of the rich fool</a> (Luke 12:16–21), the fool who built bigger barns for his surplus grain and said to himself, &quot;Soul, you have many goods laid up for many years; take your ease; eat, drink, and be merry.&quot; But God said to him, &quot;Fool! This night your soul will be required of you; then whose will those things be which you have provided?&quot;</p>\n<p>In <a href=\"https://www.biblegateway.com/passage/?search=Matthew%206%3A19-21&amp;version=NKJV\">Matthew 6:19–21</a>:</p>\n<blockquote>\n<p>&quot;Do not lay up for yourselves treasures on earth, where moth and rust destroy and where thieves break in and steal; but lay up for yourselves treasures in heaven, where neither moth nor rust destroys and where thieves do not break in and steal. For where your treasure is, there your heart will be also.&quot;</p>\n</blockquote>\n<p><a href=\"https://www.biblegateway.com/passage/?search=James%205%3A1-6&amp;version=NKJV\">James 5:1–6</a> is even more direct:</p>\n<blockquote>\n<p>&quot;Come now, you rich, weep and howl for your miseries that are coming upon you! Your riches are corrupted, and your garments are moth-eaten. Your gold and silver are corroded, and their corrosion will be a witness against you and will eat your flesh like fire. You have heaped up treasure in the last days. Indeed the wages of the laborers who mowed your fields, which you kept back by fraud, cry out; and the cries of the reapers have reached the ears of the Lord of Sabaoth. You have lived on the earth in pleasure and luxury; you have fattened your hearts as in a day of slaughter. You have condemned, you have murdered the just; he does not resist you.&quot;</p>\n</blockquote>\n<h2>Empathy of the Spirit</h2>\n<p>Empathy and compassion are fruit of a Spirit that multiplies loaves and fishes. To attempt to desperately ration it, to instead prioritize those who look like you and act like you—sounds like the priest and the Levite, stepping around the body in the road because helping is inconvenient and beneath them. There is no love there. I don't hear Christianity. I hear Matthew 19's rich young ruler, walking away grieving because the cost of love was too high. I hear James warning the rich to weep and howl for what's coming.</p>\n<p>Scripture, especially Christ's teachings, were always centered around loving those that society deemed the most difficult to love, and the easiest to hate. And Christ never promised the Kingdom of Heaven to the rich and powerful.</p>\n<p>I know Gospel will continue to be politicized and weaponized for cruelty, I know that. But it is really an invitation, repeated across a thousand pages. It is not difficult to figure out how to practice Christ's teachings in the modern day. It is easy to see who is being shunned and cast out, and who are being rejected and targeted. It is up to followers to do the right thing and <em>love</em>, and to speak up against injustice and power the way Christ did. That is simply what it looks like to follow Him.</p>\n<p>Go and do likewise.</p>\n",
      "image": "https://brennan.day/assets/images/blog/cross.jpg",
      "date_published": "2026-09-13T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "Christianity",
        "religion",
        "theology",
        "Social Justice",
        "LGBTQ",
        "trans rights",
        "immigration",
        "faith"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/a-quarter-of-a-century-later/",
      "url": "https://brennan.day/a-quarter-of-a-century-later/",
      "title": "A Quarter of a Century Later",
      "summary": "On the twenty-fifth anniversary of September 11, I reflect on being five years old and watching the attacks from a green shag carpet in Winnipeg, the cultural aftershocks that still echo through media and memory, and the urgent need to not forget the cruelty and the kindness of that day and its aftermath.",
      "content_html": "<p>I was five years old, sitting on a dark green shag carpet in my home in Winnipeg, witnessing the television the way everyone else was. My mother was pregnant with my little brother, and she wondered how she could bring another life into a world where something like this could happen.</p>\n<p>I was born in the middle of the 1990s, in the middle of the 'peaceful' decade, wedged between the Cold War and the War on Terror. The rise of the early internet made people believe in a connected, peaceful world with open borders and shared knowledge. The United States was understood to be the last remaining global superpower, and citizens felt safe from foreign threats.</p>\n<p>It took only a handful of men with a plan to irreversibly change that.</p>\n<p>A sobriety washed over the world, the taste of ash and dust. And we are now distant enough that an entire generation of millions only knows about what happened from archival footage (often <a href=\"https://heatherburns.tech/2026/09/05/the-age-gating-of-history/\">age-gated</a>) and textbooks.</p>\n<p>While there is one generation who only understands the day as history in textbooks, there are several others who were lucid and present. I was only a few years away from those who remember teachers rolling in a television so they could watch the carnage live as the world fell apart. A horror unifying the previously sheltered children and adolescents of such a superpower.</p>\n<p>And there are many who do not understand why this is still talked about, especially when so many other tragedies are not. It's a fair question, as <a href=\"https://costsofwar.watson.brown.edu/costs/human\">over a million have died</a> in Iraq, Afghanistan, Syria, Yemen, and Pakistan between 2001 and 2023 as a result. As a response.</p>\n<p>For what came afterwards? Fear and paranoia and grief cultivated into a national unity. Flags displayed in record numbers, political differences set aside, approval ratings for the federal government and political leadership reaching levels unseen in decades. <a href=\"https://www.vanityfair.com/story/how-9-11-altered-the-world\">The birth of the digital media era</a>.</p>\n<p>The culture spawned is what really gets me.</p>\n<p>You have Robert Pattinson's performance in <em>Remember Me</em> (2010), the ending of Ottessa Moshfegh's <em>My Year of Rest and Relaxation</em>. You have the fourteenth studio album by Cat System Corp, <a href=\"https://www.youtube.com/watch?v=MGnrCbgiwhk\"><em>News at 11</em></a>. You have <a href=\"https://www.washingtonpost.com/nation/interactive/2021/loose-change-korey-rowe-911-truth-conspiracy/\">Loose Change</a> and Michael Moore's documentary, <em>Fahrenheit 9/11</em>. The podcast about <a href=\"https://art19.com/shows/9-12\">the day after</a>. The hoax of lost media in <a href=\"https://lostmediawiki.com/%22LOL_SUPERMAN%22_(lost_World_Trade_Center_Plaza_footage_from_the_September_11th_attacks;_existence_unconfirmed;_2001)\">&quot;LOL SUPERMAN&quot;</a>. The thousand tasteless jokes. The <a href=\"https://english.elpais.com/culture/2026-08-27/the-fake-911-survivor-how-a-barcelona-woman-created-the-perfect-lie-that-moved-the-united-states.html\">woman who wasn't there</a>. The disappearance of <a href=\"https://www.newsnationnow.com/us-news/sept11-anniversary/sneha-ann-philip-doctor-911-new-york-city-missing/\">Dr. Sneha Anne Philip</a>. The comedian Jon Stewart desperately trying to push the <a href=\"https://www.911memorial.org/connect/blog/op-ed-why-jon-stewart-fights-those-sick-and-dying-911-related-illnesses\">James Zadroga Act</a> through Congress and save lives. I'm sure I don't need to tell you that <a href=\"https://faroutmagazine.co.uk/9-11-led-to-the-formation-of-my-chemical-romance/\">My Chemical Romance exists because of it</a>, or how Seth MacFarlane <a href=\"https://faroutmagazine.co.uk/how-seth-macfarlane-narrowly-escaped-tragedy-on-9-11-flight/\">overslept</a> and avoided being a passenger.</p>\n<p>We try to connect the dots and understand in retrospect, and in truth, this is how I understand what happened. Through the echoes and reverberations caught in media. I was too young to have the memory of the live recordings of buildings imprinted in my mind as it happened. But I can remember my mom, the awful green shag carpet, and how excited I was to have a little brother born seven months later.</p>\n<p>There are <a href=\"https://www.youtube.com/watch?v=zx8_Pumdkpg\">hours-long dashboards</a> on YouTube going through the morning. A masterful compilation of various television stations, news tickers, flight logs, with facts and figures all presented as-it-happened, from 7:46AM to noon. I return to this often, replaying the events, trying to pinpoint exactly when it was understood that the accidental was really intentional. Trying to find the specific moment it was understood the entire world had changed.</p>\n<p>Is this what it means to remember—to hoard cultural aftershocks like a magpie?</p>\n<p>It's been a quarter of a century. I have nothing new to share with you, only a mimicry of what's been said countless times before, spun around different threads of ideology. What else do we have left now but rumination? To pick the still-sore scar never fully healed. To orbit the Xerox'd questions and grief and loss. There is still sense left on the table, still a dozen ways to pattern-recognize. It's only human.</p>\n<p>I do not want to forget. I do not want to forget the consequences of cruelty. I do not want to forget <a href=\"https://www.911memorial.org/connect/blog/lend-hand-do-what-you-can-remembering-generosity-gander\">Gander, Newfoundland taking in 6,000 people on 30 flights</a>. I do not want to forget the Red bandanna man Welles Crowther. I do not want to forget <a href=\"https://timeline.911memorial.org/timeline/10681/audios/26/366\">the voicemail of Brian Sweeney</a> from Flight 175. I do not want to forget <a href=\"https://www.911memorial.org/connect/blog/recognizing-war-hero-who-led-wtc-survivors-safety-911\">Rick Rescorla</a> singing hymns down the stairwell megaphone. I do not want to forget the impossible selflessness of the people who climbed 110 flights of stairs while wearing 90 pounds of FDNY gear just to try to save one more straggler, just one more human being. I do not want to forget the undue violence in the response that came after. I do not want to forget. Please don't let me forget.</p>\n",
      "image": "https://brennan.day/assets/images/blog/towers.jpg",
      "date_published": "2026-09-11T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "history",
        "memory",
        "9/11",
        "September 11",
        "terrorism",
        "grief",
        "culture",
        "media"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/oldnets-and-altnets-a-guide-to-building-a-low-spec-daily-internet-out-of-gemini-gopher-and-terminal-tools/",
      "url": "https://brennan.day/oldnets-and-altnets-a-guide-to-building-a-low-spec-daily-internet-out-of-gemini-gopher-and-terminal-tools/",
      "title": "Oldnets and Altnets: A Guide to Building a Low-Spec Daily Internet Out of Gemini, Gopher, and Terminal Tools",
      "summary": "Reacting to the Omarchy and DigitalOcean news, I set out a curated low-spec, text-first alternative to the modern web: Gemini, Gopher, Spartan, Lynx-friendly sites, terminal readers, public Unix communities, and peer-to-peer networks like Yggdrasil, I2P, and Hyphanet.",
      "content_html": "<p>With news of <a href=\"https://omarchy.org/news/2026/09/digitalocean-joins-as-founding-corporate-patron/\">DigitalOcean deciding to give $3 million dollars to Omarchy and DHH</a>, I thought it would be fitting to once again take a look at alternative visions of what our Internet can be.</p>\n<p>For after writing about the Internet <em>on the Internet</em> for almost an entire year straight, I think I need a change. The IndieWeb is wonderful, and I'm so thankful for the viable, well-populated people-oriented alternatives that exist to replace nearly all facets of corporate social media—but I would be lying if I said this version of the Internet wasn't without its own flaws, too.</p>\n<p>Our Internet is cluttered, bloated with complex systems and scripts for the sake of visual interest, interactivity, and social engagement. I am no better myself, for even my own website, <a href=\"https://brennan.day\">Brennan.day</a>, which could be pared down to only a list of plain-text essays, is full of unnecessary additional functionality and styles which would cause it to load slowly on older or lower-powered devices.</p>\n<p>With this complexity comes reliance on systems created by others as well. Mastodon, the most successful and popular decentralized social networking and microblogging platform, is a <a href=\"https://docs.joinmastodon.org/dev/overview/\">&quot;a Ruby on Rails application with a React.js front-end.&quot;</a> RoR being the <a href=\"https://brennan.day/normalized-fascism-in-open-source-12-million-given-to-dhh/\">product created by DHH</a>, and React being the <a href=\"https://www.aljazeera.com/features/2026/8/27/metas-18bn-settlement-how-social-platforms-will-change-for-child-users\">product created by Meta</a>.</p>\n<p>As someone who never used a microblogging social network service prior to signing up for <a href=\"https://social.lol\">social.lol</a> on the <a href=\"https://jointhefediverse.net/?lang=en-us\">Fediverse</a>, I have to say that I love Mastodon. I've already <a href=\"https://social.lol/@brennan\">made over 1,000 posts</a> and follow over 1,500 accounts which gives me a busy but high-quality feed thanks to the wonderful curation of <a href=\"https://fedi.directory/\">Fedi Directory</a>. And it would be a massive undertaking to change the stack which Mastodon uses.</p>\n<p>But I'll point out that there are alternatives, such as <a href=\"https://misskey-hub.net/en/\">Misskey</a>, which uses <a href=\"https://kai-you.net/article/86094\">&quot;Node.js. TypeScript is used on both the frontend and backend. PostgreSQL is used as its database. Vue.js is used for the frontend.&quot;</a>.</p>\n<p>Really, though, I want to distance myself from the entire paradigm of these complex technical stacks, the boiling-frog Internet that cleverly uses HTML, CSS, and (mostly) JavaScript to build things on top of the same technologies which have existed for decades.</p>\n<p>I think of Orson Welles, who wrote &quot;if you give somebody constraints, it's easier to be creative.&quot; And I believe that is exactly what I need. Constraint.</p>\n<p>I've written before about <a href=\"https://brennan.day/gemini-gophers-and-fingers-oh-my-alternative-internets-beyond-https/\">Gemini</a> and alternative Internets, I've set up a <a href=\"https://smol.pub\">smolpub</a> and a gemini-only <a href=\"https://tilde.pink\">tilde.pink</a> account. I've configured one of my ThinkPads to be terminal-only with <a href=\"https://brennan.day/i-would-have-written-a-shorter-blog-post-but-i-didn-t-have-the-time-creating-a-writerdeck/\">no desktop environment or graphical user-interface</a>, but I still haven't reached where I want to go.</p>\n<p>It's easy to set up an old machine to be offline-only, and it's also easy to set up a headless Linux distro. It's much harder to make such a limited device your daily driver, let alone being the exclusive device you use.</p>\n<p>This is where I realize I want to journey towards: the fraction of the Internet that will not only load but function well on low-end, cheap hardware paired with lean, modern software.</p>\n<p>I have the hardware, and I know the software and tools required for this. The main issue is curation, and the lack of other participants. It's wonderful that we have the choice to use these alternative protocols, and that software exists to interface with them for all desktop operating systems, but the problem of discovery remains. Therefore, I need to research and make lists, and I am on a journey to collect anything that falls within the following:</p>\n<ul>\n<li>Interesting and recently updated websites using alternative protocols, including <a href=\"https://geminiprotocol.net/\">Gemini</a> capsules, <a href=\"https://cheapskatesguide.org/articles/gopherspace.html\">Gopher</a> holes, <a href=\"https://portal.mozz.us/spartan/spartan.mozz.us/\">Spartan</a> servers, and similar protocols</li>\n<li>Sites on the <a href=\"https://yggdrasil-network.github.io/\">Yggdrasil network</a></li>\n<li>Websites that display well in the <a href=\"https://lynx.invisible-island.net/\">Lynx</a> text browser</li>\n<li>Plain-text, text-only websites</li>\n<li>Any and all terminal-based programs</li>\n</ul>\n<p>There are also other peer-to-peer networks and protocols I'm interested in and don't know a lot about, including the <a href=\"https://i2p.net/en/\">Invisible Internet Project</a>, the <a href=\"https://lokinet.org/\">Lokinet</a>, the <a href=\"https://www.hyphanet.org/index.html\">Hyphanet</a>, and the <a href=\"https://www.gnunet.org/en/index.html\">GNUnet</a>. I want to emphasize I'm not interested in the privacy or security of these networks (although that certainly is important, please don't get me wrong) but rather the low-spec, accessible nature of them.</p>\n<h2>What I Found</h2>\n<p>A useful low-spec Internet already exists, but it's scattered across several ecosystems. There are <strong>Gemini and Gopher aggregators</strong>, <strong>server-rendered discussion sites</strong>, <strong>plain-text libraries</strong>, <strong>terminal readers</strong>, and <strong>public Unix communities</strong>. These resources are practical as they minimize page weight, reduce client-side dependencies, or expose content directly as text.</p>\n<p>The most immediately usable route is a layered one. For ordinary HTTP(S), I use a text browser like <strong><a href=\"https://lynx.invisible-island.net/\">Lynx</a></strong>, for RSS and Atom, <strong><a href=\"https://newsboat.org/\">Newsboat</a></strong>, for Gemini, a client such as <strong><a href=\"https://gmi.skyjake.fi/lagrange/\">Lagrange</a></strong>, and for Gopher, either a native client or <strong><a href=\"https://gopher.floodgap.com/gopher/\">Floodgap's Gopher proxy</a></strong>. Add a public shell community such as <strong><a href=\"https://sdf.org/\">SDF</a></strong> and your machine becomes a social and publishing tool.</p>\n<p>And there's activity in these places! CAPCOM showed Gemini entries dated 2026-09-09, and the Gemini BBS had posts from hours earlier. Midnight Pub lists a 2026-09-09 post, Bongusta aggregated Gopher posts from 2026-09-08, and Bitreich's news was dated 2026-09-04. I checked pages and selected native endpoints on 2026-09-09. The Gemini checks returned successful Gemini status <code>20</code>; the Spartan check returned status <code>2</code>; and selected Gopher endpoints returned menus over TCP port 70.</p>\n<p><strong><a href=\"https://gemini.bortzmeyer.org/software/lupa/\">Stéphane Bortzmeyer's Lupa crawler</a></strong> recently counted 5,218 known capsules, of which 3,548 were reachable, serving up around 717,000 pages of Gemtext between them. Veronica-2's most recent index of Gopherspace put it at 411 active servers and just under 5.9 million unique selectors as of January 2026.</p>\n<p>The limitation is not that these networks are empty. Rather, it is that they are small, intermittently maintained, and hard to find without indexes, and hosting is ironically rather centralized: Flounder, Yesterweb, and Smol Pub alone account for something like 60% of all reachable Gemini capsules. This is exactly why we need more <strong>curation, feed-making, and clear status labeling</strong>.</p>\n<p><strong>⚠️ Important note:</strong> After I first published this piece, a reader wrote in to say that Bitreich and <a href=\"http://suckless.org\">suckless.org</a> are &quot;absolutely fash-oriented, if not openly neo-Nazi,&quot; pointing to torch-lit processions and &quot;old German folk tunes&quot; sung at their annual congress. They also noted that a significant number of the USians active in Gopher lean far-right more broadly.</p>\n<p>Small, low-bandwidth, technically-constrained spaces are absolutely not inherently virtuous just because they reject the mainstream Internet. Constraint and simplicity can just as easily be used to build a clubhouse that keeps people out as one that lets people in. If you go looking in Gopherspace (or IRC, or any of the other corners in this list), go in with your eyes open, and please tell me if you run into the same thing. This is the labelling I meant when I said discovery needs &quot;ongoing human curation.&quot;</p>\n<h2>Gemini, Gopher, Spartan, and Similar Protocols</h2>\n<p><strong><a href=\"gemini://geminiprotocol.net/\">Project Gemini</a></strong> is the canonical protocol documentation, still led by its pseudonymous creator <a href=\"https://brennan.day/gemini-gophers-and-fingers-oh-my-alternative-internets-beyond-https/\">Solderpunk</a>. <strong><a href=\"gemini://geminiquickst.art/\">Gemini Quickstart</a></strong> is the onboarding guide and directory for newcomers, built and maintained by Jason McBrayer since 2021; an <a href=\"https://geminiquickst.art/\">HTTPS mirror</a> is available if you don't have a native client yet.</p>\n<p><strong><a href=\"gemini://gemini.circumlunar.space/capcom/\">CAPCOM</a></strong> was the very first Gemini feed aggregator, written by Solderpunk himself and modeled directly on the Gopher phlog aggregator Bongusta below. It's currently aggregating 76 Atom feeds, and it randomly rotates 100 URLs into its output each month, so you're not guaranteed to see the same capsule twice; an HTTPS portal exists at <a href=\"https://portal.mozz.us/gemini/gemini.circumlunar.space/capcom/\">portal.mozz.us</a>.</p>\n<p><strong><a href=\"gemini://bbs.geminispace.org/\">Gemini BBS</a></strong> provides participation rather than only reading, with discussion, microblogging, and issue tracking, all running on Jaakko Keränen's (of Lagrange fame) software called Bubble. You register with a TLS client certificate instead of a password, and as of a 2025 survey, about 100 people post or comment there every month.</p>\n<p><strong><a href=\"gemini://midnight.pub/\">Midnight Pub</a></strong> is small-scale personal publishing with a human-scale social feel, run by m15o since roughly 2020 as a &quot;virtual pub.&quot; Every member gets their own <code>username.midnight.pub</code> homepage. While there's no way to post directly over Gemini yet (Gemini's URI length limits make long posts awkward), there's a shell script called <code>midnight.sh</code>. The publishing interface is at <a href=\"https://speakeasy.midnight.pub\">speakeasy.midnight.pub</a>.</p>\n<p><strong><a href=\"gemini://kennedy.gemi.dev/\">Kennedy</a></strong> provides discovery, historical snapshots, backlinks, and health information, built by acidus99 using the same architecture ideas as early web crawlers like Mercator and the Internet Archive. It has a &quot;Delorean Time Machine&quot; (basically a Wayback Machine for Geminispace), a capsule-health report, a certificate validator, and backlink lookup.</p>\n<p>The <strong><a href=\"spartan://spartan.mozz.us/\">Spartan homepage</a></strong> is a simple sibling protocol combining ideas from Gemini, Gopher, and HTTP, designed by Michael Lazar. It sends plain ASCII requests over TCP on port 300 (referencing the 300 Spartans of Thermopylae) and it uses Gemtext as its default document format, with only four single-digit status codes. Check out the <a href=\"https://github.com/michael-lazar/spartan\">repository</a>.</p>\n<p><strong><a href=\"gopher://gopher.floodgap.com/1/v2\">Veronica-2</a></strong> makes search possible in a distributed menu-based network, and is the only Veronica search engine still operating, run by Cameron Kaiser at Floodgap. Its welcome page claims coverage of roughly 5.1 million selectors, about 80% of all of Gopherspace by Floodgap's own estimate; an HTTPS gateway is at <a href=\"https://gopher.floodgap.com/gopher/gw?gopher.floodgap.com/1/v2\">Floodgap Veronica-2</a>.</p>\n<p>The <strong><a href=\"gopher://gopher.floodgap.com/1/world\">Floodgap World directory</a></strong> lists servers and crawler-derived activity information. Kaiser has run Floodgap since around 1999–2000 (it started life as <code>gopher.ptloma.edu</code>), and the public proxy alone reportedly handles over 26 million requests a year. An <a href=\"https://gopher.floodgap.com/gopher/gw?gopher.floodgap.com/1/world\">HTTPS gateway</a> is available.</p>\n<p><strong><a href=\"gopher://sdf.org/1/\">SDF Gopherspace</a></strong> connects shell access, personal Gopherspace, phlogs, and community tools. SDF, the Super Dimension Fortress, has run continuously since 1987, when Ted Uhlemann started it as an anime-themed BBS on an Apple IIe. Its historical society reports over 707,000 accounts created across 36 years. The <a href=\"https://sdf.org/\">SDF homepage</a> exposes shell, Gopher, SSH, telnet, IRC, and Git services.</p>\n<p><strong><a href=\"gopher://i-logout.cz/1/bongusta/\">Bongusta</a></strong> is a current stream of distributed Gopher writing, written in Perl since summer 2017 by the operator of <a href=\"http://i-logout.cz\">i-logout.cz</a>. The name is Esperanto for &quot;tasty, luscious, palatable,&quot; and it currently aggregates around 85 active phlogs, pruning ones that have gone quiet and only adding new writers once they've kept it up for about three months.</p>\n<p><strong><a href=\"gopher://gopher.black/1/\">gopher.black</a></strong> shows Gopher's expressive side through fiction, recipes, games, interactive writing, and a book-review search.</p>\n<p><strong><a href=\"gopher://gopherpedia.com/1/\">Gopherpedia</a></strong> is a Wikipedia-style reference through a low-bandwidth menu and search interface, created by Colin Mitchell and released in June 2013. At launch, Mitchell claimed it was probably the largest gopher site in existence, at roughly 4.2 million pages and over 10 GB. An HTTPS gateway is at <a href=\"https://gopher.floodgap.com/gopher/gw?gopherpedia.com/1/\">Gopherpedia</a>.</p>\n<p><strong><a href=\"gopher://gopher.quux.org/1/\">quux.org archive</a></strong> preserves software, books, Internet history, and other collections. It's run by John Goerzen, who registered the domain in 2000 specifically to host &quot;obscure old technology&quot; under an &quot;obscure old name&quot;—RFCs, Project Gutenberg mirrors, Kermit, old operating systems, even a mirror of Usenet posts from 1981.</p>\n<h2>Lynx-Friendly and Plain-Text Web Resources</h2>\n<p><strong><a href=\"https://lynx.invisible-island.net/\">Lynx</a></strong> is the direct tool for browsing HTML without a graphical interface, and it's often called the oldest web browser still under active maintenance. Lou Montulli, Michael Grobe, and Charles Rezac built it in 1992 at the University of Kansas as a campus hypertext and Gopher browser; today it's maintained by Thomas Dickey, with the most recent stable version at 2.9.3.</p>\n<p><strong><a href=\"https://news.ycombinator.com/\">Hacker News</a></strong> is server-rendered stories and comments that remain useful on a terminal (news and discussion). Rather infamous now, Paul Graham launched it in February 2007 as &quot;Startup News&quot; to road-test Arc, the Lisp dialect he co-created; the server-side code is still written in Arc today.</p>\n<p><strong><a href=\"https://lobste.rs/\">Lobste.rs</a></strong> offers compact story listings, tags, and comments without a mandatory JavaScript application (technology discussion). Joshua Stein launched it in 2012, with no JavaScript for logged-out visitors and minimal CSS that works in old and experimental browsers alike.</p>\n<p><strong><a href=\"https://www.cbc.ca/lite/\">CBC Lite</a></strong> is a lighter Canadian and world news interface (low-bandwidth news), built for the more than one million Canadians without high-speed Internet access.</p>\n<p><strong><a href=\"https://68k.news/\">68k News</a></strong> is a headline/source stream that is practical on constrained hardware (a text-first headline aggregator). It's built by Sean of the YouTube channel Action Retro, marketed with the tagline &quot;Headlines from the Future,&quot; and rendered to load on a Mac SE/30 running Netscape from the 1990s. Sadly, a reader ,let me know that click-through has been broken for a while now. I confirmed it myself with <code>curl</code>, and every article link routes through <code>article.php?a=</code> to a Google News RSS redirect, which the site then tries to scrape with its Readability port and fails on (&quot;Failed to get the article 😦 Sorry - working on it!&quot;). Headlines still load fine but you can't read full stories.</p>\n<p>If you want something that works, <strong><a href=\"https://plaintext.report/\">plaintext.report</a></strong> and <strong><a href=\"https://plaintextheadlines.com/\">PlaintextHeadlines</a></strong> are both replacements. Rather than proxying through Google News, they link to the publisher's own URL, so <code>curl -L</code> (or any browser) You can use the following command:</p>\n<pre><code>curl -L --max-time 15 -o /dev/null -w &quot;%{http_code} %{url_effective}\\n&quot; https://plaintext.report/\n</code></pre>\n<p>and then follow any headline link the same way.</p>\n<p><strong><a href=\"https://frogfind.de/\">FrogFind</a></strong> adapts search results for old browsers and low-resource systems (a vintage-computer search). Also from Sean/Action Retro, it strips DuckDuckGo results and article pages down through a PHP port of Readability, stripping out ads and JavaScript, allowing pages to render on ancient browsers.</p>\n<p><strong><a href=\"https://old-search.marginalia.nu/\">Marginalia old interface</a></strong> offers an older layout for text-browser users and surfaces small-web material (a non-commercial search). It's an independent, open-source search engine built and run solo by Viktor Lofgren in Sweden, with no investors or loans, deliberately favouring text-heavy, non-commercial pages over mainstream web design.</p>\n<p><strong><a href=\"https://wiby.me/\">Wiby</a></strong> has sparse search and &quot;surprise me&quot; discovery to support exploration of simpler pages (a small-web search). Built by the pseudonymous developer wibyweb in 2018, it relies on human submissions rather than crawling the whole web.</p>\n<p><strong><a href=\"https://sourcehut.org/\">SourceHut</a></strong> provides Git/Mercurial hosting, mailing lists, CI, wikis, and static hosting without a mandatory JavaScript front end (a software forge). Drew DeVault opened it to public alpha in November 2018 after two years of private development. A typical page loads at around 57 KB, versus roughly 780 KB for a comparable GitHub page.</p>\n<p><strong><a href=\"https://www.gutenberg.org/files/1342/1342-0.txt\">Project Gutenberg text edition</a></strong> is a direct text book that can be downloaded, searched, cached, and read with a pager (a plain-text book). Michael Hart founded the project in 1971 by typing the U.S. Declaration of Independence into a university mainframe. The catalogue now holds nearly 78,000 free ebooks. The main catalogue is at <a href=\"https://www.gutenberg.org/\">gutenberg.org</a>.</p>\n<p><strong><a href=\"https://www.rfc-editor.org/rfc/rfc9110.txt\">RFC Editor text edition</a></strong> provides durable technical documents without HTML rendering requirements (a plain-text standards reference). The RFC series dates to April 1969 and Steve Crocker's RFC 1, written to help design the ARPANET, and it's been the internet's archival technical record ever since. Text-only download help is at the <a href=\"https://www.rfc-editor.org/series/rfc-download/\">RFC download page</a>.</p>\n<p><strong><a href=\"http://www.textfiles.com/\">TEXTFILES.COM</a></strong> is a large cultural archive of ASCII art, BBS material, mailing lists, and historical text (an ASCII and BBS archive). Jason Scott has run it since 1998 to preserve text files from the 1980s BBS scene, and by 2017 it was drawing 350,000 to 450,000 unique visitors a month.</p>\n<p><strong><a href=\"https://onlinebooks.library.upenn.edu/\">Online Books Page</a></strong> is a searchable catalog of free books, authors, subjects, and serials (a free-book index). John Mark Ockerbloom started it in 1993 while a student at Carnegie Mellon, and it moved to the University of Pennsylvania in 1999, now indexing more than 3 million titles.</p>\n<p><strong><a href=\"https://solar.lowtechmagazine.com/about/\">Low-tech Magazine solar site</a></strong> is a visible example of designing a publication around limited energy and offline reading (an energy-conscious publication). Kris De Decker launched it in September 2018, running on a tiny board that draws one to two and a half watts off a 30-watt solar panel and lead-acid battery. The page background shifts from yellow to blue as the battery drains, and the site goes dark below 12 volts, until the sun comes back. The offline-reading guide is at <a href=\"https://solar.lowtechmagazine.com/offline-reading/\">solar.lowtechmagazine.com/offline-reading</a>.</p>\n<p><strong><a href=\"https://txt.fyi/\">txt.fyi</a></strong> is a constrained publishing form for text-oriented pages (plain-text micro-publishing), created by Boing Boing co-editor Rob Beschizza. There are no accounts, comments, likes, analytics, or search indexing. The only way anyone finds your post is if you link yourself.</p>\n<p><strong><a href=\"https://html.duckduckgo.com/html/?q=low+bandwidth+web\">DuckDuckGo HTML</a></strong> provides search results, forms, URLs, and snippets that work without the graphical interface (a text search endpoint). There's an even lighter version at <a href=\"https://lite.duckduckgo.com\">lite.duckduckgo.com</a>.</p>\n<h2>Terminal-Based Programs and Services</h2>\n<p><strong><a href=\"https://newsboat.org/\">Newsboat</a></strong> turns the open Web into a local, keyboard-driven reading queue and avoids repeatedly loading heavy homepages (an RSS/Atom reader). It's a fork of Andreas Krennmair's Newsbeuter by Alexander Batischev when Newsbeuter was abandoned in September 2017.</p>\n<p><strong><a href=\"https://gmi.skyjake.fi/lagrange/\">Lagrange</a></strong> is a compact client with a curses interface and multi-protocol support (a Gemini/Gopher reader). Jaakko Keränen built it starting in 2020; besides Gemini, Gopher, and Finger it can play inline audio, view images, and hold TLS client certificates for sites like Gemini BBS above, and there's a terminal-only build called <code>clagrange</code>.</p>\n<p><strong><a href=\"https://lynx.invisible-island.net/\">Lynx</a></strong> is mature, portable, and appropriate for reading rather than rendering visual design (an HTTP text browser). Several of its original 1992 contributors went on to work at Netscape.</p>\n<p><strong><a href=\"https://github.com/tats/w3m\">w3m</a></strong> supports text browsing and is widely packaged on Unix-like systems (a terminal web browser). Akinori Ito built it in Japan around 1995 as a successor to his earlier pager <code>fm</code>—the name is short for &quot;WWW wo miru,&quot; or &quot;to see the WWW.&quot; It can also run inside Emacs as <code>emacs-w3m</code>.</p>\n<p><strong><a href=\"https://elinks.or.cz/\">ELinks</a></strong> is a featureful text browser for HTML, forms, and links (a terminal browser). It began in late 2001 as Petr Baudiš's fork of Mikuláš Patočka's Links browser, the E standing for &quot;Experimental.&quot;</p>\n<p><strong><a href=\"https://github.com/aaronjanse/bombadillo\">Bombadillo</a></strong> is designed for Gemini, Gopher, Finger, and related text-first browsing (a terminal client for small protocols). It's built by Sloum on tildegit, calls itself a &quot;non-web browser,&quot; treats Gopher as its default protocol, and collects no telemetry or history of its own.</p>\n<p><strong><a href=\"https://offpunk.net/\">Offpunk</a></strong> is an offline-first Gemini/Gopher/Spartan/Web/RSS client. Written by <a href=\"https://ploum.net\">Ploum</a> as a friendly fork of Solderpunk's AV-98, it caches everything you visit as plain <code>.gmi</code>/<code>.html</code> files under <code>~/.cache/offpunk/</code>. There's no database, so the cache can be edited or scripted with other tools. You can sync hourly or daily and then read, follow links, and subscribe to RSS/Atom feeds entirely offline; anything you try to open that isn't cached just gets queued for the next sync.</p>\n<p><strong><a href=\"https://wttr.in/\">wttr.in</a></strong> returns a text forecast from a direct HTTP request that can be read with <code>curl</code> (a console weather service), created by Igor Chubin as a small wrapper originally built to demonstrate <code>wego</code> below. It handles tens of millions of queries a day. For example, try <code>curl https://wttr.in/Denver</code> or another location.</p>\n<p><strong><a href=\"https://github.com/schachmat/wego\">wego</a></strong> supports text, Markdown, JSON, caching, several backends, and keyless Open-Meteo or SMHI configurations (a local terminal weather client). Unlike <a href=\"http://wttr.in\">wttr.in</a>, which is a hosted service you query, wego runs on your own machine.</p>\n<p><strong><a href=\"https://irssi.org/\">Irssi</a></strong> is one of the most resource-efficient forms of live group communication, a terminal IRC client. Finnish programmer Timo Sirainen first released it in January 1999, and it's remained a staple of IRC culture, especially among channel operators, for more than 25 years since.</p>\n<p><strong><a href=\"https://sr.ht/~delthas/senpai/\">senpai</a></strong> is a modern terminal IRC client built to pair with a bouncer rather than keep its own logs, built by delthas and hosted on SourceHut. It leans on newer IRCv3 extensions—fetching history from the server via <code>CHATHISTORY</code>, connecting to all your networks at once via <code>BOUNCER</code>, and even uploading files via <code>FILEHOST</code>, so the client is lightweight while the heavy lifting happens server-side.</p>\n<p><strong><a href=\"https://git.causal.agency/catgirl/about/\">catgirl</a></strong> is a TLS-only, ncurses-based terminal IRC client built by June McEnroe of causal.agency, with tab-complete, nick colouring, and split scrolling but deliberately little else. It exits on disconnect rather than reconnecting itself, expecting to be run in a loop or, better, paired with a bouncer. That bouncer is typically McEnroe's own <strong><a href=\"https://git.causal.agency/pounce/about/\">pounce</a></strong>, part of a suite of purpose-built IRC tools alongside the full-text logger <strong><a href=\"https://git.causal.agency/litterbox/about/\">litterbox</a></strong>.</p>\n<p><strong><a href=\"https://sdf.org/?signup\">SDF shell access</a></strong> provides a social and productive environment for SSH, telnet, Gopher, Gemini, IRC, Git, and vintage systems (a public Unix shell community). Beyond a free account, its paid MetaARPA tier (around $11 a quarter) unlocks cron jobs, background processes, SSH tunneling, and more. The homepage is generated with <code>ksh</code>, <code>sed</code>, and <code>awk</code>; current access and membership details are on the site.</p>\n<p><strong><a href=\"https://gopher.floodgap.com/gopher/\">Gopher proxy</a></strong> lets a browser or Lynx sample Gopherspace before installing a native client (an HTTP bridge to Gopher). Floodgap warns that the public gateway is rate-limited and not anonymous; native clients are preferable for regular use.</p>\n<p><strong><a href=\"https://curl.se/\">curl</a></strong> lets a low-spec machine fetch text, feeds, APIs, Gemini gateways, and weather without a browser (a minimal network retrieval tool). Daniel Stenberg started it in 1996 as a tool to fetch currency exchange rates for an IRC bot; it now ships on billions of devices, from phones to cars to game consoles. Use it with <code>less</code>, <code>grep</code>, <code>lynx -dump</code>, <code>w3m</code>, or a local cache.</p>\n<p><strong><a href=\"https://git-scm.com/\">Git over SSH</a></strong> enables offline work, local history, and synchronization over low-overhead transports (distributed publishing and software exchange). Because a clone carries the repository history and Git only ever transfers the deltas it actually needs, you can work fully offline and push or pull later, suiting low-bandwidth or intermittent connections well. Useful with SourceHut, SDF, Codeberg, or a self-hosted forge.</p>\n<h2>Other Alternative Networks</h2>\n<p>These networks are not all &quot;websites&quot; in the same sense as Gemini or Gopher. Several require a local client, a running node, a tunnel, or a network-specific address book. They're included because they can carry small web sites, IRC, code, files, and peer-to-peer publishing.</p>\n<h3>Yggdrasil</h3>\n<p><strong><a href=\"https://yggdrasil-network.github.io/\">Yggdrasil</a></strong> is an end-to-end encrypted IPv6 overlay network built by Neil Alexander and Arceliar, with its first public release in December 2018. Rather than routing by geography, it builds a global spanning tree and a distributed hash table so nodes get a flat, name-independent address derived straight from its public key—you only need two or three peers to join the mesh. The <strong><a href=\"https://yggdrasil-network.github.io/services.html\">Yggdrasil services directory</a></strong> exposes concrete IPv6-style Yggdrasil destinations, and is a community-maintained catalogue of Web, IRC, DNS, code, torrents, VoIP, Nostr, Iroh, and other services).</p>\n<p>The <strong><a href=\"http://%5B21e:a51c:885b:7db0:166e:927:98cd:d186%5D/\">Yggdrasil Web directory</a></strong> is a starting point after joining the network. It requires Yggdrasil connectivity and is not reachable from an ordinary clearnet browser. The <strong><a href=\"http://%5B200:b48d:469e:c7c7:3e13:c41d:ba4d:d2b8%5D/\">Yggdrasil search engine</a></strong> and the <strong><a href=\"http://%5B21a:34aa:c782:3ad2:1bf8:73f8:141:66e8%5D/\">Yggdrasil Forum</a></strong> are also available inside the overlay.</p>\n<p><strong><a href=\"https://yggdrasil-network.github.io/services.html#irc\">BonoboNET IRC over Yggdrasil</a></strong> combines a lightweight chat protocol with an overlay network. After joining Yggdrasil, use the preferred hostname <code>y.irc.bnet.eu.org</code> on port 6667.</p>\n<p><strong><a href=\"https://radicle.xyz/\">Yggdrasil Radicle nodes</a></strong> are useful for software exchange without depending on centralized forges. Radicle was founded in Berlin in 2018 by Eleftherios Diakomichalis and Alexis Sellier, originally built on IPFS before the team wrote their own peer-to-peer Git protocol. Version 1.0 shipped in September 2024 with 40 seed nodes already running, no central server anywhere, with issues and patches stored directly as objects inside the Git repository itself.</p>\n<h3>I2P</h3>\n<p><strong><a href=\"https://i2p.net/en/docs/\">I2P documentation</a></strong> provides a route to local <code>.i2p</code> services and self-hosted sites. The Invisible Internet Project began in 2001 as the Invisible IRC Project before jrandom renamed and relaunched it in 2003. Unlike Tor's three-hop circuits, I2P is packet-switched and routes traffic through separate unidirectional inbound and outbound tunnels, with recent estimates putting the network at around 55,000 active routers and 35,000 hidden <code>.i2p</code> &quot;eepsites.&quot;</p>\n<p>The official eepsite guide documents a built-in Jetty server and a local console at <a href=\"http://127.0.0.1:7657\">http://127.0.0.1:7657</a>.</p>\n<p><strong><a href=\"https://i2p.net/en/docs/guides/creating-an-i2p-eepsite/\">I2P eepsite guide</a></strong> shows how to publish a small site inside I2P using the preconfigured web server.</p>\n<h3>Hyphanet (formerly Freenet)</h3>\n<p><strong><a href=\"https://www.hyphanet.org/\">Hyphanet</a></strong> supports personal websites, microblogging, forums, media sharing, blogs, and version tracking. It began in 1999 as Ian Clarke's undergraduate project at the University of Edinburgh, splitting content into small encrypted chunks that get distributed, cached, and replicated across peers based on demand, and so node operators can't tell what they're storing.</p>\n<p>In March 2023, the original codebase was spun off and renamed Hyphanet, while Clarke took the Freenet name for a ground-up rewrite. The official homepage reported Hyphanet 0.7.5 build 1506 on 2026-02-21. It's more demanding than Gemini/Gopher, but is an interesting publishing network. The <strong><a href=\"https://www.hyphanet.org/pages/documentation.html\">Hyphanet documentation</a></strong> is necessary for understanding how to publish and browse inside the network.</p>\n<h3>GNUnet, Lokinet, and Reticulum</h3>\n<p><strong><a href=\"https://www.gnunet.org/en/index.html\">GNUnet</a></strong> is a foundation for distributed applications, naming, routing, resource discovery, and content distribution. Christian Grothoff has led it since it started in 2001 as &quot;GNet&quot; before becoming an official GNU package; the codebase now exceeds 400,000 lines of C, and it's spawned the GNU Name System, the GNU Taler payment framework, and PSYC, a messaging substrate used by the SecuShare social network project. It's a development framework, not a ready-made content directory.</p>\n<p><strong><a href=\"https://lokinet.org/\">Lokinet</a></strong> grew out of the Loki Project (rebranded Oxen in 2021) starting in 2018, and it's an onion router that runs across more than a thousand staked Oxen Service Nodes, so it shares infrastructure directly with the Session messenger app.</p>\n<p>The <strong><a href=\"https://github.com/markqvist/Reticulum/wiki/Community-Node-List\">Reticulum community node list</a></strong> is relevant for peer-to-peer text, messaging, and intermittent connectivity. Mark Qvist designed Reticulum between 2014 and 2022 and dedicated the protocol to the public domain. It's built to run over almost anything, including LoRa radio and packet radio, down to around 5 bits per second, and projects like Nomad Network and MeshChat use it to run entirely off-grid.</p>\n<h2>A Daily Driver</h2>\n<ol>\n<li>\n<p>Use a minimal Linux or BSD installation with a text browser such as <strong><a href=\"https://lynx.invisible-island.net/\">Lynx</a></strong>, <strong><a href=\"https://github.com/tats/w3m\">w3m</a></strong>, or <strong><a href=\"https://elinks.or.cz/\">ELinks</a></strong>.</p>\n</li>\n<li>\n<p>Use <strong><a href=\"https://newsboat.org/\">Newsboat</a></strong> as the home screen for current reading. Add feeds from CAPCOM, news sites, personal blogs, project release feeds, and any publication that exposes RSS or Atom.</p>\n</li>\n<li>\n<p>Use <strong><a href=\"https://gmi.skyjake.fi/lagrange/\">Lagrange</a></strong> for Gemini and a Gopher client or the <strong><a href=\"https://gopher.floodgap.com/gopher/\">Floodgap proxy</a></strong> for Gopher.</p>\n</li>\n<li>\n<p>Bookmark <strong><a href=\"https://portal.mozz.us/gemini/gemini.circumlunar.space/capcom/\">CAPCOM</a></strong>, <strong><a href=\"https://gopher.floodgap.com/gopher/gw?i-logout.cz/1/bongusta/\">Bongusta</a></strong>, <strong><a href=\"https://gopher.floodgap.com/gopher/gw?gopher.floodgap.com/1/v2\">Veronica-2</a></strong>, <strong><a href=\"https://old-search.marginalia.nu/\">Marginalia</a></strong>, and <strong><a href=\"https://wiby.me/\">Wiby</a></strong> as discovery tools.</p>\n</li>\n<li>\n<p>Cache durable material locally. Use <code>curl</code>, <code>wget</code>, <code>git</code>, <code>less</code>, <code>grep</code>, and a small directory of downloaded books, RFCs, manuals, and feeds.</p>\n</li>\n<li>\n<p>Add <strong><a href=\"https://sdf.org/\">SDF</a></strong> or another public Unix account for shell-based community, publishing, IRC, and experimentation.</p>\n</li>\n<li>\n<p>Yggdrasil, I2P, Hyphanet, GNUnet, Lokinet, and Reticulum are second-stage projects. They can add valuable peer-to-peer spaces, but setup and network reachability are more complicated than just opening a Gemini or Gopher client.</p>\n</li>\n</ol>\n<h2>How to Test and Save Content</h2>\n<p>A quick HTTP text check is:</p>\n<pre><code>lynx -dump -nolist https://example.com/\n</code></pre>\n<p>A lightweight retrieval check is:</p>\n<pre><code>curl -L --max-time 20 -sS https://example.com/ | less\n</code></pre>\n<p>For a plain-text resource, save a local copy and search it:</p>\n<pre><code>curl -L -sS https://www.rfc-editor.org/rfc/rfc9110.txt -o rfc9110.txt\nless rfc9110.txt\ngrep -n &quot;HTTP Semantics&quot; rfc9110.txt\n</code></pre>\n<h2>A Few Notes</h2>\n<p>This is a curated starting list by a beginner. Native-protocol networks are dynamic, and some small services may disappear or move without redirects. I directly tested Gemini, Gopher, and Spartan endpoints, and tested availability of most Yggdrasil, I2P, Hyphanet, GNUnet, Lokinet, and Reticulum pages.</p>\n<p>The term “low-spec” has multiple meanings. A page can be visually simple but still be large, like the solar Low-tech Magazine site. A terminal program can be lightweight locally while depending on a heavy remote API. Conversely, an ordinary HTML page can be highly usable if it is server-rendered, cacheable, and free of JavaScript requirements.</p>\n<p>Security and privacy are important but are not the organizing principle here. The relevant question for this article is whether a person with inexpensive hardware, a slow connection, and a preference for text can actually read, participate, publish, and discover material.</p>\n<p>Discovery and continuity require ongoing human curation. I will keep checking, re-labelling, and adding to these lists as I go. If you have any suggestions for contributions, please let me know!</p>\n<p>None of this is about DigitalOcean, or DHH, or Omarchy, or even Mastodon's stack—those are just the prompt that got me writing again. The actual point is the constraint. A smaller, text-shaped, low-powered version of the Internet isn't a downgrade. I don't think the oldnet and the altnets will ever replace the IndieWeb, or Mastodon, or Brennan.day as it stands today, but they're proof that the boiling-frog Internet we default to isn't the only option. It really isn't.</p>\n",
      "image": "https://brennan.day/assets/images/blog/archives.jpg",
      "date_published": "2026-09-10T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "technical",
        "Small Web",
        "IndieWeb",
        "Digital Culture",
        "decentralization",
        "gemini",
        "gopher",
        "terminal",
        "retrocomputing"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/how-the-mysterious-screenjesus-can-ddos-you/",
      "url": "https://brennan.day/how-the-mysterious-screenjesus-can-ddos-you/",
      "title": "How the Mysterious ScreenJesus can DDoS You",
      "summary": "How a bug in my own CI/CD accidentally uncovered a novel vulnerability in NeoCities: ScreenJesus, the undocumented screenshot bot behind thumbnail previews, has no rate limits and will happily visit thousands of your pages—and anything they embed—in minutes. Notes on accidental DDoS, opaque infrastructure, and a plea for caching and rate limiting.",
      "content_html": "<p>Buckle up. As I'm sure you can already tell by the title of this article, this one is a weird one. I (with the help of <a href=\"https://neatnik.omg.lol\">Adam of omg.lol</a>) accidentally uncovered a rather concerning—and novel—vulnerability when it comes to beloved website-maker <a href=\"https://neocities.org\">NeoCities</a>.</p>\n<p>Those who use NeoCities are aware that whenever you upload or change a file on your site, it's registered as <a href=\"https://neocities.org/site/brennanday?event_id=7552135\">an event</a>, which can be understood as a status update. This is a large part of the social aspect of the platform: you can follow others and their site updates will display in your feed so you can see people's brand new creative web designs as soon as they happen, and have a way to leave a comment.</p>\n<p>A feature of these &quot;events&quot; is that NeoCities grabs a thumbnail of each page that's added or changed. This gives the status update a visual element and a way for people to easily see what the new pages look like quickly.</p>\n<p>But <em>how</em> does NeoCities get those thumbnails? The answer is <a href=\"https://screenjesus.neocities.org/\">ScreenJesus</a>—and it's also the issue that I'm going to be discussing here today.</p>\n<p>There are two reasons why I became aware of ScreenJesus in the first place: one is my own terrible code and CI/CD, and the other is due to a <a href=\"https://status.lol\">status embed</a> that appears on every page of my site in the sidebar.</p>\n<p>To start, I wrote about how I use <a href=\"https://brennan.day/deploying-an-eleventy-site-to-neocities-with-gitlab-ci-cd/\">GitLab CI to mirror my site to NeoCities</a> quite a few months ago, now. This platform is the <a href=\"https://brennanday.neocities.org\">primary mirror</a> of my website in the event my main domain goes down for whatever reason.</p>\n<p>Unfortunately, there's a bug in my code (shocker) that causes the entire site to be uploaded rather than only pages that have been added or changed, and I haven't been able to figure out how to fix this. Though to be fair, I haven't really spent time trying, since what I do instead is <a href=\"https://gitlab.com/brennankbrown/brennan.day/-/blob/main/.gitlab-ci.yml?ref_type=heads\">manually uncomment</a> the CI script once a week to do a full upload to the site.</p>\n<p>Unfortunately, my site has grown and continues to keep growing—if it was just text files and writing, that'd be fine, but I just <em>have</em> to have a featured image for every article I write, and these images are resized to multiple different sizes. As a result, while there are around 600 total pages in my generated <code>_site</code> folder, there are over 2,000 files in total that get uploaded to NeoCities each time.</p>\n<p>On its own, this isn't that big of a deal. It just means I do a manual weekly upload that takes a bit of time instead of, you know, actual continuous deployment.</p>\n<p>However—and you can probably see where this is headed—ScreenJesus takes a screenshot of <em>each</em> page during this upload process.</p>\n<p>But wait, what even is ScreenJesus, and what does it do? That's actually difficult to answer. Despite NeoCities being <a href=\"https://github.com/neocities\">open-sourced</a>, there is no mention of <a href=\"https://github.com/search?q=org%3Aneocities+screenjesus&amp;type=code\">ScreenJesus in any of its codebase</a>. Being a screenshot bot and API service used by NeoCities to capture thumbnail previews of user websites, it visits the sites directly.</p>\n<p>The <a href=\"https://screenjesus.neocities.org/\">NeoCities site documenting ScreenJesus</a>, created by <a href=\"https://arandomsite.neocities.org/\">airu</a>, guesses that &quot;Kyle Drake (founder of Neocities) uses Vultr, a cloud server provider with KVM's [sic] (Kernal based virtual machines)&quot; to operate ScreenJesus. Like I said, there's no official documentation on this.</p>\n<p>The problem is, like real Jesus probably, ScreenJesus has no rate limits. This means that all 4,000 pages I uploaded were visited and screenshotted in the span of only fifteen minutes.</p>\n<p>This is fine for my static site behind a CDN, but Adam saw my little status.lol embed get visited 4,000 times in 15 minutes. And, according to the logs, there were 18 different IP addresses from the Vultr boxes he had to block.</p>\n<p>Before I explained all of the above, Adam assumed this was a small DDoS attempt—because it kind of is. Even though this was a total accident and a result of my own bad coding, it's clear that I accidentally stumbled upon a worryingly effective way to overload a small server if used maliciously.</p>\n<p>I don't know the current state of development on NeoCities, and it seems to be more in a maintenance mode now in 2026—<a href=\"https://kyledrake.com/\">Kyle Drake</a> hasn't written a blog post since 2023. But I certainly hope I can get an administrator of some sort to see this post and change the way ScreenJesus operates, such as using caching and rate limiting, to alleviate the problematic nature I've described here.</p>\n<p>If you want to avoid this for yourself, this <a href=\"https://control-neocities-thumbnail.neocities.org/\">handy guide</a> about controlling NeoCities thumbnails is actually really helpful. Since ScreenJesus always declares itself in the user agent, it is easy to block and will honour the block.</p>\n<p>There are still a lot of unknowns, but this is my best attempt at explaining how things are right now.</p>\n",
      "image": "https://brennan.day/assets/images/blog/screenjesus.jpg",
      "date_published": "2026-09-09T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "technical",
        "security",
        "Digital Security",
        "neocities",
        "IndieWeb",
        "web development",
        "small web",
        "infrastructure"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/more-mindful-web-development/",
      "url": "https://brennan.day/more-mindful-web-development/",
      "title": "More Mindful Web Development",
      "summary": "Yet another technical audit of brennan.day, this time using the Safi Studio Scanner, covering fixes for duplicate <h1> headings, meta descriptions, image dimensions, JSON-LD organization data, render-blocking scripts, and a switch from IndieAuth to IndieLogin—plus what I left alone.",
      "content_html": "<p>Another month, yet another technical tutorial and audit of my website. I already know what you're thinking, and I totally agree: how much could there possibly be to examine and fix on a little static blog?!</p>\n<p>I was fairly certain I'd be content for a long while after <a href=\"https://brennan.day/advanced-webweaving-auditing-against-specification-website/\">my last post</a> where I went through my site using <a href=\"https://specification.website/\">specification.website</a>, but fellow writer Unattributed of <a href=\"https://unattributed.cc\">Unattributed</a> just posted a blog post titled <a href=\"https://unattributed.cc/2026/09/06/guys-we-really-really-suck/\">&quot;Guys, we really, really suck at this!&quot;</a> where he used the <a href=\"https://safi-studio-scanner.abdulkadersafi.com/\">Safi Studio Scanner</a> to audit his website along with a few dozen others within the IndieWeb and found some rather abysmal results. Safi crawls a site and scores it on your average metrics, such as SEO, content, images, structured data, security, performance, etc.</p>\n<p>⚠️ <strong>Do not try this at home.</strong> I want to preface this by saying that the Safi scanner's website looks awfully vibecoded, which makes me assume the npm package created to audit your site is as well. The previous tool I used, specification.website, also was created with an LLM, but that was just a <a href=\"https://specification.website/checklist/\">plain text checklist</a>, so there's no risk using that. This, however, does come with risk being something you're actually installing on your system (npm itself has a rather <a href=\"https://securitylabs.datadoghq.com/articles/npm-worm-compromises-popular-npm-packages/\">bad reputation</a> of vulnerabilities). Also, running a crawler against a production site can also trip rate limits or DDoS protection, which caused me to get <a href=\"https://cdn.some.pics/brennan/6a9ee30a12dfd.png\">banned from my own site</a>. There are <a href=\"https://datayze.com/site-validator\">plenty</a> <a href=\"https://validator.w3.org/\">of other</a> <a href=\"https://pagespeed.web.dev/\">ways to audit</a> and <a href=\"https://www.debugbear.com/test/website-grader\">check important validation</a> on your site, use those instead of this.</p>\n<h2>My Site Didn't Play Nice</h2>\n<p>To start, I had to modify the script doing the scanning. As Unattributed let me know, my site was the only one he tried to audit that didn't scan properly, because I have numerous webring links that don't have <code>rel=&quot;nofollow&quot;</code>, and the way the script works is that it scans every linked page (great idea, right?). Luckily, this change wasn't hard to make.</p>\n<pre><code class=\"language-javascript\">const report = await audit('http://localhost:8082', {\n  maxPages: 25,\n  maxDepth: 3,\n  concurrency: 4,\n  browser: false,\n  skip: ['links'],\n});\n</code></pre>\n<p>I built and served my site locally instead of scanning production, making iterative changes easier as well, and reran the audit many times during the process.</p>\n<h2>Duplicate Headers</h2>\n<p>One of the most recurring warnings was <code>core-seo/single-h1</code>, indicating that a lot of my pages had more than one <code>&lt;h1&gt;</code> header. This confuses both search engines and screen reader users navigating my site by headings.</p>\n<p>There were three separate sources for this problem:</p>\n<ol>\n<li>\n<p>My site header used an <code>&lt;h1&gt;</code> for the &quot;brennan.day&quot; in the header on every page.</p>\n</li>\n<li>\n<p>My homepage had the &quot;Recent Posts&quot; heading marked up as an <code>&lt;h1&gt;</code>.</p>\n</li>\n<li>\n<p>My homepage and tag pages had a hidden <code>&lt;h1&gt;</code> inside the <code>h-feed</code> microformat, used to give the feed a machine-readable name.</p>\n</li>\n</ol>\n<p>The fix here is to ensure everything except the single <code>&lt;h1&gt;</code> per page is an <code>&lt;h2&gt;</code>, <code>&lt;p&gt;</code>, <code>&lt;div&gt;</code>, or <code>&lt;span&gt;</code> depending on context.</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">{# src/_includes/partials/header.njk - before #}\n&lt;h1 class=&quot;weblog-title&quot;&gt;&lt;a href=&quot;/&quot;&gt;{{ site.title }}&lt;/a&gt;&lt;/h1&gt;\n\n{# after #}\n&lt;p class=&quot;weblog-title&quot; data-pagefind-ignore&gt;&lt;a href=&quot;/&quot;&gt;{{ site.title }}&lt;/a&gt;&lt;/p&gt;\n</code></pre>\n<p>{% endraw %}</p>\n<p>The hidden feed-name heading became a <code>&lt;span&gt;</code> since its only meant to satisfy the microformat.</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">{# before #}\n&lt;h1 class=&quot;p-name&quot; style=&quot;display:none;&quot;&gt;{{ site.title }}&lt;/h1&gt;\n\n{# after #}\n&lt;span class=&quot;p-name&quot; style=&quot;display:none;&quot;&gt;{{ site.title }}&lt;/span&gt;\n</code></pre>\n<p>{% endraw %}</p>\n<p>Pages, like <a href=\"https://brennan.day/guestbook/\">/guestbook/</a>, <a href=\"https://brennan.day/accounts/\">/accounts/</a>, and <a href=\"https://brennan.day/slash-pages/\">/slash-pages/</a> never had an <code>&lt;h1&gt;</code> because their layout didn't render one automatically like the way I have set for standard posts and page layouts. I added one in the Markdown body using the title variable, so it stays in sync with the page's <code>&lt;title&gt;</code> tag without hardcoding it twice:</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-markdown\">---\ntitle: Guestbook\nlayout: base.njk\n---\n\n&lt;h1&gt;{{ title }}&lt;/h1&gt;\n\nWelcome to my guestbook!\n</code></pre>\n<p>{% endraw %}</p>\n<p>I made sure the styles remained the same, so nothing looks different visually.</p>\n<h2>Meta Descriptions</h2>\n<p>Meta descriptions should be between 70 and 160 characters long. My global fallback description (used whenever a description wasn't set on a page) was a lengthy paragraph introducing myself.</p>\n<p>Rather than rewrite my author bio, I kept it as the fallback and normalized description through a <code>truncate(155)</code> filter:</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">{% set pageDescription = (description or site.description) | truncate(155) %}\n&lt;meta name=&quot;description&quot; content=&quot;{{ pageDescription }}&quot;&gt;\n&lt;meta property=&quot;og:description&quot; content=&quot;{{ pageDescription }}&quot;&gt;\n</code></pre>\n<p>{% endraw %}</p>\n<p>There were also pages that had descriptions that were too short, such as my <a href=\"https://brennan.day/now/\">/now/</a>, <a href=\"https://brennan.day/search/\">/search/</a>, <a href=\"https://brennan.day/slash-pages/\">/slash-pages/</a>, and <a href=\"https://brennan.day/guestbook/\">/guestbook/</a> pages.</p>\n<pre><code class=\"language-markdown\"># Before\ndescription: What I am working on right now, current projects and focus areas.\n\n# After\ndescription: What I am working on right now, including current projects, focus areas, and recent updates.\n</code></pre>\n<p>Next, I added a description to <a href=\"https://brennan.day/search/\">/search/</a> and to tag pages via <code>eleventyComputed</code>:</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">eleventyComputed:\n  description: &quot;Essays, posts, and writing tagged with '{{ tag }}' on the independent blog brennan.day.&quot;\n</code></pre>\n<p>{% endraw %}</p>\n<h2>Images Without Dimensions</h2>\n<p>My <code>thumbnail</code> shortcode generates <code>width</code>, <code>height</code>, <code>loading</code>, and <code>decoding</code> for responsive post images, but some images still didn't have dimensions, such as featured images rendered directly in layouts, the footer watermark, and the signature graphic, so I added those:</p>\n<pre><code class=\"language-html\">&lt;img src=&quot;/assets/images/signature.svg&quot; alt=&quot;Brennan's signature&quot; width=&quot;300&quot; height=&quot;25&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot;&gt;\n</code></pre>\n<h2>Fixing the JSON-LD</h2>\n<p>I have a <a href=\"https://json-ld.org/\">structured data</a> JSON that is already rather robust. What it didn't have was an <code>Organization</code> object, which Safi's <code>structured-data/org-or-website</code> rule checks for.</p>\n<p>I added it to the shared structured-data partial, so it appears on every HTML page, referencing the same <code>@id</code> values the rest of the graph already used:</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">{\n  &quot;@type&quot;: &quot;Organization&quot;,\n  &quot;@id&quot;: &quot;{{ site.url }}/#organization&quot;,\n  &quot;name&quot;: &quot;{{ site.title }}&quot;,\n  &quot;url&quot;: &quot;{{ site.url }}&quot;,\n  &quot;logo&quot;: &quot;{{ site.url }}/assets/images/site-preview.jpg&quot;,\n  &quot;sameAs&quot;: [\n    {% for relMeUrl in site.relMe %}\n    &quot;{{ relMeUrl }}&quot;{% if not loop.last %},{% endif %}\n    {% endfor %}\n  ]\n}\n</code></pre>\n<p>{% endraw %}</p>\n<p>I also added a <code>datePublished</code> field to the <code>WebSite</code> and <code>WebPage</code> objects, falling back to the last git commit date when a page doesn't have its own frontmatter date.</p>\n<h2>Render-blocking Scripts</h2>\n<p>Pagefind's default UI script was loading in the <code>&lt;head&gt;</code> without <code>defer</code>, which meant the browser had to stop and fetch it before it could finish parsing the page:</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">{# before #}\n&lt;script src=&quot;/pagefind/pagefind-ui.js&quot;&gt;&lt;/script&gt;\n\n{# after #}\n&lt;script src=&quot;/pagefind/pagefind-ui.js&quot; defer&gt;&lt;/script&gt;\n</code></pre>\n<p>{% endraw %}</p>\n<p>I did the same for Mermaid's CDN script on <a href=\"https://brennan.day/style/\">/style/</a>, which was already only loaded conditionally, but still blocked without <code>defer</code>. The inline <code>mermaid.initialize()</code> call already runs inside a <code>DOMContentLoaded</code> listener, so deferring the script itself doesn't change when initialization happens, just when the browser is allowed to keep parsing the rest of the page while it downloads.</p>\n<h2>Looking at Links</h2>\n<p>I skipped the <code>links</code> category on the first run, but then I realized page discovery only ever follows internal links, regardless of whether <code>links</code> rules are enabled. The links category itself just checks the URLs already found on those same-origin pages. So I turned it back on:</p>\n<pre><code class=\"language-javascript\">const report = await audit('http://localhost:8082', {\n  maxPages: 60,\n  maxDepth: 4,\n  concurrency: 4,\n  browser: false,\n});\n</code></pre>\n<p>I found a couple more errors with this. First that my <a href=\"https://brennan.day/start-here/\">/start-here/</a> page linked to the tag <code>political</code> even though my site uses <code>politics</code>.</p>\n<p>Next, I realized my <a href=\"https://brennan.day/slash-pages/\">/slash-pages/</a> directory links to <a href=\"https://brennan.day/resume/\">/resume/</a> and <a href=\"https://brennan.day/poetry/\">/poetry/</a>, both of which route through Netlify redirects rather than existing as pages:</p>\n<pre><code class=\"language-toml\">[[redirects]]\n  from = &quot;/resume&quot;\n  to = &quot;https://cv.brennanbrown.ca&quot;\n  status = 301\n\n[[redirects]]\n  from = &quot;/poetry&quot;\n  to = &quot;https://bkpoetry.com&quot;\n  status = 301\n</code></pre>\n<p>Netlify treats <a href=\"https://brennan.day/resume\">/resume</a> and <a href=\"https://brennan.day/resume/\">/resume/</a> as different paths, and only matches a redirect rule against the exact one you wrote. I found the same mismatch a third time in <code>assets/xsl/rss-style.xsl</code>, which links to <a href=\"https://brennan.day/feed/\">/feed/</a> against a <code>from = &quot;/feed&quot;</code> rule.</p>\n<p>The fix is to add another rule with the trailing slash:</p>\n<pre><code class=\"language-toml\">[[redirects]]\n  from = &quot;/resume/&quot;\n  to = &quot;https://cv.brennanbrown.ca&quot;\n  status = 301\n\n[[redirects]]\n  from = &quot;/poetry/&quot;\n  to = &quot;https://bkpoetry.com&quot;\n  status = 301\n\n[[redirects]]\n  from = &quot;/feed/&quot;\n  to = &quot;/feed.xml&quot;\n  status = 301\n</code></pre>\n<h2>Switching from IndieAuth to IndieLogin</h2>\n<p>This part had nothing to do with the Safi scanner, rather, Clare Hooley <a href=\"https://social.lol/@clare_hooley@mastodon.me.uk/117225212934724560\">brought it to my attention that</a>, because I was using IndieAuth, she couldn't use her Codeberg account to login and write a comment on one of my blog posts.</p>\n<p>Now, <a href=\"https://brennan.day/building-an-indieauth-comment-system-for-your-static-site/\">my comment section solution</a> is incredibly hacky, but has miraculously worked for many people and many comments. So of course I hesitate to update anything and possibly break it.</p>\n<p>But <a href=\"https://indielogin.com/\">IndieLogin.com</a> is a newer, actively-maintained service that checks <code>rel=&quot;me&quot;</code> links of GitHub, GitLab, Codeberg, and email, on top of resolving a full IndieAuth server if the visitor has one. It's time I upgraded.</p>\n<p>Swapping the form's action was the easier part:</p>\n<p>{% raw %}</p>\n<pre><code class=\"language-njk\">{# before #}\n&lt;form id=&quot;indieauth-form&quot; action=&quot;https://indieauth.com/auth&quot; method=&quot;get&quot;&gt;\n\n{# after #}\n&lt;form id=&quot;indieauth-form&quot; action=&quot;https://indielogin.com/authorize&quot; method=&quot;get&quot;&gt;\n</code></pre>\n<p>{% endraw %}</p>\n<p>The harder part was that <a href=\"http://IndieLogin.com\">IndieLogin.com</a> doesn't behave like a normal OAuth provider. It only confirms who someone is, it doesn't hand back an access token the way <code>tokens.indieauth.com</code> does, and this was the issue I had when I tried changing this in the past.</p>\n<pre><code class=\"language-json\">{ &quot;me&quot;: &quot;https://example.com/&quot; }\n</code></pre>\n<p>My comment-posting endpoint expected a bearer token it could hand to a token-introspection endpoint on every request. <a href=\"http://IndieLogin.com\">IndieLogin.com</a> has no such endpoint, so I created my own.</p>\n<p>Once the visitor's <code>me</code> URL comes back, a Netlify Function signs a short-lived token with HMAC-SHA256 and a server-side secret, and that's what gets stored in the browser and sent back when posting a comment:</p>\n<pre><code class=\"language-javascript\">function signSession(me) {\n  const secret = process.env.COMMENT_SESSION_SECRET;\n  const payload = Buffer.from(JSON.stringify({\n    me,\n    exp: Math.floor(Date.now() / 1000) + SESSION_TTL_SECONDS\n  })).toString('base64url');\n  const signature = crypto.createHmac('sha256', secret).update(payload).digest('base64url');\n  return `${payload}.${signature}`;\n}\n</code></pre>\n<p>Now, the comment endpoint verifies that signature and expiry locally instead of making a network call.</p>\n<p>My Micropub endpoint, which OAuth clients like Quill talk to, still uses <code>tokens.indieauth.com</code>.</p>\n<p><strong>Update, shortly after publishing:</strong> Alas, I had to revert the IndieLogin switch. Turns out that <code>indielogin.com</code> only accepts client IDs that have been manually added to its database, and the public instance's registration queue is not being serviced, so <code>brennan.day</code> was rejected. I reverted the comment form and Netlify Functions to use <code>indieauth.com</code> and <code>tokens.indieauth.com</code> again. One day...</p>\n<h2>What Hasn't Been Fixed</h2>\n<p>Most of my site's scoring is now in the high 90s for most categories for the arbitrary, vibecoded appeasement of the Safi scanner, but not all of them.</p>\n<p>Because I was scanning a local instance of my site instead of the production URL, there were numerous errors. Security headers (<code>CSP</code>, <code>HSTS</code>, <code>X-Frame-Options</code>, and so on) for instance, but I recently used the <a href=\"https://developer.mozilla.org/en-US/observatory/analyze?host=brennan.day\">Mozilla HTTP Observability Report</a> for that and scored a B-, due to things outside of my control, like certain webrings that use <code>JavaScript</code> instead of simple URLs.</p>\n<p>There were also silly failures, such as no cookie consent banner detected (why would I have one on my cookieless site?) and that no analytics tag was detected either. Why? Because I use Umami, and Safi's detection regex only recognizes a specific list of providers (Google Analytics, Plausible, Fathom, Matomo, Segment, PostHog, Mixpanel, Hotjar, Clarity).</p>\n<h2>Production Scan Results</h2>\n<p>After publishing, I re-ran the Safi scanner against the live production site (<code>https://brennan.day</code>) rather than my local build. The results were better in most categories:</p>\n<table>\n<thead>\n<tr>\n<th>Category</th>\n<th>Score</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>core-seo</td>\n<td>99</td>\n</tr>\n<tr>\n<td>content</td>\n<td>97</td>\n</tr>\n<tr>\n<td>images</td>\n<td>93</td>\n</tr>\n<tr>\n<td>performance</td>\n<td>89</td>\n</tr>\n<tr>\n<td>security</td>\n<td>91</td>\n</tr>\n<tr>\n<td>social-media</td>\n<td>99</td>\n</tr>\n<tr>\n<td>structured-data</td>\n<td>100</td>\n</tr>\n<tr>\n<td>crawlability</td>\n<td>100</td>\n</tr>\n<tr>\n<td>eeat</td>\n<td>100</td>\n</tr>\n<tr>\n<td>internationalization</td>\n<td>100</td>\n</tr>\n<tr>\n<td>legal</td>\n<td>100</td>\n</tr>\n<tr>\n<td>url-structure</td>\n<td>100</td>\n</tr>\n<tr>\n<td>links</td>\n<td>41</td>\n</tr>\n<tr>\n<td>analytics</td>\n<td>64</td>\n</tr>\n</tbody>\n</table>\n<p><strong>Overall score: 77/100</strong> across 60 crawled pages.</p>\n<p>The <code>links</code> category is now the biggest remaining issue, almost entirely because of broken or missing <code>rel=noopener</code> external links from webrings and blogrolls rather than anything I can fix on my own pages. With caveats in mind, my site is scoring in the high 90s for everything under my direct control.</p>\n<h2>What Did We Learn This Time?</h2>\n<p>Scanners are useful the way spellcheckers are. They can help catch simple mistakes, like how many <code>&lt;h1&gt;</code> headers are on a page, or the character length of meta descriptions, but there will often be many false positives, out of scope asks, and unimportant metrics. It takes wisdom as a web developer to know the difference.</p>\n<p>It is always far more important to get feedback from actual users (especially <a href=\"https://brennan.day/why-make-your-website-accessible-anyways/\">disabled users</a>) of your site rather than chasing perfect 100s on any auditor.</p>\n<p>But, like nearly every other coding venture on this website, it is a surefire way to have fun procrastinating actual important stuff!</p>\n",
      "image": "https://brennan.day/assets/images/blog/astronomer.jpg",
      "date_published": "2026-09-08T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "eleventy",
        "seo",
        "accessibility",
        "performance",
        "web development",
        "technical",
        "tutorial"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/tending-the-garden-i-have-a-current-state-of-affairs/",
      "url": "https://brennan.day/tending-the-garden-i-have-a-current-state-of-affairs/",
      "title": "Tending the Garden I Have: A Current State of Affairs",
      "summary": "Taking stock of my digital garden before the first frost: an honest audit of everything I'm tending online, from Brennan.day and fanfiction.lol to my 565-day writing streak, plus the projects I've neglected, the intentional prunes I'm happy with, and the dead plants I need to admit aren't growing—including a shelved radio show, a dormant newsletter, and an unstarted school.",
      "content_html": "<p>It's the sixth of September already, somehow. Summer finally feels as though it's at an end, with the temperature outside right now a chilly +9C°, and the overcast sky a slate pewter with a biting wind. This is my absolute favourite kind of weather—no worries of sunburn and heatstroke. Of course, this is merely temporary, as we're going to reach a sunny high of +23C° on Wednesday. But for now, the chill is kind.</p>\n<p>All the swaying leaves and foliage are still green—I can't help but question if they were still green this late into the season last year. I feel as though I should be seeing the yellowing blondes surrounded by the darker evergreen pines.</p>\n<p>What's for certain, though, is that the overnight frost will consume any remains of tended gardens. This is an unavoidable loss in the northern prairies. You grow for as long as the warmth will forgive. The harvest is usually small, especially compared to the home gardens eastward in British Columbia.</p>\n<p>In gardens, flowers bloom, and there's a silly-but-nice concept online called <a href=\"https://en.wiktionary.org/wiki/bloomscrolling\">bloomscrolling</a>, which is the act of focusing your online experience towards positive, uplifting and inspiring content. It falls into the broader online aesthetic movement of <a href=\"https://www.dailycal.org/blogs/hopecore-is-giving-me-hope/article_08e88e04-e0ab-11ee-b7a4-a3466aa7e726.html\">hopecore</a>.</p>\n<p>And I pause to think about my own garden—well, my digital garden (I haven't lived somewhere with enough space and soil for a real garden in a while). I want to take stock of all that I should be grateful for, and ensure I'm focusing myself on <a href=\"https://brennan.day/being-a-toolshed-of-optimism/\">positive, uplifting inspiration</a> more than anything else.</p>\n<p>I probably need a different term for this, because I don't just mean a single project, but rather everything I have and everything I do. My parcel of Internet that I've been tending to. But more importantly, what have I been neglecting and lacking? Like many developers, I find starting new projects and ambitions more compelling than maintaining what I already have.</p>\n<p>So, this is more of a public, personal review for myself of what I have, what I need to be doing, what I need to be doing less of, and what I need to admit to myself I need to shelve because I already have too many seedlings sprouting to take care of.</p>\n<p>If you're interested in seeing the behind-the-scenes of things, or the current state of my running projects, then this might be of interest for you. Otherwise, this is a ledger purely for myself that I am publishing for the sake of transparency and honesty (and, really, to give me yet another blog post, let's be real).</p>\n<h2>The Main Garden</h2>\n<p>My centre is <a href=\"https://brennan.day\">Brennan.day</a>, where I write my near-daily essays, host my <a href=\"https://brennan.day/slash-pages\">slash pages</a>, display my <a href=\"https://brennan.day/accounts\">active accounts</a>, and enjoy tinkering and <a href=\"https://brennan.day/collections/technical-tutorials/\">adding functionality for fun</a>. I syndicate my essays to <a href=\"https://medium.com/@brennanbrown\">Medium.com</a> and paywall my work there to make a living.</p>\n<p>I write at least 750 words every day on <a href=\"https://750words.com/person/brennan\">750words.com</a> and currently have a 565-day streak! I have an archive of my digital journal there starting from 2011, and have written +1,300,000 words in that time.</p>\n<p>I'm the webmaster for the transformative works archive <a href=\"https://fanfiction.lol\">fanfiction.lol</a>, a fork of <a href=\"https://archiveofourown.org/\">Archive of Our Own</a>, which currently has over 300 users and over 400 works! This is <a href=\"https://brennan.day/homelab-for-the-beginner-you-can-self-host-your-own-server-on-50-hardware/\">self-hosted on my homelab</a>.</p>\n<p>I write and publish poetry on <a href=\"https://bkpoetry.com\">BKpoetry.com</a>, my longstanding Tumblr account that has over 17,000 followers. My independently published chapbooks are available for purchase on <a href=\"https://brennanbrown.gumroad.com/\">Gumroad</a>. Through my public writing, I've been writing enough material for my next publication, but I haven't started on the formatting, layout, etc. for that yet.</p>\n<h3>Social Media</h3>\n<p>Regarding social media, I do a bit of microblogging on <a href=\"https://social.lol/@brennan\">Mastodon</a>, and then keep up POSSE syndication of sharing my posts on my <a href=\"https://bsky.app/profile/brennan.day\">Bluesky</a>, <a href=\"https://linkedin.com/in/brennankbrown\">LinkedIn</a>, and <a href=\"https://me.dm/@brennanbrown\">Medium's Mastodon instance</a>. Feel free to follow or connect with me on these platforms if you use them, but note that I'm mostly just syndicating.</p>\n<p>I also typically browse more indie places, like the <a href=\"https://discourse.32bit.cafe\">32-bit Café</a>, <a href=\"https://ctrlshift3.com/\">Ctrl+Shift+3</a>, <a href=\"https://pillowfort.social\">Pillowfort</a>, and <a href=\"https://bubbles.town\">Bubbles.town</a> on a daily basis to keep up with the IndieWeb. I've written about <a href=\"https://brennan.day/five-interesting-indie-platforms-you-might-not-have-heard-of/\">these platforms</a> in <a href=\"https://brennan.day/bubbles-town-four-months-later/\">more detail</a> previously if you're curious. I'm also a proud member of <a href=\"https://brennan.omg.lol\">omg.lol</a> and use its services often. I'm also always on IRC via <a href=\"https://halloy.chat/\">Halloy</a>.</p>\n<h3>Programming</h3>\n<p>Regarding my coding projects, I'm active on <a href=\"https://gitlab.com/brennankbrown\">GitLab</a>, <a href=\"https://codeberg.org/brennanbrown\">Codeberg</a>, <a href=\"https://source.tube/brennan\">Source.tube</a> and reluctantly <a href=\"https://github.com/brennanbrown\">GitHub</a>. I keep track of my coding with <a href=\"https://wakatime.com/@brennan\">Wakatime</a>, and some of my technical articles are on <a href=\"https://dev.to/brennan\">dev.to</a>. I recently updated my <a href=\"https://berryhouse.ca/portfolio\">portfolio</a> to show off my projects.</p>\n<p>I have a backup of my main site synced weekly on <a href=\"https://brennanday.neocities.org/\">Neocities</a> and a script that mirrors every page in my <code>sitemap.xml</code> to the <a href=\"http://web.archive.org/web/sitemap/brennan.day\">Wayback Machine</a>.</p>\n<h3>Scholarship</h3>\n<p>Regarding scholarship, I have accounts set up on <a href=\"https://www.researchgate.net/profile/Brennan-Brown-2\">ResearchGate</a>, <a href=\"https://orcid.org/0009-0004-9951-3451\">ORCID</a>, and <a href=\"https://scholar.google.ca/citations?user=XqdnVq0AAAAJ\">Google Scholar</a>. I was also recently added to <a href=\"https://blog.front-matter.de/posts/rogue-scholar-newsletter-august-2026/\">Rogue Scholar</a>. Sadly, my publication was rejected for an ISSN, as &quot;personal blogs and personal web sites <a href=\"https://www.canada.ca/en/library-archives/services/publishers/issn/obtain.html#a1\">are not eligible</a> for ISSN assignment.&quot;</p>\n<h3>Reaching Me</h3>\n<p>While there are many different ways to reach me, the best is always going to be email: <a href=\"mailto:mail@brennanbrown.ca\">mail@brennanbrown.ca</a></p>\n<h2>What Needs Tending</h2>\n<p>There are things I want to tend more. I've dropped off on my online diary and behind-the-scenes writing on <a href=\"https://brennanbrown.dreamwidth.org/\">Dreamwidth</a>, but that's mostly been because I've been so busy with blogging each day in August. I have more wiggle room, now. I also want to be more active on my <a href=\"https://tilde.town/~brennan/\">Tilde accounts</a> and <a href=\"https://brennan.smol.pub/\">Gemini capsule</a>.</p>\n<p>There's also my professional portfolio at <a href=\"https://brennanbrown.ca\">BrennanBrown.ca</a>, and it's pretty much fine, albeit out of date. Same with my <a href=\"https://cv.brennanbrown.ca\">digital CV</a>. I think I'm fine with these being in more of a maintenance mode.</p>\n<h2>Good Prunes</h2>\n<p>There have been intentional prunes I'm happy with. <a href=\"https://brennan.day/a-full-guide-to-properly-delete-corporate-social-media-accounts/\">Quitting corporate social media</a> has been wonderful. I no longer have to worry about syndicating my work to Threads or Instagram the way I do to Bluesky and Mastodon. Nor do I have the constant temptation of numerous endless scrolling feeds.</p>\n<p>And the truth is that corporate social media has never given me significant metrics. These platforms are specifically designed to keep people on them, and it's documented that <a href=\"https://www.socialmediatoday.com/news/heres-each-big-social-platform-stand-external-links/733946/\">external linking is suppressed</a>.</p>\n<p>If people want to continue reading my work and contact me, I make that as easy as I can. Even if you don't remember my website, you can just Google me. That is one advantage to using my full name everywhere.</p>\n<h2>Dead Plants</h2>\n<p>There's a trend online of people <a href=\"https://rakowwwski.substack.com/p/welcome-to-the-museum-of-failures\">posting their own &quot;Museum of Failures&quot;</a> on social media, where people walk followers through exhibits, such as fumbling a once-in-a-lifetime opportunity or living fifteen years spent in a city they disliked, all presented as a self-aware highlight reel more than a confession.</p>\n<p>In Vancouver, curator Eyvan Collins runs the <a href=\"https://www.cp24.com/news/canada/2026/01/26/museum-in-vancouver-puts-personal-failures-on-display-encouraging-people-to-move-on/\">Museum of Personal Failure</a>, which puts actual objects on display at a mall. A dead aloe plant, an old wedding dress from a failed marriage, a rejection letter—paired with a handwritten explanation from whoever submitted it. It began as a way for Collins to process a bad breakup and ended up with enough material for a full exhibition.</p>\n<p>Failure isn't something to bury—I emphatically agree there—but it's just as cynical to turn it into content, trying to reframe your flops into &quot;exhibits&quot; for engagement. What I'm trying to do here is just be honest and take stock. There are projects I've started, or wanted to start, which I admit haven't been working or been worked on. And this audit is where I'm honest with myself about what I'm actually doing and what I need to intentionally quit, rather than letting them continue to linger in an indefinite limbo of &quot;oh yeah, I'll get to that when I have time, surely.&quot;</p>\n<p>To start, I began <a href=\"https://berryhouse.ca\">Berry House</a> before I started my independent publication Brennan.day, as I envisioned myself doing webdev work for a living rather than writing. But this hasn't been the case. While I put all the webdev projects I do under the Berry House name, I don't have any clientele, but I do try to help out people and do consultations pro bono when asked.</p>\n<p>I also had the idea to do a <a href=\"https://brennan.day/announcing-my-new-radio-show-a-love-letter-to-public-access-television/\">public radio show</a> and I got all the technical logistics set up for it, and I even migrated it from the costly DigitalOcean droplet to my self-hosted homelab; however, I still haven't actually done a radio show yet. This is due both to the amount of dedicated time it would take which I'm still spending on writing, and also just that I'm rather shy!</p>\n<p>Related to that, while I'm proud of how I have been able to start and keep <a href=\"https://folk.zone\">Folk.zone</a> online, I'm thinking of shutting it down. I don't believe any of the services are being used, and they take up considerable computational power despite being unused.</p>\n<p>Next, you'll notice there's a newsletter sign-up on my website via <a href=\"https://buttondown.com/brennanbrown/\">Buttondown</a>, but I've never actually sent out a newsletter! I think this is a much lesser evil than sending a bunch of spam, but it is still a failure nonetheless. My original plan was to email via RSS, but that requires a premium account at $12CAD/month, and it really doesn't seem worth the expense. I would recommend using an RSS reader to keep up with my blog! While the newsletter is dormant right now, I think it would be good to sign up just in case something catastrophic happened to my site and email was the only way I could communicate that (but I'll also always have Mastodon, Bluesky, etc.)</p>\n<p>Additionally, I was supposed to start <a href=\"https://fireweed.school\">Fireweed School</a> this summer, but again I haven't had the time to dedicate to this, especially if I'm expecting people to pay for it. I absolutely recommend people join the <a href=\"https://webwriterscollective.com\">Web Writers' Collective</a> if they're interested in something like this, which I'm an organiser for!</p>\n<p>I also announced awhile back that I was aiming to obtain a bachelors in computer science from the <a href=\"https://www.uopeople.edu/\">University of the People</a>. While I completed my first semester, I realize I don't have the funds (even tuition-free) or (again) the time to dedicate myself to this. Instead, I will continue completing the still-existing MOOCs and use my public library card to continue using <a href=\"https://www.calgarylibrary.ca/read-learn-and-explore/digital-library/linkedin-learning-for-library\">LinkedIn Learning free of charge</a>!</p>\n<p>Overall, there is a relief of narrowing my scope and focusing better on less. I need to stop biting off more than I can chew, that's for sure, but it's also fun throwing everything at the wall and seeing what sticks.</p>\n<p>Finally, I have been a total failure when it comes to the <a href=\"https://brennan.day/toonie-club/\">Toonie Club</a>, as I haven't been putting out a members-only monthly newsletter. I haven't taken out any funds I've received from this on Patreon, and it's a low-cost amount, so I'm happy to give full refunds. If you'd like to continue being a supporter, please <a href=\"mailto:mail@brennanbrown.ca\">email me</a> with what name and URL you'd like to be put on a publicly-displayed supporter wall that's going to be on my site (another perk I promised) and let me know if you'd like a virtual meeting for anything! Otherwise, going forward I'm going to make it more clear that your contributions will be more for ensuring I can continue my writing without a paywall, as well as my free coding projects and web services for everyone. Unlike the other failures, this affects other people, and so I take it a lot more seriously.</p>\n<h2>The Harvest</h2>\n<p>Frost arrives whether or not you figured out what's worth saving, there's no negotiation when the shock kills the plant. Maybe that's the lesson in all this counting. Choosing has to happen before the cold makes it for you. There are a lot of unknowns for me as winter approaches, but I do know that the scattered seedlings of my daily essays and archive are still growing. I've yet to take a step back and really appreciate or understand what this site and project are growing into, but it's so fun taking it day-by-day.</p>\n<p>I'm grateful for the time, for the gloomy days where I can make a cup of green tea and watch the rain before it turns into sleet. For being able to look honestly at what's working and what isn't. I can breathe a sigh of relief fogging up near the open window.</p>\n",
      "image": "https://brennan.day/assets/images/blog/gardening.jpg",
      "date_published": "2026-09-07T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "blogging",
        "IndieWeb",
        "digital garden",
        "projects",
        "self-reflection",
        "small web",
        "community"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/love-is-for-the-ones-who-love-the-work/",
      "url": "https://brennan.day/love-is-for-the-ones-who-love-the-work/",
      "title": "Love is for the ones who love the work.",
      "summary": "Taking the final line of Joseph Fasano's poem 'For a Student Who Used AI to Write a Paper' as a starting point, I argue that loving the verb of creation matters more than daydreaming the noun. There's a wide chasm between writing discipline and the seduction of genAI shortcuts. The only way forward is to start doing the work—badly, bravely, and now.",
      "content_html": "<p>The title of this post comes from the last line of Joseph Fasano's poem <a href=\"https://poets.org/poem/student-who-used-ai-write-paper\">&quot;For a Student Who Used AI to Write a Paper&quot;</a>, but to me, it encompasses so much more than that.</p>\n<p>For people have always yearned for an easier way—to fudge the numbers, or to outright cheat. At times, there's a valid strategy here. Many things in life are not worth putting 100% of your effort into, and knowing when to go all gas no brakes is sacred wisdom. There are people who work hard their entire lives and have nothing to show for it because of the unlucky alignment of where that energy is focused and channelled.</p>\n<p>But far more often, people yearn. There are dreams and written goals and recurring thoughts of taking action, but then something else happens. <a href=\"https://brennan.day/a-ship-in-harbour-is-safe/\">A ship in harbour is safe</a>, but that is not what ships are built for.</p>\n<p>I write this as somebody who is often remarked upon for my writing cadence and consistency. Sometimes, people ask how they can emulate what I do—they ask what the magic is to replicate my output.</p>\n<p>With how much I've written about <a href=\"https://brennan.day/collections/writing-craft/\">the craft of writing</a>, I've attempted to approach this question from a variety of angles to give a satisfying answer. I've written before about what my unromantic <a href=\"https://brennan.day/the-true-unglamorous-life-of-a-writer/\">day-to-day life looks like as a full-time writer</a>, that <a href=\"https://brennan.day/compulsion-the-writers-who-wrote-the-most-in-history/\">I have a compulsion</a>, and about the <a href=\"https://brennan.day/the-inertia-effect-stop-optimizing/\">inertia problem</a> of premature optimization.</p>\n<p>But love is for the ones who love the work. I don't daydream about the romantic notions of being a writer. I just write. I don't think my thoughts are too unimportant or too uninteresting to write them out. I just write. I do not wish I was loafing around and doing something easier. I just write.</p>\n<p>There is another poem that Fasano seemed to be echoing, written by Robert Frost titled <a href=\"https://poets.org/poem/hyla-brook\">Hyla Brook</a>, which has the last line:</p>\n<blockquote>\n<p>&quot;We love the things we love for what they are.&quot;</p>\n</blockquote>\n<p>Do you love the thought of the thing, or the thing itself? Do you find yourself buying books you never read, or do you read page-after-page of loaned paperbacks from the public library? Have you amassed pristine stationery and an empty gilded notebook, or do you just write and plan on whatever you can find?</p>\n<p>Being a collector is not lesser or inferior—it can be a deeply enjoyable hobby in its own right—but do not think you are creating if you only collect. You must love the verb, not the noun.</p>\n<p>I have been trying to write <a href=\"https://brennan.day/creating-an-open-source-blogging-studies-syllabus/\">a curriculum for blogging</a> for the past few days, and this is admittedly where I always get stuck. It is rather easy to teach the mechanics and the logistics—the platforms, the Markdown syntax, the best practices—whatever.</p>\n<p>But how do you teach someone to love the work? You kind of have to start with that being presumed as already being in the person—a prerequisite to the class.</p>\n<p>But how many people out there really love the work? Wouldn't they have already started on their own if that feral hunger was already within them? I could help channel and focus that drive and spirit, the way I have done with my own, but that is still a different topic entirely. And, too, I think of the question &quot;what do I write about?&quot; and it has the same answer. What you love. We love the things we love for what they are.</p>\n<p>When I attempt to have a dialogue with so-called genAI &quot;artists,&quot; I hear the same response I do to someone brand new to any craft: <a href=\"https://mastodon.social/@JigenD/117197755722486011\">&quot;I realized at some point that the breadth of what I would ideally be able to create wouldn't be attainable in my lifetime.&quot;</a></p>\n<p>When we focus on the output—on the noun of the work—it can seem impossibly daunting. The truth is you need to <a href=\"https://brennan.day/do-it-ugly-on-bad-art-and-civic-duty/\">do it ugly</a>. There is no substitution here. You need to be bad at something before you're good at it. Trying to circumvent this with shortcuts, such as genAI, will only prolong your lack of improvement.</p>\n<p>There is bold, colourful weirdness in the flaws of what you create with your own two hands. It is entirely unique and yours alone. Do not let your humanity be eroded by the piss-average output of a machine that, sure, looks better at first glance, but becomes painfully boring and useless so quickly.</p>\n<p>And the truth may be that you don't love the work. That the verb is entirely different from the daydreamed noun in your head. That's okay! But you can only find out by giving it a fair start and trying.</p>\n<p>Imagine where you'd be if you started ten years ago. Again, it is a bitter reckoning to contemplate that, I understand. But the second best time to start is now. I promise.</p>\n",
      "image": "https://brennan.day/assets/images/blog/hardwork.jpg",
      "date_published": "2026-09-05T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "writing",
        "Writing Process",
        "creativity",
        "AI",
        "generative AI",
        "Social Commentary"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/i-want-to-be-unremarkable/",
      "url": "https://brennan.day/i-want-to-be-unremarkable/",
      "title": "I Want to be Unremarkable",
      "summary": "A meditation on the contradiction of writing publicly while wanting to remain unremarkable, drawing on Daoist uselessness, Epicurean lathe biōsas, state legibility, and Deleuzian imperceptibility—and why the only peaceful path is to keep writing and surrender to shared oblivion.",
      "content_html": "<p>For my entire life, I have been aware that <a href=\"https://brennan.day/you-must-you-must-you-must/\">I must die</a>, and that my time alive is finite. This has always been a helpful motivator in doing important things, such as writing hundreds of words each day. When you recognize the timescale of epochs and eras, you also recognize how short your own existence is, and how pressing and urgent your actions must be.</p>\n<p>And for the most part, this has oriented me towards good—I want to try to leave the world better than I found it, and make use of my capabilities for the sake of others.</p>\n<p>But I am compelled not only to write, but to write in public. A compulsion to show my work and share myself as much as possible. I want there to be a record—a carving in the stone. And I have to reconcile this compulsion toward legacy with the fact that I want to remain, personally, unremarkable.</p>\n<p>There's an obvious tension there, if not an outright contradiction. I want to contribute good to the world, but I want my contributions separated from myself. I want people to discuss any good ideas I may have and forget the author. How do I negotiate the bargain between public writing and private obscurity?</p>\n<p>For I <em>am</em> unremarkable—I am just some guy writing on the Internet and I never forget that. My opinions don't matter, and I am far more often compiling the original efforts of others rather than investigating things first-hand or breaking a story myself. I am a layperson through and through. And perhaps this is why I would want to remain forgettable—it is more aligned with reality.</p>\n<p>There is a Daoist argument that uselessness is a survival strategy—<a href=\"https://uselessoldtree.com/chuangtzu/\">the gnarled tree that the carpenter cannot make good wood from</a> is the only one left standing. You cannot be extracted and exploited if you have nothing to offer. <a href=\"https://www.amentsoc.org/insects/glossary/terms/crypsis/\">Crypsis</a> is the biological ability—and evolutionary advantage—to freeze and mask your scent, after all. And I think I have done a good job of that, in many ways. Despite my output, I'm not enticing to brands or sponsorships, and there is no real way to make revenue off of me. Good.</p>\n<p>Epicurus had the idea of <a href=\"https://twentiers.com/lathe-biosas/\"><em>lathe biōsas</em></a>, <a href=\"https://anopenground.com/2025/02/05/lathe-biosas/\">live unnoticed</a>—the ethical maxim that we ought to withdraw from public ambition and civic visibility, as recognition invites both envy and obligation. This is the direct opposite of the Stoic/Aristotelian model of virtue requiring a public life.</p>\n<p>In <a href=\"https://www.goodreads.com/en/book/show/20186.Seeing_Like_a_State\"><em>Seeing Like a State</em></a>, James C. Scott describes the concept of <a href=\"https://ribbonfarm.com/2010/07/26/a-big-little-idea-called-legibility/\">&quot;legibility&quot;</a> and argues that state power depends on making populations, lands, and transactions legible. Mapped, named, standardized and countable. In his follow-up, <a href=\"https://theanarchistlibrary.org/library/james-c-scott-the-art-of-not-being-governed\"><em>The Art of Not Being Governed</em></a>, he examined hill peoples in Southeast Asia who organized their agriculture, kinship, and even their lack of writing systems to stay outside that legibility. Illegibility is a method to evade capture.</p>\n<p>Similarly, Deleuze and Guattari discuss the idea of &quot;becoming imperceptible&quot; in <a href=\"https://theanarchistlibrary.org/library/gilles-deleuze-felix-guattari-a-thousand-plateaus\"><em>A Thousand Plateaus</em></a>. <a href=\"https://fractalontology.wordpress.com/2008/06/01/a-thousand-plateaus-chapter-eight-lines-and-segmentarity/\">An endpoint of a line of flight</a>: the fixed, representable self dissolved so it can no longer be captured by systems of identity, classification, and control.</p>\n<p>We have lost the practical obscurity of <a href=\"https://supreme.justia.com/cases/federal/us/489/749/\"><em>DOJ v. Reporters Committee, 1989</em></a> given how frictionless search and aggregation have become. But the end-user still has <a href=\"https://blog.brennanbrown.ca/21-structure-chaos-ca5545d8dfdb\">obfuscation</a>—the act of producing signals of excessive ambiguity and misleading noise. If how we act is too confusing and unpredictable, we cannot be predicted.</p>\n<p>Of course, how people perceive me is outside of my control entirely. While I can write whatever I want, I cannot control the response—and I likewise cannot control what people think (or don't think) of me. And of course I'm only writing this because <a href=\"https://brennan.day/normalized-fascism-in-open-source-12-million-given-to-dhh/\">my writing yesterday</a> gained thousands of views and <a href=\"https://lobste.rs/s/ipy9xw/normalized_fascism_open_source_12\">dozens of comments</a>. But it will fade and pass just as every other spike and blip has in the past, and I will return to my small number of dedicated, lovely readers.</p>\n<p>The most peaceful and relaxing choice is, as usual, surrender. I'll keep writing what I write, regardless. No matter what I contribute and no matter the reception, I will reach <a href=\"https://brennan.day/our-shared-oblivion/\">the same oblivion</a> as everyone else. And this is exactly why I do what I want. And I am so thankful for this absurd, mostly invisible life I have.</p>\n<blockquote>\n<p>I’m Nobody! Who are you?<br>\nAre you – Nobody – too?<br>\nThen there’s a pair of us!<br>\nDon’t tell! they’d advertise – you know!</p>\n<p>How dreary – to be – Somebody!<br>\nHow public – like a Frog –<br>\nTo tell one’s name – the livelong June –<br>\nTo an admiring Bog!</p>\n<p>— <a href=\"https://poets.org/poem/im-nobody-who-are-you-260\">Emily Dickinson, #260</a></p>\n</blockquote>\n",
      "image": "https://brennan.day/assets/images/blog/alone.jpg",
      "date_published": "2026-09-03T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "philosophy",
        "ethics",
        "privacy",
        "writing",
        "mortality"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/normalized-fascism-in-open-source-12-million-given-to-dhh/",
      "url": "https://brennan.day/normalized-fascism-in-open-source-12-million-given-to-dhh/",
      "title": "Normalized Fascism in Open Source: $12 Million Given to DHH",
      "summary": "Open source has become a safe harbor for far-right politics, from David Heinemeier Hansson's white-nationalist rhetoric and the Omarchy Foundation's $12 million in patron funding to so-called apolitical projects that treat marginalized contributors as political, and why a united boycott of complicit tech companies is our only way forward.",
      "content_html": "<p>I'm somebody who's written rather extensively on <a href=\"https://brennan.day/collections/ai/\">generative AI ethics</a>, and I feel there is a lot that is unethical about the current corporate climate and culture surrounding the technology. And when I write about LLMs and chatbots, I'm careful not to make judgments about the people using the end products—I don't think you're a bad person if you use ChatGPT or Claude, or whatever.</p>\n<p>What I'm discussing today is different. There is no room for debate or argument, here—only hard, absolute lines in the sand.</p>\n<p>Much of the world has become far too complacent and complicit with people (and their companies) who proclaim and hold far-right, fascist ideology. These are not image boards residing in the fringe corners of an anonymous Internet made up of people who have slipped through the cracks. No, these are wealthy people in power who are blatant and shameless in their support for those who continuously beat the drum of bigotry, xenophobia, transphobia, and cynical accelerationist hatred.</p>\n<p>Open source technology has become a culture safe for this rhetoric and ideology, with millions of dollars being invested to continue this status quo.</p>\n<p>You need to be made aware of this, and then you need to be vocal and take action.</p>\n<h2>DHH</h2>\n<p><a href=\"https://dhh.dk/\">David Heinemeier Hansson</a> is the most well-known figurehead here. He is the creator of Ruby on Rails, CTO of 37signals, and a Shopify board member.</p>\n<p>In September 2025, DHH published <a href=\"https://web.archive.org/web/20250925050154/https://world.hey.com/dhh/as-i-remember-london-e7d38e64\">&quot;As I remember London&quot;</a>, mourning that London is &quot;no longer full of native Brits&quot;—a claim that redefines &quot;native Brit&quot; to mean &quot;white.&quot; Developer Jake Lazaroff <a href=\"https://jakelazaroff.com/words/dhh-is-way-worse-than-i-thought/\">details how DHH</a> describes a Tommy Robinson march as &quot;heartwarming,&quot; where speakers called for &quot;remigration&quot; (a euphemism for the ethnic cleansing of non-white residents) and one speaker demanded that countries &quot;ban halal,&quot; &quot;ban mosques,&quot; and &quot;ban temples.&quot; DHH invokes abuse scandals to bolster his white-nationalist rhetoric, framing non-white men as predators of &quot;British girls,&quot; while UK data <a href=\"https://www.csacentre.org.uk/research-resources/research-evidence/scale-nature-of-abuse/trends-in-official-data/\">shows no such racial skew</a>. <a href=\"https://thelibre.news/lets-talk-about-dhh/\">LibreNews</a> reaches the same conclusion.</p>\n<p>In July 2026, DHH published <a href=\"https://web.archive.org/web/20260721200429/https:/world.hey.com/dhh/wolves-sheep-and-gypsies-ba44af6a\">&quot;Wolves, sheep, and gypsies&quot;</a>, an essay comparing Denmark's rebounding wolf population to Roma encampments in Copenhagen parks as two versions of the same problem, closing with: &quot;When wolves get out of control, you shoot them. When gypsies take over public spaces, you deport them. This isn't hard, it isn't cruel. It's the basic logic of self-preservation.&quot; As <a href=\"https://couchsky.app/u/chimeracoder.bsky.social/p/3mrnl6w23p22g\">Bluesky user Aditya Mukerjee pointed out</a>, the Roma people DHH is talking about deporting are mostly citizens of the countries they live in. &quot;Deport&quot; doesn't describe a coherent policy proposal, it's ethnic cleansing with softer wording. DHH then complained publicly <a href=\"https://world.hey.com/dhh/i-m-sorry-dave-380ec27d\">when Claude refused his request</a> to translate the post into Italian, with Anthropic's model explaining it was declining because &quot;putting Roma people alongside wolves, with shooting and deportation as parallel solutions, is dehumanizing toward an ethnic group.&quot;</p>\n<p>Developer Joel Drapper wrote how <a href=\"https://joel.drapper.me/p/rubygems-takeover/\">Ruby Central had lost a $250,000-a-year sponsorship</a> from Sidekiq after giving DHH a speaking slot at RailsConf a few weeks later, leaving the nonprofit financially dependent on Shopify (where DHH sits on the board); Shopify then pushed Ruby Central to consolidate control rather than lose its funding. <a href=\"https://www.theregister.com/2025/09/25/open_source_to_closed_doors/\">The Register</a> and <a href=\"https://www.heise.de/en/news/Who-owns-an-open-source-project-RubyGems-threatens-to-split-10685184.html\">Heise</a> both covered the fallout.</p>\n<p>But none of this has cost DHH money—if anything, he's only gained. A few weeks ago, DHH <a href=\"https://omarchy.org/news/2026/08/omacom-foundation-launches-with-8-million/\">announced the Omacom Foundation</a> to bankroll his Linux distribution, Omarchy, which is nothing more than a few vibecoded scripts on top of Arch Linux.</p>\n<p>There are twelve &quot;Founding Patrons&quot; pledging a million dollars apiece:</p>\n<ul>\n<li><a href=\"https://x.com/tobi\">Tobi Lütke</a>, CEO of <a href=\"https://www.shopify.com/\">Shopify</a></li>\n<li><a href=\"https://x.com/patrickc\">Patrick Collison</a>, CEO of <a href=\"https://stripe.com/\">Stripe</a></li>\n<li><a href=\"https://x.com/MichaelDell\">Michael Dell</a>, Chairman and CEO of <a href=\"https://www.dell.com/\">Dell Technologies</a></li>\n<li><a href=\"https://x.com/jack\">Jack Dorsey</a>, Block Head and Chairman of <a href=\"https://block.xyz/\">Block</a></li>\n<li><a href=\"https://x.com/eastdakota\">Matthew Prince</a>, CEO of <a href=\"https://www.cloudflare.com/\">Cloudflare</a></li>\n<li><a href=\"https://x.com/brendaniribe\">Brendan Iribe</a>, Cofounder of <a href=\"https://www.sesame.com/\">Sesame</a> and Oculus</li>\n<li><a href=\"https://x.com/jasonfried\">Jason Fried</a>, CEO of <a href=\"https://37signals.com/\">37signals</a></li>\n<li><a href=\"https://x.com/drewhouston\">Drew Houston</a>, cofounder and co-CEO of <a href=\"https://www.dropbox.com/\">Dropbox</a></li>\n<li><a href=\"https://x.com/steipete\">Peter Steinberger</a>, creator of <a href=\"https://openclaw.ai/\">OpenClaw</a></li>\n<li><a href=\"https://x.com/brian_armstrong\">Brian Armstrong</a>, CEO of <a href=\"https://www.coinbase.com/\">Coinbase</a></li>\n<li><a href=\"https://x.com/xdanger\">Yunjie Dai</a>, cofounder of <a href=\"https://www.taptap.io/\">TapTap</a></li>\n<li>DHH himself.</li>\n</ul>\n<p>And these people are each contributing $100,000 a year for three years:</p>\n<ul>\n<li><a href=\"https://x.com/ryanrhughes\">Ryan R. Hughes</a>, partner at <a href=\"https://heyoodle.com/\">Oodle</a></li>\n<li><a href=\"https://x.com/dxhuang\">Ed Huang</a>, cofounder and CTO of <a href=\"https://www.pingcap.com/\">PingCAP</a></li>\n<li><a href=\"https://www.linkedin.com/in/atreccani/\">Adrien Treccani</a>, founder of <a href=\"https://ripple.com/products/custody/\">Metaco</a></li>\n<li><a href=\"https://x.com/mschoening\">Max Schoening</a>, Head of Product at <a href=\"https://www.notion.com/\">Notion</a></li>\n</ul>\n<p>And these corporations are each contributing $100,000 a year for three years:</p>\n<ul>\n<li><a href=\"https://1password.com/\">1Password</a></li>\n<li><a href=\"https://37signals.com/\">37signals</a></li>\n<li><a href=\"https://www.paywithfour.com/\">Four Technologies</a></li>\n</ul>\n<p>And this corporation is contributing $1 million a year for three years:</p>\n<ul>\n<li><a href=\"https://www.digitalocean.com/\">DigitalOcean</a> (<a href=\"https://omarchy.org/news/2026/09/digitalocean-joins-as-founding-corporate-patron/\">announcement</a>)</li>\n</ul>\n<p>These corporations are contributing $1.5 million in tokens to the mission:</p>\n<ul>\n<li><a href=\"https://www.meta.com/superintelligence/\">Meta Superintelligence Labs</a></li>\n</ul>\n<p>And these corporations are each contributing $150,000 in tokens, with renewal by mutual agreement:</p>\n<ul>\n<li><a href=\"https://www.anthropic.com/\">Anthropic</a></li>\n<li><a href=\"https://fireworks.ai/\">Fireworks</a></li>\n<li><a href=\"https://openai.com/\">OpenAI</a></li>\n<li><a href=\"https://openrouter.ai/\">OpenRouter</a></li>\n</ul>\n<p>Over a dozen of the most powerful executives in tech looked at a man who wrote that a British march calling for the deportation of non-white citizens was &quot;heartwarming,&quot; and decided he was the person they wanted to hand a multimillion-dollar foundation to.</p>\n<h2>Omarchy's Patrons</h2>\n<p>Because 18 million dollars isn't enough for some people, below the named executives and corporate sponsors sits a much longer list of supporters. Omarchy's open <a href=\"https://omarchy.org/patrons/\">patron program</a>, where &quot;each [contributes] as they see fit&quot; in exchange for a badge on the site. As of writing, that page lists several hundred backers, the vast majority of them ordinary developers and small consultancies. A few names stuck out to me:</p>\n<ul>\n<li><a href=\"https://axelfontaine.com/\">Axel Fontaine</a> is the creator of <a href=\"https://www.red-gate.com/blog/the-next-chapter-of-flyway/\">Flyway</a>, the widely used database migration tool he sold to Redgate in 2019. He's <a href=\"https://github.com/basecamp/omarchy/pull/6231\">also submitted code to the Omarchy repo</a>, which makes him both a funder and a hands-on contributor.</li>\n<li><a href=\"https://marc.io/\">Marc Köhlbrugge</a> is the founder of <a href=\"https://wip.co\">WIP</a> and <a href=\"https://betalist.com\">BetaList</a>, fixtures of the indie-hacker/bootstrapper scene that Omarchy's bullshit ricing aesthetic is clearly courting.</li>\n<li><a href=\"https://servicestack.net/\">ServiceStack</a> is an established .NET web-services framework vendor, one of the patrons backing the project as a company rather than an individual.</li>\n<li><a href=\"https://tamentis.com/\">Bertrand Janin</a> is a longtime open-source developer (ex-Ramp, ex-Truveris) running his own small shop, Atelier Janin.</li>\n<li><a href=\"https://pagecord.com/\">Pagecord</a> is a hosted blogging platform I've <a href=\"https://brennan.day/indieweb-ethos-and-pagecord/\">written about before</a>, where I documented how creator Olly fed a user's 26-year blog into an LLM without consent, then shipped the outputted script to production without reading it.</li>\n<li><a href=\"https://vincentritter.com/\">Vincent Ritter</a>, founder of Tinylytics and Scribbles, is a repeat presence in IndieWeb/micro.blog drama. In January 2025, <a href=\"https://social.lol/@neatnik/116919420230729975\">Adam Newbold catalogued a pattern of bigoted posting</a>: complaining about being <a href=\"https://danielpunkass.micro.blog/2025/01/23/mantons-enough-responds-to-the.html\">&quot;offended by pronouns&quot;</a>, being disappointed by more inclusive Apple emojis, disparaging &quot;foreigners&quot; who drive for Uber and play &quot;foul rap music,&quot; and praising Elon Musk the day after he performed two Nazi salutes on camera. Ritter's original posts making these remarks have since been deleted, <a href=\"https://json.blog/2025/01/22/compassion-when-i-cannot-offer.html\">Jason Becker notes as much</a>. Manton Reece, of micro.blog, publicly defends him.</li>\n<li><strong>9538-7874 Quebec inc.</strong> is one of at least a couple of numbered, unnamed Canadian corporations on the list. Bizarre shell companies with no public identity attached to them at all. I'm currently unsure about these.</li>\n</ul>\n<p>Most of these several hundred names are unremarkable, and that's on purpose. A grassroots-looking patronage tier can launder small supporters and known industry names alongside the big-hitting marquee donors.</p>\n<h2>Omarchy's Team</h2>\n<p>The people working directly on Omarchy are listed on the project's <a href=\"https://omarchy.org/teams/\">Teams page</a>:</p>\n<p><strong>Core</strong></p>\n<ul>\n<li><a href=\"https://dhh.dk/\">DHH</a> (USA/Denmark)</li>\n<li><a href=\"https://x.com/ryanrhughes\">Ryan R. Hughes</a> (USA)</li>\n<li><a href=\"https://x.com/tobi\">Tobi Lütke</a> (Canada)</li>\n<li><a href=\"https://x.com/iamdothash\">Bjarne Øverli</a> (Norway)</li>\n<li><a href=\"https://github.com/HANCORE-linux\">HANCORE</a> (Germany)</li>\n<li><a href=\"https://x.com/SpencerGBull\">Spencer Bull</a> (USA)</li>\n<li><a href=\"https://x.com/kwilczynski\">Krzysztof Wilczyński</a> (Japan)</li>\n<li><a href=\"https://x.com/outfoxxedd\">outfoxxed</a> (USA)</li>\n</ul>\n<p><strong>Security</strong></p>\n<ul>\n<li><a href=\"https://x.com/acrogenesis\">Adrian Rangel</a> (Mexico)</li>\n<li><a href=\"https://x.com/mdisec\">Mehmet İnce</a> (UK/Türkiye)</li>\n<li><a href=\"https://x.com/meltonaerik\">Erik Melton</a> (Norway)</li>\n<li><a href=\"https://x.com/Sayem314\">Sayem Chowdhury</a> (Bangladesh)</li>\n<li><a href=\"https://x.com/bastidotnet\">Sebastian Stange</a> (Germany)</li>\n</ul>\n<p><strong>Design</strong></p>\n<ul>\n<li><a href=\"https://x.com/BarisGirismen\">Barış Girişmen</a> (Türkiye)</li>\n<li><a href=\"https://x.com/hicsfh\">Christoffer Hallas</a> (USA)</li>\n<li><a href=\"https://x.com/captainscorch\">Daniel Schmier</a> (Germany)</li>\n<li><a href=\"https://x.com/avillagran\">Andrés Villagrán</a> (Chile)</li>\n<li><a href=\"https://github.com/SirJul1337\">Niklas Jul</a> (Denmark)</li>\n</ul>\n<p><strong>Rangers</strong></p>\n<ul>\n<li><a href=\"https://x.com/SandorhaziM\">Mihai</a> (Romania)</li>\n<li><a href=\"https://x.com/Mateo_VX\">Mateo Vaz</a> (Uruguay)</li>\n<li><a href=\"https://x.com/niraletter\">Nira</a> (Nepal)</li>\n</ul>\n<p>I should also mention that the same infrastructure companies bankrolling Omarchy and Ladybird are also the backbone of the ongoing violence of U.S. deportations. This includes <a href=\"https://www.immigrantdefenseproject.org/wp-content/uploads/How-Amazon-Powers-ICEs-Deportation-Machine.pdf\">Amazon's AWS contracts powering ICE</a>, <a href=\"https://mijente.net/wp-content/uploads/2018/10/WHO%E2%80%99S-BEHIND-ICE_-The-Tech-and-Data-Companies-Fueling-Deportations-_v1.pdf\">Palantir building ICE's case-management system</a>, and the use of <a href=\"https://www.nytimes.com/2025/10/16/us/salesforce-benioff-ice.html\">Salesforce's tools</a>.</p>\n<h2>&quot;Apolitical&quot;</h2>\n<p><a href=\"https://ladybird.org/\">Andreas Kling</a>, founder of the Ladybird browser project (itself an Omacom-adjacent beneficiary, <a href=\"https://ladybird.org/#sponsors\">sponsored by Cloudflare, FUTO, Shopify, 37signals, Proton, and JetBrains</a>), built his project's identity around refusing a documentation patch that would have made SerenityOS's manuals gender-neutral, on the grounds that gender-neutral language was &quot;personal politics&quot; that didn't belong in a technical project. Blogger <a href=\"https://kvibber.com/reviews/software/ladybird-inclusivity/\">Kelson Vibber</a> wrote how that became Ladybird's official contributing guidelines, which now bar &quot;discussions on societal politics&quot;—a policy treating the mere existence of trans contributors as more &quot;political&quot; than excluding them. In 2026, Kling <a href=\"https://x.com/awesomekling/status/1966456391146606806\">posted in support of Charlie Kirk</a> after Kirk's assassination and, per discussion on <a href=\"https://lobste.rs/s/oaxcep/cloudflare_is_sponsoring_ladybird\">Lobsters</a>, bristled at being called a fascist for it—a reaction hard to square with &quot;apolitical,&quot; since Kirk was a movement figure who, per his own <a href=\"https://en.wikipedia.org/wiki/Charlie_Kirk\">Wikipedia entry</a>, promoted the &quot;white genocide&quot; conspiracy theory and criticized the Civil Rights Act.</p>\n<p><a href=\"https://blog.vaxry.net/articles/2024-fdo-and-redhat\">Vaxry</a>, the developer behind the Hyprland Wayland compositor (another Omacom-funded project), was banned in 2024 by <a href=\"http://Freedesktop.org\">Freedesktop.org</a>'s Code of Conduct team over a pattern of the Hyprland Discord enabling harassment of trans community members, including an incident where moderators changed a trans user's display name to strip their pronouns. In Vaxry's own retelling on the <em>Tech Over Tea</em> podcast, <a href=\"https://thelibre.news/hyprland-banned-from-freedesktop-why/\">recounted at LibreNews</a>, the moderator swapped &quot;they/them&quot; for &quot;who/cares,&quot; and the user wasn't allowed to change it back. Vaxry's own <a href=\"https://blog.vaxry.net/articles/2024-fdo-and-redhat\">public response</a> framed the ban as ideological overreach by &quot;social justice warriors,&quot; while Freedesktop describes over a year of private attempts to get him to address the toxicity before going public. Hyprland's contributing guidelines now <a href=\"https://web.archive.org/web/20260330133306/https://blog.vaxry.net/resource/articleFDO/RHMails.pdf\">ban &quot;political&quot; speech too</a>.</p>\n<p>The funding relationship has only deepened since. The <a href=\"https://www.techtimes.com/articles/326089/20260831/omacom-foundation-hits-126m-1password-37signals-fund-linux-patron-model.htm\">Omacom Foundation announced an exclusive, three-year sponsorship of Hyprland</a>, with an option to extend for two more years. Vaxry's prior funding of individual donations and a €5/month Hyprperks subscription tier is being discontinued in favour of this single exclusive arrangement, meaning the developer <a href=\"http://freedesktop.org\">freedesktop.org</a> banned for enabling transphobic harassment is now bankrolled solely by DHH.</p>\n<p><a href=\"https://github.com/X11Libre/xserver/commit/4839966900d948c5793064b5dccbdb3fd35f558b\">Enrico &quot;metux&quot; Weigelt</a> forked the deprecated Xorg server into Xlibre as a rebellion against a &quot;RedHat DEI&quot; conspiracy he believes exists. The founding document of the project was a rant about big-tech diversity initiatives, and its code of conduct is a text file that just says &quot;404.&quot; <a href=\"https://web.archive.org/web/20251022160356/https://futo.org/about/futo-statement-on-opensource/\">FUTO</a> is a funder of Immich and is run by Eron Wolf, a friend and platformer of Curtis Yarvin, the &quot;dark enlightenment&quot; writer whose ideas about dismantling democracy have now found purchase in the current U.S. administration. <a href=\"https://samambreen.wordpress.com/2019/08/16/an-open-letter-to-brendan-eich/\">Brendan Eich</a>, Mozilla's co-founder and now Brave's CEO, used Brave's infrastructure to give payments to Kiwi Farms, a forum whose harassment campaigns <a href=\"https://www.motherjones.com/politics/2023/02/kiwi-farms-die-drop-cloudflare-chandler-trolls/\">have been linked to multiple suicides</a>.</p>\n<p>We witness the same pattern over and over. A tech project is declared &quot;apolitical,&quot; and defines any accommodation of marginalized contributors as a political act, and keeps the actual politics of the maintainers—nostalgia for ethnically white homogeneous cities and hostility to gender-neutral pronouns—off the table entirely. Because that's just, you know, how they feel. &quot;Apolitical&quot; has never meant a lack of politics. It's meant politics that current power doesn't have to defend.</p>\n<h2>The Throughline</h2>\n<p>We have been watching the fragile fury of white masculinity and hate metastasize and fester over the years, from Gamergate's harassment campaigns through years of anti-SJW cringe compilation content mills, the marking of Antifa as the enemy, the tantrum-throwing #AllLivesMatter movement, and the manufactured panic over DEI and &quot;wokeism.&quot;</p>\n<p>You are not living in the neoliberal-Obama era where basic compassion and empathy are the default anymore. And you haven't been for a long time. Despite their cries about censorship and deplatforming, and despite their persecution fetish, these people are not on the fringe. They have board seats and sponsorships and multimillion-dollar foundations.</p>\n<p>It is no coincidence this is occuring as companies and brands <a href=\"https://www.theglobeandmail.com/investing/markets/stocks/UL/pressreleases/31643497/why-big-brands-are-quietly-returning-to-x/\">return to X</a>, as the United States <a href=\"https://www.americanprogress.org/article/the-trump-administration-is-interfering-in-the-2026-midterm-elections-to-entrench-the-imperial-presidency/\">votes at a Midterm election being interfered with by a sitting president</a>, as conservatives <a href=\"https://www.lemonde.fr/en/opinion/article/2026/05/06/sweden-s-right-is-now-normalizing-the-far-right-party-born-from-the-fascist-movement_6753170_23.html\">normalize the far-right in Europe politics</a> and <a href=\"https://www.errc.org/news/the-normalisation-of-neo-fascism:-anti-roma-racism-at-the-heart-of-europes-far-right\">culture</a>.</p>\n<p>If you want a more thorough and longer list of people, companies, and products, then I recommend reading up on <a href=\"https://wiki.xxiivv.com/site/devine_lu_linvega.html\">Devine Lu Linvega's</a> <a href=\"https://git.sr.ht/~rabbits/fashware\">Fashware</a> list on Sourcehut, as well as Drew DeVault's list of <a href=\"https://drewdevault.com/weird-guys/\">Weird Little Guys</a>.</p>\n<p>You may be in a position where the specific harms and rhetoric being spewed are not aimed at you, and you may have been coaxed into viewing what I'm saying here as overreaction, or as a rabid, self-righteous screed. Millions of dollars have been spent to ensure this, and it could not be further from the truth.</p>\n<p>We cannot afford to continue to shrug off the presence of these people and their projects in open source. A united stand must be taken.</p>\n<p><strong>Speak up on this</strong>. Boycott aggressively. Let people know you don't support Cloudflare, Shopify, 37signals, Dell, 1Password, Framework, Block, Coinbase, Dropbox, TapTap, and any other company enabling the spread of dangerous and harmful political ideologies that will continue to result in further violence and death. And let people know the harm these companies are actively doing.</p>\n<p>We cannot allow this to continue; we must be far more proactive and assertive in our fight against the normalization of fascism and the far right. We must be willing to sacrifice ease and convenience, and we must be willing to sever all connections with these entities.</p>\n<p>It is our only way forward.</p>\n",
      "image": "https://brennan.day/assets/images/blog/antifa.jpg",
      "date_published": "2026-09-02T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "politics",
        "open source",
        "fascism",
        "technology"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/100-questions-for-webmasters/",
      "url": "https://brennan.day/100-questions-for-webmasters/",
      "title": "100 Questions for Webmasters",
      "summary": "A hundred-question chain meme making the rounds about how and why we make websites. I answer my way through questions on workflow, editors, CSS confidence, webrings, Neocities and Nekoweb, domain names, accessibility, genAI ethics, Gruvbox, and everything else about being a webmaster.",
      "content_html": "<p>I really miss chain-letter-style questionnaires, which I often participated in on sites like deviantART and Nexopia many years ago.</p>\n<p>There's been one floating around <a href=\"https://mouseling.net/100webmaster\">specifically designed for webmasters</a> created by <a href=\"https://mouseling.net/\">MOUSEcky</a>! Initially, I wasn’t going to answer these questions, since I feel I've covered a lot of them already over the course of my writing, in addition to my <a href=\"https://zacharykai.net/notes/pb/brennan\">interview with Zacharay Kai</a> and podcast appearance on <a href=\"https://web-weaving.jamesg.blog/8\">Wonders of Webweaving</a>.</p>\n<p>But then I saw that <a href=\"https://shens.world/about/100webmaster#other\">Shen has been keeping an impressive record</a> of webmasters answering, and I couldn't help myself but end Blaugust 2026 with the longest post of the month. So here are 100 answers, written in one sitting, in order and with no skipping.</p>\n<p>The more questions I answer, the more I think I might come back and give more detailed responses later. Some questions I feel warrant their own blog posts!</p>\n<h2>The 100 Questions</h2>\n<ol>\n<li>\n<p><strong>Introduce yourself.</strong> Hi! I'm Brennan Kenneth Brown (he/they). I'm Queer, Red River Métis, 30, born in Winnipeg, based in Calgary/Mohkínstsis (Treaty 7). I'm an independent author and web developer, founder of Berry House, and operator of Folk Zone and fanfiction.lol, and the founder of Write Club. My <a href=\"https://brennan.day/about\">/about</a> page has more details.</p>\n</li>\n<li>\n<p><strong>How long have you been making websites?</strong> Quite a long time, I'd say. I've been tinkering with HTML and CSS since I was around 13 years old tweaking themes on Tumblr. The first full-fledged websites I created were with <a href=\"https://jekyllrb.com/\">Jekyll</a> with <a href=\"https://github.com/collections/github-pages-examples\">GitHub pages</a>. What survives includes a <a href=\"https://thegliss.github.io/\">music review site</a>, <a href=\"https://brenjour.github.io/\">my first attempt at a blog</a>. So, at least ten years.</p>\n</li>\n<li>\n<p><strong>And what got you into the hobby?</strong> Blogging and writing! I remember stumbling upon the <a href=\"https://daringfireball.net/projects/markdown/\">Markdown</a> language for the first time and was amazed at how human readable it was, which led me to the static site generator Jekyll—because all you really had to do was fork a theme and then write Markdown posts and the rest was taken care of with a few commands.  I was already using <a href=\"https://crunchbang.org\">CrunchBang #!</a> Linux on my desktop computer at the time because my computer wouldn't properly install Windows (which turned out to be a blessing in disguise), and so I was able to follow the instructions and install Ruby, Gems, and Jekyll.</p>\n</li>\n<li>\n<p><strong>What kind of website are you most interested in?</strong> I love websites made by people to share their interests or life. There are countless I could refer to. Just take a gander at <a href=\"https://neocities.org/browse\">Neocities</a> for a couple minutes and you'll quickly see what I mean.</p>\n</li>\n<li>\n<p><strong>What's your workflow?</strong> I've written a blog post about <a href=\"https://brennan.day/my-blogging-workflow-a-routine-for-nearly-a-post-a-day-for-4-months-straight/\">my blogging workflow</a>, but my web development workflow looks different. I usually get the idea for a particular website or site design and go over the basics—layout, fonts, semantics, accessibility—and then I just start with the index.html (or <a href=\"http://index.md\">index.md</a>). Sometimes I start with a SSG framework or theme/template. Other times, I prototype what I want the homepage to look like by itself and then work at the modular layouts, partials, etc. from that.</p>\n</li>\n<li>\n<p><strong>Please link to your biggest inspirations.</strong> <a href=\"https://busterbenson.com\">Buster Benson</a> is probably my biggest inspiration out of everything. I only have my writing habit thanks to <a href=\"https://750words.com\">750words.com</a>, but I also found his birthday posts and <a href=\"https://github.com/busterbenson/public/blob/master/book-of-beliefs.md\">Codex Vitae</a> really inspiring, especially when I was a lot younger and looking for role models.  For the web specifically, I'd say <a href=\"https://omg.lol\">omg.lol</a>, the <a href=\"https://indieweb.org\">IndieWeb</a> community, <a href=\"https://melonking.net\">melonking.net</a>, and the dozens of friends on my <a href=\"https://brennan.day/blogroll/\">/blogroll</a>.</p>\n</li>\n<li>\n<p><strong>What's your favourite part about making websites?</strong> When the design finally gets to a place that feels cohesive and presentable. I always get anxiety at the start when it looks off and so far from what I envisioned in my head, and I often feel as though it'll never get to a point I'll be happy with it. But then it does! That's a great feeling.</p>\n</li>\n<li>\n<p><strong>And the thing you struggle with the most?</strong> Oh my God, everything? Because I work with static site generators, I really struggle with backends and databases. I also often struggle with proper RSS formatting, Nunjucks templating, JSON data, logic in JavaScript, keeping security up-to-date, basic syntax errors... Like really, everything. It is a miracle any of my websites function and work at all.</p>\n</li>\n<li>\n<p><strong>Do you keep the same layout on all of your pages?</strong> Yes, I do. And I also want to add you certainly don't need to yourself! But one of the biggest draws to SSGs for me was that you can just write the header and footer and page layout once and then never have to worry about it again instead of copy-pasting it for each page.</p>\n</li>\n<li>\n<p><strong>How confident are you with CSS?</strong> I'd like to think I'm pretty good with it at this point after years of trial and error. <a href=\"https://brennan.day\">Brennan.day's</a> CSS is custom and uses no framework. And I enjoy learning new techniques that are added to vanilla CSS, like container queries, :user-invalid, forced-colors mode, @view-transition.</p>\n</li>\n<li>\n<p><strong>Do you know how to correctly use <code>&lt;dl&gt;</code>?</strong> Yes! My <a href=\"https://brennan.day/style/\">/style guide</a> demonstrates definition lists as part of the markdown reference. I love the specific, rarely-used HTML tags.</p>\n</li>\n<li>\n<p><strong>What is your favourite HTML element?</strong> I display quite a few of them in <a href=\"https://brennan.day/html-day-2026/\">my HTML Day 2026 project</a>. <code>&lt;ruby&gt;</code> and <code>&lt;abbr&gt;</code> to explain acronyms, and <code>&lt;mark&gt;</code> for highlighting. Things I don't use enough myself.</p>\n</li>\n<li>\n<p><strong>If you're making a new web page from scratch, what is the first thing you do?</strong> If I'm doing it FULLY from scratch, then I'd grab a template with good practices, <a href=\"https://www.freecodecamp.org/news/html-starter-template-a-basic-html5-boilerplate-for-index-html/\">something like this</a> just to give myself a good starting point. Then I start writing. I'll typically write in Markdown then <a href=\"https://markdowntohtml.com/\">use an online converter</a>.</p>\n</li>\n<li>\n<p><strong>Do you know JavaScript?</strong> Yes, I'd say I'm proficient with it. Both vanilla JS and TypeScript. I also use NodeJS and EJS as my backend language of choice. But JavaScript should always be optional for a website's front-end, not mandatory for end-users.</p>\n</li>\n<li>\n<p><strong>How about PHP?</strong> No, not really. But I want to! Adam of <a href=\"https://omg.lol\">omg.lol</a> has done some absolutely amazing and fascinating work with PHP and has really showed me that it's worth learning, especially for the upcoming <a href=\"https://www.neato.pub/\">Neato Pub</a>!</p>\n</li>\n<li>\n<p><strong>Does your website have a theme that you stick to?</strong> Yes, I use the retro groove colour scheme <a href=\"https://github.com/morhetz/gruvbox\">Gruvbox</a> for the colour palette. I also am heavily inspired by the old-school, classic two-column blog layouts you'd see on WordPress and Blogger many years ago.</p>\n</li>\n<li>\n<p><strong>Are you more focused on content or design?</strong> I'm always primarily focused on accessible content. I wish I was better at interesting web design. Take a look at the <a href=\"https://tinyawards.net/vote/\">2026 finalists for the Tiny Web Awards</a>, they're all so incredible.</p>\n</li>\n<li>\n<p><strong>Do you own a domain name?</strong> I own way too many domain names. On Porkbun I have: <a href=\"https://brennan.page\">brennan.page</a>, <a href=\"https://brennan.cafe\">brennan.cafe</a>, <a href=\"https://fireweed.school\">fireweed.school</a>, <a href=\"https://brennan.jp.net\">brennan.jp.net</a>, <a href=\"https://meddler.fyi\">meddler.fyi</a>, <a href=\"https://fanfiction.lol\">fanfiction.lol</a>, <a href=\"https://fanfic.lol\">fanfic.lol</a>, <a href=\"https://theforum.love\">theforum.love</a>, <a href=\"https://brennan.casa\">brennan.casa</a>, <a href=\"https://brennan.click\">brennan.click</a>, <a href=\"https://fanfiction.forum\">fanfiction.forum</a>, <a href=\"https://folkzone.org\">folkzone.org</a>, <a href=\"https://folk.zone\">folk.zone</a>, <a href=\"https://tilde.land\">tilde.land</a>, <a href=\"https://craft.wang\">craft.wang</a>, <a href=\"https://blogstudy.org\">blogstudy.org</a>, <a href=\"https://brennan.day\">brennan.day</a>. I have even more on NameCheap. Some are in use, some are still just mere ideas.</p>\n</li>\n<li>\n<p><strong>What do you think of nostalgia-focused or &quot;retro&quot; websites?</strong> I love them! It's so cool to see how people use the design languages of the past in their websites. Simone.computer keeps a wonderful selection of <a href=\"https://simone.computer/#/webdesktops\">websites that are designed to look like desktops</a> which often are nostalgic in nature.</p>\n</li>\n<li>\n<p><strong>Is your HTML valid? Do you even check?</strong> Good question! I check when I first make a website, but I don't do routine checks on this. According to the <a href=\"https://validator.w3.org/nu/?doc=https%3A%2F%2Fbrennan.day%2F\">W3 validator</a>, Brennan.day has <a href=\"https://cdn.some.pics/brennan/6a957fe32afb7.png\">two errors and three warnings</a>. Good enough for me, right now.</p>\n</li>\n<li>\n<p><strong>What are your opinion on buttons and banners?</strong> I love them! There's a dedicated spot on my sidebar for them, after all. And I have <a href=\"https://brennan.day/assets/images/brennan-day-alt.gif\">my own 88x31 badge</a>, free for anyone to grab or hotlink!</p>\n</li>\n<li>\n<p><strong>What do you think of button walls in particular?</strong> I'll once again link to Shen with his wonderful page, <a href=\"https://shens.world/campaigns/go-click-on-a-wall\">go click on a wall!</a> I also love these.</p>\n</li>\n<li>\n<p><strong>If you started over again, would you make something similar or completely different?</strong> I have started over many times already, and I find myself gravitating towards the same inclinations no matter how I try to renew or reinvent myself. I think this is most evident in my timeline of poetry blogs: <a href=\"https://www.deviantart.com/bk-blayze\">b.k. blayze</a>, <a href=\"https://hyacinthboy.wordpress.com/\">the Hyacinth Boy</a>, <a href=\"https://web.archive.org/web/20180722212013/http://pinedraft.com/\">the Pine Draft</a>, and <a href=\"https://warsawmountain.com/\">Warsaw Mountain</a>, and finally <a href=\"https://bkpoetry.com\">bkpoetry.com</a>.</p>\n</li>\n<li>\n<p><strong>Are you envious of other people's websites?</strong> I would not use the word envy, but I am in awe of people's design talent and skills. There are so many sites I visit that have a user experience that just sparks joy!  My philosophy has always been &quot;community over competition.&quot; Other people's good sites always make the neighbourhood better.</p>\n</li>\n<li>\n<p><strong>What text editor do you use?</strong> Primarily, I use <a href=\"https://www.sublimetext.com/\">Sublime Text 4</a>. I also use <a href=\"https://bear.app/\">Bear</a>, <a href=\"https://vscodium.com/\">VSCodium</a>, <a href=\"https://en.wikipedia.org/wiki/TextEdit\">TextEdit</a>, <a href=\"https://www.geany.org/\">Geany</a>, and I've been meaning to get into <a href=\"https://gram-editor.com/\">Gram</a> and <a href=\"https://ia.net/writer\">IA Writer</a>.</p>\n</li>\n<li>\n<p><strong>Why do you use that one?</strong> I love simplicity, speed, and a proactive lack of genAI features. All of which have become increasingly difficult to find in an IDE and word processor. I was a huge fan of <a href=\"https://atom-editor.cc/\">Atom</a> (RIP) when it first came out many years ago, as it felt really aligned with Jekyll. Oh, how things change.</p>\n</li>\n<li>\n<p><strong>Do you host your image files on your web server, or on another host?</strong> Most assets live in the site's <a href=\"https://gitlab.com/brennankbrown/brennan.day/-/tree/main/src/assets/images/blog?ref_type=heads\">codebase repo</a>, which is becoming increasingly unsustainable. I also use <a href=\"https://some.pics\">some.pics</a> (an omg.lol service) for some images as well.</p>\n</li>\n<li>\n<p><strong>What's your opinion on the Neocities vs. Nekoweb debate?</strong> I wasn’t aware there was a debate! They both are wonderful platforms and I'm thankful both exist. We need more accessible ways for people to get into webdev, not less.</p>\n</li>\n<li>\n<p><strong>How much server space would you estimate your main website takes up?</strong> The folder of my codebase is just over 1GB including <code>node_modules</code>, and when I build, the generated <code>_site</code> is 437MB (mostly images). Despite these rather large sizes, I'm in the <a href=\"https://1mb.club/#:~:text=brennan.day\">1MB Club</a>! There are +400 pages generated in about a 4 second build from a dry run, and my site produces <a href=\"https://brennan.day/green/\">0.07g of CO₂ per visit</a> which is cleaner than 94% of pages tested.</p>\n</li>\n<li>\n<p><strong>Do you keep local backups of your files?</strong> Of course! My codebase lives on my local computers as a git repository, and on a redundant USB stick. Build for portability and back up constantly, or accept your work dies with the platform.</p>\n</li>\n<li>\n<p><strong>Do you prefer simple or highly visual websites?</strong> I prefer visually-interesting websites that manage to remain accessible and readable, which is a very hard balance to strike.</p>\n</li>\n<li>\n<p><strong>Do you stick to certain colours?</strong> The only colours I stick to are all of them. I love rainbows and being colourful, using all colours as much as I can. The human eye can only see so many shades, I want to take advantage of that as much as I can!</p>\n</li>\n<li>\n<p><strong>Have you ever thought about quitting?</strong> Quit be a webmaster? If I'm being candid, yes. All the time. There's real responsibility to having a computer in my home that runs a website that has hundreds of users, and I take that seriously, and it's stressful sometimes. But the human spirit is indomitable, and I will continue trying to improve the web and contribute in the little ways I can as long as I can do so!</p>\n</li>\n<li>\n<p><strong>Do you have many webmaster friends, or is it a solitary hobby?</strong> Solitary by temperament, social by effort. <a href=\"https://girlonthemoon.xyz/\">Melo</a> and <a href=\"https://agnes.love\">Agnes</a> are two of my closest webmaster friends I've made since I started, and both are very inspiring to me. I'm also in over a dozen webrings and I'm an organiser in <a href=\"https://webwriterscollective.com\">the Web Writers' Collective</a>, but it all takes real work against my introversion.</p>\n</li>\n<li>\n<p><strong>Do people in your real life know about your website?</strong> I'd say so. I shamelessly promoted myself heavily on Instagram and Discord and whatnot before I deleted all those accounts. I don't really have anybody IRL interact with my site, but everyone I know does indeed know.</p>\n</li>\n<li>\n<p><strong>Do you update your website very often?</strong> If you check my <a href=\"https://brennan.day/changelog/\">changelog</a>, I push a commit to this website nearly every day since I started it back in December 2025. There are over 1,400 commits currently.</p>\n</li>\n<li>\n<p><strong>And the overall design, do you change that much?</strong> I would say no. If you look at the <a href=\"http://web.archive.org/web/20251228064152/https://brennan.day//\">first archive</a> of my website back on December 28th, just a couple weeks after I started, it looks largely the same as it does now. I make small tweaks and iterate, but I actually really enjoy the design overall and don’t have an itch to do an overhaul as I typically do.</p>\n</li>\n<li>\n<p><strong>Is your website more you-focused, hobby-focused, or outside world-focused?</strong> All of the above? I love everything, and so my personal essays and biography sit next to my writing on cultural criticism, tech ethics, and politics. I don't stop myself from adding anything on this site, no topic off-limits, no specific niche. It's very freeing.</p>\n</li>\n<li>\n<p><strong>Do you do web design professionally?</strong> Yes, I'm the lead developer and founder of <a href=\"https://berryhouse.ca\">Berry House</a>.</p>\n</li>\n<li>\n<p><strong>If not, would you like to?</strong> N/A, since I already do. Writing is also part of my income, through the Medium Partner Program.</p>\n</li>\n<li>\n<p><strong>Do you communicate with people by email very much?</strong> Yes, I find that I've been writing more emails this year than any before. I love exchanging letters with people. It's a wonderful and rather intimate mode of communication. But of course I also love public comments and guestbook signings!</p>\n</li>\n<li>\n<p><strong>Do you keep social media outside of your website?</strong> I deleted Facebook, Messenger, Instagram, WhatsApp, Threads, X, Reddit, and Discord. I still use <a href=\"https://social.lol/@brennan\">Mastodon</a> and <a href=\"https://bsky.app/@brennan.day\">Bluesky</a>. I also use some more niche social media you can find on my <a href=\"https://brennan.day/accounts\">/accounts</a> page.</p>\n</li>\n<li>\n<p><strong>How about instant messengers?</strong> Signal, plus a handful of IRC networks (Libera, tilde.chat, irc.social.lol).</p>\n</li>\n<li>\n<p><strong>Do you listen to music while you work on websites?</strong> Constantly! Mostly indie folk and singer-songwriter stuff like Sufjan Stevens, Phoebe Bridgers, The Mountain Goats, and Elliott Smith. I also love Midwest emo, post-rock, ambient, and hip-hop. There's quite a few of my faves on my <a href=\"https://brennan.day/canon/\">/canon</a> page.</p>\n</li>\n<li>\n<p><strong>Do you keep everything you make on one website, or do you have more than one?</strong> Despite the fact that I allow myself to publish anything on Brennan.day, I have many websites! (See my answer to question #18.)</p>\n</li>\n<li>\n<p><strong>On a similar note, do you keep to one topic on your site, or many?</strong> Many. I find myself focusing on writing craft, the IndieWeb, accessibility, Métis and Indigenous issues, layman science, webdev tutorials, community, disability, genAI ethics, philosophy, music, and whatever else grabs me.</p>\n</li>\n<li>\n<p><strong>Do you present your real self, or at least try?</strong> We are always in a state of performance in a social setting, no matter how authentic and honest we attempt to be, on or off the Internet. Sociology aside, I do try to be genuine and as close to myself as I can be on here. It would be far too exhausting to be anything else, really.</p>\n</li>\n<li>\n<p><strong>Have you ever made a good friend thanks to your website?</strong> Yes, absolutely! My <a href=\"https://brennan.day/blogroll\">/blogroll</a> has a &quot;Friends!&quot; section of people I have been lucky enough to meet through the IndieWeb.</p>\n</li>\n<li>\n<p><strong>Are you happy with the way HTML and CSS currently work?</strong> I think my answer is no? It is a little bonkers you have to write a reset.css stylesheet whenever creating a webpage that you want to look the same in any browser, but I suppose that is the price paid for a free and open protocol. I guess HTML/CSS are fine if used responsibly, but the browsers we use and the most popular frameworks are so heavy and bloated. The Internet does not need to be complex or resource-intensive, and I am increasingly appreciative of the <a href=\"https://geminiprotocol.net/\">Gemini protocol</a> because of that.</p>\n</li>\n<li>\n<p><strong>What are practices that you think people should avoid?</strong> Many. Dark patterns, invasive analytics, unnecessary JS frameworks, clickbait, SEO-optimized garbage, and AI-generated content passed off as human. Just be honest, try your best. Use your own hands, hearts, and mind.</p>\n</li>\n<li>\n<p><strong>What about under-utilised practices?</strong> I don't know if these are under-utilised, but I'd say RSS/Atom feeds, semantic HTML, webmentions, progressive enhancement, and plain-text/Markdown workflows.</p>\n</li>\n<li>\n<p><strong>Do you use a lot of semantic HTML? Or are you guilty of generic structure?</strong> I love semantic HTML. Divs and spans everywhere would confuse me more (and are worse for accessibility). Headers are headers, lists are lists, forms are forms.</p>\n</li>\n<li>\n<p><strong>Do you consider different browsers?</strong> Yes! I check my sites on Firefox, Chromium, Lynx, and on iOS and Android devices. Brennan.day looks a little different depending on your operating system since I use system fonts instead of embedded fonts, but it is at a functional parity.</p>\n</li>\n<li>\n<p><strong>Speaking of, what's your preferred browser?</strong> I have been a Firefox user forever. But since their baffling push towards genAI, I have been trying various forks: Palemoon, Iceweasel, Waterfox, but I find myself returning back to FF.</p>\n</li>\n<li>\n<p><strong>And what OS are you on?</strong> macOS Sequoia 15 on a 2025 MacBook Air (M4) daily, and Debian-based Linux (BunsenLabs) on my ThinkPads and desktop.</p>\n</li>\n<li>\n<p><strong>Do you have a strong opinion on that, or do you just happen to use it?</strong> I've always loved the stability and brutalist aesthetic of Debian-based distros (though that's <a href=\"https://brennan.day/sad-machine/\">now being questioned</a>), and I use Mac day-to-day for the reasons you always hear: the trackpad, keyboard, screen, integration, devtools, etc. It really does just work, though I still haven't upgraded to Tahoe because it seems to be getting worse. Maybe Golden Gate will fix things.</p>\n</li>\n<li>\n<p><strong>Are your websites mobile-friendly?</strong> Yes, very much so. I explicitly design for a responsive experience across devices. See <a href=\"https://brennan.day/phoneblogging/\">phoneblogging</a>.</p>\n</li>\n<li>\n<p><strong>What are your thoughts on autoplay?</strong> I used to love having an autoplaying music playlist on my Tumblr, it gave my blog such a mood. But of course, I recognize now that this is universally a terrible and user-hostile feature. There is never a reason to have something autoplay unless it is the sole purpose of a webpage.</p>\n</li>\n<li>\n<p><strong>What are your thoughts on webrings? Are you in any?</strong> I love them! I'm in many: Bucketfish, Hotline, Static.Quest, IndieWeb, the a11y Webring, Fediring, XXIIVV, and others. I wrote a whole post about it, <a href=\"https://brennan.day/be-my-neighbour/\">Won't you be my neighbour?</a></p>\n</li>\n<li>\n<p><strong>Do you have any web shrines?</strong> Hm, I don't think so. You could say that my page about <a href=\"https://brennan.day/hometown/\">Winnipeg</a> is a shrine. I should make shrines though, the world needs more of them.</p>\n</li>\n<li>\n<p><strong>Are your websites &quot;cliché&quot;, in your opinion?</strong> I don't think they're cliché, but I do think all of my websites are rather boring and use predictable, obvious layouts. But I'm okay with this since it means I can make them accessible.</p>\n</li>\n<li>\n<p><strong>What is your ideal website?</strong> Honestly? I think Brennan.day is close to that. A durable, useful, human-first archive that serves writers, open-source devs, readers, and small organizations instead of feeds or engagement metrics.</p>\n</li>\n<li>\n<p><strong>Are you an artist? Do you draw or design your own assets?</strong> I've got design tools in my kit (GIMP, Inkscape), I draw a little bit sometimes, and have past lives as a photographer and a musician, but I don't hand-draw my own site graphics.</p>\n</li>\n<li>\n<p><strong>What are your favourite resource sites?</strong> <a href=\"https://discourse.32bit.cafe/t/resources-list-for-the-personal-web/49\">32-bit Café's Personal Web Resource List</a>, and everything else I list in my <a href=\"https://brennan.day/webmaster-a-manifesto-for-everyone/#further-resources\">WEBMASTER@ Manifesto</a></p>\n</li>\n<li>\n<p><strong>Is there a habit you just can't get away from no matter how hard you try?</strong> Self-quantification. I track my steps, sleep, chess puzzles, word counts and a lot more on Beeminder. Also, as you can see, writing as well.</p>\n</li>\n<li>\n<p><strong>What's your biggest advice for a new webmaster?</strong> You are capable of learning what's needed to be learned, I promise. And the bare minimum is all you need: a computer, a text editor, a way to host. Read the <a href=\"https://brennan.day/webmaster-a-manifesto-for-everyone/\">WEBMASTER@ Manifesto</a> for my full pep talk!</p>\n</li>\n<li>\n<p><strong>Do you keep all your styling in CSS? Or do you hard-code some?</strong> My CSS is fairly well organized into multiple stylesheets. I really dislike inline CSS because it often violates the DRY principle of writing things out only once and it gets really hard to keep track of.</p>\n</li>\n<li>\n<p><strong>What do you think of frameset layouts?</strong> These are really <a href=\"https://www.w3.org/TR/html401/present/frames.html\">before my time</a>. I wouldn't use them myself, but I think it's really cool so long as it works for things like screen readers, keyboard navigation, etc.</p>\n</li>\n<li>\n<p><strong>How about table-based layouts?</strong> Same as above, although I will add <a href=\"https://flownet.com/ron/css-rant.html\">this hilarious rant</a> found by Shen about how people should be using tables instead of CSS. It's so hard to wrap my head around!</p>\n</li>\n<li>\n<p><strong>Do you subscribe to the ideas of &quot;one-column&quot;, &quot;two-column&quot; and &quot;three-column&quot; layouts?</strong> Yes, absolutely. My site runs a two-column layout with a sidebar, which goes underneath of the main content in mobile view.</p>\n</li>\n<li>\n<p><strong>Do you spend longer on the HTML or the CSS?</strong> According to <a href=\"https://wakatime.com/@brennan\">WakaTime</a>, I've spent twice the amount of time on HTML as I have CSS.</p>\n</li>\n<li>\n<p><strong>Have you ever made a page with no CSS?</strong> I tried really hard to do so for my <a href=\"https://brennan.day/html-day-2026/\">HTML Day 2026 project</a>. This is the CSS I managed to golf for it:</p>\n</li>\n</ol>\n<pre><code class=\"language-css\">    body{max-width:70rem;margin:0 auto;\n        background:radial-gradient(circle at center, \n        #c6ffca 0%, #ffffff 60%, #ffffff 100%);\n        min-height:100vh;background-attachment:fixed;\n        background-size:cover;background-position:center;}\n    @media(max-width:768px){\n        body{max-width:100%;padding-left:1.5rem;padding-right:1.5rem;}\n    }\n    pre,code{overflow-x:auto;max-width:100%;word-wrap:break-word;}\n    @keyframes marquee {\n        0% { transform: translateX(0); }\n        100% { transform: translateX(-50%); }\n    }\n    marquee {\n        display: block;\n        width: 100%;\n        overflow: hidden;\n        white-space: nowrap;\n    }\n    marquee span {\n        display: inline-block;\n        animation: marquee 30s linear infinite;\n    }\n</code></pre>\n<ol start=\"73\">\n<li>\n<p><strong>Do you ever find yourself making layouts with nothing to put on them?</strong> Yes, sort of. I build a lot of standalone <a href=\"https://brennan.day/indieweb/#my-indieweb-projects\">JAMstack themes</a> for other people's future content, separate from my own writing.</p>\n</li>\n<li>\n<p><strong>Would you consider yourself a beginner? Or advanced?</strong> I guess I'm a bit of a static-site generator/JAMstack specialist with over ten years of experience by now, but I still very much feel like a beginner, or just a hobbyist. There's still so much for me to learn and understand!</p>\n</li>\n<li>\n<p><strong>Do you have a habit of looking at the source code of websites you visit?</strong> If it's a website with a design I particularly admire, I usually do. Also if I'm trying to properly cite a webpage I'll see if the source code has something that's missing (author name, date published, etc.). And, cheekily, sometimes I check to see if a CMS or theme is being used for fun.</p>\n</li>\n<li>\n<p><strong>How did YOU learn how to make websites?</strong> As I mentioned earlier, doing the HTML/CSS for my Tumblr blogs back when I was a teenager. I also have used Lynda (now LinkedIn Learning), Codecademy, and FreeCodeCamp for self-directed learning. But I also studied software development for a year at SAIT in 2019 and then attended a full-stack web bootcamp called EvolveU in 2020.</p>\n</li>\n<li>\n<p><strong>Do you ever force elements to do things they're not supposed to?</strong> I try not to, but sometimes certain frameworks and platforms require the dreaded <code>!important</code> CSS keyword flag.</p>\n</li>\n<li>\n<p><strong>Thoughts on floating elements?</strong> Should be used sparingly and in the right context, like wrapping text around an inline element, eg. images, icons, or pull-quotes. There's always an exception to every rule.</p>\n</li>\n<li>\n<p><strong>When you're sizing stuff, what do you use first?</strong> The right answer here is <a href=\"https://www.freecodecamp.org/news/what-is-rem-in-css-rem-unit-font-size-padding-height-and-more/\"><code>rem</code></a>, but I still often use pixels due to force of habit.</p>\n</li>\n<li>\n<p><strong>Do you have a favourite font?</strong> I used to really love <a href=\"https://github.com/octaviopardo/EBGaramond12\">EB Garamond</a> but I've used it so often that it's starting to wear on me. Now I'm absolutely loving bold Old Style serifs like <a href=\"https://github.com/noirblancrouge/YoungSerif\">Young Serif</a>. More generally speaking though, I enjoy Geometric Humanist for headings, Old Style for body text, Monospace Code for code — all system fonts via <a href=\"https://modernfontstacks.com/\">Modern Font Stacks</a>.</p>\n</li>\n<li>\n<p><strong>Would you run a website with another person?</strong> I would absolutely love to. If anybody reading this is interested in that idea,  please hit me up!</p>\n</li>\n<li>\n<p><strong>Do you surf the Web to find new personal websites very often?</strong> Yes, definitely! I use various directories, blogrolls, aggregators, anything that lets me find new personal websites and people.</p>\n</li>\n<li>\n<p><strong>Do you bookmark other people's websites? How would you feel knowing someone else bookmarked yours?</strong> I'm so bad at remembering to bookmark in general. It's a habit I absolutely need to reinforce more. If I don’t note something in a blog post immediately it usually vanishes from my mind. But I guess my <a href=\"https://brennan.day/blogroll\">/blogroll</a> is a bit of a bookmark list. And I'd be touched to know someone bookmarked mine!</p>\n</li>\n<li>\n<p><strong>What do you want people to be most impressed with when they see your website?</strong> Oh goodness, I'm not trying to impress anyone. I hope they enjoy the custom cursor and rainbows and little hover animations, though! And maybe the couple easter eggs my website has.</p>\n</li>\n<li>\n<p><strong>Are you interested in technology outside of websites? Do you collect?</strong> You bet. I'm into mechanical keyboards, ThinkPads, retro handhelds, and single-use devices in general.</p>\n</li>\n<li>\n<p><strong>How often and for how long are you online?</strong> Very often, very long. I try to step away from screens as much as possible and only use them for work rather than leisure, but I find myself working often.</p>\n</li>\n<li>\n<p><strong>When it comes to your website, who is your target audience?</strong> I explicitly don't have an audience in mind for my website. I write for myself, and I find that paradoxically makes the content more enjoyable for a larger amount of people as a result.</p>\n</li>\n<li>\n<p><strong>Have you ever been interested in XHTML?</strong> Oh goodness, another piece of history before my time. I'd say in passing, like while researching XFN (XHTML Friends Network) for semantic <code>rel</code> links between sites. Not a personal enthusiasm so much as a historical footnote.</p>\n</li>\n<li>\n<p><strong>Do you program in general?</strong> A little bit. I dabble in Python, Ruby, TypeScript, shell scripts, across various tools and side projects. See <a href=\"https://brennan.day/projects/\">/projects</a>.</p>\n</li>\n<li>\n<p><strong>Speaking of programs that help you make websites, what do you think of static site generators (SSGs)?</strong> Obviously I love them, I grew up with them! Right now, I use Eleventy as my primary, but I also often use Hugo. Jekyll has sadly become too slow with too many dependencies in comparison, but I still maintain quite a few Jekyll projects from earlier years.</p>\n</li>\n<li>\n<p><strong>Do you keep a hitcounter?</strong> No, I don't. I lean on privacy-focused analytics (Umami and NeatStats) instead, though I have a soft spot for hitcounters as GeoCities-era culture.</p>\n</li>\n<li>\n<p><strong>Do you frequent forums?</strong> Yes! 32-bit Café (Discourse), the MelonLand Forum, and the BBS communities on tilde.town and tilde.club.</p>\n</li>\n<li>\n<p><strong>Do you write your page content directly into the editor, or do you prepare it elsewhere?</strong> Drafts start as Markdown on <a href=\"https://750words.com\">750 Words</a>, which I've been using since 2011. Once I reach 750 words then I move over to writing the rest in Sublime, typically.</p>\n</li>\n<li>\n<p><strong>Do you think you appear cool to others?</strong> Nah, probably not.</p>\n</li>\n<li>\n<p><strong>Are you embarrassed of your old work? Have you ever deleted everything out of shame?</strong> No, quite the opposite. I used to delete everything out of an impulse to start fresh and escape myself, but now I try to archive and retain absolutely everything I do. My <a href=\"https://www.lulu.com/shop/brennan-kenneth-brown/the-dogwood-verses/hardcover/product-pmv7zj.html?page=1&amp;pageSize=4\">first book, <em>The Dogwood Verses</em></a> was my attempt at collecting all of my still-surviving writing, starting from 2011 up to 2021.</p>\n</li>\n<li>\n<p><strong>Would you close down your website if you couldn’t update it, or would you leave an archive?</strong> I'd definitely leave an archive. My whole philosophy is &quot;plain text survives&quot; and &quot;own your domain, own your words.&quot; Frankly, I would be really upset if all this work I've done vanished. Silly, right?</p>\n</li>\n<li>\n<p><strong>Do you reveal a lot about yourself on your website?</strong> A lot, yes. I'd say nearly everything about myself, including full name and location. I publish about my disabilities, mental health, family history, and personal boundaries openly. See <a href=\"https://brennan.day/disability/\">/disability</a>.</p>\n</li>\n<li>\n<p><strong>Are you willing to reveal who your best online friend is, and/or if they have a website?</strong> Yes! See my answer to question #34.</p>\n</li>\n<li>\n<p><strong>And do you optimise the images on your website?</strong> Yes, I try to with lazy loading, compression, and proper formats. I have a Sharp-based image compression workflow. That said, my articles typically feature a 2500x2500 featured image.</p>\n</li>\n<li>\n<p><strong>We're out of time! How do you feel after answering 100 questions?</strong> Let's see. I began at 6AM and it's now 9:30AM. The word count (including the questions) is just over 4,700 words. I've just completed 31/31 blog posts for Blaugust and have written 54,000 words this month in total. I feel like I closed a hundred browser tabs I'd been meaning to deal with for weeks, and I think I'm going back to bed.</p>\n</li>\n</ol>\n",
      "image": "https://brennan.day/assets/images/blog/journal.jpg",
      "date_published": "2026-09-01T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "meme",
        "IndieWeb",
        "personal essay",
        "web development",
        "Q&A",
        "small web"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/sad-machine/",
      "url": "https://brennan.day/sad-machine/",
      "title": "SAD MACHINE",
      "summary": "Debian's recent vote to permit genAI contributions, alongside the questions raised by the IndieWeb is Punk manifesto, leads me to reflect on the harm-reduction case, the deskilling of creators, the NFT-like grift of genAI output, and the Potemkin village of an industry that has yet to find profitability.",
      "content_html": "<p>In the past few days, Debian has held a lengthy <a href=\"https://www.debian.org/vote/2026/vote_002\">and rather bureaucratic vote</a> on how the project will handle genAI and LLM contributions moving forward. There were eight possible options, ranging from a ban to full acceptance, decided by Debian's Condorcet voting system.</p>\n<p>The winner was for permissive usage, #5 &quot;Responsible Use of Generative AI&quot; proposed by Marc Haber. Disclosure of AI use is encouraged, not required, and the policy explicitly ducks the copyright status question. To get into the weeds of it, this option was the only one in the &quot;Schwartz Set&quot; to beat every other option head-to-head, including the stricter &quot;Allow AI-Assisted Contributions with conditions&quot; (Option 2) by 203–14.</p>\n<p>Debian has always been my operating system of choice, as I've always preferred stability over bleeding-edge updates. <a href=\"https://ubuntu.com/community/docs/governance/debian\">Ubuntu</a>, the most popular GNU/Linux distro in the world, is based on Debian. Where do we go from here, then?</p>\n<p>I've already written on how generative AI contributions are becoming increasingly inescapable in open-source codebases, and that we should aspire towards <a href=\"https://brennan.day/software-harm-reduction/\">a harm reduction approach rather than an absolutist stance</a> because of that.</p>\n<p>I'm certainly not saying that LLMs are the future and here to stay, but rather that using only genAI-free software is becoming increasingly difficult as time goes on and more maintainers decide to go the permissive route.</p>\n<p>On a similar note, I <a href=\"https://github.com/jimmitchell/indiewebispunk.net/issues/1\">raised an issue</a> yesterday regarding the <a href=\"https://indiewebispunk.net/\">IndieWeb is Punk manifesto</a> being mostly created by Claude instead of being handmade by a human—which is what the manifesto explicitly advocates for.</p>\n<h2>Good Faith and Apathy</h2>\n<p>For the past several months, I have attempted an approach of <a href=\"https://brennan.day/trust-and-faith-in-our-web/\">good faith</a> and have assumed all the writing, art, and code I've encountered online has been human-made unless stated otherwise. I've also tried to take <a href=\"https://brennan.day/apathetic-intentionally-why-i-dont-block-ai-scrapers-on-my-website/\">an apathetic approach to genAI</a>.</p>\n<p>I have been trying to uplift and spread awareness of the good human web—of people still using their own hands and minds and hearts.</p>\n<p>And yet the world is still trying to insist on a genAI future. As <a href=\"https://www.theverge.com/ai-artificial-intelligence/960588/openai-government-5-percent-stake-trump\">OpenAI gives Trump a stake of their company</a>, as <a href=\"https://gizmodo.com/midjourney-thinks-hollywood-should-fess-up-about-using-ai-2000781426\">Hollywood uses Midjourney without disclaiming</a>, as <a href=\"https://futurism.com/artificial-intelligence/brown-university-professor-cheating-scandal-ivy-league\">genAI cheating scandals become more widespread</a>, and as <a href=\"https://futurism.com/artificial-intelligence/logs-chatgpt-suicidal-woman-death\">ChatGPT continues to drive people to suicide</a>. There is a never-ending ledger, and it is growing miles and miles in front of us.</p>\n<p>I am not someone who would think negatively of people who use genAI; I am not someone who would call them names, or feel disdain toward the humans in these situations.</p>\n<p>Rather, I have been looking at the trade-offs, here.</p>\n<h2>A Devil's Bargain</h2>\n<p>One-shotting the output of any mainstream, consumer LLM will always result in something obviously AI and rather uninspiring. Garbage in, garbage out. The only way to get these models to produce something high-quality is with thorough coaxing and human intervention—paragraphs of human writing in markdown files, hours-long back-and-forth conversations.</p>\n<p>And a lot of people have been deceived into thinking that labour is necessary, because they simply can't do the damn thing on their own. And that couldn't be further from the truth—you can instead spend that time learning and doing on your own.</p>\n<p>Reliance on genAI obscures the know-how to do things ourselves, and <a href=\"https://link.springer.com/article/10.1007/s00146-025-02686-z\">will actively deskill you</a>. Your capacity and capabilities <a href=\"https://link.springer.com/article/10.1007/s11023-025-09737-w\">atrophy the more you use generative AI</a>.</p>\n<p>And I have to wonder if people who constantly create and share genAI work do not see and understand its obviousness—have they been incubated for so long that the low-variance, piss-average genAI output looks no different to them than high-variance, human-made work?</p>\n<h2>NFTs Were No Different</h2>\n<p>Let me make a comparison: it's easy to instantly perceive the low-quality, garbage aesthetic of Web3 NFTs, such as <a href=\"https://opensea.io/collection/veefriends\">Gary Vaynerchuk's &quot;VeeFriends&quot;</a>, rushed shitty sketches that earned him thousands of dollars. Many grifting blockchain-based games made during the peak of the hype were also <a href=\"https://www.creativebloq.com/news/pixelmon-nft-game\">low-quality, asset-flipped, rushed jobs</a>.</p>\n<p>There were many thinkpieces during this time discussing how <a href=\"https://www.blockhead.co/2022/06/01/admit-it-nfts-are-ugly-and-expensive/\">cryptobros simply didn't understand aesthetic or art</a> or simply didn't care. It was always just a means to the end goal of making money.</p>\n<p>I think we are experiencing a parallel—there is a decay of aesthetic and care of aesthetic, and with genAI it is far more widespread and mainstream. The problem is that the initial deception is far more convincing: the writing is verbose and grammatically correct; the website has the semantics you expect; the art is fully rendered and coherent.</p>\n<p>But as soon as you examine closely, it really is just as ugly and boring as the grifts of NFTs that came before. There is no substance, no novel compulsion, no skin in the game.</p>\n<p>And again, I'm unsure whether people are unaware, or just don't care. People were upset that <a href=\"https://www.anthropic.com/news/claude-text-watermark\">invisible watermarks</a> are being added to Claude? There have already been visible (load-bearing) watermarks (added) this entire time.</p>\n<h2>The Mystery of the Potemkin Village</h2>\n<p>I do not know why the push for genAI continues. No corporation (with the exception of Nvidia) <a href=\"https://isaiprofitable.com/\">has found profitability</a>. <a href=\"https://fortune.com/2025/08/18/mit-report-95-percent-generative-ai-pilots-at-companies-failing-cfo/\">95% of generative AI pilots</a> at companies are failing.</p>\n<p>I do not know who is gaining from maintaining the Potemkin village of generative AI. I do not know who is fooled by &quot;Agentic AI,&quot; which does not change the underlying foundational technology at play, and is instead a dozen sycophant chatbots rather than just one.</p>\n<p>I also do not know what this means for the future of the web or my presence on it. I do not want to be defined by my enemies. I do not want to go gently into that good night. Maybe I'll give up the HTTP protocol altogether and exclusively publish <a href=\"https://brennan.day/gemini-gophers-and-fingers-oh-my-alternative-internets-beyond-https/\">to Gemini and Gopher</a>. It's hard for me to say at this point.</p>\n<iframe width=\"560\" height=\"315\" src=\"https://www.youtube.com/embed/HAIDqt2aUek\" title=\"YouTube video player\" frameborder=\"0\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture\" allowfullscreen></iframe>",
      "image": "https://brennan.day/assets/images/blog/sad-robot.jpg",
      "date_published": "2026-08-31T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "AI",
        "generative AI",
        "open source",
        "Debian",
        "web development",
        "ethics",
        "technology"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/a-few-small-things/",
      "url": "https://brennan.day/a-few-small-things/",
      "title": "A Few Small Things",
      "summary": "Reflecting on the mental fatigue of posting every day during Blaugust, I share a few small things that cheered me up: a new keyword filter on Bubbles.town, Jan Miksovsky's Origami Projector, and the ongoing, hand-made goodness of the independent web.",
      "content_html": "<p>When I first began this blog last year, it was meant to be a silly place where I allowed myself to draft rough ideas and prose experiments. It did not take long at all for the scope to creep, and for that to be thrown completely out of the window.</p>\n<p>Trying to keep up a 1:1 post-per-day cadence this month has melted my brain a little. I thought it wouldn't be a big deal, since I usually write 5 or 6 posts a week, so what damage would there be bumping that up to 7?</p>\n<p>Miraculously, I've still had a fair share of blog posts this month that I'm happy with despite the increasing straw-grasping.</p>\n<p>But I noticed last night, while working on the website for blogging studies, that I was hit with this wave of demotivation—this alien sensation of not wanting to continue, of not caring to write anymore. It was startling, because since I began in November, I had never experienced such a despondent frame of mind—as though my remaining active brain cells had come together and finally unionized against my onslaught of cognitive tyranny.</p>\n<p>On one hand, I recognize I simply need a break, but on the other, maybe I have finally reached a ceiling. I have only so many thoughts, opinions, and ideas. I feel like I've done a good job at avoiding being repetitive on this blog—sure, I beat the same drum of values—but I like to think I've always found new, creative angles to attack my favourite topics over and over again.</p>\n<p>And of course I have an embarrassing amount of pride in making it to the make-believe, arbitrary finish line on September 1st, the sunk-cost fallacy pointing out that there are only three more days left. Also, the make-believe, arbitrary standards referee checks to ensure that each post is still, at minimum, a thousand words and useful.</p>\n<p>I want to make it clear none of the above diminishes my joy, nor does it take away from how lucky I am to be doing this at all. Even when I become emotionally blunted and psychically exhausted, I still have the cognitive wherewithal to keep those facts in mind. Maybe it's also because I've begun watching the 2000 anime series about boxing and sportsmanship, <a href=\"https://myanimelist.net/anime/263/Hajime_no_Ippo\"><em>Hajime no Ippo</em></a>, that I have been so inspired to continue.</p>\n<p>Anyways, that's enough navel-gazing for one post. There are a few small things I want to write about that cheered me up.</p>\n<p>To start, <a href=\"https://bubbles.town\">Ben of Bubbles.town</a> responded to my <a href=\"https://brennan.day/bubbles-town-four-months-later/\">retrospective of the platform</a>. While most of his response was a well-argued and fair reply to my criticism, he did release a new feature allowing people to filter and <a href=\"https://dshbx.de/blog/bubbles/entry/f3238233-a208-4f70-b2ff-3a4c36ac4356\">hide posts by keyword</a> in response to the large number of genAI posts on the platform. I appreciate not only that a feature was made in response to feedback, but also that it was done so quickly. Huzzah.</p>\n<p>Next, I want to share an application in development that was recently shared with me. <a href=\"https://jan.miksovsky.com/\">Jan Miksovsky</a>, creator of the web builder <a href=\"https://weborigami.org/\">Origami</a>, has announced a new project called <a href=\"https://jan.miksovsky.com/posts/2026/08-28-origami-projector\">Origami Projector</a>. It is rather simple, but that's why I love it. It's designed to be a lightweight web development tool that gives you a real-time preview of what you're creating. You can even upload the work you create to NeoCities or Netlify.</p>\n<p>Miksovsky credits the now-defunct platform <a href=\"https://blog.glitch.com/\">Glitch</a> for inspiration. If you were a user, I'm sure you were as heartbroken as I was when the site shut down. There were so many cool, weird projects housed on Glitch that wouldn't have existed were it not for its unique ethos and design. It was an excellent starting point for people interested in web development, so I hope to see Origami Projector take off, because I think it scratches that itch, even though it's rather different in how it operates.</p>\n<p>Seeing the efforts of others really boosts my spirits. People are still creating good things on the web, by hand, for the sake of others. This has always been the case and will always continue to be the case so long as there is an Internet and there are people. No matter how many headlines try to convince you that the Internet is now only a husk of belligerent robots and platforms created by corporations, the personal and independent web will always be here. The good of the world doesn't stop existing, I promise.</p>\n",
      "image": "https://brennan.day/assets/images/blog/kittens.jpg",
      "date_published": "2026-08-30T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "blogging",
        "IndieWeb",
        "community",
        "Technology",
        "web development",
        "mental health"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/creating-an-open-source-blogging-studies-syllabus/",
      "url": "https://brennan.day/creating-an-open-source-blogging-studies-syllabus/",
      "title": "Creating an Open-source Blogging Studies Syllabus",
      "summary": "Announcing a new open-source, asynchronous Blogging Studies syllabus that blends writing craft and independent web publishing, built on Codeberg. I trace the decline of free MOOCs, outline my curriculum's anti-capitalist and community-driven pedagogy, and invite contributors and learners to help shape it.",
      "content_html": "<p>As you may be aware if you're a regular reader of my blog, I love learning, studying, <a href=\"https://brennan.day/a-guide-to-becoming-a-rogue-scholar/\">and academia</a>. And I've been thinking recently of how to take the opportunity to better intersect this with my knowledge of web development and technology in general.</p>\n<p>You see, for many years there have been free, open-source resources for people to use if they wanted to learn programming, such as the <a href=\"https://www.theodinproject.com/\">Odin Project</a> which maintains a Discord community of 708,000 learners, and <a href=\"https://www.freecodecamp.org/\">freeCodeCamp</a>, which has helped <a href=\"https://codakey.io/projects/freecodecamp-freecodecamp\">more than 100,000 people land their first developer job</a>. These have been a wonderful resource for people to go from absolute beginner to becoming competent enough to make a career in software development.</p>\n<p>And in a similar manner, over a decade ago, there were many options for Massively Open Online Courses (MOOCs); however, these have been in a sharp decline in recent years<sup class=\"footnote-ref\"><a href=\"#fn1\" id=\"fnref1\">[1]</a></sup>. The New York Times called 2012 <a href=\"https://www.nytimes.com/2012/11/04/education/edlife/massive-open-online-courses-are-multiplying-at-a-rapid-pace.html\">the Year of MOOCs</a>, but things are incredibly different, now. Let me give you a couple examples.</p>\n<p>In mid-2025, under new CEO Greg Hart, Coursera rolled out &quot;Preview Mode,&quot; replacing the old free-audit system. Instead of auditing an entire course for free, courses now only let you preview the first module before hitting a paywall. <a href=\"https://www.classcentral.com/report/coursera-preview-mode-paywall/\">Class Central's analysis</a> called it &quot;the day MOOCs truly died,&quot; noting the change came right as Coursera's stock jumped 36% on an earnings call and its valuation passed $2 billion, despite sitting on $775M in cash reserves.</p>\n<p>Harvard and MIT sold EdX to 2U in 2021 for $800 million, and edX dropped free certificates back in 2023. Then 2U <a href=\"https://www.timeshighereducation.com/news/online-course-provider-2u-files-bankruptcy\">filed for Chapter 11 bankruptcy in July 2024</a>, citing over $945 million in long-term debt. edX kept operating through the bankruptcy, but <a href=\"https://course.careers/blog/best-edx-courses\">tightened the auditing access and raised prices</a>.</p>\n<p>When looking at the above, I realize I want to contribute to free online learning as much as I can for the sake of others.</p>\n<h2>Blogging Studies</h2>\n<p>Over the past year, I've written extensively on both <a href=\"https://brennan.day/collections/indieweb/\">the IndieWeb</a> and <a href=\"https://brennan.day/collections/writing-craft/\">the craft of writing</a>. While it can be enjoyable to read and learn from these posts one-by-one, that can also be overwhelming or a slog. They're all presented as individual articles instead of something like a tangible, actionable curriculum.</p>\n<p>In light of this, I've decided I want to take everything I've written and launch a new project with it. I've actually had the idea to teach writing in virtual classes for a while now, ever since I first announced <a href=\"https://fireweed.school\">Fireweed School</a>; unfortunately, I've realized I'm <a href=\"https://brennan.day/notice-bandwidth-exceeded/\">lacking the bandwidth</a> to teach a synchronous class that would ask students to pay me for my services. The good news is, though, that I will be doing this instead, and it will be free for everyone. And I'll be able to take a lot of my ideas from that for this.</p>\n<p>As Unattributed notes in his recent post, <a href=\"https://unattributed.cc/2026/08/27/why-people-quit-blogging/\">&quot;Why People Quit Blogging&quot;</a>, much of what you encounter when you search &quot;blogging&quot; online is related to search engine optimization, corporate business marketing, and opportunistic pyramid scheme-esque endeavours promising passive income.</p>\n<p>I've written before about how I want to reclaim blogging as a democratic, open tool for people to write and share online from this cynical, capitalistic definition that is dominant and popular on search engine results, and I think this idea could be a great way to make that happen.</p>\n<h2>My Pitch</h2>\n<p>The premise for this is rather simple: I am going to create a static site that will act as the syllabus and curriculum for Blogging Studies, and it will include lessons/lectures, assignments, recommended readings, and methods for class participation.</p>\n<p><strong>Blogging Studies</strong> is a term I coined myself, and I define it as the study and practice of writing craft and independent online publishing as a single, integrated discipline, treating the blog post medium as a legitimate unit of scholarly and creative work. I use the word &quot;blogging&quot; instead of &quot;writing&quot; because while a large amount of it will focus on writing craft, I also want to similarly focus on getting that writing out there in the world <em>with</em> blogging. I'll cover platforms, formatting, netiquette, etc. just as much as the writing itself. I will try to make the technical aspects as accessible as possible, and essentially this will be a dual or hybrid approach. You can think of Blogging Studies as a subcategory of Digital Humanities.</p>\n<p>I want to avoid calling this a &quot;course&quot; or a &quot;class&quot; because it will be asynchronous, but also because online creators who announce such a thing are typically charging a lot of money, with revenue opportunity being the primary motivation.</p>\n<p>This couldn't be further from the case with this project. I have already shared everything I know and have learned on this blog, and this will simply be synthesizing that information.</p>\n<h2>Being Open-Source</h2>\n<p>And, importantly, unlike nearly all my previous open-source projects where I've been the sole contributor and developer, I truly want to be a maintainer for this. While I think my contributions are a good starting point, I think having this open-source is an excellent way of getting new and different resources, modules, and ideas added to the syllabus and curriculum by others.</p>\n<p>I'm going to be hosting this project on Codeberg, and part of the curriculum itself will be teaching people how to sign up, how to use git, make pull requests and submit issues, etc.</p>\n<p>Being a good maintainer turns out to be less a technical skill than a communication one. <a href=\"https://opensource.guide/best-practices/\">Open Source Guides</a> has a lot of helpful advice, such as getting your community documents in order early (a README, a CONTRIBUTING file, a code of conduct, a license, etc.) matters as much as the code itself. I'll be adopting the <a href=\"https://www.contributor-covenant.org/\">Contributor Covenant</a> as the code of conduct <a href=\"https://en.wikipedia.org/wiki/Contributor_Covenant\">created by Coraline Ada Ehmke in 2014</a> and now used by nine of the ten largest open-source projects in the world.</p>\n<h2>Good Pedagogy</h2>\n<p>Good pedagogy is not merely handing information down. Paulo Freire heavily criticized the &quot;banking model&quot; of education, where a teacher deposits knowledge into passive students who store it and hand it back on command.</p>\n<p>In an essay for Hybrid Pedagogy titled <a href=\"https://hybridpedagogy.org/freire-made-mooc-open-education-resistance/\">&quot;If Freire Made a MOOC: Open Education as Resistance,&quot;</a> the author draws on writer Audrey Watters's observation that a MOOC feels entirely different depending on whether the &quot;C&quot; is experienced as course or as community, and that community is what keeps people coming back. I want to provide scaffolding for people to become co-authors of their own writing practice, together.</p>\n<p>And I also admit I am lacking teaching credentials myself. But I will say this, if you don't know who I am already: I've independently published nine of my own books, five of which are <a href=\"https://brennanbrown.gumroad.com/\">available on Gumroad</a>. Not only did I do the writing, but I did the cover design, layout, formatting, and copyright. These books span over 1,500 pages in total.</p>\n<p>I graduated from Mount Royal University with a 3.8 GPA majoring in English Honours with a minor in creative writing. During my time as an undergrad, I published <a href=\"https://doi.org/10.29173/mruhr768\">a scholarly article on Indigenous resilience</a> and my <a href=\"https://doi.org/10.13140/RG.2.2.25021.37600\">honours thesis</a> which examined the importance of the English Degree and writing in today's age.</p>\n<p>I also founded Write Club, a creative writing collective of young adults that grew from a couple students to 100+ members. I was the president of this club where we hosted open mics, fundraising events, and I ran dozens of workshops with hundreds of students for three years. We published two anthologies under my tenure: <a href=\"https://www.amazon.ca/Fringe-Collection-Filth-Dana%C3%AB-Webb/dp/B0CYQ1NRY9\"><em>&quot;On the Fringe: A Collection of Filth&quot;</em></a> and <a href=\"https://www.amazon.ca/Fringe-Collection-Felix-Costa-Gomez/dp/B0F4PKFRZQ\"><em>&quot;On the Fringe: A Collection of Community&quot;</em></a>, which are available for purchase.</p>\n<p>I'm also a Queer Red River Métis, and I know how important it is to centre marginalized voices and be mindful of how political writing is. Our voice and our ability to have a platform is directly imbued into my teaching.</p>\n<h2>Identity</h2>\n<p>I think identity is an important (and fun) part of making this work for anyone who finishes a module, contributes a lesson, or shows up consistently. For instance, I'm designing an 88x31 badge for the project, and I also want to run a webring.</p>\n<p>Beyond the badges and buttons, I want a communal space where cohort members can talk to each other, share drafts, and celebrate wins together, not just consume a syllabus alone in a browser tab. I'm also interested in some light gamification: achievements, streaks, small visible symbols of progress.</p>\n<p>I know gamification has a bit of a bad reputation, mostly because platforms use it to manufacture compulsive engagement, and that's not my intention. Rather, I subscribe to the idea that romanticizing the process strengthens the bonds between people going through a cohort together, and provides motivation to continue and sustain the practice.</p>\n<h2>On Being Anti-tyranny</h2>\n<p>Jo Freeman's 1970 essay, <a href=\"https://www.jofreeman.com/joreen/tyranny.htm\">&quot;The Tyranny of Structurelessness,&quot;</a> argued that groups claiming to have no structure or hierarchy don't actually escape hierarchy and instead make it invisible and unaccountable. That's important to be mindful of when thinking about open projects claiming to be neutral or all-encompassing.</p>\n<p>Blogging Studies is not neutral. I am opinionated and particular in how I write and in how I think writing should be taught. Which is why I want to emphasize that this is just <em>one way</em> to blog and write, filtered through my own politics, my own aesthetic sensibilities, and my own experiences. Plenty of other resources exist, and plenty more should. I'm not trying to be the final word on blogging, or writing, or teaching. I'm trying to be one honest, clearly-labeled voice among many. I'd rather you disagree with my syllabus and go build your own.</p>\n<h2>Interested? Get Involved!</h2>\n<p>I realize that it would be good to start planning early. Things are totally up-in-the-air right now (I don't even have a name for this project) and there are many different ways people can help before I even launch. Here are a few ideas I have for contributing.</p>\n<h3>Ways to contribute:</h3>\n<p>I'd love writers and researchers who could help draft lessons, recommend specific readings, and share your own experience blogging as case studies for beginners.</p>\n<p>Editors and reviewers could provide feedback on drafts, proofread modules, and test assignments. Technical contributors can help with the code of the site, webring, and onboarding for folks new to git and Codeberg.</p>\n<p>Community builders could help moderate discussions, welcome newcomers, organize cohort activities, and host online writing group sessions.</p>\n<p>And of course, learners are the ones completing the modules, doing assignments, asking questions, and leaving feedback on what's helpful and what isn't.</p>\n<p>I'd love to hear from people who want to co-teach a module in their area of expertise, as well as folks who've been blogging for a while and have their own lessons to share.</p>\n<h3>Current Status</h3>\n<ul>\n<li>The project will live on <strong>Codeberg</strong> (repository link coming soon), where you'll be able to submit issues, make pull requests, and follow along with development.</li>\n<li>The Blogging Studies syllabus itself will be a static site, and I'll post a link when it's live.</li>\n<li>You can reach me through my <a href=\"https://brennan.day/contact/\">contact page</a>, <a href=\"mailto:mail@brennanbrown.ca\">email</a> or reply to this post.</li>\n</ul>\n<hr class=\"footnotes-sep\">\n<section class=\"footnotes\">\n<ol class=\"footnotes-list\">\n<li id=\"fn1\" class=\"footnote-item\"><p>Class Central still maintains a running list of <a href=\"https://www.classcentral.com/report/coursera-free-online-courses/\">470+ courses that remain completely free</a>. <a href=\"#fnref1\" class=\"footnote-backref\">↩︎</a></p>\n</li>\n</ol>\n</section>\n",
      "image": "https://brennan.day/assets/images/blog/college.jpg",
      "date_published": "2026-08-29T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "blogging",
        "IndieWeb",
        "open source",
        "digital humanities",
        "academia",
        "web development",
        "writing",
        "community"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/notice-bandwidth-exceeded/",
      "url": "https://brennan.day/notice-bandwidth-exceeded/",
      "title": "Notice: Bandwidth Exceeded",
      "summary": "After exceeding my free Netlify bandwidth for the first time and wiring up a homelab to run this site, I reflect on how my life has narrowed around writing and code, the friendships that did not survive that focus, and the loneliness of a devotion without a clean resolution.",
      "content_html": "<p>August is ending, and yet today's high is going to be 28+°C, that unseasonable summer air in early fall.</p>\n<p>With my fan humming away, I wrote yesterday about how, for the first time, I've exceeded my <a href=\"https://social.lol/@brennan/117162424319064228\">free Netlify bandwidth</a> of 100GB for the month, with five days still left to go. Everything is fine as of right now, but I've gone ahead anyways and wired up my homelab to be able to run this site, replacing the various functions and webhooks with MySQL databases and Caddy files in Docker. Containers stacked like a Jenga game.</p>\n<p>And I'm sure I'll write a tutorial about the process in the future, since it would probably be useful for people to know how to migrate off of Netlify while still retaining the features the hosting platform provides.</p>\n<p>There was an existential crisis during the procedure for me, though. I recall when I would simply write the words for a short blog post during my lunch break at work and post them to <a href=\"http://Medium.com\">Medium.com</a>—fast forward to now, and it's now <em>ingress, provisioning, blob storage, and webhooks</em>. Each day that I've tinkered with my website I've returned more and more to web development and programming—all with the hope that the additional functionality I've been adding has improved the experience and allowed more two-way communication.</p>\n<p>I look at the <code>Caddyfile</code> and <code>docker-compose.yml</code> I have to write, and it makes me take a step back and question what I'm doing here at all. Though, that doesn't actually have anything to do with writing or coding, but rather the rest of my life in-between.</p>\n<p>As you may be able to tell by the number of posts I publish and their typical length, I've devoted my life to this project. That sounds dramatic, but it is the truth—if I'm not at a screen researching or writing or debugging a local dev server, then I'm taking a break or sleeping. There is an ascetic quality to it. Sometimes I ask myself if I feel as though I'm missing out on anything, or if I shouldn't be putting all of my eggs in one basket, but I don't find myself wanting. I don't find myself lacking.</p>\n<p>But there are consequences to this. Consequences I'm not proud of. The close friends I had in person but no longer have, for instance. I realized that many of my relationships had become too one-sided—that others were putting in far more effort than I was—and I made the call that it was shittier to let that continue than to be honest and end things. I have always been the kind of person to act impulsively, as though social acts were irreversible, and burn bridges that could be left standing.</p>\n<p>I've also reached capacity in my bandwidth. In some ways, my bandwidth could be regarded as impressive—having the ability to write and create consistently for so long. But in many more ways, my bandwidth is shockingly low, and I've had to be strategic and tactical with how I use my time and energy because of that. And that has included making some difficult, and often hypocritical, decisions.</p>\n<p>I don't really know what's happened. I look back at the twenty-year-old Brennan who biked everywhere and went to school full-time, worked part-time, and still maintained a social life. On paper, I've lived <a href=\"https://weeks.brennan.day\">a rich decade</a> but in practice I'm so much less sure. There are a million more things I could be doing, a million more connections I could be weaving, and instead I'm here sitting at my desk writing yet another blog post. An unlived life stacked against these four walls.</p>\n<p>And this <em>is</em> what I want to be doing, or at least what I feel a magnetic compulsion toward. I've come to realize so much of my life, heavy with masking, was doing what I thought was the right thing to do, what &quot;normal&quot; people do. And I didn't question things until I had the time and silence to do so. And there is a shade of guilt that comes with that—questioning why I can't be more typical and have a drive to live a larger life with more dimensions.</p>\n<p>I think of <a href=\"https://worldtreasures.org/blog/emily-dickinson-the-recluse\">Emily Dickinson</a>, the reclusive hermit, the myth of Amherst. The New England Mystic <a href=\"https://www.emilydickinsonmuseum.org/emily-dickinson/poetry/\">wrote over 1,800 poems</a> in her isolation, so rarely seen outside of her homestead that she was conjured into a ghost by her neighbours. And it is a ghost-like existence; a peculiar fraction of a death.</p>\n<p>From the other side of the screen, you might have had a totally different assumption about the kind of life I was living, given how much I pour into my work. You expected this to end with a triumphant declaration—a neat resolution where I announce I'm changing for the better. I wish I could offer myself a clean break. There's no vinyl to flip over.</p>\n<p>Instead, the fan doesn't stop humming white noise, and the August heat pushes fresh wind through the open window. Quiet room, screen glowing, words always finding their way out. Everything else beyond that is tentative, determined by a calculus I can't see. Arithmetic of unspent days. But regardless of what tomorrow brings, you know there's certainty in the fact that I'll write about it.</p>\n",
      "image": "https://brennan.day/assets/images/blog/road-closed.jpg",
      "date_published": "2026-08-28T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "Technology",
        "web development",
        "mental health",
        "homelab",
        "Netlify"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/being-a-toolshed-of-optimism/",
      "url": "https://brennan.day/being-a-toolshed-of-optimism/",
      "title": "Being a Toolshed of Optimism",
      "summary": "Reflecting on a reader's description of me as 'nice' and the responsibility of having an audience, I commit to becoming a 'toolshed of hope and stubborn optimism' in my writing. Drawing on solutions journalism, restorative narrative, and thinkers like Rebecca Solnit, Mariame Kaba, Joanna Macy, adrienne maree brown, and Christiana Figueres, I explore how hope is a discipline and how to tether anger and grief to concrete, actionable repair.",
      "content_html": "<p>A few days ago, I noticed on Umami that there was a small uptick of referrals coming from Reddit, so I searched the site for my URL and found this <a href=\"https://www.reddit.com/r/indieweb/comments/1vw4dhw/two_indieweb_dudes_worth_bookmarking/\">lovely little post</a> in r/IndieWeb recommending me and <a href=\"https://jamesg.blog/\">James</a>. I later discovered this was posted by <a href=\"https://wilcosky.com/\">Billy</a>, creator of <a href=\"https://ctrlshift3.com\">Ctrl+Shift+3</a>, which has been an enjoyable indie social media platform these past few weeks I've been using it.</p>\n<p>It's always interesting to hear how others describe you, and it gave me pause for contemplation. Billy wrote that I'm someone that doesn't take myself too seriously, and I certainly agree there. But &quot;nice&quot;? Hm. Is that how I'm viewed?</p>\n<p>Let me take a step back and say, first, that it is weird to have a readership at all. I've gone most of my life being invisible, and I've been writing online since 2015 mostly to just myself and have been content with that. This past year of creating my own independent publication and posting on a near-daily basis has changed that.</p>\n<h2>Being a Jester</h2>\n<p>Without a doubt, there comes a responsibility when people begin reading your work and taking you seriously. I've had <a href=\"https://www.kinfolk.com/stories/jesters-privilege/\">Jester's privilege</a>, the historical right of a court jester to mock and speak hard truths without facing punishment, because their words are disguised as mere jokes and—more so in my case—because nobody cared what the jester has to say, or takes it seriously.</p>\n<p>As a result, I've found myself making off-hand remarks and having a flippant attitude. I've developed a bad habit of rubbernecking and gravitating towards mess and disaster. Thankfully, I've been able to channel my compulsive morbid curiosity into healthy avenues, such as the various topics I write about on this blog.</p>\n<h2>Yet, Being Virtuous</h2>\n<p>At the same time though, in contradiction, I have tried to live a values-oriented life and be vocal about what I think is important and right. And doing so puts you and your actions under a vigilant lens of scrutiny.</p>\n<p>Similarly, I think many people (myself included) have the assumption that somebody who cares deeply about virtue and justice is then also rigid, unforgiving, and views those who are less virtuous as inferior, and perhaps even irredeemable.</p>\n<p>And so I'm writing this out for a number of reasons.</p>\n<p>I want to make it clear that I've never been interested in scolding, pearl clutching, and certainly not infighting. When I've reported on the actions and behaviours of people in the past, I have done so trying my best to shine light and awareness where I thought it was both important and dark. I have been frustrated and disappointed by people, sure, but nothing beyond that.</p>\n<p>Going forward, I want to be more careful and mindful with my subject matter—what can be healed, what injustices can be redeemed? What good can be made more accessible?</p>\n<h2>Helpful Frameworks</h2>\n<p>I've been looking towards the work of others that I can use as reference. To start, <a href=\"https://www.solutionsjournalism.org/learning-lab/toolkits-guides/basic-toolkit\">Solutions journalism</a> insists on rigour—a solutions story shows evidence of what's working, insight into why it's working, and its limitations. Similarly, <a href=\"https://constructiveinstitute.org/why/\">constructive journalism</a> focuses on the three pillars of solutions, nuance, and democratic conversation. Newsrooms need to facilitate conversations society needs to move forward, and not just aspire to document evidence neutrally. And though I am not a newsroom, I do aspire to be a good citizen journalist.</p>\n<p><a href=\"https://www.poynter.org/reporting-editing/2015/whats-restorative-narrative-a-qa-with-a-journalism-professor-whos-studying-it/\">Restorative narrative</a> is a related genre that grew out of the folks at <a href=\"https://ivoh.org/\">Images &amp; Voices of Hope</a>, and says stories cannot skip past the hard truths of tragedy or rupture. The story must continue with a person or community long enough to document progression toward repair.</p>\n<p>I will never look away from what's broken, and that's many things, and I will also honour attempts at rebuilding.</p>\n<p>When you're writing day-to-day like me, it can be easy to get caught up in the trees and begin to forget about the forest. It can be easy to get wrapped up in the particular actions of particular people simply because of things like proximity bias. I need to remind myself that, just because I see something on my timeline or feed a lot, does not automatically mean it's what deserves my attention and effort.</p>\n<p>I want my little publication here to be <strong>a toolshed of hope and stubborn optimism</strong>—by that, I mean I want to focus on compassion, grace, benevolence, and hope—but in a tangible, practical way that's actionable and verb-oriented. I want my humble shed to have the tools needed to change things for the better.</p>\n<p>Rebecca Solnit wrote that <a href=\"https://www.themarginalian.org/2016/03/16/rebecca-solnit-hope-in-the-dark-2/\">hope lives in the uncertainty between optimism and pessimism</a> and in the action we take. Hope is the room not-knowing leaves for you to act in. <a href=\"http://rebeccasolnit.net/book/hope-in-the-dark-untold-histories-wild-possibilities\">Solnit looks at the Zapatista uprising and the 1999 shutdown of the WTO meetings in Seattle</a> among forgotten wins on the left. Most of what changes the world never gets photographed, it looks like something that didn't happen. A war that didn't start, or a law that didn't pass. Do you know <a href=\"https://brennan.day/the-three-times-the-world-nearly-ended/\">the names of the people that stopped the world from ending</a>?</p>\n<p><a href=\"https://cac.org/daily-meditations/hope-is-a-discipline/\">Mariame Kaba says hope is a discipline</a>, rather than an emotion. Hope is a ritual and daily practice, done whether or not you feel like it. <a href=\"https://www.thenation.com/article/culture/mariame-kaba-interview-til-we-free-us/\">Kaba herself has been running</a> Project NIA and organizing the Chicago Torture Justice Memorials reparations campaign for decades. She does <a href=\"https://micahherskind.medium.com/some-lessons-from-mariame-kabas-we-do-this-til-we-free-us-4ae4fc9986bb\">the unglamorous work</a> of bail funds, court watching, and participatory defense campaigns. Hope as a discipline is showing up to unfinished work again and again.</p>\n<p><a href=\"https://ethical.net/sustainability/books/active-hope-the-book/\">Joanna Macy says active hope</a> is three steps you take: see clearly what's happening, name the direction you want things to move in, then act. <a href=\"https://aworkinglibrary.com/reading/emergent-strategy\">adrienne maree brown has principles of emergent strategy</a> for hope: move at the speed of trust and focus on critical connections over critical mass. We must trust the people, because if you trust the people, they become trustworthy. <a href=\"https://www.concentricstrategy.org/post/principles-of-emergent-strategy\">Small is good, small is all</a>, the large is only ever a reflection of the small. This is why I am doing this on a daily blog trying to be a toolshed.</p>\n<p><a href=\"https://www.npr.org/2020/05/22/860128259/christiana-figueres-how-can-we-choose-optimism-even-in-the-darkest-times\">Christiana Figueres calls hers stubborn optimism</a>, and she used it to broker the Paris Agreement, when 195 nations agreed, six years after the Copenhagen summit collapsed in tears and screaming. Stubborn optimism is also a discipline, chosen because the alternative is unthinkable, not because the odds favour you.</p>\n<h2>What This Means</h2>\n<p>I need to remind myself to meet people where they are, and to focus on the human and what can be restored. I also need to hold every piece I write against the question: <em>will this look worthwhile from my deathbed, in retrospect?</em></p>\n<p><a href=\"https://brennan.day/the-blogging-uebermensch-or-being-the-luckiest-person-on-earth/\">I am extremely privileged</a> both in my platform and my attitude—for whatever reason, I was built with the ability to endure and survive with the image of a positive future still intact in my mind, despite everything.</p>\n<p>Which is to say that I want to use this unique, absurd opportunity I have to try to leave the world a better place than I found it. And that starts with where my focus is. This isn't about ignoring the grave injustices, but it is about figuring out what can be done about them. And that will always include righteous fury and anger and grief.</p>\n<p>Regardless of all of the above, I am a deeply flawed person. I will try my best to write something that you'll find worth reading, but as a person, I will continue to make mistakes and disappoint you. And that's okay. I want to operate on good faith. If others mess up, that's okay! Because I will as well.</p>\n<p>So, what does the toolshed of optimism look like in practice? Before I publish anything, I will ask whether it points toward what can be healed, what the reader can do with it. I will tether any anger or grief I write to a concrete next step: a tool to try, a campaign to support, a question to keep asking, or an attempt at repair already underway. I will keep building this site by hand, one word and one page at a time, and use it for the stubborn work of optimism. That is the toolshed I want to tend.</p>\n",
      "image": "https://brennan.day/assets/images/blog/toolshed.jpg",
      "date_published": "2026-08-27T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "Social Commentary",
        "hope",
        "optimism",
        "compassion",
        "philosophy",
        "community",
        "constructive journalism"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    },
    {
      "id": "https://brennan.day/bubblestown-four-months-later/",
      "url": "https://brennan.day/bubblestown-four-months-later/",
      "title": "Bubbles.town: Four Months Later",
      "summary": "After several months of using Bubbles.town, I share my long-term review of the IndieWeb aggregator. The good: discovering diverse blogs across niche topics. The issues: glacial pace of content changes, popularity contest dynamics, categorization problems, and sparse community participation. Overall, Bubbles is a valuable tool among many for web discovery, but not without its problems.",
      "content_html": "<p>It was near the end of April when <a href=\"https://brennan.day/floating-up-an-interview-with-the-creator-of-bubbles-town-benjamin-behnke/\">I interviewed the creator of Bubbles.town</a>, Benjamin Behnke, and I feel as though I've been using the platform for enough time to give a more long-term review of it now. Here are some of my thoughts, and if you disagree with any please drop a comment!</p>\n<h2>The Good</h2>\n<p>I want to start with the positive, which is that I've discovered and continue to find new blogs on a wide variety of interesting topics thanks to Bubbles. Blogs about <a href=\"https://climbingmyfamilytree.blogspot.com/\">family genealogy</a>, <a href=\"https://corianderinpho.com/works/\">wonderful illustrators</a>, <a href=\"https://blog.curiousquail.com\">musicians</a>, <a href=\"https://qtea.me/posts/souping-up-my-blog/\">souping</a>, <a href=\"https://figureoftheday.blogspot.com/2026/08/star-wars-figure-of-day-day-3374-r2.html\">Star Wars action figures</a>, <a href=\"https://googlemapsmania.blogspot.com/\">Google Maps</a>, <a href=\"https://www.velcro-city.co.uk/ours-is-the-tragedy-of-the-silent-stars/\">science fiction writers</a>, <a href=\"https://noisydeadlines.net/my-bullet-journal-setup-personal-august-2026\">bullet journals</a>. I could go on and on, and that's just from this week.</p>\n<p>There are so many topics I don't have any knowledge of whatsoever, and it makes me so happy that there are people who have dedicated blogs to these topics! Bubbles allows me to discover personal sites that I would not have encountered otherwise. It reminds me of visiting my public library and browsing the more obscure aisles of the Dewey Decimal system and being astounded that so many books on each particular topic exist.</p>\n<p>In this sense, Bubbles has been a fantastic success story for the IndieWeb, and demonstrates how it is a net positive rather than a net negative, in my opinion.</p>\n<p>That said, I do still certainly have my issues with the aggregator, particularly as it becomes more popular and used as a primary source for bloggers and IndieWeb participants. So, onto my qualms.</p>\n<h2>The Pace</h2>\n<p>I don't know if I visit the aggregator too often (two or three times a day) but I notice that the top posts change at a rather glacial pace. It reminds me of how, back in 2018, Reddit changed their default sorting from &quot;Hot&quot; to &quot;Best&quot; and the ability to use the site for breaking news near totally collapsed.</p>\n<p>And I think this is especially puzzling since it's Blaugust, surely people are blogging like crazy right now, right? I'm not sure if this simply has to do with how Bubbles calculates its algorithm: <code>Score = (1 + Votes × 25) / (EffectiveAge + 2) ^ 1.4</code>. Now, this is indeed an algorithm, but it is not an impossible black box algorithm that is unknowable to even the engineers who designed it, the way corporate social media has. It's just plain math.</p>\n<h2>The Popularity Contest</h2>\n<p>One thing I don't like is the language used by the site, the about page specifically says that &quot;you vote on the posts worth reading. The good stuff floats to the top. Everything else sinks over time.&quot; And this couldn't be further from the case in my experience. Posts on page 10 of the aggregator with zero upvotes are typically as interesting, or more interesting, than whatever is on the front page.</p>\n<p>Also, something new I just noticed: there's now a <a href=\"https://bubbles.town/classics\">classics page</a> which shows off the all-time most upvoted posts and websites. As of writing, I'm in third place, with 340 upvotes from 156 voters. Zoo-Wee Mama! From a statistical curiosity perspective, I think it's neat to have a page like this, but for someone who already thinks <a href=\"https://osteophage.neocities.org/essays/bubbles-problems\">Bubbles is a popularity contest</a>, this just amplifies that argument.</p>\n<p>I'm a writer that is deeply uninterested in how many visits my site gets or upvotes my posts get on Bubbles. But I know that's not the case for everyone. Some people get anxious or worried about what others will think, and Bubbles gives a rather obvious and problematic framing to that. As soon as you become focused on trying to cater to an audience instead of writing what YOU want to write, the entire process will quickly become unfun and burdensome. So if metrics are something you care about, I'd recommend not putting your site on Bubbles, or ask for it to be removed.</p>\n<h2>The Categorization</h2>\n<p>Bubbles has categories, and the way they work is rather neat. From the <a href=\"https://bubbles.town/faq\">FAQ</a>:</p>\n<blockquote>\n<p>Categories are decided by a small statistical classifier (Naive Bayes) that ships with the binary and runs on the Bubbles server, with no external service involved.</p>\n</blockquote>\n<p>This is far from perfect, and after using the aggregator for some time I would recommend adding more categories to help with filtering. Specifically, I'd love the ability to filter out genAI posts rather than all tech posts in general, since another criticism I have is that man, there are a lot of people writing about genAI on Bubbles. That doesn't have anything to do with Bubbles specifically, that's just a byproduct of people writing about genAI a lot in general.</p>\n<p>A &quot;meta&quot; category would also be great, to be able to filter out posts that themselves are about Bubbles.town (like this one!).</p>\n<h2>The Community</h2>\n<p>Another issue Bubbles has is community participation. A place like Bubbles can only ever be as good as the willingness people have to use it. I'm a culprit here, as I do a bad job at upvoting posts I enjoy (this is a case everywhere I go, I am so forgetful of giving a heart on posts on Tumblr, Mastodon, Pillowfort, anywhere that has that ability). An aggregator only works if people interact and participate with it. Likewise, because the categories are defined automatically, they can be wrong (like my post on &quot;Buying Them a Coffee&quot; being categorized as food) and if you click on a category on a post, you can easily submit which one is more accurate.</p>\n<p>Commenting culture is also incredibly sparse on Bubbles. I understand it's a little awkward and clunky, since you need to sign in and post comments via Mastodon, so I'm hoping people are instead just commenting directly on people's sites, <a href=\"https://brennan.day/knitting-the-web-we-need-interlinkers/\">linking to posts they like</a>, or directly emailing bloggers.</p>\n<p>I also will admit I have some beef with seeing certain bloggers on Bubbles, such as <a href=\"https://www.joanwestenberg.com/\">Joan/JA Westenberg</a> who has over 14,000 subscribers on the Nazi-complacent platform Substack, and who was previously <a href=\"https://brennan.day/did-joan-westenberg-memoryhole-web3-nfts/\">heavily involved in the Web3/NFT scene before deleting everything regarding that</a>. Sure, Bubbles should be for small, independent creators who aren't just looking for another revenue source. And maybe I'm hypocritical for that criticism given my own stats, but I like to think at least I actually deeply care about the IndieWeb and haven't just decided to hop to the next most viable market.</p>\n<h2>The Heart of It</h2>\n<p>Overall, Bubbles.town is a weird project. It is definitely a &quot;ask for forgiveness instead of beg for permission&quot; kind of project. As in, if someone told me they had the idea of starting an IndieWeb aggregator using genAI and collect thousands of personal sites and blogs without asking anyone, I would implore them not to do that and think it was a terrible idea.</p>\n<p>But Benjamin did this, and I would be dishonest if I said I didn't appreciate Bubbles.town. He has always been quick to respond and makes it easy to remove your blog.</p>\n<p>I also want to add that the <code>BubblesBot</code> has been excellent in terms of crawling my site respectfully:</p>\n<table>\n<thead>\n<tr>\n<th>User agent</th>\n<th>Requests</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Chrome</td>\n<td>429,811</td>\n</tr>\n<tr>\n<td>Firefox</td>\n<td>343,546</td>\n</tr>\n<tr>\n<td>Other</td>\n<td>287,038</td>\n</tr>\n<tr>\n<td>Mobile Safari</td>\n<td>177,268</td>\n</tr>\n<tr>\n<td>Chrome Mobile</td>\n<td>108,253</td>\n</tr>\n<tr>\n<td>Safari</td>\n<td>90,246</td>\n</tr>\n<tr>\n<td>Googlebot</td>\n<td>44,564</td>\n</tr>\n<tr>\n<td>Edge</td>\n<td>32,076</td>\n</tr>\n<tr>\n<td>NetNewsWire</td>\n<td>9,152</td>\n</tr>\n<tr>\n<td>BubblesBot</td>\n<td>9,032</td>\n</tr>\n</tbody>\n</table>\n<p>If you view Bubbles as just one of many ways to interface with the independent web, along side <a href=\"https://ooh.directory/\">directories</a>, <a href=\"https://marginalia-search.com/\">alternative search engines</a>, <a href=\"https://brisray.com/web/webring-list.htm\">webrings</a> , <a href=\"https://brennan.day/blogroll\">blogrolls</a>, <a href=\"https://url.town/\">human curation</a> and also use other aggregators like <a href=\"https://nuchronic.uk/\">nuchronic</a> or <a href=\"https://scour.ing\">scour.ing</a>, then it's a great tool.</p>\n<p>And if you're someone that's totally uninterested in aggregators and think they're problematic, that's also really understandable! There's no &quot;right&quot; way to IndieWeb or share yourself, and I'll keep trying to find new ways to discover people and sites and blogs that don't rely on automated aggregators. The discovery is sometimes the best part.</p>\n<p>And, likewise, you are somebody that has a personal blog that you're active on, particularly if it's of a niche interest, I recommend you submit your blog to be added to Bubbles. Adventure is out there!</p>\n",
      "image": "https://brennan.day/assets/images/blog/soap-bubbles.jpg",
      "date_published": "2026-08-26T02:00:00.000Z",
      "_license": "https://creativecommons.org/licenses/by-sa/4.0/",
      "tags": [
        "personal essay",
        "IndieWeb",
        "Social Commentary",
        "blogging",
        "community",
        "aggregators"
      ],
      "authors": [
        {
          "name": "Brennan Kenneth Brown",
          "url": "https://orcid.org/0009-0004-9951-3451",
          "avatar": "https://brennan.day/assets/images/brennan.jpg"
        }
      ]
    }
  ]
}