<?xml version="1.0" encoding="UTF-8"?>
<!-- generator="FeedCreator 1.8" -->
<rss version="2.0">
    <channel xmlns:g="http://base.google.com/ns/1.0">
        <title>Linkblog</title>
        <description></description>
        <link></link>
        <lastBuildDate>Mon, 26 Oct 2026 04:07:41 +0000</lastBuildDate>
        <generator>FeedCreator 1.8</generator>
        <item>
            <title>A Long Day for PHP Admins</title>
            <link>https://www.cosmocode.de/en/blog/agoh/20261022-busy_day_php/</link>
            <description>&lt;p&gt;Yesterday, two critical security vulnerabilities in PHP dubbed “php2shell” were publicly disclosed: &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-109618&quot;&gt;CVE-2026-109618&lt;/a&gt; and &lt;a href=&quot;https://www.cve.org/CVERecord?id=CVE-2026-109619&quot;&gt;CVE-2026-109619&lt;/a&gt;. Both could allow attackers to execute code on vulnerable servers without authentication. With no reliable mitigation available other than updating PHP, we &lt;a href=&quot;https://www.cosmocode.de/en/services/wiki/dokuwiki-newsletter/2026-10-21/&quot;&gt;made the decision&lt;/a&gt; to temporarily take all our and our customers’ hosted services offline as a precaution.&lt;/p&gt;
&lt;p&gt;Now, a day later, it’s time to reflect and see what we learned.&lt;/p&gt;
&lt;h2&gt;CosmoCode Services are back up&lt;/h2&gt;
&lt;p&gt;All the PHP services, including the wikis we host, are back up and running the new PHP versions released yesterday.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&quot;https://www.php.net/archive/2026.php#2026-10-21-5&quot;&gt;official PHP security advisory&lt;/a&gt; with details was released at 14:00 UTC. With it, new PHP versions were made available.&lt;/p&gt;
&lt;p&gt;Updated PHP packages for Debian (our preferred Linux distribution) followed shortly after, and we began updating and restarting the first services.&lt;/p&gt;
&lt;p&gt;The official Docker packages took a couple of hours to arrive at Docker Hub. About 20 minutes later, new &lt;a href=&quot;https://phpc.social/@dokuwiki/117480041721472926&quot;&gt;DokuWiki Docker images were released&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Around 19:30 UTC (21:30 German time), all our systems were back to normal.&lt;/p&gt;
&lt;p&gt;I want to thank my colleagues Karsten and Tilo, who worked with me until such a late hour. I also want to thank the many, mostly unpaid volunteers, in the involved Open-Source communities making this quick turnaround possible!&lt;/p&gt;
&lt;h2&gt;Was it necessary?&lt;/h2&gt;
&lt;p&gt;As always, when a catastrophe has been prevented, the question arises whether there would actually have been one in the first place.&lt;/p&gt;
&lt;p&gt;When the first information about the vulnerability came out, no concrete details were known. It was not clear whether any mitigation was available, and the only information we had was a &lt;a href=&quot;https://phpc.social/@Girgias/117476477429221001&quot;&gt;Mastodon post&lt;/a&gt; by PHP core developer Gina Peter Banyard:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The only thing I can say is that the only mitigation is patching / upgrading PHP. I sadly know too much.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At the same time, Cloudflare reported that they had seen and blocked patterns that looked like attempts to exploit the vulnerability (or what little was known about it) at the time. It seemed that at least parts of the vulnerability were already known and were being actively exploited.&lt;/p&gt;
&lt;p&gt;This is why we decided on the drastic measure of taking the services offline. We were not alone in that assessment, and many other small and large organizations followed suit during the day.&lt;/p&gt;
&lt;p&gt;With the full details now known, it seems that actually exploiting the vulnerability is a bit more difficult than initially assumed. So the big wave of automated break-ins that was feared most has not materialized yet. Nonetheless, we are already seeing probing attempts for the CVEs in our CrowdSec web application firewall logs.&lt;/p&gt;
&lt;h2&gt;Will it happen again?&lt;/h2&gt;
&lt;p&gt;The &lt;a href=&quot;https://thephp.foundation/blog/2026/10/21/todays-php-security-release-and-how-were-strengthening-php-security/&quot;&gt;PHP Foundation’s write-up on the issue&lt;/a&gt; is a good read. Basically, the threat was vaguely known for a long time, but it was difficult to assess whether and how it could be exploited at all, especially with the limited resources available to an open-source project.&lt;/p&gt;
&lt;p&gt;AI is changing the landscape here. All Internet-facing software is under constant scrutiny now. AI labs are spending trillions of tokens to proudly proclaim that they were the ones who found a serious vulnerability and thus made the net “safer”. Which is both true and false at the same time.&lt;/p&gt;
&lt;p&gt;AI is also giving attackers a new tool to exploit known vulnerabilities, beyond their own skills. Trying to keep issues under wraps and coordinate disclosure, as we saw yesterday, is becoming harder and harder. Even yesterday’s release was already a deviation from the original release plan, because knowledge of the issue had leaked during the embargo. And often the rumor of a vulnerability is now enough to have LLMs reproduce it independently and generate working exploits.&lt;/p&gt;
&lt;p&gt;So more serious vulnerabilities will be found, and the notice periods may become even shorter. Drastic measures like the ones we saw yesterday might very well become more common.&lt;/p&gt;
&lt;h2&gt;What is CosmoCode doing?&lt;/h2&gt;
&lt;p&gt;With this new reality, we need to be prepared for next time. Luckily, we have been improving our infrastructure management over the last couple of years, moving most of our services to a Kubernetes cluster managed by us. This new infrastructure proved invaluable for the fast reactions and updates we were able to deliver yesterday.&lt;/p&gt;
&lt;p&gt;But we also learned a few lessons:&lt;/p&gt;
&lt;p&gt;Not all our updates in the cluster were as frictionless as we would have liked, and we might need to improve the way we can quickly identify all services running a specific technology. This could be a programming language, as was the case yesterday, or a specific library or framework in the future. There are also some legacy systems left that should be migrated.&lt;/p&gt;
&lt;p&gt;We also need to improve our processes for quickly notifying affected customers. For our &lt;a href=&quot;https://www.cosmocode.de/en/services/wiki/dokuwiki-hosting/&quot;&gt;wiki customers&lt;/a&gt;, it was easiest for me to quickly send a newsletter.With the added benefit that this also informed those whose wikis we’re not hosting. But others had to be contacted individually.&lt;/p&gt;
&lt;p&gt;If you need help preparing for the next security incident or have other technical challenges, feel free to get in touch with us. We’re happy to discuss how we can help.&lt;/p&gt;</description>
            <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate>
            <guid>https://www.cosmocode.de/en/blog/agoh/20261022-busy_day_php/</guid>
        </item>
        <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=&quot;https://www.cosmocode.de/_astro/james_de_web.C9N5VykH.mp4&quot; poster=&quot;https://www.cosmocode.de/_astro/james_de_poster.Dm0Kvjep.jpg&quot; width=&quot;1920&quot; height=&quot;1080&quot; controls preload=&quot;none&quot;&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=&quot;CenterAlign&quot;&gt; &amp;lt;p&amp;gt;&amp;lt;img src=&quot;/_astro/james-chart.CG5XxqFf_1umKgd.webp&quot; alt=&quot;James zeigt die Neuanmeldungen pro Monat und Region als Balkendiagramm&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;560&quot; height=&quot;820&quot;&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=&quot;CenterAlign&quot;&gt; &amp;lt;p&amp;gt;&amp;lt;img src=&quot;/_astro/james-diagram.CNp1yQmG_28R5wv.webp&quot; alt=&quot;James zeigt den Ablauf einer Bestellung vom Warenkorb bis zum Versand als Diagramm&quot; loading=&quot;lazy&quot; decoding=&quot;async&quot; width=&quot;560&quot; height=&quot;1180&quot;&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 &quot;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;&quot;https://example.com/&quot;&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;&quot;-//IETF//DTD HTML 2.0//EN&quot;&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=&quot;boilerplate&quot;&gt;Boilerplate&lt;/h2&gt;
&lt;p&gt;Much like &lt;a href=&quot;https://vale.rocks/posts/css-reset&quot;&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;&quot;en&quot;&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;&quot;UTF-8&quot;&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;&quot;viewport&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;width=device-width&quot;&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;&quot;text-scale&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;scale&quot;&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;&quot;stylesheet&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/styles.css&quot;&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;&quot;preload&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;font.woff2&quot;&lt;/span&gt; &lt;span&gt;as&lt;/span&gt;=&lt;span&gt;&quot;font&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;font/woff2&quot;&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;&quot;og:title&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Name of Page&quot;&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;&quot;description&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Description of this page.&quot;&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;&quot;og:description&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Description of this page for embeds.&quot;&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;&quot;icon&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;image/svg+xml&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/favicon.svg&quot;&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;&quot;og:image&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/embed-image.webp&quot;&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;&quot;og:image:alt&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;A picture of something.&quot;&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;&quot;og:image:type&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;image/webp&quot;&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;&quot;og:image:width&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;1200&quot;&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;&quot;og:image:height&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;630&quot;&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;&quot;canonical&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/page&quot;&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;&quot;og:url&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/page&quot;&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;&quot;og:site_name&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Website Name&quot;&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;&quot;author&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;A N Other&quot;&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;&quot;color-scheme&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;light dark&quot;&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;&quot;theme-color&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;red&quot;&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;&quot;(prefers-color-scheme: light)&quot;&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;&quot;theme-color&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;green&quot;&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;&quot;(prefers-color-scheme: dark)&quot;&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;&quot;alternate&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;application/rss+xml&quot;&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;&quot;RSS feed of posts on Website Name.&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/posts/feed.xml&quot;&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;&quot;alternate&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;application/feed+json&quot;&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;&quot;JSON feed of posts on Website Name.&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/posts/feed.json&quot;&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;&quot;search&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;application/opensearchdescription+xml&quot;&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;&quot;Website Search&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/opensearch.xml&quot;&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;&quot;manifest&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/app.webmanifest&quot;&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;&quot;main&quot;&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;&quot;footer&quot;&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=&quot;breakdown&quot;&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=&quot;https://rviscomi.github.io/capo.js/&quot;&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;&quot;en&quot;&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=&quot;https://www.rfc-editor.org/info/rfc5646/&quot;&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;&quot;UTF-8&quot;&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;&quot;viewport&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;width=device-width&quot;&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=&quot;https://vale.rocks/micros/20260902-1350&quot;&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=&quot;https://vale.rocks/micros/20260908-1315&quot;&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=&quot;footnote-ref-1&quot; href=&quot;#footnote-1&quot; data-footnote-ref aria-describedby=&quot;footnote-label&quot;&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;&quot;text-scale&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;scale&quot;&lt;/span&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Makes text &lt;a href=&quot;https://matuzo.at/blog/2026/text-scaling-meta-tag&quot;&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;&quot;stylesheet&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/styles.css&quot;&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;&quot;preload&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;font.woff2&quot;&lt;/span&gt; &lt;span&gt;as&lt;/span&gt;=&lt;span&gt;&quot;font&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;font/woff2&quot;&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=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Reference/Attributes/rel/preload#cors-enabled_fetches&quot;&gt;the &lt;code&gt;crossorigin&lt;/code&gt; attribute is still necessary&lt;/a&gt;. I always serve fonts as &lt;abbr title=&quot;Web Open Font Format&quot;&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;&quot;og:title&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Name of Page&quot;&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=&quot;https://ogp.me&quot;&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;&quot;description&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Description of this page.&quot;&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;&quot;og:description&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Description of this page for embeds.&quot;&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;&quot;icon&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;image/svg+xml&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/favicon.svg&quot;&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=&quot;https://caniuse.com/link-icon-svg&quot;&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;&quot;og:image&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/embed-image.webp&quot;&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;&quot;og:image:alt&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;A picture of something.&quot;&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;&quot;og:image:type&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;image/webp&quot;&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;&quot;og:image:width&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;1200&quot;&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;&quot;og:image:height&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;630&quot;&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;&quot;canonical&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/page&quot;&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;&quot;og:url&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/page&quot;&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;&quot;og:site_name&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;Website Name&quot;&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;&quot;author&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;A N Other&quot;&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;&quot;color-scheme&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;light dark&quot;&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;&quot;theme-color&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;red&quot;&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;&quot;(prefers-color-scheme: light)&quot;&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;&quot;theme-color&quot;&lt;/span&gt; &lt;span&gt;content&lt;/span&gt;=&lt;span&gt;&quot;green&quot;&lt;/span&gt; &lt;span&gt;media&lt;/span&gt;=&lt;span&gt;&quot;(prefers-color-scheme: dark)&quot;&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;&quot;alternate&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;application/rss+xml&quot;&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;&quot;RSS feed of posts on Website Name.&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/posts/feed.xml&quot;&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;&quot;alternate&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;application/feed+json&quot;&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;&quot;JSON feed of posts on Website Name.&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/posts/feed.json&quot;&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=&quot;https://piccalil.li/blog/a-quick-guide-to-creating-syndication-feeds/#auto-discovery&quot;&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;&quot;search&quot;&lt;/span&gt; &lt;span&gt;type&lt;/span&gt;=&lt;span&gt;&quot;application/opensearchdescription+xml&quot;&lt;/span&gt; &lt;span&gt;title&lt;/span&gt;=&lt;span&gt;&quot;Website Search&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;https://example.com/opensearch.xml&quot;&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=&quot;https://github.com/dewitt/opensearch/blob/master/opensearch-1-1-draft-6.md&quot;&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;&quot;manifest&quot;&lt;/span&gt; &lt;span&gt;href&lt;/span&gt;=&lt;span&gt;&quot;/app.webmanifest&quot;&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=&quot;https://developer.mozilla.org/en-US/docs/Web/Progressive_web_apps/Manifest&quot;&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;&quot;main&quot;&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;&quot;footer&quot;&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=&quot;https://www.dublincore.org/specifications/dublin-core/&quot;&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=&quot;https://ogp.me/#type_article&quot;&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=&quot;https://developers.google.com/search/docs/appearance/structured-data/intro-structured-data&quot;&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=&quot;https://matuzo.at/blog/2026/html-boilerplate&quot;&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=&quot;footnote-1&quot;&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=&quot;#footnote-ref-1&quot; data-footnote-backref aria-label=&quot;Back to reference 1&quot;&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=&quot;filtersFieldset&quot;&gt;
          &lt;legend&gt;Search and filter by...&lt;/legend&gt;

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

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

          &lt;p&gt;&lt;label for=&quot;decade&quot;&gt;
              Relevant Decade
              &lt;abbr title=&quot;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.&quot;&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>
    </channel>
</rss>
