<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Blog</title>
  <subtitle>Software development and diving. The two go together, obviously.</subtitle>
  <link href="https://ddevnet.net/blog/" rel="alternate" type="text/html"></link>
  <link href="https://ddevnet.net/blog/feed.xml" rel="self" type="application/atom+xml"></link>
  <id>https://ddevnet.net/blog/feed.xml</id>
  <updated>2026-05-28T11:01:20Z</updated>
  <author>
    <name>Daniel Devine</name>
    <email>devine@ddevnet.net</email>
  </author>
  <entry>
    <title>If you want to be heard, make AI say it to everyone.</title>
    <link href="https://ddevnet.net/blog/if-you-want-to-be-heard-make-AI-say-it/" rel="alternate" type="text/html"></link>
    <id>https://ddevnet.net/blog/if-you-want-to-be-heard-make-AI-say-it/</id>
    <updated>2026-05-28T00:00:00Z</updated>
    <summary>In 2026 there’s a compelling reason to go back to maintaining a personal site or blog. AI is hungry for training data and that&#39;s your foot in the door.</summary>
    <content type="html">&lt;p&gt;In 2026 there’s a compelling reason to go back to maintaining a personal site or blog.&lt;/p&gt;&#xA;&lt;p&gt;Most people no longer browse the open web in any meaningful sense. They ask questions, prompt systems and accept generated responses as their first exposure to an idea. The interface to information has shifted from navigation to conversation.&lt;/p&gt;&#xA;&lt;p&gt;Whether or not you think human cognition and LLMs are meaningfully similar in structure they behave similarly in one important way: both are shaped by repeated exposure to patterns and both reinforce those patterns over time.&lt;/p&gt;&#xA;&lt;p&gt;Social visibility (or popularity) still plays a role in determining relevancy. But there&#39;s a whole new audience for your writing that is more interested in a broader set of characteristics than purely popularity: AI.&lt;/p&gt;&#xA;&lt;p&gt;Large language models are trained on vast amounts of human-created content gathered by data brokers and training data providers. Through training on this data, the AI model absorbs recurring patterns: how ideas are framed, how arguments are structured, what concepts are linked together and what &amp;quot;normal&amp;quot; phrasing looks like for a given domain. Those patterns reappear in how the system generates responses.&lt;/p&gt;&#xA;&lt;blockquote class=&#34;pull&#34;&gt;Publishing still matters, &lt;strong&gt;but the role of publishing has changed.&lt;/strong&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;A personal site is one of the few publishing formats you still fully control. You own the hosting, copyright and editorial direction. Most importantly you have ownership and control over the context. Not all contexts are equal - an article published in more formal context is more impactful than the exact same content published in a lower-quality context such as a Facebook post. Furthermore, you can also curate the metadata around your content making it a more attractive source for AI training data.&lt;/p&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;Some things are in our control and others not. Things in our control are opinion, pursuit, desire, aversion, and, in a word, whatever are our own actions...&lt;br /&gt;&#xA;...Remember, then, that if you suppose that things which are slavish by nature are also free, and that what belongs to others is your own, then you will be hindered.&lt;br /&gt;&#xA;&lt;strong&gt;-- Epictetus, Enchiridion and Selections from the Discourses&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;/blockquote&gt;&#xA;&lt;p&gt;If you care about whether your ideas will continue to exist in the world you need somewhere they can exist without platform distortion or compression forced by platform mechanics (e.g. character limits or workarounds to avoid moderation or censorship) because that increases the chances your ideas show up in what AI systems produce. Maintaining a personal site is a good way to do this.&lt;/p&gt;&#xA;&lt;p&gt;Personal websites and open decentralised publishing are likely to remain critical for models being trained for the foreseeable future. Although models are already trained on synthetic data sources in order to have a higher signal to noise ratio they are interpolative in nature. Human generated data - although noisy and at times outright &lt;em&gt;wrong&lt;/em&gt; - better reflects reality. In late 2024 a widely distributed article in Nature discussed &lt;a href=&#34;https://www.nature.com/articles/s41586-024-07566-y&#34;&gt;the problem of &amp;quot;model collapse&amp;quot;&lt;/a&gt; resulting from recursive use of synthetic data when training models.&lt;/p&gt;&#xA;&lt;p&gt;Some people will not be able to get beyond their ego and accept that their ideas may be transmitted without consistent attribution. They will stop publishing - but their ideas will die with them.&lt;br /&gt;&#xA;Sucks to be you, buddy.&lt;/p&gt;&#xA;</content>
  </entry>
  <entry>
    <title>Hello, World... (Again)</title>
    <link href="https://ddevnet.net/blog/hello-world-again/" rel="alternate" type="text/html"></link>
    <id>https://ddevnet.net/blog/hello-world-again/</id>
    <updated>2026-05-27T00:00:00Z</updated>
    <summary>I&#39;ve been considering a new site for a while but there were always two main things that held me back. Choosing my content and finding a platform that suited my style.</summary>
    <content type="html">&lt;p&gt;I&#39;ve been considering a new site for a while so that I could share a bit of writing occasionally but there were always two main things that held me back.&lt;/p&gt;&#xA;&lt;p&gt;Firstly, &lt;a href=&#34;https://web.archive.org/web/20260000000000*/ddevnet.net&#34;&gt;Archive.org will remember everything I post&lt;/a&gt; for the rest of time whether I like it or not. I&#39;ve taken time to think and I&#39;ve got a good idea about what lines I&#39;m willing to cross and also what content I&#39;d like to share in general. I have multiple projects in mind that will probably be worth writing about.&lt;/p&gt;&#xA;&lt;p&gt;The other thing that held me back was that I couldn&#39;t find a platform or framework I actually liked for a personal site. I didn&#39;t want to start writing content only to then be frustrated by the tools.&lt;/p&gt;&#xA;&lt;h2 id=&#34;choosing-a-platform&#34;&gt;Choosing a platform&lt;/h2&gt;&#xA;&lt;p&gt;If you don&#39;t have a team of non-technical users then features such as editors and dashboards are completely unnecessary and are a really bad deal. Dynamic features present a large attack surface both in terms of the application itself and also the system it is hosted on. You also take on considerable maintenance obligations and incur monthly costs... And if it fails you look like an idiot.&lt;/p&gt;&#xA;&lt;p&gt;Another Django based site isn&#39;t an option.&lt;br /&gt;&#xA;Wordpress? Absolutely not.&lt;br /&gt;&#xA;HEY World? Neat, but too simplistic and not self hosted.&lt;/p&gt;&#xA;&lt;p&gt;Many static site frameworks still come with a whole lot of baggage, though generally half as much as dynamic platforms. In the end you have to understand and apply someone else&#39;s framework and workflow to your project. Copious dependencies still might need to be installed on your system just to write a new blog entry once every few months. Screw that.&lt;/p&gt;&#xA;&lt;h2 id=&#34;security&#34;&gt;Security&lt;/h2&gt;&#xA;&lt;p&gt;Lately I&#39;ve become very concerned about security. There have been multiple severe &lt;a href=&#34;https://snyk.io/blog/mini-shai-hulud-antv-npm-supply-chain-attack/&#34;&gt;NPM and PyPI supply chain attacks&lt;/a&gt; (among others) this year. Security needs to be treated as a first class feature now that the cost of creating exploits is lower than ever and the need to pare down third-party dependencies - even for tools running locally - is clear.&lt;/p&gt;&#xA;&lt;p&gt;With AI, it&#39;s now often feasible to replace a third-party dependency with a smaller, project-specific implementation inside your own codebase. You can strip away the liability the third-party poses and also the liability of any bundled features that you don&#39;t use or want. On the other hand relying on AI to generate replacements for third-party dependencies comes with significant downsides too; the generated code is now your responsibility and you may not have the domain expertise to ensure correctness, security, etc.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-wish-list&#34;&gt;The wish-list&lt;/h2&gt;&#xA;&lt;p&gt;Over the course of two days I meditated on what my ideal static site generator might look like and produced a wish list:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;No baggage&lt;/strong&gt; - I don’t mind carrying around content and assets in backups or on my laptop, but Python and Node.js environments tend to leave a mess behind. Virtual environments, package caches, node_modules directories, toolchains that drift out of date. It all adds up.&lt;/p&gt;&#xA;&lt;p&gt;When I come back a year later, or switch to a new device, I don’t want to reinstall half the internet just to get a blog building again. I want something that works without dependency hell or supply chain anxiety.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;No dependencies&lt;/strong&gt; - or at least as close as possible. Pulling them from NPM, PyPI, or crates.io every time you want to work on a website or on the site generator is out.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Zero friction when adding content&lt;/strong&gt; - I want to put files in a directory structure that reflects my URL scheme, run a build command and run a deploy command.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;Simple as possible&lt;/strong&gt; - A minimal templating system. No databases or state. No plugins. No configuration files. Nuxt Content style front-matter for directives and metadata can be defined at the top of any markdown file. If I go away and come back a year later I shouldn&#39;t be surprised by how the system works or forced to rack my memory for basic usage details.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&#xA;&lt;p&gt;&lt;strong&gt;We need to build, but we don&#39;t need a whole freakin&#39; build chain&lt;/strong&gt; - No kludge of tools, multi-pass compilation or directed-graph craziness.&lt;/p&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Rather than pin my hopes on someone else&#39;s solution, I decided to build my own static site generator.&lt;/p&gt;&#xA;&lt;p&gt;Did I hand code it? Nope. I fired up Claude - laid out my vision in plain language, discussed some implementation details and let it rip. It did a surprisingly good job.&lt;/p&gt;&#xA;&lt;p&gt;After the initial prototype I decided to invest in additional features. Adding metadata to my pages to help crawlers and social media integration was trivial. Adding an Atom feed was easy and helped round out the project. The old habit of mapping every feature to a third-party library was easy to break.&lt;/p&gt;&#xA;&lt;h2 id=&#34;gosite&#34;&gt;Gosite&lt;/h2&gt;&#xA;&lt;p&gt;The implementation is easiest to summarise in a few points:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Written in Go because it produces a single binary easily, has a strong standard library, avoids extra build tooling and is much more performant than scripted langugages.&lt;/li&gt;&#xA;&lt;li&gt;Templating from the Go standard library. Perfectly adequate.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;goldmark&lt;/code&gt; for markdown. Despite being a third-party dependency I feel it is well worth it and likely trustworthy. To reduce risk I used &lt;code&gt;go mod vendor&lt;/code&gt; to bring it into the project codebase. All content being processed is local and presumably trustworthy so it might never have to be updated.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;tailwind-cli&lt;/code&gt; as an optional dependency. This is a standalone binary. I &lt;em&gt;really&lt;/em&gt; prefer to use Tailwind over raw CSS. The generated output only includes relevant tailwind classes and is also minified.&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://taskfile.dev/&#34;&gt;&lt;code&gt;Task&lt;/code&gt;&lt;/a&gt; as another optional dependency. It&#39;s trivial to run &lt;code&gt;gosite&lt;/code&gt; directly (e.g. simply &amp;quot;gosite build&amp;quot;) but it&#39;s nice to have a Taskfile which wraps up all your common commands and injects environment variables from a &lt;code&gt;.env&lt;/code&gt; file. I also use it to run &lt;code&gt;tailwind-cli&lt;/code&gt; automatically. Once you decide how you want to deploy just extend the Taskfile. You definitely could use a Makefile to do all these things, but you know... Current year.&lt;/li&gt;&#xA;&lt;li&gt;Front-matter is in YAML key-value style but no third-party YAML dependency is used. Simple string parsing does the trick.&lt;/li&gt;&#xA;&lt;li&gt;The &lt;code&gt;gosite&lt;/code&gt; and &lt;code&gt;tailwind-cli&lt;/code&gt; binaries sit in the site project directory. There isn&#39;t a Python virtual environment or node_modules directory in sight. It&#39;s blissful.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In the near future I may make the source for Gosite public. There are many static website generators but this one is mine.&lt;/p&gt;&#xA;&lt;h2 id=&#34;this-site&#34;&gt;This Site&lt;/h2&gt;&#xA;&lt;p&gt;Obviously what you see here is the Gosite output.&lt;/p&gt;&#xA;&lt;p&gt;The look and feel is recycled from my last business-card style website because after browsing other portfolio and blog websites I couldn&#39;t find themes and trends that felt right. I&#39;m still in disbelief that I&#39;d actually managed to create something with aesthetic value all by myself! Visuals have always been my weakness.&lt;/p&gt;&#xA;&lt;p&gt;I&#39;ve held firm to a &amp;quot;no JavaScript&amp;quot; approach and I&#39;m quite happy with the results. It&#39;s a lot easier to make nice sites with modern CSS features. A modern SPA-like experience with transitions &lt;strong&gt;between&lt;/strong&gt; separate HTML pages can be done without JavaScript! What a time to be alive! The reduced size and load time is also very satisfying especially combined with some browser preloading.&lt;/p&gt;&#xA;&lt;p&gt;When you go to a minimal website that has nice typography and a distinct lack of chrome you know you&#39;re about to get an education even if the content is a collection of rants by an aging sysadmin that people frequently mistake for a homeless person. I wanted to bring a little of that energy to my site.&lt;/p&gt;&#xA;&lt;p&gt;There&#39;s no comment section because frankly I don&#39;t need one. People can comment on social media or email me. Comment sections on blogs mostly act as a spam archive these days.&lt;/p&gt;&#xA;&lt;p&gt;There is dark-mode support but it relies on your OS/browser using &lt;code&gt;prefers-color-scheme&lt;/code&gt; to trigger the dark mode CSS. Adding a dark-mode toggle would definitely require JavaScript and that&#39;s where I draw the line.&lt;/p&gt;&#xA;</content>
  </entry>
</feed>
