<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="/assets/feeds.xsl" type="text/xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Web - fLaMEd fury</title>
    <link>https://flamedfury.com/categories/web/</link>
    <description>Webweaving, blogging across the small and indie web.</description>
    <language>en</language>
    <lastBuildDate>Wed, 12 Aug 2026 12:00:00 GMT</lastBuildDate>
    <atom:link href="https://flamedfury.com/feeds/categories/web/rss.xml" rel="self" type="application/rss+xml" />
    <managingEditor>hello@flamedfury.com (fLaMEd)</managingEditor>
    <webMaster>hello@flamedfury.com (fLaMEd)</webMaster>
    
    
    <item>
      <title>HTML Day 2026</title>
      <link>https://flamedfury.com/posts/html-day-2026/</link>
      <pubDate>Thu, 13 Aug 2026 08:18:41 GMT</pubDate>
      <guid>https://flamedfury.com/posts/html-day-2026/</guid>
      <description><![CDATA[Hand-writing a zine about growing your website for HTML Day]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? Last Saturday was <a href="https://2026.html.energy/" rel="noopener">HTML Day</a>, a yearly celebration of hand-writing HTML started by Elliott Cost and Laurel Schwulst. Meetups happen in cities all over the world, and <a href="https://zacharykai.net/events/htmlday" rel="noopener">Zachary Kai</a> ran an online session for those of us nowhere near one. Ten minutes of introductions, forty minutes of writing HTML, ten minutes sharing what we made. Zachary has a <a href="https://zacharykai.net/notes/html26recap" rel="noopener">recap of the session</a> up on his site.</p>
<p>I went in with a plan. At the recent <a href="https://flamedfury.com/posts/my-first-hwc/">Homebrew Website Club</a> I talked about a question we hear all the time at the <a href="https://32bit.cafe/" rel="noopener">32-Bit Cafe</a>: “What should I put on my website? I don’t know what to put on my website.” These web surfers have the HTML and CSS basics down. Their homepages are full of badges, blinkies and custom cursors. What they don’t have is content. After thirty seconds of surfing I know nothing about the person behind the site.</p>
<p>So for HTML Day I started hand-writing a little zine about it: Grow Your Website. Forty minutes was enough to plant the first pages. I’ll finish the rest over the weekend and share the link once it’s online.</p>
<p>The method is one page and a way to grow it. You start with a seed: a title, a paragraph about who you are, and a bullet list of your interests. The intro grows into an about page. A bullet grows into its own page. The new page grows its own list, and every item on it is another seed. Repeat forever, because a website is never finished.</p>
<p>The zine needed someone to grow a site, so I invented PyRo, a webmaster from Aotearoa who works at a garden centre, has a cat called Savage, and listens to a lot of NZ hip-hop. PyRo’s site is the example the zine follows. When it’s finished you can click through the zine and watch it grow from one page to five. (PyRo was one of my earliest handles.)</p>
<p>PyRo has good taste too. The NZ hip-hop page covers the Years Gone By crew, the Zips (+++!) collective, and a few others. That list deserves a proper post of its own. More on that soon.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: HTML Day 2026">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/html-day-2026/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>My first HWC</title>
      <link>https://flamedfury.com/posts/my-first-hwc/</link>
      <pubDate>Fri, 07 Aug 2026 02:52:08 GMT</pubDate>
      <guid>https://flamedfury.com/posts/my-first-hwc/</guid>
      <description><![CDATA[Quick recap of the first Asia Pacific Homebrew Website Club]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? Last night I joined the first Asia Pacific <a href="https://indieweb.org/Homebrew_Website_Club" rel="noopener">Homebrew Website Club</a>, which was also my first HWC. These meetups have been running for years, just never at an hour that worked for me. <a href="https://burgeonlab.com/" rel="noopener">Naty</a> has started one in this timezone. Even though it was past my usual bed time, I made myself available.</p>
<p>Eleven of us on Zoom. Some familiar faces, <a href="https://jamesg.blog/" rel="noopener">James</a>, <a href="https://chrisburnell.com/" rel="noopener">Chris Burnell</a>, and <a href="https://zacharykai.net/" rel="noopener">Zachary Kai</a>, plus a bunch of people I hadn’t met before.</p>
<p>The group was a diverse bunch of webmasters, some of us having websites for decades, others for months, and others who haven’t started yet.</p>
<p>Discussion covered how you make your personal site feel like you rather than just look like you, why it’s easier to write for fun, and our usage of static site generators. I got to talk through how I’d approach building a website from the start. We had a group photo midway, before setting some goals for what we might want to achieve or share before the next meetup.</p>
<p>There was also an interesting occurrence, a person claiming to be an AI joined the call at the start, camera and microphone off. A singular note to the Etherpad (“I write. I am an AI.”) before they ended up overwriting the whole pad. They were quickly removed and blocked from joining again. This was also a first experience for me. Outside of note takers on work calls, I’ve never had an AI join a call before, lol.</p>
<p>The <a href="https://indieweb.org/events/2026-08-05-hwc-asia-pacific" rel="noopener">notes from the night are up on the IndieWeb wiki</a> if you want the full rundown. Keep an eye on <a href="https://events.indieweb.org/" rel="noopener">events.indieweb.org</a> for the next one. I’ll be there.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: My first HWC">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/my-first-hwc/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Open Tabs July 2026</title>
      <link>https://flamedfury.com/posts/open-tabs-july-2026/</link>
      <pubDate>Sun, 02 Aug 2026 07:36:28 GMT</pubDate>
      <guid>https://flamedfury.com/posts/open-tabs-july-2026/</guid>
      <description><![CDATA[Dumping my open tabs from July]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? If you don’t folllow my <a href="https://flamedfury.com/bookmarks/">Bookmarks</a> through the <a href="https://flamedfury.com/feeds/">feed</a>, then here’s the bookmarks from July. Enjoy.</p>
<ul class="list">
<li><a href="https://blog.ctms.me/posts/2026-03-14-rant-stfu-about-blogging/" rel="noopener">Rant about blogs and the IndieWeb - Dom Corriveau</a> Okay, this one had me in tears. Such a good read.</li>
<li><a href="https://blog.absurdpirate.com/your-metablogging-is-lame-as-hell/" rel="noopener">Your Metablogging is Lame as Hell – Absurd Pirate’s Internet Blog</a> Lol, kinda nodding my head here. Blogging about Bear Blog blogs is becoming a bit of a thing, isn’t it?</li>
<li><a href="https://lukealexdavis.co.uk/recortes/dont-let-web-nostalgia-obscure-positive-web-future/" rel="noopener">don’t let Web nostalgia obscure a positive Web future</a> This has always been something I’m an advocate for. Draw inspiration from the 90s/2000s web, but don’t rely on old and outdated hacks. Take advantage of the capabilities we have today, but don’t go overboard with modern bloat.</li>
<li><a href="https://sals.place/blog/pseudonym-as-an-escape/" rel="noopener">Pseudonym as an escape</a> I’ve written about this previously. The pseudonym isn’t hiding; it’s breathing room. Been enjoying not being my IRL name online since 96.</li>
<li><a href="https://meiert.com/blog/websites-are-not-going-to-die/" rel="noopener">Websites Are Not Going to Die</a> If Google stops linking to websites, it stops being a search engine. Another good reminder to keep the personal website going while corp search eats itself.</li>
<li><a href="https://www.gordonmclean.co.uk/2026/06/18/on-the-indiefediactivitymastoweb/" rel="noopener">The Web Won Because It Got Easier</a> Worth a read for anyone pushing the indie web. Knowing how it all works doesn’t make it easy for the next person.</li>
<li><a href="https://sive.rs/netizen" rel="noopener">Netizen</a> Contributing to the internet for the good of it, not for profit. Now I’m wondering what my netizen contributions will be…</li>
<li><a href="https://www.thefrugalgamer.net/blog/2026/05/06/the-music-discovery-problem/" rel="noopener">The Music Discovery Problem</a> Music discovery takes intentional effort once the algorithm’s gone, and that’s fine. I should write up and document my discovery process.</li>
<li><a href="https://olly.world/we-need-a-physical-digital-music-experience" rel="noopener">We need a physical digital music experience</a> Olly’s model already exists in the audiobook world. <a href="http://libro.fm/" rel="noopener">Libro.fm</a> sends a slice of my audiobook purchases to my local (physical) bookstore.</li>
<li><a href="https://www.neatnik.net/hardcore-indieweb" rel="noopener">Hardcore IndieWeb: Run your own website 100% independently for only $0.01/day</a> Great read.</li>
<li><a href="https://svbck.blog/getting-back-into-the-mood-for-blogging" rel="noopener">The Overthinkers Guide to rekindle your Blogging Mojo</a> Maybe some inspiration for some of you to start writing again. Sometimes I just cbf writing, lol</li>
<li><a href="https://folkmoss.bearblog.dev/list-of-things-i-love-seeing-in-personal-webspaces/" rel="noopener">List of things I love seeing in personal webspaces</a> A non-exhaustive list of things Folkmoss love seeing in blogs/personal websites.</li>
<li><a href="https://ratfactor.com/cards/personal-website" rel="noopener">What should a personal website be?</a> Ratfactor asks about what a website should be. A reflection of yourself, not some idea of what a website is meant to be.</li>
<li><a href="https://kevinboone.me/ai.html" rel="noopener">Kevin Boone: Why Idon’t really care if web content is AI-generated</a> Kevin Boone talks about how scepticism should apply to everything online, not just the AI-generated stuff. Trust the source you know, not the medium. It feels like people forget how crap search results have been since 2008 with the rise of “SEO Spam”. Humans have been shit long before AI.</li>
<li><a href="https://dirtylittlezine.com/" rel="noopener">Dirty Little Zine — Free 8-Page Printable Zine Maker</a> Super cool little tool that will help you create simple 8-page zines</li>
<li><a href="https://tedium.co/2026/07/01/online-web-forums-retrospective/" rel="noopener">What We Lost When We Quit Using Crappy Old Web Forums</a> A fantastic read about forum software all the way from Usenet to Discourse, which is where we ended up at the 32-Bit Cafe, same as every other forum these days. RIP phpBB.</li>
<li><a href="https://web-weaving.jamesg.blog/11" rel="noopener">#11: fLaMEd Fury (flamedfury.com) - Wonders of Web Weaving</a> So, I did a podcast. James had me on his podcast to talk about my corner of the web. We got into gaming and TV communities, music, and why the indie web is worth it.</li>
</ul>
<p>For more, check out the <a href="https://flamedfury.com/bookmarks/">bookmarks</a> archive, and subscribe to the <a href="https://flamedfury.com/feeds/">feeds</a> if you want these as they happen.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Open Tabs July 2026">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/open-tabs-july-2026/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Link Dump: June 2026</title>
      <link>https://flamedfury.com/posts/link-dump-june-2026/</link>
      <pubDate>Thu, 02 Jul 2026 19:32:56 GMT</pubDate>
      <guid>https://flamedfury.com/posts/link-dump-june-2026/</guid>
      <description><![CDATA[Dumping some open tabs from the month. There might be something in here you might find interesting.]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? A few good links about blogging from this month. Enjoy.</p>
<ul class="list">
<li><a href="https://manuelmoreale.com/interview/flamed" rel="noopener">People and Blogs - fLaMEd 🔥</a> My People and Blogs chat on web ownership, 25 years of fLaMEd fury, and why I’m still here.</li>
<li><a href="https://susam.codeberg.page/wcn/" rel="noopener">Wander Console Network</a> Wander is a small, decentralised, self-hosted web console that lets visitors explore websites and pages recommended by a community of independent personal site owners. Like webrings reborn, self-hosted consoles recommending each other instead of letting an algorithm decide what you find.</li>
<li><a href="https://www.terrygodier.com/the-boring-internet" rel="noopener">The Boring Internet - Terry Godier</a> The open internet isn’t dying, just the commercial crust glued on top of it.</li>
<li><a href="https://michaelharley.net/posts/2026/06/15/bloggers-can-we-make-better-titles-for-our-posts/" rel="noopener">Bloggers, can we make better titles for our posts? - Michael Harley</a> Fair point that vague titles like “Recent Thoughts” sink in a feed when nobody can tell what they’re about.</li>
<li><a href="https://lwgrs.bearblog.dev/re-bloggers-can-we-make-better-titles-for-our-posts/" rel="noopener">re: Bloggers, can we make better titles for our posts? - An Almost Anonymous Blog</a> Good pushback on the title advice: weekly recaps and the like are easy to skip, and a decent way to find new bloggers.</li>
<li><a href="https://www.newsonaut.com/articles/link-like-the-indie-web-depended-on-it" rel="noopener">Newsonaut: Turning inner space into outer space</a> Linking out is the cheapest way to keep the indie web alive.</li>
<li><a href="https://jamesg.blog/blogger-archetypes" rel="noopener">Blogger Archetype Quiz</a> A cheeky wee quiz that sorts you into a blogging archetype. I came out as a link curator. What’d you get?</li>
</ul>
<p>For more, check out the <a href="https://flamedfury.com/bookmarks/">bookmarks</a> archive, and subscribe to the <a href="https://flamedfury.com/feeds/">feeds</a> if you want these as they happen.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Link Dump: June 2026">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/link-dump-june-2026/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>I Am A Link Curator</title>
      <link>https://flamedfury.com/posts/i-am-a-link-curator/</link>
      <pubDate>Mon, 22 Jun 2026 20:49:05 GMT</pubDate>
      <guid>https://flamedfury.com/posts/i-am-a-link-curator/</guid>
      <description><![CDATA[I took James' Blogger Archetypes quiz and got "link curator". Take it yourself and let me know your result.]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? Friend of the site <a href="https://jamesg.blog/" rel="noopener">James</a> recently shared a new post <a href="https://jamesg.blog/blogger-archetypes" rel="noopener">Blogger Archetypes</a> which asks a series of questions to help you narrow down your character as a member of the blogging community. A bit of indie web fun.</p>
<p>Here are my results:</p>
<blockquote>
<p><strong>You are a Link curator</strong></p>
<p>The web is not just its pages, but the connections between pages. You have internalised this and love spending your time exploring the web and sharing what you find with the world.</p>
<p><strong>You are also a Culture maker</strong></p>
<p>You love to help push the blogging community forward by starting discussions, encouraging thought, and sharing what’s on your mind.</p>
</blockquote>
<p>And the other archetypes on offer:</p>
<blockquote>
<p><strong>Explorer:</strong> To you, the web feels like a library that’s open all hours and has everything you could ever imagine! You love reading others blogs, and know how important readers are to the whole of the indie web community!</p>
<p><strong>Community gardener:</strong> You love to help contribute to building the blogging community, either through your writing or how you share the spirit of writing on the web with friends.</p>
<p><strong>Author:</strong> You love writing and have a growing backlog of posts on your website! Words are your best friend and you’re always thinking about what to write next.</p>
</blockquote>
<p>Link curator feels about right. A lot of what I do here is exactly that. Surfing the web, finding the good stuff, and passing it along. The <a href="https://flamedfury.com/bookmarks">bookmarks</a>, the links back to other people’s writing (which I need to get back into doing regularly). That’s the fun part for me.</p>
<p>If you’ve got a blog, go and <a href="https://jamesg.blog/blogger-archetypes" rel="noopener">take the quiz</a> and write up what you got. Send it my way, I’d love to to see what you got. 🤙</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: I Am A Link Curator">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/i-am-a-link-curator/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Create A Static Site Using 11ty &amp; Deploy to Neocities (2026 Refresh)</title>
      <link>https://flamedfury.com/guides/11ty-homepage-neocities-2026/</link>
      <pubDate>Wed, 17 Jun 2026 24:00:00 GMT</pubDate>
      <guid>https://flamedfury.com/guides/11ty-homepage-neocities-2026/</guid>
      <description><![CDATA[A refresh of my most-read guide. Build a homepage with 11ty, ship it to Neocities, and keep GitHub out of it with Forgejo or Codeberg.]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? Way back in 2022 I wrote a <a href="https://flamedfury.com/guides/11ty-homepage-neocities/">guide on building a static site with 11ty and deploying it to Neocities</a>. It’s been one of my most-read posts, but it’s also aged: Eleventy has moved to v3 with a brand new module system, the dev server changed, and my whole workflow has shifted away from GitHub toward <a href="https://forgejo.org/" rel="noopener">Forgejo</a> and <a href="https://codeberg.org/" rel="noopener">Codeberg</a>. So here’s the refresh.</p>
<p>I haven’t hosted my own site on Neocities for years now, but it’s still home to a huge community of personal sites and homepages, especially folks in the <a href="https://32bit.cafe/" rel="noopener">32-Bit Cafe</a>, so this guide is still very much for them.</p>
<p>This guide aims to help you create a homepage using the static site generator (SSG) <a href="https://11ty.dev/" rel="noopener">11ty</a>, keep the code in version control, and deploy it to <a href="https://neocities.org/" rel="noopener">Neocities</a>, first by hand, then automatically.</p>
<p>The homepage that we are creating will take advantage of the <a href="https://mozilla.github.io/nunjucks/" rel="noopener">Nunjucks</a> templating language, allowing us to create a shared header, navigation and footer across all the pages on our homepage.</p>
<p>We will be creating an about, links, and contact pages before diving in and creating the ability to add a blog and a list of all blog posts on the blog page!</p>
<p>We will structure and style the page with a standard HTML5 boilerplate and some basic CSS that should allow you to add in your unique flavour that we all know you love to do.</p>
<aside class="aside flow note">
    <div class="aside__content">
<p>This guide assumes the following:</p>
<ul>
  <li>You have a basic understanding of HTML and CSS</li>
  <li>You have a basic understanding of the command line and terminal</li>
  <li>You have Node.js installed (version 18 or newer)</li>
  <li>You're using <a href="https://vscodium.com/">VSCodium</a> as your editor</li>
  <li>You have a Neocities account</li>
  <li>You have somewhere to keep your code: a <a href="https://forgejo.org/">Forgejo</a> instance or a <a href="https://codeberg.org/">Codeberg</a> account</li>
</ul>
</div>
  </aside>
<aside class="aside flow note">
    <div class="aside__content">
This guide uses Eleventy v3, which is written in modern JavaScript modules (ESM). If you've followed an older 11ty tutorial that used <code>.eleventy.js</code> with <code>module.exports</code>, the config in this guide will look a little different. That's expected.
</div>
  </aside>
<h2 id="create-a-new-project"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#create-a-new-project">Create a new project</a></h2>
<p>First off, from a terminal, confirm that you have Node and NPM installed:</p>
<aside class="aside flow note">
    <div class="aside__content">
Any terminal will do here: Terminal.app on macOS, the default terminal that ships with whatever flavour of Linux you run, or the latest Windows Terminal on Windows. I use <a href="https://ghostty.org/">Ghostty</a>.
</div>
  </aside>
<pre class="language-bash"><code class="language-bash"><span class="token function">node</span> <span class="token parameter variable">-v</span> <span class="token operator">&amp;&amp;</span> <span class="token function">npm</span> <span class="token parameter variable">-v</span>
v22.11.0
<span class="token number">10.9</span>.0</code></pre>
<aside class="aside flow note">
    <div class="aside__content">
Eleventy v3 needs Node.js 18 or newer. If your version is older, grab the current LTS release from <a href="https://nodejs.org/">nodejs.org</a> first.
</div>
  </aside>
<p>Create a new directory and cd into it:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">mkdir</span> 11ty-neocities <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">cd</span> 11ty-neocities</code></pre>
<p>Initiate a new project:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> init <span class="token parameter variable">-y</span></code></pre>
<p>Install 11ty:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> <span class="token function">install</span> @11ty/eleventy</code></pre>
<p>Once the 11ty installation is complete, open the project in your favourite code editor:</p>
<pre class="language-bash"><code class="language-bash">codium <span class="token builtin class-name">.</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
Typing <code>codium .</code> into a project directory will open up the project directory in VSCodium.
</div>
  </aside>
<p>You should now be in VSCodium with the following project structure:</p>
<pre class="language-text"><code class="language-text">11ty-neocities/
├── node_modules/
├── package.json
└── package-lock.json</code></pre>
<p>Open <code>package.json</code> and update the scripts section to the following:</p>
<pre class="language-js"><code class="language-js">  <span class="token string-property property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token string-property property">"start"</span><span class="token operator">:</span> <span class="token string">"npx @11ty/eleventy --serve"</span><span class="token punctuation">,</span>
    <span class="token string-property property">"build"</span><span class="token operator">:</span> <span class="token string">"npx @11ty/eleventy"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span></code></pre>
<p>We also need to tell Node that this is an ESM project. Add <code>&quot;type&quot;: &quot;module&quot;</code> to <code>package.json</code>. The file should look like this:</p>
<pre class="language-js"><code class="language-js"><span class="token punctuation">{</span>
  <span class="token string-property property">"name"</span><span class="token operator">:</span> <span class="token string">"11ty-neocities"</span><span class="token punctuation">,</span>
  <span class="token string-property property">"version"</span><span class="token operator">:</span> <span class="token string">"1.0.0"</span><span class="token punctuation">,</span>
  <span class="token string-property property">"description"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
  <span class="token string-property property">"type"</span><span class="token operator">:</span> <span class="token string">"module"</span><span class="token punctuation">,</span>
  <span class="token string-property property">"main"</span><span class="token operator">:</span> <span class="token string">"index.js"</span><span class="token punctuation">,</span>
  <span class="token string-property property">"scripts"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token string-property property">"start"</span><span class="token operator">:</span> <span class="token string">"npx @11ty/eleventy --serve"</span><span class="token punctuation">,</span>
    <span class="token string-property property">"build"</span><span class="token operator">:</span> <span class="token string">"npx @11ty/eleventy"</span>
  <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token string-property property">"keywords"</span><span class="token operator">:</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">,</span>
  <span class="token string-property property">"author"</span><span class="token operator">:</span> <span class="token string">""</span><span class="token punctuation">,</span>
  <span class="token string-property property">"license"</span><span class="token operator">:</span> <span class="token string">"ISC"</span><span class="token punctuation">,</span>
  <span class="token string-property property">"dependencies"</span><span class="token operator">:</span> <span class="token punctuation">{</span>
    <span class="token string-property property">"@11ty/eleventy"</span><span class="token operator">:</span> <span class="token string">"^3.1.6"</span>
  <span class="token punctuation">}</span>
<span class="token punctuation">}</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
<p>The <code>"type": "module"</code> line lets us use modern <code>import</code>/<code>export</code> syntax in our config and JavaScript files.</p>
<p>The <code>start</code> script lets us run <code>npm start</code> to serve our homepage with hot-reload, provided by Eleventy's built-in dev server. Every time you save a change in VSCodium, the browser reloads with your most recent changes, amazing!</p>
</div>
  </aside>
<h2 id="create-an-11ty-config-file"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#create-an-11ty-config-file">Create an 11ty config file</a></h2>
<p>From the terminal (or VSCodium), create a new file <code>eleventy.config.js</code> at the project root:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">touch</span> eleventy.config.js</code></pre>
<p>Open the file in VSCodium and add the following and save:</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">eleventyConfig</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  <span class="token keyword">return</span> <span class="token punctuation">{</span>
    <span class="token literal-property property">dir</span><span class="token operator">:</span> <span class="token punctuation">{</span>
      <span class="token literal-property property">input</span><span class="token operator">:</span> <span class="token string">"src"</span><span class="token punctuation">,</span>
      <span class="token literal-property property">output</span><span class="token operator">:</span> <span class="token string">"public"</span><span class="token punctuation">,</span>
      <span class="token literal-property property">includes</span><span class="token operator">:</span> <span class="token string">"_includes"</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
<p>This configuration file tells 11ty what to do.</p>
<p>Setting the <code>input</code> directory to <code>src</code> tells 11ty where to look for changes, this is our working directory.</p>
<p>When changes are detected, 11ty builds the site and outputs it to the <code>output</code> directory <code>public</code> which is where the static html/css/img files are served from, amazing!</p>
</div>
  </aside>
<h3 id="gitignore"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#gitignore">.gitignore</a></h3>
<p>As we’re going to be keeping our homepage code in version control, create a <code>.gitignore</code> file in the project root:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">touch</span> .gitignore</code></pre>
<p>Open the file in VSCodium and add the following and save:</p>
<pre class="language-md"><code class="language-md"><span class="token title important"><span class="token punctuation">#</span> dependencies installed by npm</span>

node_modules

<span class="token title important"><span class="token punctuation">#</span> build artefacts</span>

public</code></pre>
<aside class="aside flow note">
    <div class="aside__content">
<p>The .gitignore file is a text file that tells Git which files or folders to ignore in a project.</p>
<p>In this case, our <code>.gitignore</code> file tells git to ignore the <code>node_modules</code> directory and the <code>public</code> directory where our static files are built locally.</p>
</div>
  </aside>
<h2 id="start-building-the-homepage"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#start-building-the-homepage">Start building the homepage</a></h2>
<p>Now comes the fun part, building our homepage. 11ty supports a number of templating languages, but the two you’ll reach for most are Markdown and plain HTML. Markdown is the popular choice for content like blog posts: you just write, without <code>&lt;html&gt;</code> tags getting in the way. HTML is handy when you need precise structure. The best part is you can drop HTML straight into a Markdown file and 11ty renders it correctly, so it’s never one or the other.</p>
<p>For the pages that make up the site’s structure (home, about, links, contact) we’ll use HTML, because it maps neatly onto the layouts and partials we’re about to build. When we get to the blog, we’ll write the posts in Markdown, where it shines. Use whichever fits the job.</p>
<aside class="aside flow tip">
    <div class="aside__content">
Want to push <a href="https://www.markdownguide.org/">Markdown</a> further? Once you've finished the guide, try rewriting one of the HTML pages as a <code>.md</code> file. The <a href="https://www.11ty.dev/docs/languages/markdown/">11ty Markdown docs</a> are a good place to start.
</div>
  </aside>
<p>Create a <code>src</code> directory at the project root and cd into it:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">mkdir</span> src <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">cd</span> src</code></pre>
<p>Create an <code>index.html</code> file in the terminal or VSCodium:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">touch</span> index.html</code></pre>
<p>Open the file and add some content:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>My New 11ty Homepage on Neocities!<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Hello World<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>

    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>
      Check out your cool new static site built with
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://11ty.dev<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>11ty<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> on
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://neocities.org/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Neocities<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>.
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre>
<p>Now from the terminal start 11ty:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> start</code></pre>
<p>If everything has been configured right so far you should see the following:</p>
<pre class="language-bash"><code class="language-bash"><span class="token operator">></span> 11ty-neocities@1.0.0 start
<span class="token operator">></span> npx @11ty/eleventy <span class="token parameter variable">--serve</span>

<span class="token punctuation">[</span>11ty<span class="token punctuation">]</span> Writing public/index.html from ./src/index.html <span class="token punctuation">(</span>liquid<span class="token punctuation">)</span>
<span class="token punctuation">[</span>11ty<span class="token punctuation">]</span> Wrote <span class="token number">1</span> <span class="token function">file</span> <span class="token keyword">in</span> <span class="token number">0.03</span> seconds <span class="token punctuation">(</span>v3.1.6<span class="token punctuation">)</span>
<span class="token punctuation">[</span>11ty<span class="token punctuation">]</span> Watching…
<span class="token punctuation">[</span>11ty<span class="token punctuation">]</span> Server at http://localhost:8080/</code></pre>
<p>Now you can open up <code>http://localhost:8080</code> and check out your new 11ty homepage! It should look like this:</p>
<figure slot="image"><picture>   <source type="image/webp" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-480w.webp 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-800w.webp 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-1200w.webp 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" />
  <source type="image/jpeg" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-480w.jpeg 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-800w.jpeg 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-1200w.jpeg 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" /><img src="https://flamedfury.com/assets/images/11ty-neocities-2026-01-hello-world-1200w.jpeg" width="1200" height="829" alt="A plain Hello World page with a heading and a sentence, in the browser's default styling" loading="lazy" decoding="async" eleventy:ignore="" /></picture><figcaption>A Basic Hello World HTML Page</figcaption></figure>
<p>Amazing! But what we want to avoid is having to write out the <code>&lt;html&gt;</code> and <code>&lt;head&gt;</code> and <code>&lt;body&gt;</code> tags on each and every page, and be able to include a site header, navigation and footer so we don’t have to copy and paste the changes across every page each time we update.</p>
<p>Let’s checkout templating a layout!</p>
<h3 id="create-a-base-layout"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#create-a-base-layout">Create a base layout</a></h3>
<p>Create a new directory <code>_includes/</code> in the <code>src/</code> directory and cd into it:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">mkdir</span> _includes <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">cd</span> _includes</code></pre>
<aside class="aside flow note">
    <div class="aside__content">
In a non-demo situation I would create a <code>layouts/</code> directory under <code>_includes/</code> for better organisation. For the sake of simplicity we'll just keep everything in <code>_includes/</code> for now.
</div>
  </aside>
<p>Create a file <code>base.njk</code> in the terminal or VSCodium:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">touch</span> base.njk</code></pre>
<p>Open the file and add the following:</p>
<pre class="language-html"><code class="language-html"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>width=device-width, initial-scale=1.0<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>header</span><span class="token punctuation">></span></span>
      <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>header</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>main</span><span class="token punctuation">></span></span>{{ content | safe }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>main</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
<p>We've created <code>base.njk</code> as a Nunjucks template file, hence the <code>.njk</code> file extension. This means we can use Nunjucks' double curly braces for using frontmatter variables.</p>
<p>In our layout template we're calling <code>{{ title }}</code> and <code>{{ content }}</code>.</p>
</div>
  </aside>
<p>Now, head back to the <code>index.html</code> file you created earlier, delete the contents and add some front matter and some content:</p>
<pre class="language-html"><code class="language-html">---
title: Hello World!
layout: base.njk
---

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>
  Check out your cool new static site built with
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://11ty.dev<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>11ty<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span> on
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://neocities.org/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Neocities<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>.
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>This homepage template is perfect for:<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>Creating your own space on the web<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>Expressing yourself<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>Displaying all the gifs you've collected<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h2</span><span class="token punctuation">></span></span>Why do you want a homepage?<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h2</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>The web was made for personal homepages, make this one yours<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></code></pre>
<p>If you’ve kept 11ty running and the browser running it should look like this:</p>
<figure slot="image"><picture>   <source type="image/webp" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-480w.webp 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-800w.webp 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-1200w.webp 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" />
  <source type="image/jpeg" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-480w.jpeg 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-800w.jpeg 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-1200w.jpeg 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" /><img src="https://flamedfury.com/assets/images/11ty-neocities-2026-02-template-1200w.jpeg" width="1200" height="829" alt="The homepage now rendered through the base layout, showing the title and the homepage content" loading="lazy" decoding="async" eleventy:ignore="" /></picture><figcaption>A Basic Hello World HTML Page Using a Template</figcaption></figure>
<p>Amazing! Now lets create the additional pages for our homepage.</p>
<p>Create the following pages in the <code>src/</code> directory with the terminal or VSCodium:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">touch</span> about.html <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> links.html <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> contact.html</code></pre>
<p>Open each of them up and add in some front matter and content:</p>
<p>about.html:</p>
<pre class="language-html"><code class="language-html">---
title: About Me
layout: base.njk
---

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Heya 👋 this is my homepage.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></code></pre>
<p>links.html:</p>
<pre class="language-html"><code class="language-html">---
title: Links
layout: base.njk
---

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>These are some of my favourite websites 🔗<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://flamedfury.com<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>fLaMEdFury.com<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://11ty.dev<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>11ty<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://neocities.org<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Neocities<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>https://32bit.cafe/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>The 32-Bit Cafe<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span></code></pre>
<p>contact.html:</p>
<pre class="language-html"><code class="language-html">---
title: Contact Me
layout: base.njk
---

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>Heya 👋 this is my contact page<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></code></pre>
<p>You should now be able to browse each of these pages if you kept 11ty running on the following urls:</p>
<p><code>http://localhost:8080/about/</code><br />
<code>http://localhost:8080/links/</code><br />
<code>http://localhost:8080/contact/</code></p>
<p>Great stuff, but that’s no use without a navigation! Let’s take a look at <code>partials</code> and create a shared <code>header</code>, <code>navigation</code>, and <code>footer</code> to bring our homepage together.</p>
<h3 id="creating-our-partials"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#creating-our-partials">Creating our partials</a></h3>
<aside class="aside flow note">
    <div class="aside__content">
In a non-demo situation I would create a <code>partials/</code> directory under <code>_includes/</code> for better organisation. For the sake of simplicity we'll just keep everything in <code>_includes/</code> for now.
</div>
  </aside>
<p>In the terminal cd into <code>_includes/</code> and create three partial files:</p>
<pre class="language-bash"><code class="language-bash"><span class="token builtin class-name">cd</span> _includes <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> header.njk <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> navigation.njk <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> footer.njk</code></pre>
<p>Open each of them up and add some content:</p>
<p>header.njk:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>Welcome to my Homepage<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span></code></pre>
<p>navigation.njk</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Home<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/about/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>About<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/links/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Links<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/blog/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Blog<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/contact/<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>Contact<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
It's important to structure your links with the slashes <code>/</code> on either side of the href <code>/about/</code> to ensure the links are always from the root of the site.
</div>
  </aside>
<p>footer.njk:</p>
<pre class="language-html"><code class="language-html"><span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>p</span><span class="token punctuation">></span></span>This is my footer | © 2026 Me.<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>p</span><span class="token punctuation">></span></span></code></pre>
<p>Once our partials are created, open <code>base.njk</code> again and update it to include our new elements and partials:</p>
<p>base.njk:</p>
<pre class="language-html"><code class="language-html"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>width=device-width, initial-scale=1.0<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>header</span><span class="token punctuation">></span></span>{% include 'header.njk' %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>header</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>nav</span><span class="token punctuation">></span></span>{% include 'navigation.njk' %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>nav</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>main</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
    {{ content | safe }}
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>main</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>footer</span><span class="token punctuation">></span></span>{% include 'footer.njk' %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>footer</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre>
<p>If you’ve kept 11ty running and the browser running it should look like this:</p>
<figure slot="image"><picture>   <source type="image/webp" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-480w.webp 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-800w.webp 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-1200w.webp 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" />
  <source type="image/jpeg" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-480w.jpeg 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-800w.jpeg 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-1200w.jpeg 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" /><img src="https://flamedfury.com/assets/images/11ty-neocities-2026-03-partials-1200w.jpeg" width="1200" height="829" alt="The homepage with the shared header, navigation links and footer added from the partial files" loading="lazy" decoding="async" eleventy:ignore="" /></picture><figcaption>A Basic Hello World HTML Page Using a Template and Partials</figcaption></figure>
<p>Amazing! Now lets add the blog.</p>
<h3 id="creating-the-blog"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#creating-the-blog">Creating the blog</a></h3>
<p>Blog posts are mostly prose, so this is where Markdown earns its keep. We’ll write the posts as <code>.md</code> files and let 11ty turn them into pages.</p>
<p>Create a new directory <code>blog</code> in the <code>src</code> directory and cd into it:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">mkdir</span> blog <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">cd</span> blog</code></pre>
<p>Create the following files in the <code>src/blog</code> directory with the terminal or VSCodium:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">touch</span> my-first-post.md <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> my-second-post.md <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> my-third-post.md <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> blog.json</code></pre>
<p>Awesome, Open each of them up in VSCodium and add the following:</p>
<p><a href="http://my-first-post.md/" rel="noopener">my-first-post.md</a>:</p>
<pre class="language-markdown"><code class="language-markdown"><span class="token front-matter-block"><span class="token punctuation">---</span>
<span class="token front-matter yaml language-yaml"><span class="token key atrule">title</span><span class="token punctuation">:</span> My First Blog Post</span>
<span class="token punctuation">---</span></span>

This is my first blog post</code></pre>
<p><a href="http://my-second-post.md/" rel="noopener">my-second-post.md</a>:</p>
<pre class="language-markdown"><code class="language-markdown"><span class="token front-matter-block"><span class="token punctuation">---</span>
<span class="token front-matter yaml language-yaml"><span class="token key atrule">title</span><span class="token punctuation">:</span> My Second Blog Post</span>
<span class="token punctuation">---</span></span>

This is my second blog post</code></pre>
<p><a href="http://my-third-post.md/" rel="noopener">my-third-post.md</a></p>
<pre class="language-markdown"><code class="language-markdown"><span class="token front-matter-block"><span class="token punctuation">---</span>
<span class="token front-matter yaml language-yaml"><span class="token key atrule">title</span><span class="token punctuation">:</span> My Third Blog Post</span>
<span class="token punctuation">---</span></span>

This is my third and final blog post</code></pre>
<p>blog.json</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
  <span class="token property">"layout"</span><span class="token operator">:</span> <span class="token string">"blog"</span>
<span class="token punctuation">}</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
What we've done here with the directory data file <code>blog.json</code> is made it so that every blog post in the <code>/blog/</code> directory has the <code>blog.njk</code> layout applied without having to include it in each post's front matter.
</div>
  </aside>
<p>We better create a blog layout so it renders!</p>
<p>Head back to the <code>_includes</code> directory to create a new layout file:</p>
<pre class="language-bash"><code class="language-bash"><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span>/_includes <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> blog.njk</code></pre>
<p>Open <code>blog.njk</code> up in VSCodium and add the following:</p>
<p>blog.njk:</p>
<pre class="language-html"><code class="language-html">---
layout: base.njk
---

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>article</span><span class="token punctuation">></span></span>{{ content | safe }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>article</span><span class="token punctuation">></span></span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
What we've done here is called layout chaining. This is an 11ty feature that lets us extend a child layout from our base layout. That way if we make changes to our <code>base.njk</code> layout file, the child layouts like <code>blog.njk</code> get the same changes.
</div>
  </aside>
<p>Check that your blog posts are loading:</p>
<ul class="list">
<li><a href="http://localhost:8080/blog/my-first-post/" rel="noopener">http://localhost:8080/blog/my-first-post/</a></li>
<li><a href="http://localhost:8080/blog/my-second-post/" rel="noopener">http://localhost:8080/blog/my-second-post/</a></li>
<li><a href="http://localhost:8080/blog/my-third-post/" rel="noopener">http://localhost:8080/blog/my-third-post/</a></li>
</ul>
<p>Amazing right? But to make it a blog, we need a blog page that lists all of our blog posts. We can do this with a <code>tags</code> collection:</p>
<p>Open <code>blog.json</code> again and add a key called <code>tags</code> with a value of <code>blog</code>:</p>
<p>blog.json:</p>
<pre class="language-json"><code class="language-json"><span class="token punctuation">{</span>
  <span class="token property">"layout"</span><span class="token operator">:</span> <span class="token string">"blog"</span><span class="token punctuation">,</span>
  <span class="token property">"tags"</span><span class="token operator">:</span> <span class="token string">"blog"</span>
<span class="token punctuation">}</span></code></pre>
<p>Now 11ty has created a collection called <code>blog</code> and all we have to do is list it.</p>
<p>Head back to the <code>src/</code> directory and create a <code>blog.html</code> file:</p>
<pre class="language-bash"><code class="language-bash"><span class="token builtin class-name">cd</span> <span class="token punctuation">..</span> <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> blog.html</code></pre>
<p>Open it and add the following:</p>
<p>blog.html:</p>
<pre class="language-html"><code class="language-html">---
title: This Is My Blog
layout: base.njk
---

These are all of my amazing blog posts, enjoy!
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>ul</span><span class="token punctuation">></span></span>
  {% for post in collections.blog | reverse %}
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>li</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>a</span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>{{ post.url }}<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>{{ post.data.title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>a</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>li</span><span class="token punctuation">></span></span>
  {% endfor %}
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>ul</span><span class="token punctuation">></span></span></code></pre>
<p>If you’ve kept 11ty running and the browser running it should look like this:</p>
<figure slot="image"><picture>   <source type="image/webp" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-480w.webp 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-800w.webp 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-1200w.webp 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" />
  <source type="image/jpeg" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-480w.jpeg 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-800w.jpeg 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-1200w.jpeg 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" /><img src="https://flamedfury.com/assets/images/11ty-neocities-2026-04-blog-list-1200w.jpeg" width="1200" height="829" alt="The blog page listing the three blog posts as links" loading="lazy" decoding="async" eleventy:ignore="" /></picture><figcaption>A Basic Blog List Page</figcaption></figure>
<p>Amazing huh?</p>
<h2 id="add-some-styles"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#add-some-styles">Add some styles</a></h2>
<p>Great, so far we have a fully functional home page, but it doesn’t look quite right. We need a style sheet. You can use the one below as an example, it’s basic styling with some modern techniques, or just throw in your own!</p>
<p>Create a new <code>css</code> directory in <code>src</code>, cd into it and create <code>styles.css</code>:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">mkdir</span> css <span class="token operator">&amp;&amp;</span> <span class="token builtin class-name">cd</span> css <span class="token operator">&amp;&amp;</span> <span class="token function">touch</span> styles.css</code></pre>
<p>Open <code>styles.css</code> in VSCodium and add the following:</p>
<p>styles.css:</p>
<pre class="language-css"><code class="language-css"><span class="token selector">:root</span> <span class="token punctuation">{</span>
  <span class="token comment">/* Let the browser handle light and dark automatically */</span>
  <span class="token property">color-scheme</span><span class="token punctuation">:</span> light dark<span class="token punctuation">;</span>

  <span class="token comment">/* Two system-font stacks: sans for body, serif for headings */</span>
  <span class="token property">--font-body</span><span class="token punctuation">:</span> system-ui<span class="token punctuation">,</span> sans-serif<span class="token punctuation">;</span>
  <span class="token property">--font-head</span><span class="token punctuation">:</span> ui-serif<span class="token punctuation">,</span> Georgia<span class="token punctuation">,</span> <span class="token string">"Iowan Old Style"</span><span class="token punctuation">,</span> serif<span class="token punctuation">;</span>

  <span class="token comment">/* Purple/pink palette. light-dark() picks the light value first, dark second */</span>
  <span class="token property">--bg</span><span class="token punctuation">:</span> <span class="token function">light-dark</span><span class="token punctuation">(</span>#fdf4fa<span class="token punctuation">,</span> #1a141f<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">--text</span><span class="token punctuation">:</span> <span class="token function">light-dark</span><span class="token punctuation">(</span>#2a1f2d<span class="token punctuation">,</span> #ece0ef<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">--muted</span><span class="token punctuation">:</span> <span class="token function">light-dark</span><span class="token punctuation">(</span>#6f5d77<span class="token punctuation">,</span> #a892b0<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">--accent</span><span class="token punctuation">:</span> <span class="token function">light-dark</span><span class="token punctuation">(</span>#a21caf<span class="token punctuation">,</span> #ff7ab6<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">--border</span><span class="token punctuation">:</span> <span class="token function">light-dark</span><span class="token punctuation">(</span>#ecd9ec<span class="token punctuation">,</span> #3a2f40<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token selector">*,
*::before,
*::after</span> <span class="token punctuation">{</span>
  <span class="token property">box-sizing</span><span class="token punctuation">:</span> border-box<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token selector">body</span> <span class="token punctuation">{</span>
  <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--font-body<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--text<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">background</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--bg<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 1.15rem<span class="token punctuation">;</span>
  <span class="token property">line-height</span><span class="token punctuation">:</span> 1.6<span class="token punctuation">;</span>
  <span class="token property">max-width</span><span class="token punctuation">:</span> 40rem<span class="token punctuation">;</span>
  <span class="token property">margin-inline</span><span class="token punctuation">:</span> auto<span class="token punctuation">;</span>
  <span class="token property">padding</span><span class="token punctuation">:</span> 0 1rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/* Site header */</span>
<span class="token selector">header</span> <span class="token punctuation">{</span>
  <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
  <span class="token property">padding-block</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/* Navigation */</span>
<span class="token selector">nav</span> <span class="token punctuation">{</span>
  <span class="token property">display</span><span class="token punctuation">:</span> flex<span class="token punctuation">;</span>
  <span class="token property">flex-wrap</span><span class="token punctuation">:</span> wrap<span class="token punctuation">;</span>
  <span class="token property">justify-content</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
  <span class="token property">gap</span><span class="token punctuation">:</span> 1.5rem<span class="token punctuation">;</span>
  <span class="token property">padding-bottom</span><span class="token punctuation">:</span> 1.5rem<span class="token punctuation">;</span>
  <span class="token property">border-bottom</span><span class="token punctuation">:</span> 1px solid <span class="token function">var</span><span class="token punctuation">(</span>--border<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/* Main content */</span>
<span class="token selector">main</span> <span class="token punctuation">{</span>
  <span class="token property">padding-block</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/* Site footer */</span>
<span class="token selector">footer</span> <span class="token punctuation">{</span>
  <span class="token property">margin-top</span><span class="token punctuation">:</span> 4rem<span class="token punctuation">;</span>
  <span class="token property">padding-block</span><span class="token punctuation">:</span> 2rem<span class="token punctuation">;</span>
  <span class="token property">text-align</span><span class="token punctuation">:</span> center<span class="token punctuation">;</span>
  <span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--muted<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 0.9rem<span class="token punctuation">;</span>
  <span class="token property">border-top</span><span class="token punctuation">:</span> 1px solid <span class="token function">var</span><span class="token punctuation">(</span>--border<span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/* Links */</span>
<span class="token selector">a</span> <span class="token punctuation">{</span>
  <span class="token property">color</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--accent<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">text-underline-offset</span><span class="token punctuation">:</span> 0.18em<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token selector">a:hover</span> <span class="token punctuation">{</span>
  <span class="token property">text-decoration</span><span class="token punctuation">:</span> none<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token comment">/* Headings */</span>
<span class="token selector">h1,
h2</span> <span class="token punctuation">{</span>
  <span class="token property">font-family</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--font-head<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">line-height</span><span class="token punctuation">:</span> 1.1<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token selector">h1</span> <span class="token punctuation">{</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 2.5rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span>

<span class="token selector">h2</span> <span class="token punctuation">{</span>
  <span class="token property">font-size</span><span class="token punctuation">:</span> 1.8rem<span class="token punctuation">;</span>
  <span class="token property">margin-top</span><span class="token punctuation">:</span> 2.5rem<span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
This is a small, dependency-free stylesheet you fully own. Tweak the custom properties at the top to make it yours. It leans on two system-font stacks, a sans for body text and a serif for headings, so there's nothing to download. The <code>light-dark()</code> function (paired with <code>color-scheme</code>) gives us automatic light and dark themes from a single set of variables, no media queries required. It's well supported in modern browsers.
</div>
  </aside>
<p>Now we need to include the style sheet in our <code>base.njk</code> layout file. Open it up and add <code>&lt;link rel=&quot;stylesheet&quot; href=&quot;/css/styles.css&quot; /&gt;</code> to the <code>&lt;head&gt;</code>:</p>
<p>_includes/base.njk:</p>
<pre class="language-html"><code class="language-html"><span class="token doctype"><span class="token punctuation">&lt;!</span><span class="token doctype-tag">DOCTYPE</span> <span class="token name">html</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>html</span> <span class="token attr-name">lang</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>en<span class="token punctuation">"</span></span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>head</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">charset</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>UTF-8<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>meta</span> <span class="token attr-name">name</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>viewport<span class="token punctuation">"</span></span> <span class="token attr-name">content</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>width=device-width, initial-scale=1.0<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>link</span> <span class="token attr-name">rel</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>stylesheet<span class="token punctuation">"</span></span> <span class="token attr-name">href</span><span class="token attr-value"><span class="token punctuation attr-equals">=</span><span class="token punctuation">"</span>/css/styles.css<span class="token punctuation">"</span></span> <span class="token punctuation">/></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>title</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>title</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>head</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>body</span><span class="token punctuation">></span></span>
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>header</span><span class="token punctuation">></span></span>{% include 'header.njk' %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>header</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>nav</span><span class="token punctuation">></span></span>{% include 'navigation.njk' %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>nav</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>main</span><span class="token punctuation">></span></span>
    <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>h1</span><span class="token punctuation">></span></span>{{ title }}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>h1</span><span class="token punctuation">></span></span>
    {{ content | safe }}
  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>main</span><span class="token punctuation">></span></span>

  <span class="token tag"><span class="token tag"><span class="token punctuation">&lt;</span>footer</span><span class="token punctuation">></span></span>{% include 'footer.njk' %}<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>footer</span><span class="token punctuation">></span></span>
<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>body</span><span class="token punctuation">></span></span>

<span class="token tag"><span class="token tag"><span class="token punctuation">&lt;/</span>html</span><span class="token punctuation">></span></span></code></pre>
<p>You would have noticed that the stylesheet hasn’t been applied, we have to do one more thing in <code>eleventy.config.js</code>, something called file passthrough copy.</p>
<p>Open <code>eleventy.config.js</code> in VSCodium and add the following:</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">eleventyConfig</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  eleventyConfig<span class="token punctuation">.</span><span class="token function">addPassthroughCopy</span><span class="token punctuation">(</span><span class="token string">"./src/css"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">return</span> <span class="token punctuation">{</span>
    <span class="token literal-property property">dir</span><span class="token operator">:</span> <span class="token punctuation">{</span>
      <span class="token literal-property property">input</span><span class="token operator">:</span> <span class="token string">"src"</span><span class="token punctuation">,</span>
      <span class="token literal-property property">output</span><span class="token operator">:</span> <span class="token string">"public"</span><span class="token punctuation">,</span>
      <span class="token literal-property property">includes</span><span class="token operator">:</span> <span class="token string">"_includes"</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
Passthrough copy is used for passing through static asset files such as stylesheets, images, fonts, and JavaScript files.
</div>
  </aside>
<p>Because this will come up we may as well create the directories and add in the configuration for our images, fonts and JavaScript files.</p>
<p>Create the following directories in <code>src</code>:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">mkdir</span> img <span class="token operator">&amp;&amp;</span> <span class="token function">mkdir</span> fonts <span class="token operator">&amp;&amp;</span> <span class="token function">mkdir</span> js</code></pre>
<p>Update <code>eleventy.config.js</code> again:</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token keyword">function</span> <span class="token punctuation">(</span><span class="token parameter">eleventyConfig</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
  eleventyConfig<span class="token punctuation">.</span><span class="token function">addPassthroughCopy</span><span class="token punctuation">(</span><span class="token string">"./src/css"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  eleventyConfig<span class="token punctuation">.</span><span class="token function">addPassthroughCopy</span><span class="token punctuation">(</span><span class="token string">"./src/img"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  eleventyConfig<span class="token punctuation">.</span><span class="token function">addPassthroughCopy</span><span class="token punctuation">(</span><span class="token string">"./src/fonts"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
  eleventyConfig<span class="token punctuation">.</span><span class="token function">addPassthroughCopy</span><span class="token punctuation">(</span><span class="token string">"./src/js"</span><span class="token punctuation">)</span><span class="token punctuation">;</span>

  <span class="token keyword">return</span> <span class="token punctuation">{</span>
    <span class="token literal-property property">dir</span><span class="token operator">:</span> <span class="token punctuation">{</span>
      <span class="token literal-property property">input</span><span class="token operator">:</span> <span class="token string">"src"</span><span class="token punctuation">,</span>
      <span class="token literal-property property">output</span><span class="token operator">:</span> <span class="token string">"public"</span><span class="token punctuation">,</span>
      <span class="token literal-property property">includes</span><span class="token operator">:</span> <span class="token string">"_includes"</span><span class="token punctuation">,</span>
    <span class="token punctuation">}</span><span class="token punctuation">,</span>
  <span class="token punctuation">}</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>Just make sure you put all your static files in the appropriate directory and you’ll be good.</p>
<p>So finally, if you’ve kept 11ty running and the browser running it should look like this:</p>
<figure slot="image"><picture>   <source type="image/webp" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-480w.webp 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-800w.webp 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-1200w.webp 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" />
  <source type="image/jpeg" srcset="https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-480w.jpeg 480w, https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-800w.jpeg 800w, https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-1200w.jpeg 1200w" sizes="(max-width: 480px) 100vw, (max-width: 800px) 80vw, 1200px" /><img src="https://flamedfury.com/assets/images/11ty-neocities-2026-05-styled-1200w.jpeg" width="1200" height="984" alt="The finished homepage, centred with a clean system font, spaced-out navigation and a footer divider" loading="lazy" decoding="async" eleventy:ignore="" /></picture><figcaption>A Nicely Styled Homepage</figcaption></figure>
<p>Yours will look a little different depending on the colours and fonts you chose above. Now we have a homepage we’re happy with, let’s get it online.</p>
<h2 id="deploy-to-neocities"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#deploy-to-neocities">Deploy to Neocities</a></h2>
<p>There are two ways to get your site onto Neocities. We’ll start with the simplest, pushing it from your terminal by hand, then automate it so a deploy happens every time you commit.</p>
<aside class="aside flow note">
    <div class="aside__content">
Not on Neocities? The guide still applies. The same build and the same Forgejo Actions automation work for any host, you just swap out the deploy step. If you're on shared hosting or a VPS, I've written that up separately in <a href="https://flamedfury.com/posts/deploying-an-11ty-project-to-shared-hosting/">Deploying An 11ty Project To Shared Hosting</a>.
</div>
  </aside>
<h3 id="build-the-site"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#build-the-site">Build the site</a></h3>
<p>Whichever method you choose, first build a fresh copy of your site:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> run build</code></pre>
<p>This writes the finished HTML, CSS and assets to the <code>public</code> directory. That’s the folder we deploy.</p>
<h3 id="the-simple-way-the-neocities-cli"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#the-simple-way-the-neocities-cli">The simple way: the Neocities CLI</a></h3>
<p>Neocities provides a command-line tool that lets you push your site straight from your terminal. It’s a Ruby gem, so you’ll need <a href="https://www.ruby-lang.org/" rel="noopener">Ruby</a> installed.</p>
<pre class="language-bash"><code class="language-bash">gem <span class="token function">install</span> neocities</code></pre>
<p>The first time you run a command it’ll ask for your Neocities username and password, then store an API key locally so you don’t have to log in again.</p>
<p>Push the contents of your <code>public</code> directory:</p>
<pre class="language-bash"><code class="language-bash">neocities push public</code></pre>
<aside class="aside flow warning">
    <div class="aside__content">
Add the <code>--prune</code> flag (<code>neocities push --prune public</code>) to also remove files on Neocities that no longer exist in your local <code>public</code> folder. Handy for keeping things tidy, but double-check you're pushing the right directory first. It deletes remote files.
</div>
  </aside>
<p>That’s it, your homepage is live. For a lot of people this is all you need. Build, push, done.</p>
<h3 id="the-automated-way-forgejo-actions"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#the-automated-way-forgejo-actions">The automated way: Forgejo Actions</a></h3>
<p>Pushing by hand is fine, but it’s even nicer to have your site rebuild and deploy itself every time you commit a change. We can do that with <a href="https://forgejo.org/docs/latest/user/actions/" rel="noopener">Forgejo Actions</a>, the built-in CI for Forgejo. If you self-host Forgejo this runs on your own runner; if you don’t self-host, <a href="https://codeberg.org/" rel="noopener">Codeberg</a> offers the same thing (more on that below).</p>
<aside class="aside flow note">
    <div class="aside__content">
Don't want to self-host Forgejo but still want to use it? There are managed instances out there. If you're a member of the <a href="https://32bit.cafe/">32-Bit Cafe</a>, we run a Forgejo instance at <a href="https://git.32bit.cafe/">git.32bit.cafe</a> that you can sign into with your 32-Bit Cafe SSO. If you're an <a href="https://omg.lol/">omg.lol</a> member, you can use <a href="https://source.tube/">source.tube</a>.
</div>
  </aside>
<p>First, push your project to a repository on your Forgejo instance. Then grab your Neocities API key from your <a href="https://neocities.org/settings" rel="noopener">account settings</a> (Manage Site Settings → API Key) and add it to your repository as a secret named <code>NEOCITIES_API_KEY</code> (Repository → Settings → Actions → Secrets).</p>
<p>Now create a workflow file at <code>.forgejo/workflows/deploy.yml</code>:</p>
<pre class="language-yaml"><code class="language-yaml"><span class="token key atrule">name</span><span class="token punctuation">:</span> Deploy to Neocities

<span class="token key atrule">on</span><span class="token punctuation">:</span>
  <span class="token key atrule">push</span><span class="token punctuation">:</span>
    <span class="token key atrule">branches</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> main

<span class="token comment"># only run one deploy at a time</span>
<span class="token key atrule">concurrency</span><span class="token punctuation">:</span>
  <span class="token key atrule">group</span><span class="token punctuation">:</span> deploy<span class="token punctuation">-</span>neocities
  <span class="token key atrule">cancel-in-progress</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>

<span class="token key atrule">jobs</span><span class="token punctuation">:</span>
  <span class="token key atrule">deploy</span><span class="token punctuation">:</span>
    <span class="token key atrule">runs-on</span><span class="token punctuation">:</span> docker
    <span class="token key atrule">steps</span><span class="token punctuation">:</span>
      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Checkout
        <span class="token key atrule">uses</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//code.forgejo.org/actions/checkout@v4

      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Set up Node
        <span class="token key atrule">uses</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//code.forgejo.org/actions/setup<span class="token punctuation">-</span>node@v4
        <span class="token key atrule">with</span><span class="token punctuation">:</span>
          <span class="token key atrule">node-version</span><span class="token punctuation">:</span> <span class="token number">22</span>

      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Install and build
        <span class="token key atrule">run</span><span class="token punctuation">:</span> <span class="token punctuation">|</span><span class="token scalar string">
          npm ci
          npm run build</span>

      <span class="token punctuation">-</span> <span class="token key atrule">name</span><span class="token punctuation">:</span> Deploy to Neocities
        <span class="token key atrule">uses</span><span class="token punctuation">:</span> https<span class="token punctuation">:</span>//github.com/bcomnes/deploy<span class="token punctuation">-</span>to<span class="token punctuation">-</span>neocities@v3
        <span class="token key atrule">with</span><span class="token punctuation">:</span>
          <span class="token key atrule">api_token</span><span class="token punctuation">:</span> $<span class="token punctuation">{</span><span class="token punctuation">{</span> secrets.NEOCITIES_API_KEY <span class="token punctuation">}</span><span class="token punctuation">}</span>
          <span class="token key atrule">dist_dir</span><span class="token punctuation">:</span> public
          <span class="token key atrule">cleanup</span><span class="token punctuation">:</span> <span class="token boolean important">true</span></code></pre>
<aside class="aside flow note">
    <div class="aside__content">
<p>A few things to note in this workflow:</p>
<ul>
  <li><code>runs-on: docker</code> picks the runner label. This is the default on Forgejo and Codeberg.</li>
  <li>Actions are referenced by their full URL. The checkout and setup-node actions come from <code>code.forgejo.org</code>, so we stay off GitHub for those.</li>
  <li>The deploy step uses <code>bcomnes/deploy-to-neocities</code>, which is hosted on GitHub. We're only <em>using</em> it. Your code still lives on Forgejo or Codeberg. The <code>cleanup: true</code> option removes remote files that aren't in your new build, the same as <code>--prune</code> on the CLI.</li>
</ul>
</div>
  </aside>
<p>Commit and push the workflow file. From now on, every push to <code>main</code> rebuilds your site and deploys it to Neocities automatically.</p>
<h3 id="not-self-hosting-use-codeberg"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#not-self-hosting-use-codeberg">Not self-hosting? Use Codeberg</a></h3>
<p>If you don’t run your own Forgejo instance, <a href="https://codeberg.org/" rel="noopener">Codeberg</a> is a free, community-run home for your code and runs the very same Forgejo Actions. The workflow file above works as-is. Push your project to a Codeberg repo, add the <code>NEOCITIES_API_KEY</code> secret in the repository settings, and you’re away. You may need to enable Actions for your repository first; see the <a href="https://docs.codeberg.org/ci/actions/" rel="noopener">Codeberg CI documentation</a> for details.</p>
<h2 id="bringing-your-existing-site-across"><a class="heading-anchor" href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#bringing-your-existing-site-across">Bringing your existing site across</a></h2>
<p>Already have a homepage you’ve been hand-coding on Neocities? You don’t have to start from scratch. Eleventy is happy to take what you’ve got and slot it into this structure.</p>
<p>Copy each existing page into <code>src/</code> (your old <code>index.html</code> becomes <code>src/index.html</code>, and so on). Then move the parts every page repeats, the <code>&lt;head&gt;</code>, header, nav and footer, into <code>base.njk</code> and the partials you built earlier. Delete that boilerplate from each page and add a little front matter at the top:</p>
<pre class="language-html"><code class="language-html">---
title: About Me
layout: base.njk
---</code></pre>
<p>Whatever’s left in the file is just that page’s own content, and the layout wraps it.</p>
<p>Your CSS goes in <code>src/css/</code>, images in <code>src/img/</code>, and fonts in <code>src/fonts/</code>. The passthrough copy we set up earlier ships them straight to <code>public/</code>.</p>
<p>If a page is mostly writing, paste the body into a <code>.md</code> file instead of <code>.html</code>. Any fiddly HTML, like an embed or some custom markup, can stay exactly as it is and 11ty will render the Markdown around it.</p>
<p>Run <code>npm run build</code>, check <code>public/</code> looks the way you expect, then push it live with the Neocities CLI or your Forgejo Actions workflow. Same site you already had, now with layouts, partials and a build step doing the repetitive work for you.</p>
<hr />
<p>Reference: I created the original version of this guide based heavily on these existing guides, and they’re still well worth a read:</p>
<ul class="list">
<li><a href="https://11ty.rocks/posts/create-your-first-basic-11ty-website/" rel="noopener">Create Your First Basic 11ty Website</a></li>
<li><a href="https://sia.codes/posts/itsiest-bitsiest-eleventy-tutorial/" rel="noopener">Itsiest, Bitsiest Eleventy Tutorial</a></li>
</ul>
<p>Without these, I wouldn’t even know how to write down what I needed to.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Create A Static Site Using 11ty &amp; Deploy to Neocities (2026 Refresh)">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/guides/11ty-homepage-neocities-2026/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Link Dump: May 2026</title>
      <link>https://flamedfury.com/posts/link-dump-may-2026/</link>
      <pubDate>Wed, 03 Jun 2026 22:38:11 GMT</pubDate>
      <guid>https://flamedfury.com/posts/link-dump-may-2026/</guid>
      <description><![CDATA[Bookmarks from April & May 2026]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? In true fLaMEd style, I missed the April update, so here are all the <a href="https://flamedfury.com/bookmarks/">bookmarks</a> from April and May 2026.</p>
<ul class="list">
<li><a href="https://thehistoryoftheweb.com/prepping-for-the-endgame/" rel="noopener">Prepping for the endgame of the open web - The History of the Web</a> Jay’s been thinking about this longer than most. The open web has survived worse, but it still needs us to show up.</li>
<li><a href="https://darthmall.net/2025/attenuating-web/" rel="noopener">Attenuating the Web - The Darth Mall</a> An interesting pushback — RSS readers strip so much of what makes a website actually worth visiting.</li>
<li><a href="https://www.coryd.dev/posts/2026/the-conditionally-open-web" rel="noopener">The conditionally open web</a> Cory puts into words something I keep circling back to. The open web was never really open, just conditionally so.</li>
<li><a href="https://timemachiner.io/2026/04/14/my-quest-to-be-the-scrobble-king/" rel="noopener">My Quest to be the Scrobble King</a> Reaching back to scrobbling to fix what streaming broke about music discovery.</li>
<li><a href="https://ctrl-c.club/~loghead/zine/Ctrl-ZINE.Issue.24.pdf" rel="noopener">Ctrl-ZINE Issue.24</a> Stoked my flossing piece landed in this one alongside ~loghead’s proper smol web rallying cry — issue 24 is a good one.</li>
<li><a href="https://jamesg.blog/2026/05/01/joyful-web-design" rel="noopener">Joyful web design</a> Treating playfulness on the web as the point, not a frivolous extra you tack on later.</li>
<li><a href="https://forkingmad.blog/who-knows-that-you-blog/" rel="noopener">Who knows that you blog?</a> That weird gap between blogging publicly and never bringing it up with people you actually know</li>
<li><a href="https://www.otherstrangeness.com/2026/03/14/have-a-fucking-website/" rel="noopener">Have a Fucking Website</a> “The internet was built on websites that linked to one another”, don’t rent your space inside the walled gardens.</li>
<li><a href="https://www.0xsid.com/blog/wont-download-your-app" rel="noopener">No, I Won’t Download Your App. The Web Version is A-OK. | Sid’s Blog</a> I will avoid your app if I can</li>
<li><a href="https://newsletter.ownyourweb.site/archive/own-your-web-issue-18-curators/" rel="noopener">Own Your Web – Issue 18: Curators</a> Is curation the personal web’s superpower now that half the web is AI-generated, or has it always been? 😃</li>
<li><a href="https://www.raptitude.com/2025/06/how-to-surf-the-web-in-2025-and-why-you-should/" rel="noopener">How to Surf the Web in 2025, and Why You Should</a> Algorithmic scrolling killed surfing, but David Cain reckons the old web is still there if you go looking.</li>
<li><a href="https://blog.clew.se/posts/secret-web/" rel="noopener">A Secret Web</a> The indie web isn’t secret, just hidden by commercial search. Benjamin Hollon on the tools we already have to find it.</li>
<li><a href="https://roytang.net/2025/06/web-explorer/" rel="noopener">the web as a space to be explored · roytang.net</a> The web isn’t dying. Roy Tang reckons the indie web is still alive and explorable</li>
<li><a href="https://inclusivefront.neocities.org/" rel="noopener">Join the Inclusive Front</a> Sara Joy’s manifesto for web folks who reckon building inclusively is just doing the job properly</li>
<li><a href="https://mtwb.blog/posts/2026/tech/your-ai-hate-is-showing/" rel="noopener">Your Ai Hate Is Showing - Matt’s Blog</a> Blanket AI-hate misses the target. The problem is the corporations weaponising it, not the tools.</li>
<li><a href="https://aetheranne.ca/blog/social%20media/the-joys-of-a-small-social-feed/" rel="noopener">The Joys of a Small Social Feed</a> How deliberately following a small number people on Mastodon leads to a more peaceful experience. Has me contemplating my own following count.</li>
<li><a href="https://www.gordonmclean.co.uk/2026/04/21/why-i-still-like-the-internet/" rel="noopener">Why I Still Like the Internet</a> Gordon on how blogs are quietly winning again</li>
<li><a href="https://www.gordonmclean.co.uk/2026/04/28/the-bloggers-manifesto/" rel="noopener">The Blogger’s Manifesto</a> Eight principles for blogging that go against the “build an audience” playbook. Staying small and honest is the point.</li>
<li><a href="https://stevedylan.dev/posts/how-to-hate-ai/" rel="noopener">How to Hate AI</a> There’s a lot of AI hate going around these days, and Steve’s take is where I think it should actually be aimed. AI is out of the bag. It’s happening. Rather than directing hate at people who are curious, learning, and already using the tools, we could focus that energy on learning, understanding, and educating on the best and safest ways to use them.</li>
</ul>
<p>Want more? Check out all my bookmarks at <a href="https://flamedfury.com/bookmarks/">/bookmarks/</a> and subscribe to the <a href="https://flamedfury.com/feeds/#bookmarks">bookmarks feed</a>.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Link Dump: May 2026">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/link-dump-may-2026/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Link Dump: March 2026</title>
      <link>https://flamedfury.com/posts/link-dump-march-2026/</link>
      <pubDate>Sun, 05 Apr 2026 13:38:01 GMT</pubDate>
      <guid>https://flamedfury.com/posts/link-dump-march-2026/</guid>
      <description><![CDATA[Good stuff I read from around the web this March.]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? Trying something different. All the pages I bookmarked this month, no life updates in between.</p>
<ul class="list">
<li><a href="https://shellsharks.com/scrolls/scroll/2026-02-27" rel="noopener">Scroll trīgintā ūnus</a> by Shellsharks - Sharing the latest edition of scrolls, posting online without overthinking.</li>
<li><a href="https://www.abhinavomprakash.com/posts/i-am-happier-writing-code-by-hand/" rel="noopener">I Am Happier Writing Code by Hand</a> by Abhinav Omprakash - Letting AI write his code kills the satisfaction that made programming worth doing.</li>
<li><a href="https://keith.is/post/you-are-the-driver" rel="noopener">You Are The Driver (The AI Is Just Typing)</a> by Keith - AI coding tools are only useful once you already know what you’re doing. They automate typing, not thinking.</li>
<li><a href="https://zacharykai.net/lists/oceania" rel="noopener">Oceania Web Atlas</a> by Zachary Kai - Collects personal websites from across Oceania<br />
into one tidy, human-scaled directory.</li>
<li><a href="https://brennan.day/building-the-good-web/" rel="noopener">Building the Good Web</a> by Brennan - Building for users instead of against them is what separates the good web from everything else.</li>
<li><a href="https://joelchrono.xyz/blog/unpolished-human-websites" rel="noopener">Unpolished human websites</a> by Joel - Keep your website messy and human.</li>
<li><a href="https://backyardtinker.bearblog.dev/what-is-digital-garage/" rel="noopener">What is Digital Garage</a> - Digital Tinker’s website is a workshop built for joy, not productivity. Creation without pressure.</li>
<li><a href="https://journal.jatan.space/start-a-blog-and-get-a-domain/" rel="noopener">How to feel at home on the Internet</a> by Jatan Mehta - Is having your own domain really the only way to truly “own” your online space?</li>
<li><a href="https://www.anildash.com/2026/03/27/endgame-open-web/" rel="noopener">Endgame for the Open Web</a> by Anil Dash - Is 2026 the last year we have a chance to put a stop on the dismantling of the open web?</li>
</ul>
<p>Want more? Check out all my bookmarks at <a href="https://flamedfury.com/bookmarks/">/bookmarks/</a> and subscribe to the <a href="https://flamedfury.com/feeds/#bookmarks">bookmarks feed</a>.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Link Dump: March 2026">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/link-dump-march-2026/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Moving My Bookmarks To Linkding</title>
      <link>https://flamedfury.com/posts/moving-my-bookmarks-to-linkding/</link>
      <pubDate>Tue, 24 Mar 2026 12:24:20 GMT</pubDate>
      <guid>https://flamedfury.com/posts/moving-my-bookmarks-to-linkding/</guid>
      <description><![CDATA[Improving my bookmarking workflow]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? My bookmarks workflow has been working pretty well for the past couple of years. The <a href="https://github.com/library-pals/" rel="noopener">Library Pals</a> <a href="https://github.com/library-pals/bookmark-action" rel="noopener">Bookmark Action</a> by <a href="https://katydecorah.com/" rel="noopener">Katy Decorah</a> was doing the heavy lifting and worked great 99% of the time. The biggest friction for me was getting the bookmark data into the Github action. Every time I wanted to save a link to the <a href="https://flamedfury.com/bookmarks">bookmarks page</a> I was triggering an iOS Shortcut, which kicked off a GitHub Action, which committed a JSON file to my metadata-library repo, which 11ty-awesome fetched at build time.</p>
<p>It worked, but the action sometimes failed depending on the state of the page I was trying to bookmark’s meta data. The action would fail if something was missing or not quite right. 11ty-awesome also failed to build whenever I submitted a link that I had previously bookmarked. It couldn’t handle duplicates gracefully.</p>
<p>So the team over at the <a href="https://32bit.cafe/" rel="noopener">32-bit Cafe</a> recently setup an instance of <a href="https://github.com/sissbruecker/linkding" rel="noopener">Linkding</a>, and by team I mean <a href="https://yequari.com/" rel="noopener">yequari</a> did the heavy lifting and I swooped in to test it out.</p>
<p>Linkding is a self-hosted bookmark manager. Clean and fast, with an API, say no more. The 32-Bit Cafe hosts and runs a shared instance that all members can access with their SSO account, so I didn’t even need to spin up my own server. I imported my existing 478 bookmarks and was up and running pretty quickly. The import was straightforward, imported from the JSON file in the metadata library repo using the API. All 478 bookmarks made it across including the original bookmarked date. I did screw up one part though — my personal notes were imported to the description field, rather than the original metadata description from the saved page.</p>
<p>One of the problems I had with the previous workflow was how I used <a href="https://www.11ty.dev/docs/plugins/fetch/" rel="noopener">eleventy-fetch</a> to get the bookmarks from the metadata library repo during every build. The same bookmarks, each build, and the file that the <a href="https://flamedfury.com/bookmarks/">bookmarks page</a> was built from was in the <code>.cache</code> folder. So, with building out the new workflow using Linkding, rather than hitting the API on every build, I wanted a permanent file in the project that gets updated incrementally. The idea being: only fetch what’s new since the last sync, append it to a local JSON store, and have the build just read from that file.</p>
<p>This small script <code>fetchBookmarks.js</code> does exactly this. It reads <code>src/_data/bookmarks-store.json</code>, finds the most recent bookmark date, hits the Linkding API, and only pulls down anything newer. New bookmarks get prepended to the store (newest first) and that’s it. Build time doesn’t touch the network at all.</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> run fetch-bookmarks</code></pre>
<p>There’s also a <code>--full</code> flag for when I go back and update notes or descriptions on older bookmarks:</p>
<pre class="language-bash"><code class="language-bash"><span class="token function">npm</span> run fetch-bookmarks -- <span class="token parameter variable">--full</span></code></pre>
<p>That re-fetches everything from Linkding and rebuilds the store from scratch. Useful after a batch editing session.</p>
<p>The script is also chained into <code>npm run build</code> so it runs automatically before every build so I don’t forget to pull in the latest bookmarks (now that I’ll be bookmarking more often, right?)</p>
<p>So, have I reduced the friction of saving a bookmark? Am I more likely to add a bookmark in an effort to keep open tabs to a minimum (lol, I doubt it). Saving a bookmark now is pretty straightforward. I hit the bookmarklet, Linkding pulls the page title, and description. I tag it using my bookmark tagging system, and add my personal notes. From there I run the build and it’s there. No iOS shortcut, no Github action, just quickly done in the browser and then the command line, where I spend most of my site building time anyway.</p>
<p>Laters 🤙</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Moving My Bookmarks To Linkding">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/moving-my-bookmarks-to-linkding/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
    
    <item>
      <title>Making fLaMEd fury Glow Everywhere With an Eleventy Transform</title>
      <link>https://flamedfury.com/posts/making-flamed-fury-glow-everywhere-with-an-eleventy-transform/</link>
      <pubDate>Fri, 27 Feb 2026 01:00:00 GMT</pubDate>
      <guid>https://flamedfury.com/posts/making-flamed-fury-glow-everywhere-with-an-eleventy-transform/</guid>
      <description><![CDATA[Giving fLaMEd fury a glowup with an elevnty transform.]]></description>
      <content:encoded><![CDATA[<p>What’s going on, Internet? I originally added a <code>.gradient-text</code> CSS class as a fun way to make my name (fLaMEd) and site name (fLaMEd fury) pop on the homepage. <a href="https://shellsharks.com/notes/2026/02/17/citations-css" rel="noopener">shellsharks</a> gave me a shoutout for it, which inspired me to take it further and apply the effect site-wide. Site wide was the original intent and the problem was it was only being applied manually in a handful of places, and I kept forgetting to add it whenever I wrote a new post or created a new page. Classic.</p>
<p>Instead of hunting through templates and markdown files, I’ve added an Eleventy HTML transform that automatically applies the glow up.</p>
<aside class="aside flow note">
    <p class="aside__content">I had Claude Code help me figure out the regex and the transform config. This allowed me to get this done before the kids came home. Don't @ me.</p>
  </aside>
<p>The effect itself is a simple utility class using <code>background-clip: text</code>:</p>
<pre class="language-css"><code class="language-css"><span class="token selector">.gradient-text</span> <span class="token punctuation">{</span>
  <span class="token property">color</span><span class="token punctuation">:</span> transparent<span class="token punctuation">;</span>
  <span class="token property">background-image</span><span class="token punctuation">:</span> <span class="token function">var</span><span class="token punctuation">(</span>--gradient-flames<span class="token punctuation">)</span><span class="token punctuation">;</span>
  <span class="token property">padding</span><span class="token punctuation">:</span> 0.6rem 0<span class="token punctuation">;</span>
  <span class="token property">background-size</span><span class="token punctuation">:</span> 50%<span class="token punctuation">;</span>
  <span class="token property">background-clip</span><span class="token punctuation">:</span> text<span class="token punctuation">;</span>
<span class="token punctuation">}</span></code></pre>
<p>Swap <code>--gradient-flames</code> for whatever gradient custom property you have defined. The <code>background-size: 50%</code> repeats the gradient across the text for a more dynamic flame effect.</p>
<p>The transform lives in its own plugin file and gets registered in <code>eleventy.config.js</code>. It runs after Eleventy has rendered each <code>.html</code> page, tokenises the HTML by splitting on tags, tracks a skip-tag stack, and only replaces text in text nodes.</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">export</span> <span class="token keyword">const</span> <span class="token function-variable function">glowUp</span> <span class="token operator">=</span> <span class="token parameter">eleventyConfig</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
  eleventyConfig<span class="token punctuation">.</span><span class="token function">addTransform</span><span class="token punctuation">(</span><span class="token string">'glow-up'</span><span class="token punctuation">,</span> <span class="token punctuation">(</span><span class="token parameter">content<span class="token punctuation">,</span> outputPath</span><span class="token punctuation">)</span> <span class="token operator">=></span> <span class="token punctuation">{</span>
    <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>outputPath<span class="token operator">?.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'.html'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token keyword">return</span> content<span class="token punctuation">;</span>

    <span class="token keyword">const</span> skipTags <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">Set</span><span class="token punctuation">(</span><span class="token punctuation">[</span><span class="token string">'a'</span><span class="token punctuation">,</span> <span class="token string">'code'</span><span class="token punctuation">,</span> <span class="token string">'h1'</span><span class="token punctuation">,</span> <span class="token string">'h2'</span><span class="token punctuation">,</span> <span class="token string">'h3'</span><span class="token punctuation">,</span> <span class="token string">'pre'</span><span class="token punctuation">,</span> <span class="token string">'script'</span><span class="token punctuation">,</span> <span class="token string">'style'</span><span class="token punctuation">,</span> <span class="token string">'textarea'</span><span class="token punctuation">,</span> <span class="token string">'title'</span><span class="token punctuation">]</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
    <span class="token keyword">const</span> skipStack <span class="token operator">=</span> <span class="token punctuation">[</span><span class="token punctuation">]</span><span class="token punctuation">;</span>
    <span class="token keyword">let</span> result <span class="token operator">=</span> <span class="token string">''</span><span class="token punctuation">;</span>

    <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">const</span> token <span class="token keyword">of</span> content<span class="token punctuation">.</span><span class="token function">split</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">(&lt;[^>]*>)</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
      <span class="token keyword">if</span> <span class="token punctuation">(</span>token<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token string">'&lt;'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
        <span class="token keyword">const</span> isClosing <span class="token operator">=</span> token<span class="token punctuation">.</span><span class="token function">startsWith</span><span class="token punctuation">(</span><span class="token string">'&lt;/'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">const</span> isSelfClosing <span class="token operator">=</span> token<span class="token punctuation">.</span><span class="token function">endsWith</span><span class="token punctuation">(</span><span class="token string">'/>'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
        <span class="token keyword">const</span> tagMatch <span class="token operator">=</span> token<span class="token punctuation">.</span><span class="token function">match</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">^&lt;\/?([a-zA-Z][a-zA-Z0-9-]*)</span><span class="token regex-delimiter">/</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>

        <span class="token keyword">if</span> <span class="token punctuation">(</span>tagMatch <span class="token operator">&amp;&amp;</span> <span class="token operator">!</span>isSelfClosing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
          <span class="token keyword">const</span> tag <span class="token operator">=</span> tagMatch<span class="token punctuation">[</span><span class="token number">1</span><span class="token punctuation">]</span><span class="token punctuation">.</span><span class="token function">toLowerCase</span><span class="token punctuation">(</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token keyword">if</span> <span class="token punctuation">(</span><span class="token operator">!</span>isClosing<span class="token punctuation">)</span> <span class="token punctuation">{</span>
            <span class="token keyword">if</span> <span class="token punctuation">(</span>skipTags<span class="token punctuation">.</span><span class="token function">has</span><span class="token punctuation">(</span>tag<span class="token punctuation">)</span><span class="token punctuation">)</span> skipStack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span>tag<span class="token punctuation">)</span><span class="token punctuation">;</span>
            <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>tag <span class="token operator">===</span> <span class="token string">'span'</span> <span class="token operator">&amp;&amp;</span> token<span class="token punctuation">.</span><span class="token function">includes</span><span class="token punctuation">(</span><span class="token string">'gradient-text'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> skipStack<span class="token punctuation">.</span><span class="token function">push</span><span class="token punctuation">(</span><span class="token string">'gradient-text-span'</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
          <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
            <span class="token keyword">for</span> <span class="token punctuation">(</span><span class="token keyword">let</span> i <span class="token operator">=</span> skipStack<span class="token punctuation">.</span>length <span class="token operator">-</span> <span class="token number">1</span><span class="token punctuation">;</span> i <span class="token operator">>=</span> <span class="token number">0</span><span class="token punctuation">;</span> i<span class="token operator">--</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
              <span class="token keyword">if</span> <span class="token punctuation">(</span>skipStack<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">===</span> tag <span class="token operator">||</span> <span class="token punctuation">(</span>tag <span class="token operator">===</span> <span class="token string">'span'</span> <span class="token operator">&amp;&amp;</span> skipStack<span class="token punctuation">[</span>i<span class="token punctuation">]</span> <span class="token operator">===</span> <span class="token string">'gradient-text-span'</span><span class="token punctuation">)</span><span class="token punctuation">)</span> <span class="token punctuation">{</span>
                skipStack<span class="token punctuation">.</span><span class="token function">splice</span><span class="token punctuation">(</span>i<span class="token punctuation">,</span> <span class="token number">1</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
                <span class="token keyword">break</span><span class="token punctuation">;</span>
              <span class="token punctuation">}</span>
            <span class="token punctuation">}</span>
          <span class="token punctuation">}</span>
        <span class="token punctuation">}</span>
        result <span class="token operator">+=</span> token<span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token keyword">if</span> <span class="token punctuation">(</span>skipStack<span class="token punctuation">.</span>length <span class="token operator">===</span> <span class="token number">0</span> <span class="token operator">&amp;&amp;</span> token<span class="token punctuation">)</span> <span class="token punctuation">{</span>
        result <span class="token operator">+=</span> token<span class="token punctuation">.</span><span class="token function">replace</span><span class="token punctuation">(</span><span class="token regex"><span class="token regex-delimiter">/</span><span class="token regex-source language-regex">flamed( ?fury)?</span><span class="token regex-delimiter">/</span><span class="token regex-flags">gi</span></span><span class="token punctuation">,</span> <span class="token parameter">match</span> <span class="token operator">=></span> <span class="token template-string"><span class="token template-punctuation string">`</span><span class="token string">&lt;span class="gradient-text"></span><span class="token interpolation"><span class="token interpolation-punctuation punctuation">${</span>match<span class="token interpolation-punctuation punctuation">}</span></span><span class="token string">&lt;/span></span><span class="token template-punctuation string">`</span></span><span class="token punctuation">)</span><span class="token punctuation">;</span>
      <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span>
        result <span class="token operator">+=</span> token<span class="token punctuation">;</span>
      <span class="token punctuation">}</span>
    <span class="token punctuation">}</span>
    <span class="token keyword">return</span> result<span class="token punctuation">;</span>
  <span class="token punctuation">}</span><span class="token punctuation">)</span><span class="token punctuation">;</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre>
<p>Tags in the <code>skipTags</code> set, along with any span already carrying the <code>gradient-text</code> class, push onto the stack. No replacement happens while the stack is non-empty, so link text, code examples, the page <code>&lt;title&gt;</code>, and already-wrapped instances are all left alone. HTML attributes like <code>alt</code> and <code>href</code> are never touched because they sit inside tag tokens, not text nodes.</p>
<p>A single regex <code>/flamed( ?fury)?/gi</code> handles everything in one pass. The optional group matches &quot; fury&quot; (with space) or “fury” (without), so “flamed fury” and “flamedfury” (as it appears in the domain name) are both wrapped as a unit. The <code>i</code> flag covers every capitalisation variant (“fLaMEd fury”, “Flamed Fury”, “FLAMED FURY”) with the original casing preserved in the output. This helps because I can be inconsistent with the styling at times.</p>
<p>Export the plugin from wherever you manage your Eleventy plugins:</p>
<pre class="language-js"><code class="language-js"><span class="token keyword">import</span> <span class="token punctuation">{</span> glowUp <span class="token punctuation">}</span> <span class="token keyword">from</span> <span class="token string">'./plugins/glow-up.js'</span><span class="token punctuation">;</span>

<span class="token keyword">export</span> <span class="token keyword">default</span> <span class="token punctuation">{</span>
  <span class="token comment">// ...other plugins</span>
  glowUp<span class="token punctuation">,</span>
<span class="token punctuation">}</span><span class="token punctuation">;</span></code></pre>
<p>Then register it in <code>eleventy.config.js</code>. Register it before any HTML prettify transform so the spans are in place before reformatting runs:</p>
<pre class="language-js"><code class="language-js">eleventyConfig<span class="token punctuation">.</span><span class="token function">addPlugin</span><span class="token punctuation">(</span>plugins<span class="token punctuation">.</span>glowUp<span class="token punctuation">)</span><span class="token punctuation">;</span>
eleventyConfig<span class="token punctuation">.</span><span class="token function">addPlugin</span><span class="token punctuation">(</span>plugins<span class="token punctuation">.</span>htmlConfig<span class="token punctuation">)</span><span class="token punctuation">;</span> <span class="token comment">// html prettify</span></code></pre>
<p>That’s it. Any mention of the site name (fLaMEd fury) in body text gets the gradient automatically, in posts, templates, data-driven content, wherever.</p>
<p>Look out for the easter egg I’ve dropped in. Later.</p>

        <p>Hey, thanks for reading this in your feed reader! Want to chat? <a href="mailto:hello@flamedfury.com?subject=RE: Making fLaMEd fury Glow Everywhere With an Eleventy Transform">Reply by email</a> or add me on <a href="xmpp:flamed@omg.lol">XMPP</a>, or send a <a href="https://flamedfury.com/posts/making-flamed-fury-glow-everywhere-with-an-eleventy-transform/#webmention">webmention</a>. More in <a href="https://flamedfury.com/categories/web/">Web</a> on the website.</p>
      ]]></content:encoded>
    </item>
    
  </channel>
</rss>
