Shellsharks Blogroll - BlogFlock 2026-06-19T13:58:15.090Z BlogFlock Adepts of 0xCC, destructured, fLaMEd, Aaron Parecki, Trail of Bits Blog, Westenberg, gynvael.coldwind//vx.log (pl), James' Coffee Blog, joelchrono, Evan Boehs, Kev Quirk, cool-as-heck, Posts feed, Sophie Koonin, cmdr-nova@internet:~$, <span>Songs</span> on the Security of Networks, Johnny.Decimal, Werd I/O, Robb Knight, Molly White, Hey, it's Jason!, Terence Eden’s Blog 📝 2026-06-19 12:25: Little chicks are starting to venture out from under mum. 🐥 - Kev Quirk https://kevquirk.com/2026-06-19-1225 2026-06-19T11:25:00.000Z <p>Little chicks are starting to venture out from under mum. 🐥</p> <p><img src="https://kevquirk.com/content/images/2026-06-19-1225/1000009784.webp" alt="1000009784" /></p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-19%2012%3A25">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-19-1225#comments">leave a comment</a>.</p> </div> Proud Dad Moment - Kev Quirk https://kevquirk.com/proud-dad-moment 2026-06-19T11:11:00.000Z <p>Yesterday was sports day at my kids' school, and usually it consists of us standing in a field, being baked by the sun, waiting for our kids to come on and do their couple races each. All in all, I'm only ever interested in a couple minutes of the 2.5 hours we stand there.</p> <p>Usually my oldest doesn't try that hard as he struggles with resilience. So if he's not clearly winning, he won't push, he'll give up. And our younger son was always a little <em>too</em> young and therefore uncoordinated, and usually at the back.</p> <p>This year was different.</p> <p>Our youngest tried really hard and was <em>rapid</em>! He ended up winning 2 of his races and coming second in another. Great result. But the stand out was our oldest son.</p> <p>At the end of the day, they give out all the awards and our son won the prized <em>sportsperson of the year</em> award. Not the <em>day</em>…the <strong>year</strong>. The headteacher talked in great depth about how he is always helpful to the younger kids, how he's always a good sportsman, even if he loses, and how he's happy to share his knowledge to help others be better.</p> <p>This would make most parents proud, right? But for us, even more so. Our kids are adopted, and thanks to a significant amount of early neglect, our oldest has always found it <em>impossible</em> to share and help others. He <em>always</em> put himself first.</p> <p>That's not because he's selfish. He's actually a very kind, loving boy. It's because in those early years he had to <em>survive</em> and in order for him to survive it was literally him versus his siblings. What a horrendous situation to be in.</p> <p>Anyway, to hear that he's not only been a good sport throughout the year, but also that he's sharing and working with his teammates filled his mum and I with joy and made us so proud.</p> <p>My wife shed a little tear - she thinks I didn't notice, but I did. Me being the clown that I am, I shouted <em>"WELL DONE SAUSAGE!"</em> at the top of my voice so the whole school could hear. Everyone knows I call them <em>the sausages</em> so this made sure every single person on that playground saw him have his moment.</p> <p>What a legend. ❤️</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=Proud%20Dad%20Moment">reply to this post by email</a>, or <a href="https://kevquirk.com/proud-dad-moment#comments">leave a comment</a>.</p> </div> Notable links: June 19, 2026 - Werd I/O 6a34bfa563734f00018bd901 2026-06-19T09:00:31.000Z <img src="https://images.unsplash.com/photo-1534078362425-387ae9668c17?crop=entropy&amp;cs=tinysrgb&amp;fit=max&amp;fm=jpg&amp;ixid=M3wxMTc3M3wwfDF8c2VhcmNofDV8fHNwZWVkfGVufDB8fHx8MTc4MTg0MjE0OHww&amp;ixlib=rb-4.1.0&amp;q=80&amp;w=2000" alt="Notable links: June 19, 2026"><p><em>Most Fridays, I share a handful of pieces that caught my eye at the intersection of technology, media, and society.</em></p><p><em>Did I miss something important? </em><a href="mailto:ben@werd.io" rel="noreferrer"><em>Send me an email</em></a><em> to let me know.</em></p><hr><h3 id="change-agent"><a href="https://restructurednews.substack.com/p/change-agent?ref=werd.io" rel="noreferrer">Change Agent</a></h3><p><a href="https://restructurednews.substack.com/?ref=werd.io">Gina Chua</a> is one of the people in news who is doing the most to push the conversation forward and prepare the industry for the future. This piece of hers outlines what I think is a necessary skill for survival.</p><p>We&#x2019;re in the fastest period of technology change &#x2014; and, consequently, the fastest period of journalistic change &#x2014; in decades. Building takes time; if we aim to build for today, we&#x2019;ll always be behind. So we need to consider what the future looks like.</p><p>That doesn&#x2019;t necessarily mean having one singular vision for the future, although it may be that one stands out as the most likely or compelling. It may be wise to juggle multiple <em>possible</em> futures, each with their own probabilities, prerequisites, and outcomes. If we deeply research them based on the work of experts in their fields, and then articulate them well, we can share them, and use them organizationally to prepare for what might become true.</p><p>Will our information ecosystem radically change in the face of agentic systems? Will people look to community as AI intermediates everything else? Will the open internet fragment in the hands of authoritarianism? None of those things are necessarily the future, but it&#x2019;s worth considering what all of them might mean.</p><p>What we can&#x2019;t do is assume that the world will stay the same. I would like to burn Gina&#x2019;s words into the walls of every newsroom and every mission-driven organization in the world:</p><blockquote>&#x201C;You can hear that thinking if you roam the halls of any journalism conference. Get the platforms to pay for content. Do more original journalism. Build deeper relationships with audiences. Drive more direct traffic. But those aren&#x2019;t theories of change; they are theories that the world won&#x2019;t change that much, and that the strategies of the past will serve us well in the future, if only we execute them better, faster, and cheaper.&#x201D;</blockquote><p>Each possible future is a kind of speculative fiction. It takes creativity &#x2014; and bravery &#x2014; to break out of existing frames and qualitatively consider what might be. These explorations must be informed by how things have played out already, where we are today, and what we know is coming down the pipeline, but they also must be generative and open. In doing so, we uncover ideas that can help us not just navigate what the future might be, but get in front of it and help to shape it &#x2014; according to our own values and needs.</p><p>The world won&#x2019;t stay the same. Journalism <em>isn&#x2019;t</em> staying the same. In addition to the rapid change in the platforms we depend on, trust is declining; engagement is declining; for many newsrooms, revenue is declining. A bet on the present is not a winning one. So we need to reach further.</p><hr><h3 id="overview-and-key-findings-of-the-2026-digital-news-report"><a href="https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2026/dnr-executive-summary?ref=werd.io" rel="noreferrer">Overview and key findings of the 2026 Digital News Report</a></h3><p>This year&#x2019;s Reuters Digital News Report has a key finding that&#x2019;s worth paying attention to:</p><blockquote>&#x201C;Though it has been the case in some individual countries for several years, at the global level (averaging across 48 markets) social media and video networks are for the first time the single most widely used way of accessing online news (used by 54% of all respondents), ahead of news organisations&#x2019; own websites and apps (51%). This shifting composition of news consumption is happening among all age groups.&#x201D;</blockquote><p>For the first time, social media is the primary platform for news globally.</p><p>News is how we learn about the world and make informed democratic decisions. That means that, more than ever before, we need to care about who owns these networks, who dictates how they function, and which narratives they promote.</p><p>X, of course, was purchased by Elon Musk specifically because he wanted to suppress what he called the &#x201C;woke mind virus&#x201D;. It&#x2019;s a propaganda play, which anyone can see if they load a feed on the platform: shocking white supremacist rhetoric is central.</p><p>But every proprietary social platform is subject to some version of this. We don&#x2019;t have the access to view (or even the ability to truly research) how companies like Meta choose to promote and suppress information. We are subject to their business decisions, including the backroom political decisions they make in order to ensure their own survival.</p><p>In contrast, open social web platforms like Mastodon and Bluesky are open and verifiable. They run on open protocols that cannot be controlled by a single entity. Their algorithms are either non-existent (in the case of Mastodon) or fully under our control (in the case of Bluesky). Rather than gatekeeping the information we need to be democratic citizens, they give us full control over our information ecosystems.</p><p>They&#x2019;re also full of people who have already self-selected to inhabit more ethical spaces. These turn out to be people who are more likely to both engage with and financially support news. So not only does having an open social web strategy mean you&#x2019;re engaging in platforms that don&#x2019;t seek to intermediate democracy, they actually provide better return on investment than more traditional platforms. We need these platforms to exist if we want to have a healthy information landscape; it turns out that engaging in them yields real benefits <em>right now</em>.</p><p>News has a choice here: it can shrug its shoulders as an industry and say that it should just meet people wherever they&#x2019;re at, even if that&#x2019;s on X. Or newsrooms can choose to promote and prioritize their accounts in spaces that are actually aligned with their values, needs, and business models. I strongly think they should do the latter.</p><hr><h3 id="ceos-who-think-ai-replaces-their-employees-are-just-bad-ceos"><a href="https://www.techdirt.com/2026/06/09/ceos-who-think-ai-replaces-their-employees-are-just-bad-ceos/?ref=werd.io" rel="noreferrer">CEOs Who Think AI Replaces Their Employees Are Just Bad CEOs </a></h3><p>I second this sentiment:</p><blockquote>&#x201C;It seems pretty clear to me that companies that think they&#x2019;ll be able to layoff huge swaths of workers because of LLM tools are going to find out they&#x2019;re mistaken pretty quickly. The power of LLMs is that when used well and used willingly it can help employees to get more done, but that doesn&#x2019;t mean you need fewer humans. You need more humans who know how to work productively.&#x201D;</blockquote><p>I&#x2019;ve seen some pretty dumb stuff out in the wild: leaders who have expected their engineers to dramatically increase their output to inhuman levels, company-wide token leaderboards, product managers who believe they can replace real user research with synthetic personas, and, of course, high-level leaders who think they can replace their human workers with AI agents. (None of this, I should say, has been at my job, where our work is primarily done by humans and AI, when it is used at all, is an assistive tool.)</p><p>I think Mike Masnick&#x2019;s prescription is accurate: many CEOs are so distant from the actual productive work of a company that they miss the complicated nuance of what goes into it. So if they can produce something with Claude Code that feels analogous to it, a bad CEO might start wondering why they&#x2019;re hiring all these people.</p><p>A good CEO will understand that they&#x2019;re missing a ton of expertise that goes into building something well, doing work with skill, or even just exercising humane human judgment. The others will find out the hard way that they&#x2019;re wrong to underestimate their employees.</p><hr><h3 id="a-scottish-post-the-new-election-threat-disinformation-inside-the-answer"><a href="https://willrobinson.substack.com/p/a-scottish-post-the-new-election?ref=werd.io" rel="noreferrer">A Scottish Post: The New Election Threat: Disinformation Inside the Answer</a></h3><p>The dangers of AI-generated answers in search results are enumerated here in the context of the recent Scottish election. 75 questions about the ballot were posed on AI systems, and the findings were sobering. On average, 44.4% of responses were at least partially wrong; ChatGPT was specifically wrong 46.2% of the time. Improbably, Grok actually performed the best in this test, with only 8.97% of responses containing factual inaccuracies.</p><p>These findings held true in other UK elections:</p><blockquote>&#x201C;Days before the Senedd election in Wales, also held on May 7, BBC Wales tested six major chatbots, ChatGPT, Copilot, Gemini, Claude, Meta AI, and Grok, against fictional voter profiles. The results echoed Scotland&#x2019;s almost exactly.&#x201D;</blockquote><p>Some of this is likely just an outcome of how these systems work: hallucinations are par for the course. Nobody knows how to build a completely accurate LLM. But it&#x2019;s also relatively easy to seed bad information as training data, which can be used to whitewash disinformation: you establish the intentional falsehoods, the LLM poisons its training corpus by ingesting your information, and it then presents your falsehoods as fact.</p><p>Researchers at NYU discovered that <a href="https://futurism.com/training-data-ai-misinformation-compromised?ref=werd.io">if 0.001 percent of the training data of a given LLM is &#x201C;poisoned,&#x201D; or deliberately planted with misinformation, the entire training set becomes likely to propagate errors</a>. You can do that just by hosting harmful information online: in blogs, on Reddit, in otherwise-trustworthy sites. Once the falsehoods have been internalized by the LLM, the end user will never know.</p><p>As the linked article points out, between 7 and 13% of voters in these elections used a chatbot to figure out who to vote for. We&#x2019;re at the foothills of AI use; these numbers will continue to rise. And with them, a real risk to maintaining an informed democratic voting population.</p><hr><h3 id="w-social-public-institutions-and-the-theater-of-european-digital-sovereignty"><a href="https://blog.elenarossini.com/w-social-public-institutions-and-the-theater-of-european-digital-sovereignty/?ref=werd.io" rel="noreferrer">W Social, Public Institutions and the Theater of European Digital Sovereignty</a></h3><p><a href="https://blog.elenarossini.com/?ref=werd.io" rel="noreferrer">Elena Rossini</a> (rightly) calls shenanigans on what&#x2019;s been happening in the European social world. I think what happened should be instructive for any pro-social technology movement.</p><p>Here&#x2019;s what happened:</p><p>Earlier this month, the European Commission <a href="https://commission.europa.eu/news-and-media/news/strengthening-europes-tech-sovereignty-2026-06-03_en?ref=werd.io">announced a technology sovereignty plan</a> that included a reliance on open source software as a path to autonomy.</p><p><a href="https://eurosky.tech/?ref=werd.io">Eurosky</a>, a non-profit fork of Bluesky that is both fully open source and stores all its data in the EU, subsequently launched <a href="https://mu.social/?ref=werd.io">Mu</a>, a social media application running on AT Protocol that is fully EU-based and is arguably more fully-featured than Bluesky itself.</p><p>But the European Commission, including its President and its Central Bank&#x2019;s President, went another way by migrating to <a href="https://blog.elenarossini.com/the-untold-story-about-w-social-unconventional-beginnings-strategic-pitches-conflicting-signals/?ref=werd.io">W Social</a>, a proprietary AT Protocol. Whereas Eurosky is a non-profit that has worked extensively in the open with open social web and democratic communities, W Social is a for-profit startup that has been opaque about its intentions and, <a href="https://blog.elenarossini.com/w-social-public-institutions-and-the-theater-of-european-digital-sovereignty/?ref=werd.io">as Elena now reports</a>, has now pulled its code from being available on an open source basis. These EC profiles now live on a platform that contradicts the EC&#x2019;s own sovereignty plan.</p><p>Worse, the founders have a <a href="https://blog.elenarossini.com/the-untold-story-about-w-social-unconventional-beginnings-strategic-pitches-conflicting-signals/?ref=werd.io">track record of using causes like climate change for their own profit</a>, notably using Greta Thunberg to raise money for a venture capital firm without her knowledge or consent.</p><p>So I strongly agree with Elena&#x2019;s implication that the Commission made a poor decision here. But it happened because its founders are heavily connected: it launched at the World Economic Forum in Davos, and its advisors include politicians from across Europe.</p><p>Ten years ago I joined a top 100 website after working in open source social for a decade. Based on my na&#xEF;ve experience in open circles, I&#x2019;d assumed it competed on having a great product. In fact, it hired well-connected partnerships people, already known to influential decision-makers, who worked tirelessly behind the scenes. That team included the relatives of Presidential hopefuls and people who had built wildly successful careers as media executives. Having a good product was table stakes at best; being successful meant negotiating politics, making quid-pro-quo deals, and convincing people to join by any means necessary.</p><p>W Social is the insider&#x2019;s tool: a platform created people who know how to work the system for their own benefit. That ultimately means it&#x2019;s more likely to betray its users. It seems likely to me that when the discourse moves away from sovereignty to something else, the founders will also shift. But it&#x2019;s not a surprise to me that European politicians are more likely to work with a platform that partners with and pays people they already know.</p><p>The nice thing about open platforms is that there doesn&#x2019;t need to be one winner. The European Commission has made a bad decision, but Eurosky can still find everyone else. By building better tools for the writers, the artists, the culture-makers, and onboarding people through careful outreach one community at a time, it can serve as the basis for a new social commons. I hope it succeeds.</p> Rainbow - James' Coffee Blog https://jamesg.blog/2026/06/19/rainbows 2026-06-19T00:00:00.000Z <p>“Cheers.” I like to say a toast to the day: to myself and others: peace, hope, happiness, health. After I raised my glass of orange juice, I looked up and saw a rainbow. I don’t think I have ever seen a rainbow from this view before: a rainbow that stands out among the grey clouds, originating from a valley in which many stories have been told.</p><p>As I watch the rainbow and notice the clouds movie, a tiny grey cloud floats past, insignificant relative to the rainbow: rain created the conditions for the rainbow, but the colour cannot be dulled by a lone grey cloud. I keep looking at the colours, which seem to intensify in some places. I notice the blue sky above. Will more of the sky be blue soon? The colour and light brought a smile to my face.</p><p>I see the faintest hint of a second rainbow, a tiny haze of colour, but enough for me to see. In the background, the birds sing the melody of the morning. Cars occasionally pass: people are starting their days. The world is waking up. I am, too. The warm breeze from the window eases me into the summer day.</p><p>After several minutes, the rainbow started to fade, slowly. I wanted to hold onto the colour as much as I could, so I kept watching until I could see no more colour. Soon, the rainbow was gone. But when I stood up and went to look out the window moments later, the rainbow was back again, not quite as intense as the first rainbow but all the colours of the spectrum – the reds and yellows and violets – are still discernible.</p><p>Intense and contrasting with the dark green of the trees that surround me, the rainbow brought a little bit of joy into the morning. I wonder how many other people smiled this morning too – or are smiling now – as they too notice the rainbow.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0e10cb24b326b64',t:'MTc4MTg1NjU0NQ=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> The European Commission falls for openness theater by working with W Social - Werd I/O 6a341d6963734f00018bd8e8 2026-06-18T16:31:37.000Z <p>Link: <a href="https://blog.elenarossini.com/w-social-public-institutions-and-the-theater-of-european-digital-sovereignty/?ref=werd.io"><em>W Social, Public Institutions and the Theater of European Digital Sovereignty, by Elena Rossini</em></a></p><p>Elena Rossini (rightly) calls shenanigans on what&#x2019;s been happening in the European social world. I think what happened should be instructive for any pro-social technology movement.</p><p>Here&#x2019;s what happened:</p><p>Earlier this month, the European Commission <a href="https://commission.europa.eu/news-and-media/news/strengthening-europes-tech-sovereignty-2026-06-03_en?ref=werd.io">announced a technology sovereignty plan</a> that included a reliance on open source software as a path to autonomy.</p><p><a href="https://eurosky.tech/?ref=werd.io">Eurosky</a>, a non-profit fork of Bluesky that is both fully open source and stores all its data in the EU, subsequently launched <a href="https://mu.social/?ref=werd.io">Mu</a>, a social media application running on AT Protocol that is fully EU-based and is arguably more fully-featured than Bluesky itself.</p><p>But the European Commission, including its President and its Central Bank&#x2019;s President, went another way by migrating to <a href="https://blog.elenarossini.com/the-untold-story-about-w-social-unconventional-beginnings-strategic-pitches-conflicting-signals/?ref=werd.io">W Social</a>, a proprietary AT Protocol. Whereas Eurosky is a non-profit that has worked extensively in the open with open social web and democratic communities, W Social is a for-profit startup that has been opaque about its intentions and, <a href="https://blog.elenarossini.com/w-social-public-institutions-and-the-theater-of-european-digital-sovereignty/?ref=werd.io">as Elena now reports</a>, has now pulled its code from being available on an open source basis. These EC profiles now live on a platform that contradicts the EC&#x2019;s own sovereignty plan.</p><p>Worse, the founders have a <a href="https://blog.elenarossini.com/the-untold-story-about-w-social-unconventional-beginnings-strategic-pitches-conflicting-signals/?ref=werd.io">track record of using causes like climate change for their own profit</a>, notably using Greta Thunberg to raise money for a venture capital firm without her knowledge or consent.</p><p>So I strongly agree with Elena&#x2019;s implication that the Commission made a poor decision here. But it happened because its founders are heavily connected: it launched at the World Economic Forum in Davos, and its advisors include politicians from across Europe.</p><p>Ten years ago I joined a top 100 website after working in open source social for a decade. Based on my na&#xEF;ve experience in open circles, I&#x2019;d assumed it competed on having a great product. In fact, it hired well-connected partnerships people, already known to influential decision-makers, who worked tirelessly behind the scenes. That team included the relatives of Presidential hopefuls and people who had built wildly successful careers as media executives. Having a good product was table stakes at best; being successful meant negotiating politics, making quid-pro-quo deals, and convincing people to join by any means necessary.</p><p>W Social is the insider&#x2019;s tool: a platform created people who know how to work the system for their own benefit. That ultimately means it&#x2019;s more likely to betray its users. It seems likely to me that when the discourse moves away from sovereignty to something else, the founders will also shift. But it&#x2019;s not a surprise to me that European politicians are more likely to work with a platform that partners with and pays people they already know.</p><p>The nice thing about open platforms is that there doesn&#x2019;t need to be one winner. The European Commission has made a bad decision, but Eurosky can still find everyone else. By building better tools for the writers, the artists, the culture-makers, and onboarding people through careful outreach one community at a time, it can serve as the basis for a new social commons that is free from US influence. I hope it succeeds.</p> More people get their news from social media than anywhere else - globally. The platforms we use matter. - Werd I/O 6a33fd0363734f00018bd8e2 2026-06-18T14:13:23.000Z <p>Link: <a href="https://reutersinstitute.politics.ox.ac.uk/digital-news-report/2026/dnr-executive-summary?ref=werd.io"><em>Overview and key findings of the 2026 Digital News Report, by Jim Egan at the Reuters Institute for the Study of Journalism</em></a></p><p>This year&#x2019;s Reuters Digital News Report has a key finding that&#x2019;s worth paying attention to:</p><blockquote>&#x201C;Though it has been the case in some individual countries for several years, at the global level (averaging across 48 markets) social media and video networks are for the first time the single most widely used way of accessing online news (used by 54% of all respondents), ahead of news organisations&#x2019; own websites and apps (51%). This shifting composition of news consumption is happening among all age groups.&#x201D;</blockquote><p>For the first time, social media is the primary platform for news globally.</p><p>News is how we learn about the world and make informed democratic decisions. That means that, more than ever before, we need to care about who owns these networks, who dictates how they function, and which narratives they promote.</p><p>X, of course, was purchased by Elon Musk specifically because he wanted to suppress what he called the &#x201C;woke mind virus&#x201D;. It&#x2019;s a propaganda play, which anyone can see if they load a feed on the platform: shocking white supremacist rhetoric is central.</p><p>But every proprietary social platform is subject to some version of this. We don&#x2019;t have the access to view (or even the ability to truly research) how companies like Meta choose to promote and suppress information. We are subject to their business decisions, including the backroom political decisions they make in order to ensure their own survival.</p><p>In contrast, open social web platforms like Mastodon and Bluesky are open and verifiable. They run on open protocols that cannot be controlled by a single entity. Their algorithms are either non-existent (in the case of Mastodon) or fully under our control (in the case of Bluesky). Rather than gatekeeping the information we need to be democratic citizens, they give us full control over our information ecosystems.</p><p>They&#x2019;re also full of people who have already self-selected to inhabit more ethical spaces. These turn out to be people who are more likely to both engage with and financially support news. So not only does having an open social web strategy mean you&#x2019;re engaging in platforms that don&#x2019;t seek to intermediate democracy, they actually provide better return on investment than more traditional platforms. We need these platforms to exist if we want to have a healthy information landscape; it turns out that engaging in them yields real benefits <em>right now</em>.</p><p>News has a choice here: it can shrug its shoulders as an industry and say that it should just meet people wherever they&#x2019;re at, even if that&#x2019;s on X. Or newsrooms can choose to promote and prioritize their accounts in spaces that are actually aligned with their values, needs, and business models. I strongly think they should do the latter.</p> By the pricking of my corpus, something wicked answers for us - Werd I/O 6a33f20663734f00018bd8d6 2026-06-18T13:26:30.000Z <p>Link: <a href="https://willrobinson.substack.com/p/a-scottish-post-the-new-election?ref=werd.io"><em>A Scottish Post: The New Election Threat: Disinformation Inside the Answer, by Tim Chambers in Will Robinson&apos;s Newsletter</em></a></p><p>The dangers of AI-generated answers in search results are enumerated here in the context of the recent Scottish election. 75 questions about the ballot were posed on AI systems, and the findings were sobering. On average, 44.4% of responses were at least partially wrong; ChatGPT was specifically wrong 46.2% of the time. Improbably, Grok actually performed the best in this test, with only 8.97% of responses containing factual inaccuracies.</p><p>These findings held true in other UK elections:</p><blockquote>&#x201C;Days before the Senedd election in Wales, also held on May 7, BBC Wales tested six major chatbots, ChatGPT, Copilot, Gemini, Claude, Meta AI, and Grok, against fictional voter profiles. The results echoed Scotland&#x2019;s almost exactly.&#x201D;</blockquote><p>Some of this is likely just an outcome of how these systems work: hallucinations are par for the course. Nobody knows how to build a completely accurate LLM. But it&#x2019;s also relatively easy to seed bad information as training data, which can be used to whitewash disinformation: you establish the intentional falsehoods, the LLM poisons its training corpus by ingesting your information, and it then presents your falsehoods as fact.</p><p>Researchers at NYU discovered that <a href="https://futurism.com/training-data-ai-misinformation-compromised?ref=werd.io">if 0.001 percent of the training data of a given LLM is &#x201C;poisoned,&#x201D; or deliberately planted with misinformation, the entire training set becomes likely to propagate errors</a>. You can do that just by hosting harmful information online: in blogs, on Reddit, in otherwise-trustworthy sites. Once the falsehoods have been internalized by the LLM, the end user will never know.</p><p>As the linked article points out, between 7 and 13% of voters in these elections used a chatbot to figure out who to vote for. We&#x2019;re at the foothills of AI use; these numbers will continue to rise. And with them, a real risk to maintaining an informed democratic voting population.</p> Book Review: The Great When by Alan Moore ★★★★☆ - Terence Eden’s Blog https://shkspr.mobi/blog/?p=72033 2026-06-18T11:34:19.000Z <img src="https://shkspr.mobi/blog/wp-content/uploads/2026/05/great-when.webp" alt="Book cover featuring Tower Bridge." width="270" class="alignleft size-full wp-image-72034"> <p>This is the most overwritten book I've ever read. Unfortunately, Alan Moore knows exactly how much polysyllabic pressure it takes to transmogrify base coal into precious gems.</p> <p>With lines like "his shaved suede skull made him look like a wilted thistle" and "There was a rumour of pink lipstick circling her mouth" you know you're in for a treat. Even better than the joyful prose of <a href="https://shkspr.mobi/blog/2025/12/book-review-the-satsuma-complex-by-bob-mortimer/">Bob Mortimer's Satsuma Complex</a>.</p> <p>I'm also pretty sure Moore is <em>actually</em> a wizard. I've just finished reading a book about <a href="https://shkspr.mobi/blog/2026/03/book-review-under-fire-black-britain-in-wartime-by-stephen-bourne/">Black Britain in Wartime</a> - which features Ras Prince Monolulu, who also appears in this book. Along with M. P. Shiel - who I did my GCSE coursework on. And, no spoilers, but I'm fairly sure I'd met other characters too. The only logical conclusion is that Moore is stalking my brain.</p> <p>It is an epic tale full of rogues and reprobates. The story is excellent even though the plot follows a fairly basic structure. Although set up to be a series, it is a satisfying stand-alone tale.</p> <p>My only real criticism of it is the trope of the "failing light of English magic" - much like Jonathan Strange &amp; Mr Norrell, <a href="https://shkspr.mobi/blog/2021/03/book-review-shades-of-milk-and-honey-glamourist-histories-series-book-1-mary-robinette-kowal/">Shades of Milk and Honey</a>, <a href="https://shkspr.mobi/blog/2020/02/book-review-sorcerer-to-the-crown/">Sorcerer to the Crown</a>, <a href="https://shkspr.mobi/blog/2024/01/book-review-babel-r-f-kuang/">Babel</a>, and a hundred other books. Britain was a great (magical) power and it's up to our hero to Make Magic Great Again. Well, sort of. I suspect that's going to feature more heavily in the sequels.</p> <p>A pleasure to read and I look forward to both Alan and I being bitterly disappointed in the Bowdlerised Apple TV miniseries.</p> <img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=72033&HTTP_REFERER=Atom" alt width="1" height="1" loading="eager"> A realisation on the nature of information storage - Johnny.Decimal https://johnnydecimal.com/blog/0223-a-realisation-on-the-nature-of-information-storage/ 2026-06-18T03:34:24.000Z <p>In opening up the ID for the topic of this afternoon&#39;s <a href="https://johnnydecimal.com/support/knowledge-base/sbs-events-calendar/">Small Business Zoom session</a> – <code>33.22 Annual SBS TGIF cycle</code> – I had one of those tiny niggles of annoyance that comes from not being able to <em>instantly</em> recall the location of a thing.<sup><a href="#user-content-fn-impatient" id="user-content-fnref-impatient" data-footnote-ref="" aria-describedby="footnote-label" class="footnote">1</a></sup></p> <p>Moments later the ID was found, and with it a deep realisation about the nature of systems like Johnny.Decimal: that, at the very least, they force you to store your information <em>somewhere</em>.</p> <p>This is best demonstrated with the counter-point: storing your information <em>nowhere</em>. By which I mean, on your Desktop. Or just in a floating text document that you never dare close. Or in a chat window, or in one of 40 SharePoint folders whose locations you can never recall.</p> <p>Forcing you to choose an <em>actual place</em> – an ID, that you had to create – <em>is</em> a touch annoying. It&#39;s extra work: I&#39;ve never pretended that it was &#39;free&#39; from a mental perspective.</p> <p>But, when trying to find this thing just now, there was a baseline sense of comfort: <em>the thing is somewhere</em>.</p> <div data-footnotes="" class="footnotes"><h2 class="sr-only" id="footnote-label">Footnotes</h2> <ol> <li id="user-content-fn-impatient"> <p>I&#39;m very impatient. <a href="#user-content-fnref-impatient" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref footnoteBackLink">↩</a></p> </li> </ol> </div> Hades - Joel's Log Files https://joelchrono.xyz/blog/hades 2026-06-18T02:38:37.000Z <p>Back when I purchased my Nintendo Switch in 2023, there were only a few titles I cared about trying on it. Among the first games I purchased at the time was <em>Hades</em>, released in 2020, developed by Supergiant Games.</p> <p><em>Hades</em> had already made a name for itself, as a title that redefined the genre and the medium, in manners that only a few get to do. It happened with <em>Ocarina of Time</em> and 3D action combat, with Halo’s controller layout for FPS games, with <em>Super Metroid</em> and <em>Castlevania: Symphony of the Night</em>, giving birth to a genre that has flourished with iconic titles known to all. It’s a work that left a mark this decade already.</p> <p>Roguelikes have been around for ages, and I have tried and played a fair share of them, even if none have quite landed for me until now, I could appreciate what they do. I wrote a bit about <a href="/blog/short-games-and-roguelikes/">roguelikes</a> a while ago if you want some more thoughts about them. Some interesting comments on that post as well!</p> <p>Alas, Hades is very different.</p> <p><img src="/assets/img/blogs/2026-06-18-hades.webp" alt="Hades game cover artwork" /></p> <p>A roguelike is a game where you have to complete without dying. If you do, ultiple elements of the game will be randomized and procedurally generated. Item locations, rooms, enemies. Every playthrough is unique, every death permanent.</p> <p>Most roguelikes are very much focused on forcing you to get better at the game. Something like <em>Spelunky</em> will rely on your ability to understand its mechanics a little more run after run, the rooms and levels may change, but the way the world works is the same always. You have to help yourself, improve yourself, try things and learn as much as you can so if you die, it will be a bit easier and you will have mastered the game enough to complete it, earn the victory yourself. This is the same for many other classic roguelikes, like <em>Dungeon Cralw Stone Soup</em>, <em>Shattered Pixel Dungeons</em> or <em>Cataclysm: Dark Days Ahead</em></p> <p>Something like <em>Ember Knights</em>, <em>Dead Cells</em> and <em>Rogue Legacy</em> will feature meta-progression. Items that will ease each run, with things like extra lives, more speed, better weapons, or regenerative health, benefits present in other roguelikes, but often lost forever by the next run. Some times those games may mix those benefits with caveats that add variation to each attempt too, and I’m sure others have tried to balance the game in similar ways.</p> <p>One style can be way too difficult and repetitive for some players, while providing a true challenge and a real sense of getting good at it to others. While it can be unfair to lose hours of progress in a run, a game you will eventually complete because you keep unlocking new permanent upgrades and enemies don’t get any tougher, can end up feeling just as pointless.</p> <p>Hades features meta-progression, choices and multiple paths to take so you can build up your moveset and make your way through rooms until you reach the end. But how does it justify this?</p> <p>The story.</p> <p>Most roguelikes have a very mild sense of story. Since you often die quickly, it doesn’t really matter, you just try again for no particular reason. This can be a deal breaker if the mechanics are not enough to hold your interest. This happened to me in the case of stuff like <em>One Step From Eden</em>, where I feel no reason to go through it, while others absolutely love the depth of its mechanics and nods to other games.</p> <p>Hades has a story, where we follow Zagreus (or Zag), the son of Hades, ruler of the Underworld, as he attempts to reach Mount Olympus to reunite with the rest of his family. Going through every level of the Underworld, an endless maze of shuffling rooms and enemies that no mortal can escape from.</p> <p>This is the basis on which everything is justified. Zag is escaping the house of Hades, everytime he tries to run away, the gods of Olympus aid him with boons: attack effects, better stats, more movement options, etc. There will also be rooms that reward you with weapon upgrades, or with different currencies to get permanent benefits.</p> <p>Each god has something to say when giving you a boon, and each god will offer certain powers that can even synergize with those from other gods. They all have a different character and you will get to meet them better, as the story continues. Understanding the family dynamics of them all. Making for a really interesting form of story-telling.</p> <p>Mechanically, each god is different too. Athena focuses on deflecting and defense, Poseidon can push away enemies with waves, Zeus has lightning chip damage that bounces through enemies, and the like.</p> <p>There are plenty of other characters in each level of the Underworld, muses, fallen kings, forgotten warriors, people who will aid you in different ways. And of course, boss fights! I’ve already spoiled enough.</p> <p>You can not actually die. Each time you lose, you are carried away by the Styx river, back to the House of Hades. And this is where the things get interesting. Since there is no fighting in the House, you can just interact and know characters there better, some who want to help you, some who are there to stop you.</p> <p>These moments between runs are where most of the story will develop, where you will know why Zag wants to make it to the top, why the Olympians are aiding you at all, and understand more about the complicated relationship between Hades and his family. You can get to know and unlock more lore about each character, as well as obtain certain benefits by offering something to them in the game.</p> <p>All of this is aided by some of the best artwork I have ever seen. Each character is portrayed in a fantastic way, and all of them are really cool. There is some fantastic voice work too, the talent and the effort put into all of this is amazing.</p> <p>Featuring half a dozen weapons and a rather versatile moveset, each run is never the same, while at the same time, it kind of is. Here’s where Hades can make or break it for a player, as it essentially is a bit of a button masher when it comes to its gameplay…</p> <p>You got your Dash, Attack, Special Attack and Cast, these are the four moves you get to do, each one varies depending on your weapon and there’s some combos for each, also affected by whatever weapon upgrade you may get during a run. The truth remains the same, most of the time you’ll dash dash attack, dash dash special, dash dash attack, cast cast cast, rinse and repeat.</p> <p>This is not a bad thing by itself. The game will hook you and get you in a focus state where you will evade your way through everything and anihiliate everyone and you won’t even realize it. But that’s if you get good…</p> <p>The game is also quite difficult. There are no one-hit kills or anything, but the environment and traps and constant damage will eventually get to you if you are not careful. This can be really rough, and will stop a lot of people on their tracks. It took me about thirty runs before I finally reached the end, and no, I did not win that final boss fight until later.</p> <p>The game features one helpful feature for this: Godmode. A tickbox in the pause menu that increases your defense by 2% each time you die.</p> <p>Of course, Hades <em>wants</em> you to die multiple times to keep seeing more of the story, and accepting each defeat as part of the cycle is kind of important. This is a game where reaching the final boss fight is not really the end goal. Even after you win, there will be reasons to keep going, and more interactions to be had after each death or victory.</p> <p>The story is full of revelations and very interesting developments, there are also other side plots that make you care about some of the side characters you meet along the way. I reached the end of some of them, but not all, before I reached credits, and it’s one of the things that I am interested on returning to, if I’m honest.</p> <p>Just like the artwork, the music is outstanding as well. A very epic score that gets the heart pumping during those epic battles. Where screens are full of enemies and projectiles fill up the screen. The game is excellently optimized for Nintendo Switch, running at 60 fps despite the amount of assets loaded up. It has a hiccup here and there, but nothing significant.</p> <h2 id="the-bad">The bad</h2> <ul> <li>The gameplay can feel repetitive if you don’t change up weapons or strategy.</li> <li>The difficulty can be really high if you don’t enable Godmode.</li> <li>Difficult cannot be manually configured, no difficulty options.</li> <li>Button mashing can end up actually hurting you if you go too hard with it.</li> <li>Not all strategies and boons are as good as others, some runs will be just bad.</li> <li>Meta-progression can be a deterrent for some people.</li> </ul> <h2 id="the-good">The good</h2> <ul> <li>The gameplay can hook you and get you into a flow state.</li> <li>The challenge is always there and can be amped up later to counteract permanent upgrades.</li> <li>Godmode allows you to ease the burdens of the game over time as you continue to experience the story.</li> <li>The characters, writing, artwork, animation, music and overall production of this game is top notch.</li> <li>You can choose a variety of weapons catering to different styles of play.</li> <li>Meta-progression and Godmode ensures you can eventually get to the end of the game with some persistence.</li> <li>The story is simply fantastic and worth experiencing.</li> </ul> <h2 id="some-tips-and-reminders">Some tips and reminders</h2> <ul> <li>Athena’s boons are awesome, use them</li> <li>Try every weapon, one is bound to be great for you, my favorite was the bow</li> <li>Talk with <em>everyone</em> every time you die, you can technically skip this, but why would you deny yourself the awesome interactions?</li> <li>If a run is bound to be bad, try to focus on resource gathering! It will often help you more.</li> </ul> <h2 id="final-thoughts">Final thoughts</h2> <p>I played through the game in a span of three years, so even though I was never fully hooked by it, I was interested on trying it and getting to complete it, and I am glad I gave it the time. Even during the span of times where I didn’t touch the game at all, it remained in my memory, and every time I returned to it, I would often spend two or three hours in a day, making progress, it was just that sort of game for me.</p> <p>What is there to say about Hades that hasn’t been said? It is a roguelike with excellent mechanics that are absolutely justified within the story, and because of that, it was never tiring for me to go through the motions. The gameplay did hook me for hours at a time, always going for two or three runs whenever I had the chance. I was not helplessly addicted to it like some people who played it like 400 hours, but I got about 40 hours of playtime myself before I finally reached the credits, and saw the conclusion of the story.</p> <p>There is still an epilogue, it seems, that will tie up some more knots, and side plots I would like to conclude, but I am fine writing about the game by now. It was a wonderful time, and I really recommend giving it a go!</p> <p>This is day 81 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=Hades">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116771003276423641">Reply on Fediverse</a> </p> Views - James' Coffee Blog https://jamesg.blog/2026/06/18/views 2026-06-18T00:00:00.000Z <p><em>The faint reflection of the hall catches my eye; how nature and humanity blend — how there are so many ways to see the world; how painting lets us explore what we see and what we want the world to be, just like words. A figure — a few brush stokes and colours — stands out in the grove of light amid the shadowed grounds. To see the geometry of the inclining hill, the depth of the layers of trees at the end of which is the house and the sky.</em></p><p>When I walked into the National Gallery of Scotland today, there were three paintings near the entrance that caught my eye: two paintings of Durham Castle, and one of Somer Hill at Tonbridge.</p><p>When I first saw the painting of <a href="https://www.nationalgalleries.org/art-and-artists/5528" rel="noreferrer">Somer Hill, by JMW Turner</a>, I was transfixed. The painting looked both new and familiar at the same time. After studying the painting for a while, I realised I had seen it before: the artwork had been moved from another wall. Yet in this new place – in this new light – with all the time that had passed since I had last seen it, the painting was anew.</p><p>I started taking notes of the painting, an impression of which remains in my mind: of the small bird soaring in the bottom of the picture, of the boat in river in the bottom left, of the faint reflection of the hall in the water, painted with such detail, of the golden glow of the sky and the warm colours used in the painting.</p><p>After gazing at the painting for some time, I moved on to the two paintings of Durham Castle, a castle I had seen a few times as a child.</p><p>Both of the paintings, the first by Turner and the second by Sir George Reid, transformed my understanding of the castle. I held in my mind a childhood impression, and gazed before me to see two more impressions: one abstract, in full colour, the river of my childhood seen in a light beyond my wildest imaginations; the other, truer-to-life, warm, autumnal.</p><p><a href="https://www.nationalgalleries.org/exhibition/norham-castle-sunrise" rel="noreferrer">Turner’s impression of the Castle</a>, a building now ruined, left me thinking about how only a few colours and details could create a whole new image of the castle. The yellow of the sunshine reflects on the river. The blue castle stands strong in the middle of the painting. I thought to myself it would be hard for me to interpret the painting without the explanatory text next to the artwork – there was no way for me to know it was Durham Castle without the text. In this painting, too, the castle reflects on the river.</p><p><a href="https://www.nationalgalleries.org/art-and-artists/5352" rel="noreferrer">Sir George Reid’s painting</a> brought Durham Castle back to life in my mind in a new way – Turner’s interpretation was one of colour and abstraction, Reid’s was one that brought me back to my time passing through Norham as a child. The autumn leaves in the painting were wonderful; the painting radiated warmth. Two birds fly close to the river. The castle appears small compared to Nature.</p><p>I went into the gallery expecting to go to the medieval art and left having seen a place I knew from childhood in two new lights, and an image of a country house far away depicted with such attention to depth that I felt like I was only beginning to appreciate the details of the painting in my visit today. Indeed, one of the wonderful things about art is that the more you look, the more you see – the same is true, too, of life.</p><script>(function(){function c(){var b=a.contentDocument||a.contentWindow.document;if(b){var d=b.createElement('script');d.innerHTML="window.__CF$cv$params={r:'a0db72e5bf695212',t:'MTc4MTc5NzgxNw=='};var a=document.createElement('script');a.src='/cdn-cgi/challenge-platform/scripts/jsd/main.js';document.getElementsByTagName('head')[0].appendChild(a);";b.getElementsByTagName('head')[0].appendChild(d)}}if(document.body){var a=document.createElement('iframe');a.height=1;a.width=1;a.style.position='absolute';a.style.top=0;a.style.left=0;a.style.border='none';a.style.visibility='hidden';document.body.appendChild(a);if('loading'!==document.readyState)c();else if(window.addEventListener)document.addEventListener('DOMContentLoaded',c);else{var e=document.onreadystatechange||function(){};document.onreadystatechange=function(b){e(b);'loading'!==document.readyState&amp;&amp;(document.onreadystatechange=e,c())}}}})();</script> <a class="tag" href="https://www.nationalgalleries.org/art-and-artists/5352">Sir George Reid’s painting</a> <a class="tag" href="https://www.nationalgalleries.org/art-and-artists/5528">Somer Hill, by JMW Turner</a> <a class="tag" href="https://www.nationalgalleries.org/exhibition/norham-castle-sunrise">Turner’s impression of the Castle</a> The fountain - James' Coffee Blog https://jamesg.blog/2026/06/18/the-fountain 2026-06-18T00:00:00.000Z <p>I opened my eyes and saw pink flowers; the countryside was dotted with flowers of all colours. Bees bounced between the thistles. I was delighted by all that I saw when I opened my eyes on the train journey; sleep is seductive, but so, too, is colour.</p><p>I spent the afternoon on my feet, wandering. I think wandering felt right because I wasn’t sure where I wanted to go. I wanted to walk to figure out where I should be. This has been a theme lately: I put one foot in front of another and look around, admiring the world around.</p><p>On my first stop I saw a tiled floor with a Greek motif reflected in the chrome espresso machine in a small cafe. I revealed in the sound of the espresso machine; the way the steam wand halts with a whimper. I appreciated the colour of all the ceramic cups on top of the machine. I noted that “Greek motif” is now part of my vocabulary. With studying, I see more patterns in the world.</p><p>I kept walking, drinking one of the best decaf flat whites I have had. I look up and see a car pass whose license plate ended with “JOY”. I look around and see and appreciate the architecture of all that is around: the way that two houses next to each other have doors that look exactly the same, the corinthian capitals of the pillars in the front of some buildings, the different kinds of columns whose name I can’t remember but that I know are of specific orders.</p><p><em>We are all time travellers.</em> Did this thought come from looking at Georgian architecture over a hundred years old? With every second we travel through time: we go to the future. And with every moment we look back, we go to the past . We live within time, our time, and all of time. The coffee reminded me of a place I visited last year. There is something delightful about how the mind can go from appreciating taste to admiring the temporal in the space of a minute.</p><p>I kept walking, exploring, ending up in a Parish courtyard. A person sat on the stone steps at a red door, taking notes. I wonder if they were writing a story. Studying? I wonder. Shortly thereafter, walking loosely in the direction of an art gallery, I thought to myself “the world is my art gallery”. Wherever we go there is architecture, people, stories – life – just like in an art gallery.</p><p>I stopped at a fountain, a tall turquoise fountain with a gilded top. A bird perched on the top. I appreciate how we can all see the world from our own perspectives. Perhaps only birds will see the city from the perspective of sitting atop the fountain. What can I see from where I am?</p><p>The gardens are blue and red and yellow and a lighter blue and pink and white. The grass is green; the trees around the fountain are green, too. Did we remove a tree to make space for the fountain, or did we plant the trees to make this space? Around me dozens of people sit on benches. An older man looks upward with his hand on his chin and an inquisitive look on his face, as if deciding where to go next. I, too, am deciding where to go. His gaze was toward the spire of the church I had passed several minutes earlier. </p><p>As the water rushes down the mountain, I realise I am not sure how fountains work – there is so much to learn; there are details everywhere. The prospect of rain that the sky carried fell into the background as I watched people pass by one by one, many stopping to take pictures and to look at the fountain. I wondered if I might see a rainbow here on a sunnier day.</p><p>Two kids shout “playground!”, looking excitedly toward said playground. A lady seated at a nearby bench looks toward the fountain and smiles. I do too. How many people have stood here before, smiling at the fountain?</p><p>I’m not sure how much time I spent watching the world go by. I kept watching because I was so excited by all of the stories: the people who decided to spend time here. Eventually, I stood up and started walking toward the art gallery. The fountain kept flowing as I walked away. In the background and all around, new memories are made second by second, minute by minute.</p><p><em>Why am I here at the fountain?</em> I wondered. The first answer that came to mind was “To be part of the story.”</p> 📝 2026-06-17 13:56: So you know how we have the incubator setup? Well, unbeknownst to me, my wife... - Kev Quirk https://kevquirk.com/2026-06-17-1356 2026-06-17T12:56:00.000Z <p>So you know how we have the incubator setup? Well, unbeknownst to me, my wife gave one of our broody hens a cluch of Guinea fowl eggs to sit on <strong>a month ago</strong>.</p> <p>She just sent me this...</p> <video src="https://kevquirk.com/content/images/2026-06-17-1356/1000009748.mp4" controls height="500px" width="100%" preload="metadata"></video> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-17%2013%3A56">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-17-1356#comments">leave a comment</a>.</p> </div> Adding a Town Square - Kev Quirk https://kevquirk.com/town-square 2026-06-17T09:24:00.000Z <p>I recently learned about <a href="https://github.com/cauenapier/TownSquare/">this fantastic project</a> where visitors are able to "chat" with one another in a fun and private way.</p> <p>I had to try it!</p> <p>So now, at the bottom of every page on this site, you will see my little town square. Please take a look and have some fun with it. If you want to learn more about Town Square, you can take a look at <a href="https://cauenapier.com/blog/townsquare/">this post</a> from its creator, Cauê Napier.</p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=Adding%20a%20Town%20Square">reply to this post by email</a>, or <a href="https://kevquirk.com/town-square#comments">leave a comment</a>.</p> </div> 📝 2026-06-17 07:04: We have the incubator setup incubating a dozen eggs, including the last 2 our hen... - Kev Quirk https://kevquirk.com/2026-06-17-0704 2026-06-17T06:04:00.000Z <p>We have the incubator setup incubating a dozen eggs, including the last 2 our hen that was caught by the fox layed.</p> <p>Expect regular updates. 🐣</p> <p><img src="https://kevquirk.com/content/images/2026-06-17-0704/1000009739.webp" alt="1000009739" /></p> <div class="email-hidden"> <hr /> <p>Thanks for reading this post via RSS. RSS is ace, and so are you. ❤️</p> <p>You can <a href="mailto:19gy@qrk.one?subject=%F0%9F%93%9D%202026-06-17%2007%3A04">reply to this post by email</a>, or <a href="https://kevquirk.com/2026-06-17-0704#comments">leave a comment</a>.</p> </div> In need of numbers? - Johnny.Decimal https://johnnydecimal.com/blog/0221-in-need-of-numbers/ 2026-06-17T02:32:49.000Z <p>It took me a while to figure out what this even was. So much potential…</p> <figure class="figure jdimage jdimage--auto-dark"> <picture> <img class="figure__inner" alt="A photograph of a beige control panel, attached to a wall. There's a grid of 5 × 6 buttons – except they're not buttons, they're just a mold where the buttons would be. Only the lower left of these 30 potential buttons is actually a button, and it's very lightly embossed with the word 'CALL'." height="1280" loading="lazy" src="https://johnnydecimal.com/blog/0221-So_much_potential-1280x1280.jpeg" width="1280"> </picture> </figure> World Cup, Sci-Fi movies, Birthday! - W24 - Joel's Log Files https://joelchrono.xyz/blog/w24 2026-06-16T22:00:00.000Z <p>Hey hey! Good news, this was my birthday week! And it has been pretty awesome. The World Cup started, and as much as I hate everything behind the politics and the greediness of FIFA. Us Mexicans and many other people choose to focus on the beautiful game that brings the world together, no matter what.</p> <p>Alas, these are my notes from June 9 to 15, 2026, enjoy!</p> <ul> <li> <p>🚲 Went on another nice ride in the park and saw a lot of bicycles on the way. I also noticed how literally none of them were locked. Saw plenty of them on the move too, I actually struggled to keep up with them and got left behind by a bunch of senior citizens.</p> </li> <li> <p>⚽ The World Cup is upon us, and as a Mexican, it is my duty to support my team like an absolute maniac until they mess it up badly. They started out showing promise! But backing away instead of trying for more. We’ll see how it goes!</p> </li> <li> <p>📺 My workplace (as every decent workplace in Mexico should have done) set up all the TVs to watch the game live and also gave us free snacks and drinks. The atmosphere was pretty cool. Although the TV in our office specifically had some signal issues. All in all, three hours of not-working while at work were nice.</p> </li> <li> <p>🌧️ The constant rains have exposed a couple of big leaks in my bed room, and I’ve been woken up midnight because of the water dripping in. I’ve used two buckets and they both were filled halfway by the morning, RIP.</p> </li> <li> <p>✈️ My sister visited due to the vacation period so she managed to show up for my birthday and help organize it a bit this time.</p> </li> <li> <p>🍿 My family and I went to the movies to watch <em>Disclosure Day</em>, we also got some cool shirts and had a blast overall.</p> </li> <li> <p>🥳 Another birthday week happened, and I am now twenty six years young. This is weird. in four more years I’ll be thirty, by the next world cup I’ll be thirty!</p> </li> <li> <p>🌕 Had a small birthday party where I invited some friends and the theme was <em>space</em>. My cake was made by my sister and it was themed after the moon! The candle was an astronaut. Of course everyone gave me Star Wars themed gifts lol (I love <em>Star Wars</em> so that’s not a complaint).</p> </li> <li> <p>🃏 We played a bunch of games during the party, some of the highlights were <em>Happy Salmon</em>, <em>Cheat</em> and <em>Snap</em>.</p> </li> </ul> <h2 id="watching">Watching</h2> <ul> <li> <p><strong>The World Cup</strong> - I of course watched the opening for the World Cup and was happy to see the fans of the sport having a blast, the atmosphere seemed great, even if the 2-0 result of Mexico vs Sudafrica left me wanting more. I also watched the match between Japan and the Netherlands, and that was an absolute roller coaster. I was rooting for Japan (because of <em>Blue Lock</em> and how they played in 2022), and they definitely delivered. Great stuff. I screamed more than with the Mexican match, since I was shy at the office, but there were also like no stakes compared to Japan.</p> </li> <li> <p><strong>Disclosure Day</strong> - Steven Spielberg is back, and this movie felt like a Spielberg movie for sure. Lots of fascinating elements, many thought-provoking situations, a lot of chase sequences and gripping emotional moments. There were some clichés and some convenient moments, but I really enjoyed it, even if it felt a little long. It’s a movie that deals with the truth and how it should be handled, and I found it fascinating. While I agree with the message and concepts, the execution felt a bit mixed.</p> </li> <li> <p><strong>The Martian</strong> - Speaking of execution, this movie gets all of that right. One of the best sci-fi films I’ve ever seen. This is a rewatch and it continues to just be cool. Humanity against all odds will never get boring for me. A guy is left for dead and ends up stranded on Mars, and has to make contact with Earth and try to get by, using any means necessary, while NASA and the world try to figure out how to save him before time and rations run out.</p> </li> <li> <p><strong>Mission to Mars</strong> - This movie from the 2000s was a weird choice to watch after <em>The Martian</em>. A sci-fi very focused on the “fi” side of things, but in an interesting way. A team of astronauts is killed by a weird sand snake, another group ends up attacked by micrometeorites, and in the end, there is a <em>2001</em>-esque sequence where the truth about humanity’s origin is revealed and some weird animation effects are used and honestly? The hole thing is a trip. The visual effects are actually stunning, the zero gravity sequences (including a whole dance) are peak. This movie <em>looks awesome</em>, but it has pacing issues and some cosmical things going on and it kinda works but doesn’t but I really liked it so whatever.</p> </li> <li> <p><strong>Max Steel: Bio Crisis</strong> - I continue watching my childhood movies and this one is just plain fun. It is much more laid back than the first ones, which can be a deterrent, but seeing Max Steel going through every obstacle making funny remarks and jokes is hilarious to me. This movie features a new character addition to the world. Cytro, a robot designed to destroy Max Steel, but ends up becoming an ally on his quest to stop an evil scientist from poisoning an island for his own gains.</p> </li> </ul> <h2 id="gaming">Gaming</h2> <h3 id="completed">Completed</h3> <p><strong>Metroid Prime Remastered</strong> - This game, this game is awesome! I ended up completing it and fighting against the last two bosses, after acquiring a bunch of the collectibles. I gave up on 100% that, as I didn’t want to go through all the regions of the game again. This is an awesome title and I will definitely write my review of it in the future. I highly recommend it already.</p> <h3 id="started">Started</h3> <p><strong>Transistor</strong> - All of a sudden, I picked up my Nintendo Switch after beating Metroid, and decided to open up this game for once and WOW. The atmosphere of this is already immaculate. We control Red, a lady who picks up a giant sword out of a dead man, and the sword talks! But it’s all so weird and mysterious, it has this strange, I don’t know, like a Cyberpunk Neon Noir atmosphere. There are a lot of questions in my head about how this will all play it, but for now, I’ll keep going!</p> <p>The combat has been really interesting, with a planning mechanic that lets you perform a sequence of attacks in slow mo, and then see how they play out. It’s like programming your movements. It has been incredible to see and I am trying to get better at it. It’s a game from the creators of <em>Hades</em>, and it already shows.</p> <p><strong>Survidice</strong>. This is a Mexican indie <strong>board game</strong> developed by Vadle Studios where you have to survive through hordes of zombies by using dice! Each character is a dice, the actions and steps you can move is defined by the value of your dice, each zombie is a dice and they have the same rules. It’s a cooperative game where every character has to help each other out. You can also play walls to block off some paths and make zombies take longer to get to you. There’s different types of zombies, that movie faster or tank some damage.</p> <p>We played a whole game and it was really exhilarating at times when you got into it. It is divided in two phases, players move, and then do the zombies. Because of this, it has vibes similar to a Tactics RPG. The board has special spawn points for every type of zombie dice, which are always rerolled after every wave. It is such a complete package and it offers a lot of replayability, with ways to make the game much harder by adding extra zombies or altering the way movement works.</p> <h3 id="ongoing">Ongoing</h3> <p><strong>Hollow Knight: Silksong</strong> - Indeed, I have returned. I have returned to this title because I want to get to Act 3 for once! There are so many extra boss fights and things I’ve heard about, so I really look forward to getting there sometime soon. For now Transistor got the focus though, and I may replace it or add it to my Summer Game Challenge.</p> <h2 id="reading">Reading</h2> <h3 id="completed-1">Completed</h3> <ul> <li><strong>Tiamat’s Wrath (The Expanse #8) by James S.A. Corey</strong> - What a journey so far. And how many changes and things happened here… I really didn’t see a lot of this coming. Many welcome surprises, many losses were had as well. I can’t wait for the final chapter of this journey, the ninth book is coming! I am ready to start… <em>Leviathan Falls</em>.</li> </ul> <h3 id="ongoing-1">Ongoing</h3> <ul> <li> <p><strong>Clarkesworld #211 by Neil Clarke</strong> - I am currently reading <em>The Rambler</em> a short story about a bridge that moves and causes mayhem around the city… It seems a bit absurdist and kinda funny and feel free to share your thoughts to explain it to me.</p> </li> <li> <p><strong>My Wife is From a Thousand Years Ago</strong> - Up to chapter 285. This rom-com manhua continues to be very fun.</p> </li> <li> <p><strong>Shikimori’s Not Just a Cutie</strong> - Up to chapter 116. Same same, all fun but nothing super unique by now, just cute couple stuff.</p> </li> </ul> <h2 id="around-the-web">Around the Web</h2> <h3 id="blog-posts">Blog posts</h3> <ul> <li> <p><a href="https://bojidar-bg.dev/blog/2026-06-15-edc-bag/">Hullo, new EDC bag</a> by Bojidar Marinov</p> </li> <li> <p><a href="https://syls.blog/a-small-check-in/">A Small Check-In</a> - by Syl</p> </li> <li> <p><a href="https://brennan.day/yes-buy-them-a-coffee-support-and-mutual-aid-on-the-indieweb/">Yes, Buy Them a Coffee: Support and Mutual Aid on the IndieWeb</a> - by Brennan Kenneth Brown</p> </li> <li> <p><a href="https://blog.avas.space/llm-circus/">our workplace LLM mass delusion</a> by Ava</p> </li> </ul> <h3 id="youtube">YouTube</h3> <ul> <li> <p><a href="https://youtu.be/6saQ5PpgO24">This Camera Went Missing 15 Years Ago. Let’s Find The Owner</a> by Man + River</p> </li> <li> <p><a href="https://youtu.be/QTJvFcx0DPE">Someone threw out 13 monitors… I took them all</a> by Marcin Plaza</p> </li> <li> <p><a href="https://youtu.be/bAuhWUYz3y4">2027 is already stacked (the games I’m excited for)</a> by Laura’s Cloud Saves</p> </li> </ul> <p>This is day 80 of <a href="https://100daystooffload.com">#100DaysToOffload</a></p> <p> <a href="mailto:me@joelchrono.xyz?subject=World Cup, Sci-Fi movies, Birthday! - W24">Reply to this post via email</a> | <a href="https://fosstodon.org/@joel/116762071130447224">Reply on Fediverse</a> </p> Note published on June 16, 2026 at 4:45 PM UTC - Molly White's activity feed 6a317db7f3a5676bc2fa5584 2026-06-16T16:45:43.000Z <article><div class="entry h-entry hentry"><header></header><div class="content e-content"><p>Setting aside the absurd premise of this op-ed, I love that the writer felt the need to hedge with "not that has been reported"</p><p>"No one's reported that one of the most famous popstars in the world dated a man who at the time was a random oyster farmer from Maine, BUT IT IS POSSIBLE"</p><div class="media-wrapper"><a href="https://storage.mollywhite.net/micro/48e9d1bb19de36ee56ad_Screenshot_20260616-022003.png" data-fslightbox=2a1af6a76b65076b552c><img src="https://storage.mollywhite.net/micro/48e9d1bb19de36ee56ad_Screenshot_20260616-022003.png" alt="@ wsjopinion 13h Did Taylor Swift once date Graham Platner? Not that has been reported, but her songs about dissolute men do echo accounts of women who dated the Maine Democratic Senate nominee, writes Allysia Finley WSJ wsj.com Opinion | Taylor Swift Sings About Graham Platner and Donald Trump" /></a></div></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp-block"><div class="timestamp">Posted: <a class="u-url" href="https://www.mollywhite.net/micro/entry/202606161243"><time class="dt-published" datetime="2026-06-16T16:45:43+00:00" title="June 16, 2026 at 4:45 PM UTC">June 16, 2026 at 4:45 PM UTC</time>. </a></div></div><div class="social-links"> <span> Also posted to: </span><a class="social-link u-syndication mastodon" href="https://hachyderm.io/@molly0xfff/116760797944266581" title="Mastodon" rel="syndication">Mastodon, </a><a class="social-link u-syndication bluesky" href="https://bsky.app/profile/molly.wiki/post/3mog4e25vl22h" title="Bluesky" rel="syndication">Bluesky</a></div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/maine" title="See all micro posts tagged "Maine"" rel="category tag">Maine</a>, <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/media" title="See all micro posts tagged "media"" rel="category tag">media</a>, <a class="tag p-category" href="https://www.mollywhite.net/micro/tag/us_politics" title="See all micro posts tagged "US politics"" rel="category tag">US politics</a>. </div></div></footer></div></article> Read "MAGA Pronatalism is Anti-Freedom No Matter the Packaging" - Molly White's activity feed 6a3149c691f30f1ebeda58c2 2026-06-16T13:04:06.000Z <article class="entry h-entry hentry"><header><div class="description">Read: </div></header><div class="content e-content"><div class="article h-cite hcite"><div class="title"><a class="u-url u-repost-of" href="https://nobody-wants-this.ghost.io/maga-pronatalism-is-anti-freedom-no-matter-the-packaging/" rel="bookmark">“<span class="p-name">MAGA Pronatalism is Anti-Freedom No Matter the Packaging</span>”</a>. </div><div class="byline"><span class="p-author h-card">Anne Lutz Fernandez</span> in <i class="p-publication">Nobody Wants This</i>. <span class="read-date"> Published <time class="dt-published published" datetime="2026-06-15">June 15, 2026</time>.</span></div><blockquote class="summary p-summary entry-summary">But its sanewashing is underway</blockquote><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><img src="https://www.mollywhite.net/assets/images/placeholder_social.png" alt="Illustration of Molly White sitting and typing on a laptop, on a purple background with 'Molly White' in white serif." style="display: none;"/></div><footer class="footer"><div class="flex-row post-meta"><div class="timestamp">Posted: <time class="dt-published" datetime="2026-06-16T13:04:06+00:00" title="June 16, 2026 at 1:04 PM UTC">June 16, 2026 at 1:04 PM UTC</time>. </div></div><div class="bottomRow"><div class="tags">Tagged: <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/extremism" title="See all feed posts tagged "extremism"" rel="category tag">extremism</a>, <a class="tag p-category" href="https://www.mollywhite.net/feed/tag/women's rights" title="See all feed posts tagged "women's rights"" rel="category tag">women's rights</a>. </div></div></footer></article> Create A Static Site Using 11ty &amp; Deploy to Neocities (2026 Refresh) - The Weblog of fLaMEd https://flamedfury.com/guides/11ty-homepage-neocities-2026/ 2026-06-16T12:00:00.000Z <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">title: 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">title: 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">title: 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 post 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>. Check out the <a href="https://flamedfury.com/posts/">posts archive</a> on the website.</p>