<?xml version="1.0" encoding="UTF-8" standalone="no"?><!-- generator="FeedCreator 1.8" --><rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Andreas Gohr: Linkblog [splitbrain.org]</title>
        <description>Noteworthy or interesting links collected by Andreas Gohr.</description>
        <link/>
        <lastBuildDate>Fri, 16 Oct 2026 07:33:58 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <item>
            <title>Ein KI-Agent, der Ihre Software von innen kennt</title>
            <link>https://www.cosmocode.de/en/blog/agoh/20260930-james-backend-butler/</link>
            <description>&lt;h1&gt;Ein KI-Agent, der Ihre Software von innen kennt&lt;/h1&gt;
&lt;p&gt;In der Softwareentwicklung arbeiten wir täglich mit KI-Agenten und wissen, wie nützlich diese Werkzeuge sein können.
Doch auch in anderen Bereichen sind diese Systeme nützlich. Unser Wiki zum Beispiel hat einen eingebauten
Agenten. Er beantwortet Fragen mit Wissen aus dem Wiki und mit Daten aus unserer übrigen internen Software. Für einen
Kunden haben wir ein ähnliches System gebaut, das komplexe Auswertungen aus der Vertragsdatenbank erstellt.&lt;/p&gt;
&lt;p&gt;Da lag die Idee nahe, einen solchen Agenten in jede Webanwendung einzubauen, die wir für unsere Kunden betreuen: ins
TYPO3-CMS genauso wie in individuell entwickelte Fachanwendungen. Überall dort, wo Mitarbeitende im Backend Inhalte und
Daten pflegen.&lt;/p&gt;
&lt;p&gt;Das Ergebnis ist James - Ihr Butler fürs Backend.&lt;/p&gt;
&lt;video src="https://www.cosmocode.de/_astro/james_de_web.C9N5VykH.mp4" poster="https://www.cosmocode.de/_astro/james_de_poster.Dm0Kvjep.jpg" width="1920" height="1080" controls preload="none"&gt;&lt;p&gt;Ein kurzes Video, das James vorstellt.&lt;/p&gt;&lt;/video&gt;
&lt;h2&gt;Was ist James?&lt;/h2&gt;
&lt;p&gt;Wir schreiben nicht nur Software für unsere Kunden, sondern unterstützen sie auch im laufenden Betrieb der Anwendung.
Denn egal, wie gut die Software ist: Im Betrieb ergeben sich Fragen. Hier setzt James an. James ist ein
Chat-Assistent, der direkt in die Anwendung eingebaut ist und dort hilft, wo gearbeitet wird: im Backend. Er ist für
die Menschen gedacht, die sich in der Anwendung anmelden, um Inhalte und Daten zu pflegen, zum Beispiel den
Redakteur:innen in einem CMS.&lt;/p&gt;
&lt;p&gt;James ist also kein Chatbot für die Besucher:innen der Website. Wer die Seiten liest oder im Shop einkauft, bekommt ihn
nie zu sehen. Er ist für die Menschen da, die mit der Anwendung arbeiten, nicht für die, die sie von außen nutzen.&lt;/p&gt;
&lt;p&gt;James hat Werkzeuge, um den Quellcode der Applikation zu lesen, und kann in die Live-Datenbank schauen. Zudem kann er
über den Browser der angemeldeten Nutzer:in “sehen”, was dargestellt wird. Zudem lassen sich weitere
Informationen wie das Nutzerhandbuch oder Fachwissen hinzufügen. Damit hat James dieselben Werkzeuge zur
Verfügung, die auch wir nutzen würden, um eine Anfrage zu beantworten.&lt;/p&gt;
&lt;p&gt;Wichtig ist dabei, dass der Agent nichts “kaputt” machen kann. Er darf zwar den Quellcode und die Datenbank lesen, hat
aber keine Werkzeuge, um Änderungen durchzuführen. Gegebenenfalls kann er natürlich erklären, wie eine Anpassung
durch die Nutzer:in selbst vorgenommen werden kann.&lt;/p&gt;
&lt;h2&gt;Wofür ist das gut?&lt;/h2&gt;
&lt;p&gt;Das Tolle an Agentensystemen ist, wie flexibel sie mit nur einer Handvoll Werkzeugen einsetzbar sind. Für James ergeben
sich einige Anwendungsfelder.&lt;/p&gt;
&lt;h3&gt;Direktes Hilfesystem&lt;/h3&gt;
&lt;p&gt;Fragen zur Bedienung und zum Zustand der Applikation sind die naheliegendsten Aufgaben.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Wie lege ich eine neue Veranstaltung an, die nur für angemeldete Mitglieder sichtbar ist?”&lt;/li&gt;
&lt;li&gt;“Warum erscheint mein Artikel von gestern nicht auf der Startseite?”&lt;/li&gt;
&lt;li&gt;“Wie kann ich einer Kollegin Schreibrechte für den Pressebereich geben?”&lt;/li&gt;
&lt;li&gt;“Warum hat Bestellung 4711 noch keine Rechnung bekommen?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;James bietet hier eine direkte Zeitersparnis. Statt sich auf der Suche nach der richtigen Stelle durch die Anwendung zu
klicken oder am Ende sogar bei uns nachfragen zu müssen, kann James die Antwort direkt liefern.&lt;/p&gt;
&lt;h3&gt;Spontane Auswertungen&lt;/h3&gt;
&lt;p&gt;Oftmals möchte man etwas über die Daten in der eigenen Software wissen, das über die Oberfläche in dieser Form nicht
ausgegeben wird.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Welche Kunden haben im letzten Jahr mehr als dreimal bestellt, aber seit sechs Monaten nicht mehr?”&lt;/li&gt;
&lt;li&gt;“Wie hat sich die Zahl der Neuanmeldungen pro Monat seit Januar entwickelt, getrennt nach Region?”&lt;/li&gt;
&lt;li&gt;“Welche Seiten wurden seit über zwei Jahren nicht mehr bearbeitet und von wem stammen sie?”&lt;/li&gt;
&lt;li&gt;“Wie viele Verträge laufen im nächsten Quartal aus und welchen Umsatz machen sie zusammen aus?”&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;James kann die Daten dabei nicht nur zusammensuchen, sondern über eine eingebaute Bibliothek für Balken- und
Liniendiagramme auch gleich grafisch darstellen.&lt;/p&gt;
&lt;div class="CenterAlign"&gt; &amp;lt;p&amp;gt;&amp;lt;img src="/_astro/james-chart.CG5XxqFf_1umKgd.webp" alt="James zeigt die Neuanmeldungen pro Monat und Region als Balkendiagramm" loading="lazy" decoding="async" width="560" height="820"&amp;gt;&amp;lt;/p&amp;gt; &lt;/div&gt;
&lt;p&gt;James ist dabei für die schnelle Frage zwischendurch gedacht, nicht als Ersatz für ein richtiges Auswertungswerkzeug.
Zeigt sich, dass eine Auswertung immer wieder gebraucht wird, ist es sinnvoller, die Anwendung entsprechend zu
erweitern.&lt;/p&gt;
&lt;h3&gt;Der große Überblick&lt;/h3&gt;
&lt;p&gt;Eine eingebaute Bibliothek für Schaubilder (Mermaid) erlaubt es James, auch mal eben Datenflüsse oder Zusammenhänge
grafisch zu visualisieren.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Zeig mir, welche Schritte eine Bestellung vom Warenkorb bis zum Versand durchläuft.”&lt;/li&gt;
&lt;li&gt;“Welche Rollen gibt es im System und wer darf was?”&lt;/li&gt;
&lt;li&gt;“Wie hängen Produkte, Kategorien und Angebote zusammen?”&lt;/li&gt;
&lt;li&gt;“Was passiert alles, wenn sich jemand für den Newsletter anmeldet?”&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="CenterAlign"&gt; &amp;lt;p&amp;gt;&amp;lt;img src="/_astro/james-diagram.CNp1yQmG_28R5wv.webp" alt="James zeigt den Ablauf einer Bestellung vom Warenkorb bis zum Versand als Diagramm" loading="lazy" decoding="async" width="560" height="1180"&amp;gt;&amp;lt;/p&amp;gt; &lt;/div&gt;
&lt;h3&gt;Fehlermeldungen und Änderungswünsche&lt;/h3&gt;
&lt;p&gt;Keine Software ist perfekt und manchmal stoßen unsere Kunden auf unvorhergesehene Probleme. James kann das Problem
analysieren und einen technischen Bericht für CosmoCode erstellen - egal, ob es sich um einen Fehler oder eine fehlende
Funktion handelt.&lt;/p&gt;
&lt;p&gt;Wir sparen Zeit bei der Analyse des Problems und unsere Kunden Geld, weil die Fehlerbehebung schneller geht.&lt;/p&gt;
&lt;h2&gt;Software&lt;/h2&gt;
&lt;p&gt;James ist in Go geschrieben und enthält in einem einzigen Programm alles, was nötig ist: einen eigenen Webserver, das
Backend, welches die Werkzeuge bereitstellt und mit dem Sprachmodell (LLM) spricht, sowie das Frontend für die Ausgabe.
Dazu gehört eine Konfigurationsdatei, die festlegt, wo der Quellcode und andere Informationsquellen zu finden sind und wie
die Datenbank anzusprechen ist.&lt;/p&gt;
&lt;p&gt;Dieser Aufbau macht James unabhängig von der Programmiersprache und dem Framework der eigentlichen Anwendung, die es zu
unterstützen gilt. Egal, ob ein PHP-basiertes TYPO3 oder eine individuelle Django-App: Am Ende muss nur ein kleiner
JavaScript-Schnipsel integriert werden, und James steht allen authentifizierten Nutzer:innen zur Verfügung.&lt;/p&gt;
&lt;p&gt;Die Konfiguration und Integration übernehmen wir natürlich.&lt;/p&gt;
&lt;h2&gt;Was noch kommt&lt;/h2&gt;
&lt;p&gt;Hat man James erst einmal im Einsatz, ergeben sich schnell neue Ideen. Mit weiteren Datenquellen könnte James zum
Beispiel auch solche Fragen beantworten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;“Welche Seiten werden am häufigsten besucht, sind aber seit Jahren nicht aktualisiert worden?” (mit Daten aus Matomo
oder Google Analytics)&lt;/li&gt;
&lt;li&gt;“Bei welchen Suchbegriffen verlieren wir gerade Plätze bei Google?” (mit Daten aus der Google Search Console)&lt;/li&gt;
&lt;li&gt;“Welche Kunden aus dem Shop haben ein offenes Ticket im Support-System?” (mit Anbindung an weitere Systeme)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Welche Erweiterungen wir zuerst umsetzen, entscheiden die Rückmeldungen unserer Kunden. Sie haben eine Idee oder
möchten James in Ihrer Anwendung ausprobieren? Sprechen Sie uns an!&lt;/p&gt;</description>
            <pubDate>Wed, 30 Sep 2026 00:00:00 +0000</pubDate>
            <guid>https://www.cosmocode.de/en/blog/agoh/20260930-james-backend-butler/</guid>
        </item>
        <item>
            <title>Jaw literally dropped. I ran the prompt from the "Made entirely with Opus 5. ...</title>
            <link>https://www.reddit.com/r/ClaudeAI/comments/1wovwao/jaw_literally_dropped_i_ran_the_prompt_from_the/</link>
            <description></description>
            <pubDate>Fri, 25 Sep 2026 06:03:47 +0000</pubDate>
            <guid>https://www.reddit.com/r/ClaudeAI/comments/1wovwao/jaw_literally_dropped_i_ran_the_prompt_from_the/</guid>
        </item>
        <item>
            <title>My HTML Boilerplate</title>
            <link>https://vale.rocks/posts/html-boilerplate</link>
            <description>&lt;blockquote&gt;&lt;hr&gt;&lt;/blockquote&gt;&lt;div&gt;
					&lt;p&gt;When &lt;abbr&gt;HTML&lt;/abbr&gt; was first created, a document could be very simple indeed. A valid document could look like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;TITLE&lt;/span&gt;&amp;gt;&lt;/span&gt;HTML document&lt;span&gt;&amp;lt;/&lt;span&gt;TITLE&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;H1&lt;/span&gt;&amp;gt;&lt;/span&gt;Heading&lt;span&gt;&amp;lt;/&lt;span&gt;H1&lt;/span&gt;&amp;gt;&lt;/span&gt;

&lt;span&gt;&amp;lt;&lt;span&gt;P&lt;/span&gt;&amp;gt;&lt;/span&gt;This is a paragraph with a &lt;span&gt;&amp;lt;&lt;span&gt;A&lt;/span&gt; &lt;span&gt;HREF&lt;/span&gt;=&lt;span&gt;"https://example.com/"&lt;/span&gt;&amp;gt;&lt;/span&gt;link&lt;span&gt;&amp;lt;/&lt;span&gt;A&lt;/span&gt;&amp;gt;&lt;/span&gt;.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;It wasn’t until &lt;abbr&gt;HTML&lt;/abbr&gt; 2.0 – the first formalised standard – that a proper document structure came into being. A &lt;code&gt;DOCTYPE&lt;/code&gt; declaration to explain a document’s type and to handle compatibility became an expected inclusion, as did head and body sections:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;!DOCTYPE &lt;span&gt;HTML&lt;/span&gt; &lt;span&gt;PUBLIC&lt;/span&gt; &lt;span&gt;"-//IETF//DTD HTML 2.0//EN"&lt;/span&gt;&amp;gt;&lt;/span&gt;

&lt;span&gt;&amp;lt;&lt;span&gt;HEAD&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;span&gt;TITLE&lt;/span&gt;&amp;gt;&lt;/span&gt;HTML document&lt;span&gt;&amp;lt;/&lt;span&gt;TITLE&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;span&gt;HEAD&lt;/span&gt;&amp;gt;&lt;/span&gt;

&lt;span&gt;&amp;lt;&lt;span&gt;BODY&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;span&gt;H1&lt;/span&gt;&amp;gt;&lt;/span&gt;Heading&lt;span&gt;&amp;lt;/&lt;span&gt;H1&lt;/span&gt;&amp;gt;&lt;/span&gt;
    &lt;span&gt;&amp;lt;&lt;span&gt;P&lt;/span&gt;&amp;gt;&lt;/span&gt;This is a document.
&lt;span&gt;&amp;lt;/&lt;span&gt;BODY&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;In the years since &lt;abbr&gt;HTML&lt;/abbr&gt; 2.0’s 1995 debut, the web has changed massively. However, there is a saying in the web standards world: &lt;em&gt;‘Don’t Break The Web’&lt;/em&gt;. There are some exceptions, but on the whole a website developed at the web’s inception should work in a modern browser, regardless of how much time has passed. To keep this compatibility, however, risks making changes impossible for fret of breaking existing sites.&lt;/p&gt;
&lt;p&gt;One way the web combats this is with certain elements that are expected in &lt;abbr&gt;HTML&lt;/abbr&gt; documents. If the element is present, then it uses the new functionality. If not, it simply falls back to the old functionality. Pair that with what different integrations and systems across the web expect, and it means that there is rather a lot of ‘boilerplate’ – code that is repeated across almost every new or maintained site. &lt;abbr&gt;HTML&lt;/abbr&gt; boilerplate commonly both opts in to modern functionality and also sets site preferences and details. Assorted things such as how the site should embed on social media, what styles should be loaded, how the browser should theme surrounding the site, and other such details.&lt;/p&gt;
&lt;h2 id="boilerplate"&gt;Boilerplate&lt;/h2&gt;
&lt;p&gt;Much like &lt;a href="https://vale.rocks/posts/css-reset"&gt;I maintain my own &lt;abbr&gt;CSS&lt;/abbr&gt; reset&lt;/a&gt;, which provides me a clean slate for my styles, I maintain my own boilerplate, which I use as a base structure and reference when creating &lt;abbr&gt;HTML&lt;/abbr&gt; documents. Much like my &lt;abbr&gt;CSS&lt;/abbr&gt; reset, it is very opinionated. Here it is in full:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;!doctype &lt;span&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;html&lt;/span&gt; &lt;span&gt;lang&lt;/span&gt;=&lt;span&gt;"en"&lt;/span&gt;&amp;gt;&lt;/span&gt;
	&lt;span&gt;&amp;lt;&lt;span&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;charset&lt;/span&gt;=&lt;span&gt;"UTF-8"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"viewport"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"width=device-width"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"text-scale"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"scale"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;Name of Page | Name of Website&lt;span&gt;&amp;lt;/&lt;span&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"stylesheet"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/styles.css"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"preload"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"font.woff2"&lt;/span&gt; &lt;span&gt;as&lt;/span&gt;=&lt;span&gt;"font"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"font/woff2"&lt;/span&gt; &lt;span&gt;crossorigin&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:title"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Name of Page"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"description"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Description of this page."&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:description"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Description of this page for embeds."&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"icon"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"image/svg+xml"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"https://example.com/favicon.svg"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"https://example.com/embed-image.webp"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:alt"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"A picture of something."&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:type"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"image/webp"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:width"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"1200"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:height"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"630"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"canonical"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"https://example.com/page"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:url"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"https://example.com/page"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:site_name"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Website Name"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"author"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"A N Other"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"color-scheme"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"light dark"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"theme-color"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"red"&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;"(prefers-color-scheme: light)"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"theme-color"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"green"&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;"(prefers-color-scheme: dark)"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"alternate"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"application/rss+xml"&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;"RSS feed of posts on Website Name."&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/posts/feed.xml"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"alternate"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"application/feed+json"&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;"JSON feed of posts on Website Name."&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/posts/feed.json"&lt;/span&gt;&amp;gt;&lt;/span&gt;

		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"search"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"application/opensearchdescription+xml"&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;"Website Search"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"https://example.com/opensearch.xml"&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"manifest"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/app.webmanifest"&lt;/span&gt;&amp;gt;&lt;/span&gt;
	&lt;span&gt;&amp;lt;/&lt;span&gt;head&lt;/span&gt;&amp;gt;&lt;/span&gt;

	&lt;span&gt;&amp;lt;&lt;span&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;header&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;header&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;main&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;=&lt;span&gt;"main"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;main&lt;/span&gt;&amp;gt;&lt;/span&gt;
		&lt;span&gt;&amp;lt;&lt;span&gt;footer&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;=&lt;span&gt;"footer"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;footer&lt;/span&gt;&amp;gt;&lt;/span&gt;
	&lt;span&gt;&amp;lt;/&lt;span&gt;body&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;/&lt;span&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="breakdown"&gt;Breakdown&lt;/h2&gt;
&lt;p&gt;It should be noted that there is order to my &lt;abbr&gt;HTML&lt;/abbr&gt; boilerplate. The order of the document head in particular has great influence on performance. &lt;a href="https://rviscomi.github.io/capo.js/"&gt;Capo.js&lt;/a&gt; is a brilliant tool for evaluating the order of elements in a document’s head from a performance perspective.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;!doctype &lt;span&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This is the document type declaration for the living &lt;abbr&gt;HTML&lt;/abbr&gt; standard, as introduced in &lt;abbr&gt;HTML&lt;/abbr&gt; 5. I always include it to avoid falling into quirks mode.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;html&lt;/span&gt; &lt;span&gt;lang&lt;/span&gt;=&lt;span&gt;"en"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;html&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Opens the &lt;code&gt;html&lt;/code&gt; tag which wraps the document and defines the document language using an &lt;a href="https://www.rfc-editor.org/info/rfc5646/"&gt;&lt;abbr&gt;RFC&lt;/abbr&gt; 5646&lt;/a&gt; compliant tag with the &lt;code&gt;lang&lt;/code&gt; attribute. The language provided the default for the full page and can be overwritten on a per-element basis. Providing the language is important for automatic translation, typography such as hyphens, and for assistive technologies (especially screen readers).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;charset&lt;/span&gt;=&lt;span&gt;"UTF-8"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The first element I place in the &lt;code&gt;head&lt;/code&gt; is always the &lt;code&gt;charset&lt;/code&gt; &lt;code&gt;meta&lt;/code&gt; tag with a value of &lt;code&gt;UTF-8&lt;/code&gt;, which is the only valid encoding as of &lt;abbr&gt;HTML&lt;/abbr&gt; 5. It is always top of the &lt;code&gt;head&lt;/code&gt;, as it must occur within the first 1024 bytes of a document, and it should be before any elements liable to get mangled.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"viewport"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"width=device-width"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;When the first iPhone launched in 2007, it rendered desktop sites with the expectation of the user to zoom in and pan around. Apple introduced the above &lt;code&gt;meta&lt;/code&gt; tag for sites that were actually optimised for mobile, and it was eventually picked up more widely across browsers such that now it is supported widely to make a site responsive.&lt;/p&gt;
&lt;p&gt;Many people will include &lt;code&gt;initial-scale=1&lt;/code&gt;, however, after extensive testing and research, I’ve identified that &lt;a href="https://vale.rocks/micros/20260902-1350"&gt;it isn’t necessary to include any more&lt;/a&gt;. It can be included to change the page’s presentation if an element horizontally expands beyond the viewport width, but that should never be allowed to happen &lt;a href="https://vale.rocks/micros/20260908-1315"&gt;and I advise against it&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;minimum-scale&lt;/code&gt;, &lt;code&gt;maximum-scale&lt;/code&gt;, and &lt;code&gt;user-scalable&lt;/code&gt; all greatly harm accessibility and should never&lt;sup&gt;&lt;a id="footnote-ref-1" href="#footnote-1" data-footnote-ref aria-describedby="footnote-label"&gt;1&lt;/a&gt;&lt;/sup&gt; be used. They should generally be stripped from sites whenever noticed.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"text-scale"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"scale"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Makes text &lt;a href="https://matuzo.at/blog/2026/text-scaling-meta-tag"&gt;scale in accordance with the system setting&lt;/a&gt;. If this tag is present, then a page’s styles must expect it and be written accordingly. This is especially important to avoid accessibility pitfalls with content scaling.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;Name of Page | Name of Website&lt;span&gt;&amp;lt;/&lt;span&gt;title&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The title of the page. It is a required value which is shown on many surfaces. It is used as the name of the page when bookmarked, the name of the tab in search engines, and anywhere else a name for the page is needed. I’ll generally show the page title followed by the site’s title.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"stylesheet"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/styles.css"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Whatever styles must be imported can be imported here. Styles should generally be imported in the page head rather than using the &lt;code&gt;@import&lt;/code&gt; &lt;abbr&gt;CSS&lt;/abbr&gt; at-rule within a stylesheet to avoid a waterfall, where the stylesheet must first be fetched to then fetch additional stylesheets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"preload"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"font.woff2"&lt;/span&gt; &lt;span&gt;as&lt;/span&gt;=&lt;span&gt;"font"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"font/woff2"&lt;/span&gt; &lt;span&gt;crossorigin&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Complex variable fonts can be rather large in size, even after subletting and other optimisations, so I preload fonts that I know will be used on the page. Even if a font is located on the same-origin, &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/preload#cors-enabled_fetches"&gt;the &lt;code&gt;crossorigin&lt;/code&gt; attribute is still necessary&lt;/a&gt;. I always serve fonts as &lt;abbr title="Web Open Font Format"&gt;WOFF&lt;/abbr&gt;2, as it is the most performant widely supported font format.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:title"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Name of Page"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;og:title&lt;/code&gt; is used for embeds, such as those seen on social media. It is one of the many metadata values of &lt;a href="https://ogp.me"&gt;the Open Graph protocol&lt;/a&gt;. While I’ll typically include the site name at the end of the &lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt; element, I leave it absent in the &lt;code&gt;og:title&lt;/code&gt;. In the majority of cases embeds will show the domain or &lt;code&gt;og:site_name&lt;/code&gt; next to the title, rendering it a duplicate.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"description"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Description of this page."&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I mainly treat this meta description field as an exercise in search engine optimisation. Previously major search engines would expose the description to users on search pages, however they mostly fetch directly from the document itself now.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:description"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Description of this page for embeds."&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;og:description&lt;/code&gt; is sometimes shown in embeds. If absent, embeds usually forgo a description or fall back to the meta description. I like to write short, often quippy content here that strikes intrigue and fits in social media or chat feeds.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"icon"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"image/svg+xml"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"https://example.com/favicon.svg"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A favicon is an important bit of branding for all websites – especially when it comes to identifying tabs when you have many open. I serve favicons as &lt;abbr&gt;SVG&lt;/abbr&gt;s, as they’re &lt;a href="https://caniuse.com/link-icon-svg"&gt;well supported&lt;/a&gt;, can be made to dynamically adapt to light/dark mode, look good at all sizes, and remove the need for maintaining a set of raster favicons in different sizes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"https://example.com/embed-image.webp"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:alt"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"A picture of something."&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:type"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"image/webp"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:width"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"1200"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:image:height"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"630"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The image defined in the &lt;code&gt;og:image&lt;/code&gt; is often shown in a site’s embed on the likes of social media or chat platforms. It is advantageous to include on almost every site, as it adds context and usually increases an embed’s size for better presence. Support for alt text on embedded images is middling, so it shouldn’t be relied upon. Some sites support it, some ignore it, and some support it in odd ways. I make the effort to include it but keep it brief. 1200px by 630px is a widely supported size, and WebP is the best supported of the modern image formats I’ve tested.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"canonical"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"https://example.com/page"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:url"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"https://example.com/page"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A canonical link to the authoritative version of the page is important for indicating what should be considered the source of truth. This is especially important if content is duplicated.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;property&lt;/span&gt;=&lt;span&gt;"og:site_name"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"Website Name"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The name of the website to be shown in embeds. As aforementioned, some embeds will show this name near the page’s title.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"author"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"A N Other"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;The &lt;code&gt;author&lt;/code&gt; tag obviously indicates the author of a page. It isn’t strictly necessary but is useful for developers to identify who is responsible for a page.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"color-scheme"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"light dark"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Setting the &lt;code&gt;color-scheme&lt;/code&gt; meta tag with a content attribute value of &lt;code&gt;light dark&lt;/code&gt; tells the browser that a site supports both light and dark modes. Having it defined in the head prevents a Flash of Unstyled Content (&lt;abbr&gt;FOUC&lt;/abbr&gt;), such as a screen of bright white when the site and browser are set to dark mode.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"theme-color"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"red"&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;"(prefers-color-scheme: light)"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;meta&lt;/span&gt; &lt;span&gt;name&lt;/span&gt;=&lt;span&gt;"theme-color"&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;"green"&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;"(prefers-color-scheme: dark)"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Used for theming the browser chrome of sites installed as progressive web apps (&lt;abbr&gt;PWA&lt;/abbr&gt;s) and for theming the browser chrome in Chrome for Android (but only in light mode). Some other browsers also interpret these values in various ways. I use the media attribute to set the colour independently for both light and dark modes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"alternate"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"application/rss+xml"&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;"RSS feed of posts on Website Name."&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/posts/feed.xml"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"alternate"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"application/feed+json"&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;"JSON feed of posts on Website Name."&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/posts/feed.json"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If a site has syndication feeds, then including these in the head &lt;a href="https://piccalil.li/blog/a-quick-guide-to-creating-syndication-feeds/#auto-discovery"&gt;permits autodiscovery of them&lt;/a&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"search"&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;"application/opensearchdescription+xml"&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;"Website Search"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"https://example.com/opensearch.xml"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;If a site has integrated search functionality, then establishing an &lt;a href="https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md"&gt;opensearch.xml&lt;/a&gt; file and referencing it from your document head exposes it to browsers so they can provide a rich searching experience. The exact experience differs by browser, but in many cases it allows searching with a site via the browser’s own address bar and also provides a simple way to add a search engine.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;link&lt;/span&gt; &lt;span&gt;rel&lt;/span&gt;=&lt;span&gt;"manifest"&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;"/app.webmanifest"&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;I’m a progressive web app evangelist. I love them, and many sites benefit from being &lt;abbr&gt;PWA&lt;/abbr&gt;s, even if a site is not a typical ‘app’. I’ll &lt;a href="https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest"&gt;define a manifest&lt;/a&gt; for most sites even if the only benefit is that the presentation is nicer if people add the site to their homescreen. This declaration helps browsers discover the manifest.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;span&gt;&amp;lt;&lt;span&gt;header&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;span&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;nav&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;header&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;main&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;=&lt;span&gt;"main"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;main&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;span&gt;&amp;lt;&lt;span&gt;footer&lt;/span&gt; &lt;span&gt;id&lt;/span&gt;=&lt;span&gt;"footer"&lt;/span&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;span&gt;footer&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;This defines any site’s general &lt;code&gt;body&lt;/code&gt; structure. The &lt;code&gt;header&lt;/code&gt; holds a navigation element for general site navigation. The &lt;code&gt;main&lt;/code&gt; holds the primary page content and has an &lt;code&gt;id&lt;/code&gt; attribute to provide an anchor, which is important for ‘skip to’ links. The &lt;code&gt;footer&lt;/code&gt; holds information about the current site and page. Like &lt;code&gt;main&lt;/code&gt;, I give it an &lt;code&gt;id&lt;/code&gt; for anchoring purposes. I don’t get any more detailed with my &lt;abbr&gt;HTML&lt;/abbr&gt; body boilerplate, as there is so much variance depending on the site.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is just boilerplate. It is a template for what I’ll include on roughly every site, with some light alterations. Every site is sure to deviate from this depending on its requirements, but this is a reasonable foundation.&lt;/p&gt;
&lt;p&gt;If a page is expected to be cited academically, then you’d consider including Google Scholar’s &lt;code&gt;citation_*&lt;/code&gt; meta tags and &lt;a href="https://www.dublincore.org/specifications/dublin-core/"&gt;Dublin Core&lt;/a&gt;’s &lt;code&gt;dc&lt;/code&gt; meta tags. If a page represents an article, then you’d include the tags from the Open Graph Protocol’s &lt;a href="https://ogp.me/#type_article"&gt;article namespace&lt;/a&gt; and perhaps tags pertaining to a publishing system. A video, audio, book, or other content type would similarly be marked up differently. Many sites will also benefit from &lt;a href="https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data"&gt;&lt;code&gt;JSON-LD&lt;/code&gt; structured data&lt;/a&gt;. It all depends on the particular page and what is needed.&lt;/p&gt;
&lt;p&gt;For a larger boilerplate that outlines some more optional inclusions, I recommend Manuel Matuzović’s brilliant article, &lt;a href="https://matuzo.at/blog/2026/html-boilerplate"&gt;My &lt;abbr&gt;HTML&lt;/abbr&gt; boilerplate in 2026&lt;/a&gt;.&lt;/p&gt;
&lt;section data-footnotes&gt;

&lt;ol&gt;
&lt;li id="footnote-1"&gt;
&lt;p&gt;There are cases where they can be used, but you’ll know those extremely rare cases when you come to them. Take great and extreme care. &lt;a href="#footnote-ref-1" data-footnote-backref aria-label="Back to reference 1"&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;

				&lt;/div&gt;</description>
            <pubDate>Fri, 11 Sep 2026 05:41:29 +0000</pubDate>
            <guid>https://vale.rocks/posts/html-boilerplate</guid>
        </item>
        <item>
            <title>Index of Aesthetics</title>
            <link>https://cari.institute/aesthetics</link>
            <description>&lt;blockquote&gt;&lt;hr&gt;&lt;/blockquote&gt;&lt;div id="filtersFieldset"&gt;
          &lt;legend&gt;Search and filter by...&lt;/legend&gt;

          &lt;p&gt;&lt;label for="keyword"&gt;Keyword&lt;/label&gt;
            
          &lt;/p&gt;

          &lt;div id="startEraFilter"&gt;
  &lt;p&gt;&lt;label for="startEraBound"&gt;Earliest Known Example&lt;/label&gt;&lt;/p&gt;&lt;div&gt;
    
    &lt;p&gt;&lt;label for="startEraSpecifier1"&gt;and&lt;/label&gt;
      
      
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
          
          &lt;div id="endEraFilter"&gt;
  &lt;p&gt;&lt;label for="endEraBound"&gt;End of Popularity&lt;/label&gt;&lt;/p&gt;&lt;div&gt;
    
    &lt;p&gt;&lt;label for="endEraSpecifier1"&gt;and&lt;/label&gt;
      
      
    &lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;
          

          &lt;p&gt;&lt;label for="decade"&gt;
              Relevant Decade
              &lt;abbr title="The decade that an aesthetic was most prevalent in, regardless of the year of its earliest known example or end of popularity. For example, Radical Surrealism originated in the 1960s, but its relevant decade is 1970."&gt;
                &lt;i&gt;&lt;/i&gt;
              &lt;/abbr&gt;
            &lt;/label&gt;
            
          &lt;/p&gt;
        &lt;/div&gt;</description>
            <pubDate>Sat, 22 Aug 2026 21:45:24 +0000</pubDate>
            <guid>https://cari.institute/aesthetics</guid>
        </item>
        <item>
            <title>On the frustration of agreeing with everyone about AI</title>
            <link>https://www.flourish.org/2026/06/agree-everyone-ai/</link>
            <description>&lt;blockquote&gt;&lt;hr&gt;&lt;/blockquote&gt;&lt;article id="post-agree-everyone-ai" data-pagefind-body&gt;
  

  &lt;div&gt;
    &lt;p&gt;Conversations about AI are febrile and have been for a while now. Everyone has different views.&lt;/p&gt;
&lt;p&gt;It’s frustrating for me because not only do I empathise with all of you, in some ways I
have every major position in my mind.&lt;/p&gt;
&lt;p&gt;I find myself impossible, messed up. Niller-nally, retwixt, fragmented.&lt;/p&gt;
&lt;h3 id="i-agree-with-the-accelerationists"&gt;I agree with the accelerationists&lt;/h3&gt;
&lt;p&gt;I briefly used an open source agentic programming tool with &lt;a href="https://www.cerebras.ai/"&gt;1000 tokens/second&lt;/a&gt;
of a top Chinese model. It was like a drug pumped straight into my veins. I worked on
&lt;a href="https://creatures.wiki/Francis_Irving"&gt;artificial life&lt;/a&gt; 27 years ago - we were trying to
do the same at CyberLife, just much earlier. Creation can be beautiful, and helpful, warm and
purposeful. There’s diseases to cure, climate models to optimise, software to make perfect
for each person.&lt;/p&gt;
&lt;h3 id="i-agree-with-the-artists"&gt;I agree with the artists&lt;/h3&gt;
&lt;p&gt;Our work has all been stolen, and remixed into a bland slop of the world’s cultural
heritage. I’m more radical here than nearly anyone - I think
&lt;a href="https://arxiv.org/abs/2407.13493"&gt;model weights are a derived work&lt;/a&gt;
of every bit of content they’re trained on. Power is winning, not rules. Because power
wins. We can’t keep human emotion in art without a relentless disavowal of AI-generated
art. Every single nuance needs editing, curating. I care about human emotion in art.&lt;/p&gt;
&lt;h3 id="i-agree-with-the-nationalists"&gt;I agree with the nationalists&lt;/h3&gt;
&lt;p&gt;I watched the US administration &lt;a href="https://www.anthropic.com/news/fable-mythos-access"&gt;suddenly declare&lt;/a&gt;
that a powerful new model is available only to US citizens.  It turned my stomach.
My empathy runs high when the European Commission responds that
Europe needs &lt;a href="https://www.reuters.com/legal/litigation/eu-commission-looking-practical-consequences-anthropic-decision-spokesperson-2026-06-14/"&gt;“technological sovereignty”&lt;/a&gt; in AI. It’s a race.&lt;/p&gt;
&lt;h3 id="i-agree-with-the-doomers"&gt;I agree with the doomers&lt;/h3&gt;
&lt;p&gt;I look at &lt;a href="https://pauseai.uk/"&gt;PauseAI&lt;/a&gt; and think… Yep, this technology can
cause harm. &lt;em&gt;Existential&lt;/em&gt; harm - if not with with current architectures as they scale,
then at some point in the next decade or next century with another technology.  It is
necessary to regulate it, to sign international treaties. It’s nukes but accelerated not
only by Government dominance, but also by business value.&lt;/p&gt;
&lt;h3 id="i-agree-with-the-openness-freaks"&gt;I agree with the openness freaks&lt;/h3&gt;
&lt;p&gt;I’ve loved open source software &lt;a href="https://www.flourish.org/webmask/about.html"&gt;since 1997&lt;/a&gt;. So when
I see an argument that &lt;a href="https://rbren.substack.com/p/banning-open-weight-models-would"&gt;open models level the playing field&lt;/a&gt;,
I’ve already watched it play out with software, and despite the problems, I agree. As the models work better and
better, it is worse and worse that we’re locked into a limited set of providers, that
power accumulates with the few.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;(I guess I don’t really agree with people opposed to data centres because of water or power
use - as that seems solvable with the right infrastructure. And the other issues dominate
those proximate questions, however much of an environmentalist I am. There are stronger
reasons to oppose data centres.)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id="-breathe-"&gt;… breathe …&lt;/h3&gt;
&lt;p&gt;Yes that all contradicts. It fragments. Open models is the worst for doom, AI sovereignty
is the opposite of a pause, protecting artists’ works blocks acceleration. Nothing
functions.&lt;/p&gt;
&lt;p&gt;Why am I this splinter of contradictions?&lt;/p&gt;
&lt;p&gt;Because all the arguments are right, but which is right the most depends on what happens.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;If we’re at the &lt;strong&gt;top of the S-curve and AI capability stalls&lt;/strong&gt; with a few more 10%
improvements that cost 2x the amount… Then yes let’s roll it out, let’s make it open
for everyone, and regulate the mundane risks, remove all the problems, gain all the
benefits. Can’t stop capitalism, can get it right.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If AI gets &lt;strong&gt;vastly more capable&lt;/strong&gt;, but somehow without its own “will to power”, then I want
to be in a large empire which controls its use for my benefit. The consequences for
defense are mind-collapsing, unthinkable. The military acceleration unbearable. But what
happens if instead you opt out? It’s bad.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;If AI not only gets more powerful, but &lt;strong&gt;we lose control&lt;/strong&gt;, these alien minds start acting
at scale and in a way we lose collective and individual control of. It spreads, either an
inert cancer growing through our civilisation eating it up, or a willful Cthulhu monster
carelessly and deliberately breaking everything apart.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;And nobody knows what is going to happen.&lt;/p&gt;
&lt;p&gt;I’m kind of tired, agreeing and disagreeing simultaneously with every post on the topic.&lt;/p&gt;
&lt;p&gt;Frozen.&lt;/p&gt;
&lt;p&gt;I guess I’ll &lt;a href="https://pauseai.uk/campaigns"&gt;email my MP&lt;/a&gt; about holding AI developers
liable for severe harm. That seems a good next step.&lt;/p&gt;

  &lt;/div&gt;
&lt;/article&gt;</description>
            <pubDate>Fri, 21 Aug 2026 08:47:03 +0000</pubDate>
            <guid>https://www.flourish.org/2026/06/agree-everyone-ai/</guid>
        </item>
    </channel>
</rss>