{
  "version": "https://jsonfeed.org/version/1.1",
  "title": "Vale.Rocks Posts",
  "description": "Long form writings about assorted topics.",
  "home_page_url": "https://vale.rocks/posts",
  "feed_url": "https://vale.rocks/posts/feed.json",
  "icon": "https://vale.rocks/assets/favicon.svg",
  "favicon": "https://vale.rocks/assets/favicon.svg",
  "items": [
    {
      "id": "https://vale.rocks/posts/html-relics",
      "url": "https://vale.rocks/posts/html-relics",
      "title": "Antiquated HTML Snippets and Artefacts",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>With ever-changing devices, browsers, operating systems, form factors, specifications, personal preferences, tooling, and corporate interests, the web is in a constant state of flux. As a result, so is the <abbr>HTML</abbr> we write. For every line of the <abbr>HTML</abbr> specification itself that has changed since the language&#8217;s inception, there are many more bits of <abbr>HTML</abbr> that have seen what I&#8217;ll call &#8216;environmental&#8217; changes. Adaptations to differing browsers, extensions, integrations, and systems which we find <abbr>HTML</abbr> existing in.</p>\n<p>This article doesn&#8217;t cover <a href=\"https://www.htmhell.dev/adventcalendar/2025/22/\">once-specced but now obsolete bits of <abbr>HTML</abbr></a> but instead looks at all the snippets that have wormed their way into websites as result of, or in combat against, third-party integrations, browser competition, vendor extensions, and platform-specific hacks. The bits of <abbr>HTML</abbr> that were included for reasons, and which have been forgotten for present irrelevance. The snippets that live on only in the markup of sites from bygone eras and in the minds of those who fought during the browser wars.</p>\n<h2 id=\"x-ua-compatible\">X-UA-Compatible</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;X-UA-Compatible&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;IE=edge&quot;</span>&gt;</span>\n</code></pre><p>In an age where browsers changed quickly and version-specific behaviours weren&#8217;t unheard of, it was deemed necessary to signal compatibility with specific versions of browsers with the <code>X-UA-Compatible</code> meta tag. Here the content attribute reads <code>IE=edge</code>, meaning that the target is the highest supported document mode in Internet Explorer (IE).</p>\n<p>As <a href=\"https://learn.microsoft.com/en-us/openspecs/ie_standards/ms-iedoco/380e2488-f5eb-4457-a07a-0cb1b6e4b4b5\">outlined in the documentation</a>, there are other values than <code>edge</code>. One can also supply a value of <code>5</code> through <code>11</code> to correspond with the associated Internet Explorer version, or <code>EmulateIE7</code> through <code>EmulateIE11</code> to enter into that version&#8217;s mode, but only if a valid <code>DOCTYPE</code> is declared, otherwise falling back to quirks mode.</p>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;X-UA-Compatible&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;chrome=1&quot;</span>&gt;</span>\n</code></pre><p>Before Chrome took over the market, Google released an Internet Explorer plugin called <a href=\"https://en.wikipedia.org/wiki/Google_Chrome_Frame\">Google Chrome Frame</a>. Installable in Internet Explorer versions 6 through 9, it rendered websites in Chrome&#8217;s modified WebKit engine rather than Internet Explorer&#8217;s Trident engine if they had the tag set.</p>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;X-UA-Compatible&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;requiresActiveX=true&quot;</span>&gt;</span>\n</code></pre><p><code>requiresActiveX</code> was used to prompt Internet Explorer 10 to switch to desktop mode if in Metro mode, which didn&#8217;t support plugins.</p>\n<h2 id=\"icbm-coordinate\"><abbr>ICBM</abbr> Coordinate</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;ICBM&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;-31.9548, 115.8602&quot;</span>&gt;</span>\n</code></pre><p><abbr>ICBM</abbr> (an abbreviation of &#8216;intercontinental ballistic missile&#8217;) is hacker slang for one&#8217;s geographical location that dates back to Usenet days. The meta tag was used for identifying the location of a website&#8217;s subject and was referenced by the service <a href=\"https://web.archive.org/web/20060701025123/http://geourl.org/\">GeoURL</a> for plotting sites on the globe and helping people find sites of geographical proximity.</p>\n<h2 id=\"conditional-comments\">Conditional Comments</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-comment\">&lt;!--[if gte IE 6]&gt;\n\t&lt;p&gt;Only shown in Internet Explorer 6 and higher.&lt;/p&gt;\n&lt;![endif]--&gt;</span>\n</code></pre><p>In an era where browsers changed regularly and the vicious browser wars were in full force, it was sometimes important to target a specific browser or version of one. Microsoft handled this in Internet Explorer with specially formatted comments as seen in the snippet. There were a number of operators that could be used to further refine the condition:</p>\n<table>\n<thead>\n<tr>\n<th align=\"center\">Operator</th>\n<th align=\"left\">Description</th>\n</tr>\n</thead>\n<tbody><tr>\n<td align=\"center\"><code>IE</code></td>\n<td align=\"left\">Denotes Internet Explorer. Can also include a version, such as <code>IE 7</code>.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>lt</code></td>\n<td align=\"left\">Less than.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>lte</code></td>\n<td align=\"left\">Less than or equal.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>gt</code></td>\n<td align=\"left\">Greater than.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>gte</code></td>\n<td align=\"left\">Greater than or equal.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>!</code></td>\n<td align=\"left\"><abbr>NOT</abbr>.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>&amp;</code></td>\n<td align=\"left\"><abbr>AND</abbr>.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>|</code></td>\n<td align=\"left\">OR.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>()</code></td>\n<td align=\"left\">Subexpression operator.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>true</code></td>\n<td align=\"left\">Always evaluates to true.</td>\n</tr>\n<tr>\n<td align=\"center\"><code>false</code></td>\n<td align=\"left\">Always evaluates to false.</td>\n</tr>\n</tbody></table>\n<pre><code class=\"language-html\"><span class=\"hljs-comment\">&lt;!-- &amp;{navigator.appName == &#x27;Netscape&#x27;}; \n\t&lt;p&gt;Only shown in Netscape.&lt;/p&gt;\n--&gt;</span>\n\n<span class=\"hljs-comment\">&lt;!--&amp;{navigator.platform == &#x27;win95&#x27;};\n    &lt;p&gt;Only shown in Netscape on Windows 95.&lt;/p&gt;\n--&gt;</span>\n</code></pre><p>Netscape <a href=\"https://www.masswerk.at/nowgobang/2019/object-handle-event#:~:text=A%20special%20use%20case%20were%20conditional%20comments\">had its own way of handling conditional comments</a> using JavaScript entities immediately following an opening comment tag. If evaluated to <code>true</code>, the comment would be included. If <code>false</code>, it&#8217;d just be a comment. Browsers other than Netscape would always treat it as just a comment.</p>\n<h2 id=\"microsoft-smart-tags\">Microsoft Smart Tags</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;MSSmartTagsPreventParsing&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;TRUE&quot;</span>&gt;</span>\n</code></pre><p><a href=\"https://web.archive.org/web/20010625111031/http://www.microsoft.com/windows/ie/preview/smarttags/default.asp\">Smart Tags</a> was a system Microsoft introduced in Internet Explorer 6 which would automatically inject hyperlinks into pages.<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1</a></sup> An example given by Microsoft was that &#8216;a Smart Tag might detect the names of major companies on the Web and tag them, allowing you to access stock quotes and company information.&#8217;. Site owners were outraged, and the <code>MSSmartTagsPreventParsing</code> meta tag was introduced to allow opting out. Microsoft later dropped it from Internet Explorer entirely.</p>\n<h2 id=\"pics\"><abbr>PICS</abbr></h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span>\n\t<span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;PICS-Label&quot;</span>\n\t<span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&#x27;\n (PICS-1.1 &quot;http://www.gcf.org/v2.5&quot;\n    labels on &quot;1994.11.05T08:15-0500&quot;\n           until &quot;1995.12.31T23:59-0000&quot;\n           for &quot;http://w3.org/PICS/Overview.html&quot;\n    ratings (suds 0.5 density 0 color/hue 1))\n&#x27;</span>\n&gt;</span>\n</code></pre><p>In the mid-90s the World Wide Web Consortium (W3C) attempted to establish a set of technical specifications for labelling internet content, called <a href=\"https://www.w3.org/PICS/\">Platform for Internet Content Selection (<abbr>PICS</abbr>)</a>. <abbr>PICS</abbr> was incorporated into many filtering products, as well as Internet Explorer as of version 3. The shown meta tag could be included on a page to label it.</p>\n<p>Rather unsurprisingly, many site owners just lied and miscategorised their sites. More still just never added the tags. The <a href=\"https://www.w3.org/2007/powder/\">Protocol for Web Description Resources (<abbr>POWDER</abbr>)</a> succeeded <abbr>PICS</abbr> but was also unsuccessful in its intentions. <abbr>PICS</abbr> was more or less completely dropped by 2003.</p>\n<h2 id=\"interpage-transitions\">Interpage Transitions</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;Page-Enter&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;revealTrans(Duration=2.0,Transition=12)&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;Page-Exit&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;revealTrans(Duration=2.0,Transition=12)&quot;</span>&gt;</span>\n</code></pre><p>Much like slide deck applications such as Microsoft PowerPoint or Apple Keynote have the ability to set transitions, Internet Explorer from version 4 to version 8 <a href=\"https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/platform-apis/ms532847(v=vs.85)#interpage-transitions\">supported the above tags for transition style effects</a>. This feature wouldn&#8217;t officially reach the web platform until the adoption of the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/View_Transition_API\">View Transition <abbr>API</abbr></a>. Web developer Bramus has ported Internet Explorer&#8217;s <a href=\"https://page-transitions.style\">transitions to the new View Transition <abbr>API</abbr></a>.</p>\n<h2 id=\"frame-buster\">Frame Buster</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;Window-target&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;_top&quot;</span>&gt;</span>\n</code></pre><p>Starting in Netscape Navigator in the mid-90s and then working its way over to Internet Explorer and other browsers, this non-standard meta tag would cause a page to break free of the parent page and open as a standalone browser window if it was loaded in a frame. It was popularly used by people to stop their pages from being embedded in frames on other sites. The <code>_top</code> <code>Window-target</code> specifies that a page should load in a <em>top</em> level window. In the modern age people use security headers to prevent pages from being embedded.</p>\n<h2 id=\"baidu-page-transcoding\">Baidu Page Transcoding</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;applicable-device&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;pc,mobile&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;Cache-Control&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;no-siteapp,no-transform&quot;</span>&gt;</span>\n</code></pre><p>The Baidu Browser (<ruby>百<rt>bǎi</rt>度<rt>dù</rt>浏<rt>liú</rt>览<rt>lǎn</rt>器<rt>qì</rt></ruby>) included a page &#8216;transcoding&#8217; feature on mobile which was immensely unpopular. Websites would be routed through <code>transcoder.baidu.com</code> and modified. Layouts would be restructured, styles stripped, images compressed, branding removed, and adverts on the site would be removed while Baidu Union (<ruby>百<rt>bǎi</rt>度<rt>dù</rt>联<rt>lián</rt>盟<rt>méng</rt></ruby>) adverts would be injected. It <a href=\"https://zzz.buzz/zh/2017/04/10/baidu-mobile-seo-and-baidu-siteapp/\">heavily disrupted sites</a>. One of these tags would be added to sites from 2012 through to 2018 to opt out of this transcoding taking place.</p>\n<h2 id=\"skype-toolbar\">Skype Toolbar</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;skype_toolbar&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;skype_toolbar_parser_compatible&quot;</span>&gt;</span>\n</code></pre><p>There was an add-on for Internet Explorer, Chrome, and Firefox called &#8216;Skype Toolbar&#8217; (later &#8216;Skype Click to Call&#8217;). Available from the mid-2000s until the mid-2010s, it was automatically installed alongside Skype and would attempt to detect phone numbers on pages and show a clickable icon. This icon allowed calling a number via Skype, adding it to one&#8217;s Skype address book, and assorted other Skype-related functionality. In inserting an icon, it would often cause page breakages, so developers would include the above tag to disable it on their sites.</p>\n<p>The extension was also extremely unstable in Firefox, to the extent that <a href=\"https://blog.mozilla.org/addons/2011/01/20/blocking-the-skype-toolbar-in-firefox/\">Mozilla explicitly blocked it</a> in 2011.</p>\n<h2 id=\"image-toolbar\">Image Toolbar</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;imagetoolbar&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;no&quot;</span>&gt;</span>\n</code></pre><p>Internet Explorer 6 added an Image Toolbar, which would appear over images and show buttons for actions such as saving or sharing an image. Developers naturally hated this intrusion on their site and could disable the functionality with the above meta tag.</p>\n<h2 id=\"cleartype\">ClearType</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">http-equiv</span>=<span class=\"hljs-string\">&quot;cleartype&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;on&quot;</span>&gt;</span>\n</code></pre><p>ClearType is Microsoft&#8217;s system <a href=\"https://learn.microsoft.com/en-us/typography/cleartype/\">for improving the legibility of typography</a>. This tag could be included on pages to make typography look better on low-resolution devices, namely those running Pocket Internet Explorer / Internet Explorer Mobile.</p>\n<h2 id=\"ajax-crawling\"><abbr>AJAX</abbr> Crawling</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;fragment&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;!&quot;</span>&gt;</span>\n</code></pre><p>Google previously didn&#8217;t run JavaScript when crawling pages, so sites which had <abbr>AJAX</abbr>-based content would not be indexed. This meta tag told Google&#8217;s crawler to request a page with the <code>_escaped_fragment_</code> query parameter, which was expected to return a <abbr>HTML</abbr> version of the page&#8217;s contents. Google began recommending this approach in 2009 and <a href=\"https://web.archive.org/web/20180707074702/https://webmasters.googleblog.com/2015/10/deprecating-our-ajax-crawling-scheme.html\">stopped advising it in 2015</a>.</p>\n<h2 id=\"directory\">Directory</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;robots&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;noodp, noydir&quot;</span>&gt;</span>\n</code></pre><p>Web directories used to be immensely popular as a way for people to find content on the internet. Two of the most popular were Yahoo Directory and DMoz (named for the <abbr>URL</abbr> <code>directory.mozilla.org</code>). The directories would sometimes write their own titles and descriptions for sites, which would be used by some search engines. To signal to search engines that they should use the metadata provided on the page and not the metadata from the directories, developers would include the above meta tag. Both directories are defunct now, making this snippet irrelevant.</p>\n<h2 id=\"web-app-name\">Web App Name</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;application-name&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;App Title&quot;</span>&gt;</span>\n</code></pre><p><code>application-name</code> was used by various web app implementations across various browsers before Progressive Web Apps (<abbr>PWA</abbr>s) became established. If missing, systems usually fell back to <code>&lt;title&gt;</code>.</p>\n<h2 id=\"internet-explorer-pinned-sites\">Internet Explorer Pinned Sites</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-tooltip&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;Visit our site!&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-starturl&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;./&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-window&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;width=1024;height=768&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-navbutton-color&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;#FF3300&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-task&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;name=Blog;action-uri=/blog;icon-uri=/favicon.ico&quot;</span>&gt;</span>\n</code></pre><p>Internet Explorer 9 and higher on Windows 7 had a function to <a href=\"https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/gg491738(v=vs.85)\">pin sites to the taskbar</a>. When pinned, sites could expose some site features on an operating system and browser level, almost like a modern progressive web app. <code>msapplication-tooltip</code> was text shown when hovering a site&#8217;s icon, <code>msapplication-starturl</code> set the root <abbr>URL</abbr> of the pinned site, <code>msapplication-window</code> set the initial size of the pinned site&#8217;s window when opened (minimum width of 800px and height of 600px), <code>msapplication-navbutton-color</code> set a custom colour for the browser chrome&#8217;s back and forward navigation buttons, and <a href=\"https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/gg491725(v=vs.85)#using-msapplication-task\"><code>msapplication-task</code></a> was used to define quick actions which could be accessed by secondary clicking a pinned site in the taskbar. For example, a quick link to a blog page.</p>\n<h2 id=\"microsoft-web-apps\">Microsoft Web Apps</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-TileColor&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;#FF3300&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-TileImage&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;/mstile-144x144.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-square70x70logo&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;/images/small-tile.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-square150x150logo&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;/images/medium-tile.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-wide310x150logo&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;/images/wide-tile.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-square310x310logo&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;/images/large-tile.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-config&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;/browserconfig.xml&quot;</span>&gt;</span>\n</code></pre><p>Very similar to the previously mentioned Pinned Site functionality, these values were used for presentation. <code>msapplication-TileColor</code>, <code>msapplication-TileImage</code>, and the various <code>msapplication-square*</code> and <code>msapplication-wide*</code> attribute carrying tags were used for setting the theming of the tiles across the assorted versions of Windows, including the desktop UI, Metro UI, and Windows Mobile.</p>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-badge&quot;</span> <span class=\"hljs-attr\">value</span>=<span class=\"hljs-string\">&quot;frequency=360;polling-uri=https://contoso.com/BadgeUpdate.aspx&quot;</span>&gt;</span>\n</code></pre><p><code>msapplication-badge</code> was used <a href=\"https://learn.microsoft.com/en-us/previous-versions/windows/internet-explorer/ie-developer/samples/jj152137(v=vs.85)\">to define a web address to be polled for notifications</a> which would display on a site&#8217;s Live Tile.</p>\n<h2 id=\"chrome-pinned-web-apps\">Chrome Pinned Web Apps</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;application-url&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;https://vale.rocks&quot;</span>&gt;</span>\n</code></pre><p>Google Chrome had some pinned web app functionality which would use <code>application-url</code> for the start <abbr>URL</abbr>.</p>\n<h2 id=\"crx-less-web-apps\"><abbr>CRX</abbr>-less Web Apps</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;chrome-application-definition&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;application_definition.json&quot;</span>&gt;</span>\n</code></pre><p><a href=\"https://web.archive.org/web/20120303234427/http://code.google.com/intl/en-US/chrome/apps/docs/no_crx.html\"><abbr>CRX</abbr>-less Web Apps</a> were applications in Google Chrome which allowed using an online manifest to describe a hosted app. The above meta tag would link to a <abbr>JSON</abbr> file with the manifest:</p>\n<pre><code class=\"language-json\"><span class=\"hljs-punctuation\">{</span>\n\t<span class=\"hljs-attr\">&quot;name&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Application&quot;</span><span class=\"hljs-punctuation\">,</span>\n\t<span class=\"hljs-attr\">&quot;description&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Description describing the app.&quot;</span><span class=\"hljs-punctuation\">,</span>\n\t<span class=\"hljs-attr\">&quot;launch_url&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;index.html&quot;</span><span class=\"hljs-punctuation\">,</span>\n\t<span class=\"hljs-attr\">&quot;launch_container&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;panel&quot;</span><span class=\"hljs-punctuation\">,</span>\n\t<span class=\"hljs-attr\">&quot;icons&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n\t\t<span class=\"hljs-attr\">&quot;128&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;128.png&quot;</span>\n\t<span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n\t<span class=\"hljs-attr\">&quot;permissions&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">[</span><span class=\"hljs-string\">&quot;notifications&quot;</span><span class=\"hljs-punctuation\">]</span>\n<span class=\"hljs-punctuation\">}</span>\n</code></pre><p>These <abbr>CRX</abbr>-less apps could be distributed on the Chrome Web Store with just the <abbr>JSON</abbr> manifest and an icon, with no need for the full <code>.crx</code> format Chrome uses for extensions. This type of app was later renamed to &#8216;Chrome Apps&#8217;, which are <a href=\"https://developer.chrome.com/docs/apps/overview\">being phased out</a>.</p>\n<h2 id=\"ios-web-apps\">iOS Web Apps</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;apple-touch-icon&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;/custom_icon.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;apple-touch-startup-image&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;/splash.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;apple-mobile-web-app-title&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;App Name&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;apple-mobile-web-app-capable&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;yes&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;apple-mobile-web-app-status-bar-style&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;black-translucent&quot;</span>&gt;</span>\n</code></pre><p>To allow site owners to customise the experience of their websites when added to a user&#8217;s homescreen on iOS, Apple <a href=\"https://developer.apple.com/library/archive/documentation/AppleApplications/Reference/SafariWebContent/ConfiguringWebApplications/ConfiguringWebApplications.html\">introduced the above meta tags</a>. The icon, startup image, and title are self-explanatory, while <code>apple-mobile-web-app-capable</code> disabled the browser chrome, and <code>apple-mobile-web-app-status-bar-style</code> allowed setting the operating system status bar to one of three possible values:</p>\n<ul>\n<li><code>default</code> - White background with black text and icons.</li>\n<li><code>black</code> - Black background with black text and icons.</li>\n<li><code>black-translucent</code> - Background colour sourced from the webpage background colour with white text and icons.</li>\n</ul>\n<p>These meta tags are now rendered obsolete by modern <abbr>PWA</abbr> definitions.</p>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;apple-touch-fullscreen&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;yes&quot;</span>&gt;</span>\n</code></pre><p><code>apple-touch-fullscreen</code> was used in some early demos for iOS 2, however, Apple&#8217;s documentation only reflects <code>apple-mobile-web-app-capable</code>. Due to its presence in those early demos, <code>apple-touch-fullscreen</code> was popularised before the feature released, seemingly prompting Apple to make it an alias of <code>apple-mobile-web-app-capable</code>.</p>\n<h2 id=\"uc-browser-and-qq-browser\">UC Browser and QQ Browser</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;screen-orientation&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;portrait&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;x5-orientation&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;portrait&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;full-screen&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;yes&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;x5-fullscreen&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;true&quot;</span>&gt;</span>\n</code></pre><p>UC Browser and QQ Browser were particularly popular browsers in Asia through the early to mid-2010s due to their heavy data savings and optimisation for cheap devices. UC Browser would use <code>screen-orientation</code> to force a specific display orientation and <code>full-screen</code> to hide the browser&#8217;s chrome. QQ Browser would do the same, though with <code>x5-orientation</code> and <code>x5-fullscreen</code>. &#8216;X5&#8217; in those meta names refer to Tencent&#8217;s X5 browser engine. The meta tags are no longer needed due to the standard fullscreen and orientation <abbr>API</abbr>s and popularisation of more capable browsers.</p>\n<h2 id=\"pda-optimised\"><abbr>PDA</abbr> Optimised</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;HandheldFriendly&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;true&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;MobileOptimized&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;320&quot;</span>&gt;</span>\n</code></pre><p>Before the proliferation of <code>&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width&quot;&gt;</code> for making sites cleanly scale to small screens, these tags were widely used for mobile content. <code>HandheldFriendly</code> was created for <a href=\"https://getoutofmyhead.dev/handheld-friendly\">AvantGo</a> and then <a href=\"https://web.archive.org/web/20150306230553/https://developer.blackberry.com/playbook/html5/documentation/handheldfriendly.html\">spread to the Blackberry Browser</a>, while <code>MobileOptimized</code> was a <a href=\"https://learn.microsoft.com/en-us/previous-versions/bb431690(v=msdn.10)\">Microsoft concoction</a> for old versions of <a href=\"https://vale.rocks/posts/pda-browsers#windows-mobile\">Windows Mobile</a>.</p>\n<h2 id=\"internet-explorer-tap-highlight\">Internet Explorer Tap Highlight</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;msapplication-tap-highlight&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;no&quot;</span>&gt;</span>\n</code></pre><p>This snippet stops links from highlighting when tapped in Internet Explorer 11. It was similar to <a href=\"https://developer.mozilla.org/en-US/docs/Web/CSS/Reference/Properties/-webkit-tap-highlight-color\"><code>-webkit-tap-highlight-color</code></a>, though unlike that property it was a boolean and didn&#8217;t allow changing the colour.</p>\n<h2 id=\"revisit-after\">Revisit-After</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;revisit-after&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;7 days&quot;</span>&gt;</span>\n</code></pre><p>A website called <a href=\"http://vancouver-webpages.com\">Vancouver Webpages</a> ran a niche regional search system called &#8216;searchBC&#8217; (the BC standing for &#8216;British Columbia&#8217;) which used the tag to know how often it should re-scrape a site. However, this was the only known use of the tag. There is no evidence that it has ever been used by any major search engine, <a href=\"https://developers.google.com/search/blog/2007/12/answering-more-popular-picks-meta-tags#revisit-after-sitemap-lastmod-and-changefreq\">including Google</a>. Despite this, it somehow caught on like some sort of <abbr>SEO</abbr> myth and was perpetuated across the web.</p>\n<h2 id=\"page-prerendering\">Page Prerendering</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;prerender&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com&quot;</span>&gt;</span>\n</code></pre><p>Only fully supported in Chrome between versions 13 and 62 and never specced, this would fetch and process a page so it would be ready when users navigate to it. The functionality was replaced by the <a href=\"https://developer.mozilla.org/en-US/docs/Web/API/Speculation_Rules_API\">Speculation Rules <abbr>API</abbr></a>.</p>\n<h2 id=\"accelerated-mobile-pages-version\">Accelerated Mobile Pages Version</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;amphtml&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com/amp.html&quot;</span>&gt;</span>\n</code></pre><p>Accelerated Mobile Pages (<abbr>AMP</abbr>) were restructured versions of pages optimised for faster content loading. This tag was used to link to an <abbr>AMP</abbr> version of a page, however, Accelerated Mobile Pages are no longer widely used, and Google no longer pushes for them, making the tag unneeded.</p>\n<h2 id=\"internet-explorer-reading-view\">Internet Explorer Reading View</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;IE_RM_OFF&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;true&quot;</span>&gt;</span>\n</code></pre><p>Starting with Internet Explorer 9, &#8216;Reading View&#8217; was introduced. By pressing a button which would appear in the browser chrome, you could get a simplified version of a page suited for reading. Pages could opt out of having this button shown by including the aforementioned meta tag.</p>\n<h2 id=\"really-simple-discovery\">Really Simple Discovery</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;EditURI&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com/xmlrpc.php?rsd&quot;</span> <span class=\"hljs-attr\">type</span>=<span class=\"hljs-string\">&quot;application/rsd+xml&quot;</span> <span class=\"hljs-attr\">title</span>=<span class=\"hljs-string\">&quot;RSD&quot;</span>&gt;</span>\n</code></pre><p><a href=\"https://cyber.harvard.edu/blogs/gems/tech/rsd.html\">Really Simple Discovery (<abbr>RSD</abbr>)</a> was a system for exposing services for managing a blog to clients. The link in the head would direct clients to an <abbr>XML</abbr> document which would include endpoints to which tools such as Windows Live Writer, BlogJet, or MarsEdit could connect. It was implemented across platforms, including WordPress, Blogger, LiveJournal, TypePad, and MediaWiki. Modern publishing systems have generally deprecated it.</p>\n<h2 id=\"pingbacks\">Pingbacks</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;pingback&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com/xmlrpc.php&quot;</span>&gt;</span>\n</code></pre><p>Pingbacks were a system where sites would alert other sites when they linked to them. The site receiving the &#8216;ping&#8217; would check that a link was actually present on the site sending the ping, then make a note on the page saying something to the effect of &#8216;[Website] linked to this page&#8217;. They functioned somewhat similarly to how <a href=\"https://indieweb.org/Webmention\">WebMentions</a> do.</p>\n<p>Unfortunately, pingbacks rather quickly became an avenue for spam and <abbr>SEO</abbr>-gaming, so fell out of fashion. Vulnerabilities allowing sites to be tied up in <abbr title=\"Distributed Denial of Service\">DDoS</abbr> attacks also became widely exploited.</p>\n<h2 id=\"share-partners\">Share Partners</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;image_src&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com/post/image.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;audio_src&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com/post/audio.mp4&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link</span> <span class=\"hljs-attr\">rel</span>=<span class=\"hljs-string\">&quot;video_src&quot;</span> <span class=\"hljs-attr\">href</span>=<span class=\"hljs-string\">&quot;https://example.com/post/video.mp4&quot;</span>&gt;</span>\n</code></pre><p>Before Facebook created <a href=\"https://ogp.me\">Open Graph</a>, they had a &#8216;Share Partners&#8217; system for defining metadata to be used in embeds. Many additional sites adopted it as an ad hoc standard and implemented the tags. For example, <a href=\"https://web.archive.org/web/20120511044923/https://about.digg.com/thumbnails\">Digg</a>.</p>\n<p><code>rel=&quot;image_src&quot;</code> would be referenced for an image to embed, <code>rel=&quot;audio_src&quot;</code> would be referenced for audio to embed, and likewise <code> rel=&quot;video_src&quot;</code> for video. There were <a href=\"https://web.archive.org/web/20061114042416/https://www.facebook.com/share_partners.php\">a number of these meta tags</a> which were supported to varying degrees.</p>\n<h2 id=\"twitter-embeds\">Twitter Embeds</h2>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:card&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;summary&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:site&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;@account&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:creator&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;@writer_account&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:url&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;https://example.com/posts/hello-world&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:title&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;Title&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:description&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;Page description&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:image&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;https://example.com/hello-world-embed-image.png&quot;</span>&gt;</span>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:image:alt&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;Alternative text for the image.&quot;</span>&gt;</span>\n</code></pre><p>These meta tags (and some other, less frequently used ones) were used on Twitter when generating link embeds. However, the documentation and card validator are no longer accessible (previously at <code>https://dev.twitter.com/cards/getting-started</code> and <code>https://cards-dev.twitter.com/validator</code> respectively). X falls back to the widely respected Open Graph meta tags, making the Twitter-specific declarations largely useless. They should be removed in favour of Open Graph tags. Further, they should be removed because X is an awful site with poor moderation that is owned by a man who publicly performed a Nazi Sieg Heil salute and has directly contributed to the rise of fascism in the United States of America and globally, among other horrors.</p>\n<pre><code class=\"language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">meta</span> <span class=\"hljs-attr\">name</span>=<span class=\"hljs-string\">&quot;twitter:dnt&quot;</span> <span class=\"hljs-attr\">content</span>=<span class=\"hljs-string\">&quot;on&quot;</span>&gt;</span>\n</code></pre><p>Twitter also had a Do Not Track meta tag for opting out of tracking when using Twitter for Websites widgets. Again, the documentation (previously at <code>https://dev.twitter.com/web/overview/privacy</code>) is now inaccessible, and it seems the tag is no longer respected.</p>\n<hr>\n<p>This article isn&#8217;t comprehensive. These are only the more popular or notable non-standard bits. There are so many more obscure bits drifting through the shatters of cyberspace. For the curious mind, some more are listed &#8211; albeit without associated detail &#8211; on <a href=\"https://wiki.whatwg.org/wiki/MetaExtensions\">the WhatWG Wiki</a>.</p>\n<section class=\"footnotes\" data-footnotes>\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>Google tried something very similar in late-2024 with a feature called &#8216;<a href=\"https://web.archive.org/web/20241121124222/https://support.google.com/websearch/thread/308719098/page-annotation-in-google-app-browser-for-ios?hl=en\">Page Annotations</a>&#8217; in their Google app on iOS. It was hated and ultimately discontinued in March 2025. <a href=\"#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n\n\t\t",
      "summary": "Overviews of the very many snippets of HTML that were once commonly included on websites to address specific cases with certain technologies, browsers, operating systems, or extensions. Fragments dating back to the days of Internet Explorer and Netscape, to more modern bits that are nonetheless obsolete.",
      "date_published": "2026-09-08"
    },
    {
      "id": "https://vale.rocks/posts/halo-stats",
      "url": "https://vale.rocks/posts/halo-stats",
      "title": "Examining My Halo Service Record",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>I am not what one would call the greatest player of Halo to ever grace this planet. If you can believe it, I am rather mediocre. I have moments of greatness, but I&#8217;m also very much a casual player. Halo is a game I can pick up and play for leisure without too much effort or consideration. That said, I love data. I love diving into data and picking out interesting little details &#8211; all the tiny little bits that you don&#8217;t really notice otherwise.</p>\n<p>Bungie must have been data fiends too, because their website, <a href=\"https://www.halopedia.org/Bungie.net\">bungie.net</a>, used to be a haven for player stats. Hooking directly into Xbox Live, bungie.net was a brilliant hub of Halo stats and content. You could even see <a href=\"https://bnetarchive.haloman30.com/Stats/halo3/heatmapstatsed76.html\">things like heatmaps</a> showing where a player killed or got killed. Even details such as what weapons you were best with. Unfortunately, 343 Industries didn&#8217;t keep the same level of detail when they took over the franchise. Some details are made accessible on Halo Waypoint, but they&#8217;re a bit lacklustre, and not all tracked details are exposed.</p>\n<p>This page shows all my Halo stats, sourced from my <a href=\"https://www.halowaypoint.com/players/outervale/service-records\">Service Records on Halo Waypoint</a>. The stats are not fetched automatically, as Halo Studios or Microsoft are liable to change authentication or the returned data, causing a surprise breakage. I instead fetch them manually when I feel the data has grown stale. Using the <a href=\"https://vale.rocks/posts/web-origami\">ever-wonderful Web Origami dialect of JavaScript</a> which I built this site upon, I then transform the data to populate this post. You can see when I last updated the data by referencing the modification date in the header.</p>\n<details>\n<summary>Further data handling details</summary><p>I load up the Halo Waypoint site in my browser, authenticate, and download my Service Records directly. My Halo Infinite Service Record comes from <code>https://halostats.svc.halowaypoint.com/hi/players/xuid(2535432479962354)/Matchmade/servicerecord?</code>. My Halo MCC Service Record comes from <code>https://mccapi.svc.halowaypoint.com/hmcc/users/gt(OuterVale)/service-record</code> with the campaign data coming from <code>https://mccapi.svc.halowaypoint.com/hmcc/users/gt(OuterVale)/service-record/{GAME}/campaign</code>. In the latter I substitute <code>{GAME}</code> for the game: &#8216;h1&#8217;, &#8216;h2&#8217;, &#8216;h3&#8217;, &#8216;odst&#8217;, &#8216;reach&#8217;, or &#8216;h4&#8217;.</p>\n<p>I then save my acquired data in my website&#8217;s Git repository. I have scripts to map campaign level numbers to the actual names corresponding to the levels, to map medal IDs to the actual medal data, and a script to convert the timestamps to actual human-readable duration values with reasonable degrees of detail.</p>\n</details><h2 id=\"halo-the-master-chief-collection\">Halo: The Master Chief Collection</h2>\n<p>The Master Chief Collection (MCC) has my stats for Halo: CE through Halo 4. I did not play the original Xbox and Xbox 360 releases of these games when their servers were still available, so no stats exist from those releases.</p>\n<p>My MCC stats are particularly poor. If ever you&#8217;ve tried to play an old online game with a die-hard community, you know the struggle. The people still playing these old Halo games online are really good. Many have been playing since the games originally released and know them intricately. Meanwhile, I&#8217;ve only played for 2 days and 8 hours, and that is across all of the games in the collection. They&#8217;re fun games that are great to jump into, but I won&#8217;t kid that I don&#8217;t get decimated.</p>\n<h3 id=\"multiplayer\">Multiplayer</h3>\n<ul>\n<li>Games Played: 84</li>\n<li>Wins: 37</li>\n<li>Losses: 47</li>\n<li>Kills: 455</li>\n<li>Deaths: 1016</li>\n<li>Assists: 342</li>\n<li>Average <abbr title=\"Kill-Death-Assist\">KDA</abbr>: -5.32</li>\n</ul>\n<h3 id=\"campaigns\">Campaigns</h3>\n<ul>\n<li>Mission Kills: 8550</li>\n<li>Mission Deaths: 127</li>\n</ul>\n<details>\n<summary>Individual campaign level stats</summary><h3>Halo: Combat Evolved</h3><h4>The Pillar of Autumn</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Normal</li>\n\t<li>Best Time (Single Player) (Easy): 1 hour and 40 minutes</li>\n\t<li>Best Score (Co-op) (Normal): 3900</li>\n\t<li>Best Time (Co-op) (Normal): 16 minutes and 39 seconds</li>\n</ul>\n<h4>Halo</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Normal</li>\n\t<li>Best Score (Single Player) (Easy): 611</li>\n\t<li>Best Time (Single Player) (Easy): 40 minutes and 45 seconds</li>\n\t<li>Best Score (Co-op) (Normal): 3660</li>\n\t<li>Best Time (Co-op) (Normal): 31 minutes and 21 seconds</li>\n</ul>\n<h4>Truth and Reconciliation</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1526</li>\n\t<li>Best Time (Single Player) (Easy): 37 minutes and 43 seconds</li>\n</ul>\n<h4>The Silent Cartographer</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1055</li>\n\t<li>Best Time (Single Player) (Easy): 38 minutes and 12 seconds</li>\n</ul>\n<h4>Assault on the Control Room</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1724</li>\n\t<li>Best Time (Single Player) (Easy): 1 hour and 5 minutes</li>\n</ul>\n<h4>343 Guilty Spark</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 827</li>\n\t<li>Best Time (Single Player) (Easy): 23 minutes and 42 seconds</li>\n</ul>\n<h4>The Library</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2256</li>\n\t<li>Best Time (Single Player) (Easy): 45 minutes and 36 seconds</li>\n</ul>\n<h4>Two Betrayals</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): None</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n</ul>\n<h4>Keyes</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2459</li>\n\t<li>Best Time (Single Player) (Easy): 25 minutes and 49 seconds</li>\n</ul>\n<h4>The Maw</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1032</li>\n\t<li>Best Time (Single Player) (Easy): 30 minutes and 52 seconds</li>\n</ul>\n<h3>Halo 2</h3><h4>The Heretic</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1504</li>\n\t<li>Best Time (Single Player) (Easy): 17 minutes and 36 seconds</li>\n</ul>\n<h4>The Armory</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 961</li>\n\t<li>Best Time (Single Player) (Easy): 30 minutes and 5 seconds</li>\n</ul>\n<h4>Cairo Station</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 3469</li>\n\t<li>Best Time (Single Player) (Easy): 19 minutes and 23 seconds</li>\n</ul>\n<h4>Outskirts</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1294</li>\n\t<li>Best Time (Single Player) (Easy): 22 minutes and 8 seconds</li>\n</ul>\n<h4>Metropolis</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 705</li>\n\t<li>Best Time (Single Player) (Easy): 54 minutes and 7 seconds</li>\n</ul>\n<h4>The Arbiter</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1745</li>\n\t<li>Best Time (Single Player) (Easy): 27 minutes and 39 seconds</li>\n</ul>\n<h4>Oracle</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): None</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n</ul>\n<h4>Delta Halo</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 490</li>\n\t<li>Best Time (Single Player) (Easy): 29 minutes and 17 seconds</li>\n</ul>\n<h4>Regret</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1499</li>\n\t<li>Best Time (Single Player) (Easy): 24 minutes and 46 seconds</li>\n</ul>\n<h4>Sacred Icon</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2084</li>\n\t<li>Best Time (Single Player) (Easy): 44 minutes and 25 seconds</li>\n</ul>\n<h4>Quarantine Zone</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1932</li>\n\t<li>Best Time (Single Player) (Easy): 15 minutes and 16 seconds</li>\n</ul>\n<h4>Gravemind</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): None</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n</ul>\n<h4>Uprising</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 3317</li>\n\t<li>Best Time (Single Player) (Easy): 20 minutes and 53 seconds</li>\n</ul>\n<h3>Halo 3</h3><h4>Sierra 117</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1330</li>\n\t<li>Best Time (Single Player) (Easy): 18 minutes and 53 seconds</li>\n</ul>\n<h4>Crowsnest</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1466</li>\n\t<li>Best Time (Single Player) (Easy): 34 minutes and 21 seconds</li>\n</ul>\n<h4>Tsavo Highway</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2605</li>\n\t<li>Best Time (Single Player) (Easy): 20 minutes and 3 seconds</li>\n</ul>\n<h4>The Storm</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2188</li>\n\t<li>Best Time (Single Player) (Easy): 22 minutes and 29 seconds</li>\n</ul>\n<h4>Floodgate</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2607</li>\n\t<li>Best Time (Single Player) (Easy): 15 minutes and 13 seconds</li>\n</ul>\n<h4>The Ark</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2918</li>\n\t<li>Best Time (Single Player) (Easy): 44 minutes and 39 seconds</li>\n</ul>\n<h4>The Covenant</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 3572</li>\n\t<li>Best Time (Single Player) (Easy): 39 minutes and 49 seconds</li>\n</ul>\n<h4>Cortana</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1843</li>\n\t<li>Best Time (Single Player) (Easy): 28 minutes and 35 seconds</li>\n</ul>\n<h4>Halo</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 3068</li>\n\t<li>Best Time (Single Player) (Easy): 21 minutes and 3 seconds</li>\n</ul>\n<h3>Halo 3: <abbr>ODST</abbr></h3><h4>Prepare to Drop</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 755</li>\n\t<li>Best Time (Single Player) (Easy): 14 minutes and 5 seconds</li>\n</ul>\n<h4>Mombasa Streets</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): None</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n</ul>\n<h4>Tayari Plaza</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2860</li>\n\t<li>Best Time (Single Player) (Easy): 16 minutes and 42 seconds</li>\n</ul>\n<h4>Uplift Reserve</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2732</li>\n\t<li>Best Time (Single Player) (Easy): 14 minutes and 17 seconds</li>\n</ul>\n<h4>Kizingo Boulevard</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2108</li>\n\t<li>Best Time (Single Player) (Easy): 13 minutes and 53 seconds</li>\n</ul>\n<h4><abbr>ONI</abbr> Alpha Site</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1207</li>\n\t<li>Best Time (Single Player) (Easy): 19 minutes and 42 seconds</li>\n</ul>\n<h4><abbr>NMPD</abbr> HQ</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1826</li>\n\t<li>Best Time (Single Player) (Easy): 4 minutes and 12 seconds</li>\n</ul>\n<h4>Kikowani Station</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 9096</li>\n\t<li>Best Time (Single Player) (Easy): 23 minutes and 21 seconds</li>\n</ul>\n<h3>Halo: Reach</h3><h4>Noble Actual</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 694</li>\n\t<li>Best Time (Single Player) (Easy): 19 minutes and 49 seconds</li>\n</ul>\n<h4>Winter Contingency</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2037</li>\n\t<li>Best Time (Single Player) (Easy): 21 minutes and 54 seconds</li>\n</ul>\n<h4><abbr>ONI</abbr>: Sword Base</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 903</li>\n\t<li>Best Time (Single Player) (Easy): 27 minutes and 31 seconds</li>\n</ul>\n<h4>Nightfall</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2250</li>\n\t<li>Best Time (Single Player) (Easy): 23 minutes and 7 seconds</li>\n</ul>\n<h4>Tip of the Spear</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2475</li>\n\t<li>Best Time (Single Player) (Easy): 31 minutes and 12 seconds</li>\n</ul>\n<h4>Long Night of Solace</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2230</li>\n\t<li>Best Time (Single Player) (Easy): 26 minutes and 23 seconds</li>\n</ul>\n<h4>Exodus</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 3166</li>\n\t<li>Best Time (Single Player) (Easy): 25 minutes and 34 seconds</li>\n</ul>\n<h4>New Alexandria</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2358</li>\n\t<li>Best Time (Single Player) (Easy): 24 minutes and 9 seconds</li>\n</ul>\n<h4>The Package</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 4391</li>\n\t<li>Best Time (Single Player) (Easy): 29 minutes and 38 seconds</li>\n</ul>\n<h4>The Pillar of Autumn</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n</ul>\n<h4>Lone Wolf</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 387</li>\n\t<li>Best Time (Single Player) (Easy): 4 minutes and 41 seconds</li>\n</ul>\n<h3>Halo 4</h3><h4>Dawn</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2279</li>\n\t<li>Best Time (Single Player) (Easy): 17 minutes and 37 seconds</li>\n</ul>\n<h4>Requiem</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1636</li>\n\t<li>Best Time (Single Player) (Easy): 28 minutes and 38 seconds</li>\n</ul>\n<h4>Forerunner</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 1765</li>\n\t<li>Best Time (Single Player) (Easy): 39 minutes and 38 seconds</li>\n</ul>\n<h4>Infinity</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 6806</li>\n\t<li>Best Time (Single Player) (Easy): 44 minutes and 40 seconds</li>\n</ul>\n<h4>Reclaimer</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 2789</li>\n\t<li>Best Time (Single Player) (Easy): 52 minutes and 44 seconds</li>\n</ul>\n<h4>Shutdown</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 3463</li>\n\t<li>Best Time (Single Player) (Easy): 36 minutes and 6 seconds</li>\n</ul>\n<h4>Composer</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 6125</li>\n\t<li>Best Time (Single Player) (Easy): 27 minutes and 49 seconds</li>\n</ul>\n<h4>Midnight</h4>\n<ul>\n\t<li>Highest Difficulty (Single Player): Easy</li>\n\t<li>Highest Difficulty (Co-op): Not Played</li>\n\t<li>Best Score (Single Player) (Easy): 6046</li>\n\t<li>Best Time (Single Player) (Easy): 32 minutes and 10 seconds</li>\n</ul>\n</details><h2 id=\"halo-infinite\">Halo Infinite</h2>\n<p>Unlike MCC, I&#8217;m not quite as poorly matched in Halo Infinite on account of it being a newer game that is much more accessible and has a far greater active player population. It is also a really solid online game with the best gameplay of the series.</p>\n<p>I&#8217;ve completed 618 matches in my 4 days and 6 hours of playtime since February of 2023. Of those matches, I&#8217;ve won 322 of them, lost 286 of them, and tied in 10 of them.</p>\n<h3 id=\"core-stats\">Core Stats</h3>\n<p>These are the totals across all game types (including Firefight, which massively inflates figures).</p>\n<ul>\n<li>Score: 8898</li>\n<li>Personal Score: 863283</li>\n<li>Rounds Won: 346 (55.99%)</li>\n<li>Rounds Lost: 311 (50.32%)</li>\n<li>Rounds Tied: 10 (1.62%)</li>\n<li>Win/Loss Ratio: 1.13</li>\n<li>Kills: 14668</li>\n<li>Deaths: 6761</li>\n<li>Assists: 4062</li>\n<li>Kill-to-death Ratio: 2.17</li>\n<li>Average <abbr title=\"Kill-Death-Assist\">KDA</abbr>: 14.99</li>\n<li>Suicides: 112 (1.66%)</li>\n<li>Betrayals: 16 <em>(sorry!)</em></li>\n<li>Grenade Kills: 139 (0.95%)</li>\n<li>Headshot Kills: 457 (3.12%)</li>\n<li>Melee Kills: 959 (6.54%)</li>\n<li>Power Weapon Kills: 1461 (9.96%)</li>\n<li>Shots Fired: 249065</li>\n<li>Shots Hit: 83404 (33.49%)</li>\n<li>Damage Dealt: 3175091</li>\n<li>Damage Taken: 1778123</li>\n<li>Damage Ratio: 1.79</li>\n<li>Callout Assists: 1</li>\n<li>Vehicles Destroyed: 154</li>\n<li>Driver Assists: 67</li>\n<li>Vehicle Hijacks: 24</li>\n<li><abbr title=\"Electro Magnetic Pulse\">EMP</abbr> Assists: 7</li>\n<li>Max Killing Spree: 10</li>\n<li>Spawns: 7220</li>\n<li>Objectives Completed: 351</li>\n</ul>\n<p>For exclusively player versus player interactions, excluding Firefight:</p>\n<ul>\n<li>Kills: 4752</li>\n<li>Deaths: 6116</li>\n<li>Assists: 1792</li>\n<li>Kill-to-death Ratio: 0.78</li>\n</ul>\n<h3 id=\"medals\">Medals</h3>\n<h4>Spree</h4>\n<ul>\n\t<li><span class=\"medal\" style=\"background-position:-64px -0px;\"></span> <strong>Killing Spree</strong> ×404<br>Kill 5 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -0px;\"></span> <strong>Killing Frenzy</strong> ×272<br>Kill 10 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -0px;\"></span> <strong>Running Riot</strong> ×221<br>Kill 15 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-256px -0px;\"></span> <strong>Rampage</strong> ×168<br>Kill 20 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -0px;\"></span> <strong>Nightmare</strong> ×136<br>Kill 25 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-0px -0px;\"></span> <strong>Killjoy</strong> ×115<br>End an enemy&#8217;s killing spree.</li>\n\t<li><span class=\"medal\" style=\"background-position:-384px -0px;\"></span> <strong>Boogeyman</strong> ×113<br>Kill 30 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -0px;\"></span> <strong>Grim Reaper</strong> ×98<br>Kill 35 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-512px -0px;\"></span> <strong>Demon</strong> ×71<br>Kill 40 enemies without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -640px;\"></span> <strong>Driving Spree</strong> ×4<br>Earn 5 Driver Assists without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -640px;\"></span> <strong>Death Cabbie</strong> ×2<br>Earn 10 Driver Assists without dying.</li>\n\t<li><span class=\"medal\" style=\"background-position:-256px -640px;\"></span> <strong>Immortal Chauffeur</strong> ×1<br>Earn 15 Driver Assists without dying.</li>\n</ul>\n<h4>Mode</h4>\n<ul>\n\t<li><span class=\"medal\" style=\"background-position:-576px -0px;\"></span> <strong>Steaktacular</strong> ×51<br>Win a game by dominating the enemy team.</li>\n\t<li><span class=\"medal\" style=\"background-position:-896px -192px;\"></span> <strong>Hill Guardian</strong> ×22<br>Occupy the Hill for 30 seconds without leaving in King of the Hill.</li>\n\t<li><span class=\"medal\" style=\"background-position:-640px -0px;\"></span> <strong>Flawless Victory</strong> ×9<br>Win every round of a game with 3+ rounds.</li>\n\t<li><span class=\"medal\" style=\"background-position:-960px -0px;\"></span> <strong>Stopped Short</strong> ×6<br>Kill an enemy flag carrier who is about to score.</li>\n\t<li><span class=\"medal\" style=\"background-position:-64px -64px;\"></span> <strong>Goal Line Stand</strong> ×4<br>Return a flag near the enemy flag stand.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -64px;\"></span> <strong>Extermination</strong> ×4<br>Wipe an enemy team with at least an Overkill in Elimination or Attrition.</li>\n\t<li><span class=\"medal\" style=\"background-position:-704px -0px;\"></span> <strong>Perfection</strong> ×3<br>Win a game with 15+ kills and no deaths.</li>\n\t<li><span class=\"medal\" style=\"background-position:-832px -192px;\"></span> <strong>Always Rotating</strong> ×2<br>Capture all zones in a single life.</li>\n\t<li><span class=\"medal\" style=\"background-position:-960px -192px;\"></span> <strong>Clock Stop</strong> ×1<br>Stop the enemy from scoring their final points by capturing a zone in Strongholds.</li>\n</ul>\n<h4>Multikill</h4>\n<ul>\n\t<li><span class=\"medal\" style=\"background-position:-0px -256px;\"></span> <strong>Double Kill</strong> ×1867<br>Kill 2 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-64px -256px;\"></span> <strong>Triple Kill</strong> ×623<br>Kill 3 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -256px;\"></span> <strong>Overkill</strong> ×283<br>Kill 4 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -256px;\"></span> <strong>Killtacular</strong> ×135<br>Kill 5 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-256px -256px;\"></span> <strong>Killtrocity</strong> ×69<br>Kill 6 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -256px;\"></span> <strong>Killamanjaro</strong> ×41<br>Kill 7 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-384px -256px;\"></span> <strong>Killtastrophe</strong> ×30<br>Kill 8 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -256px;\"></span> <strong>Killpocalypse</strong> ×20<br>Kill 9 enemies in quick succession.</li>\n\t<li><span class=\"medal\" style=\"background-position:-512px -256px;\"></span> <strong>Killionaire</strong> ×15<br>Kill 10 enemies in quick succession.</li>\n</ul>\n<h4>Proficiency</h4>\n<ul>\n\t<li><span class=\"medal\" style=\"background-position:-320px -320px;\"></span> <strong>Boxer</strong> ×83<br>Kill 5 enemies with melee in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-256px -320px;\"></span> <strong>Bomber</strong> ×60<br>Kill 5 enemies with launchers in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-384px -320px;\"></span> <strong>Warrior</strong> ×47<br>Kill 5 enemies with melee weapons in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-768px -256px;\"></span> <strong>Wingman</strong> ×41<br>Earn 10 Kill Assists in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -320px;\"></span> <strong>Gunslinger</strong> ×32<br>Kill 5 enemies with pistols in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-64px -320px;\"></span> <strong>Rifleman</strong> ×31<br>Kill 5 enemies with assault rifles in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-576px -320px;\"></span> <strong>Breacher</strong> ×28<br>Kill 5 enemies with <abbr>SMG</abbr> weapons in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-704px -320px;\"></span> <strong>Marksman</strong> ×24<br>Kill 5 enemies with tactical rifles in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -320px;\"></span> <strong>Grenadier</strong> ×21<br>Kill 5 enemies with grenades in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-640px -320px;\"></span> <strong>Sharpshooter</strong> ×16<br>Kill 5 enemies with sniper rifles in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-512px -320px;\"></span> <strong>Scattergunner</strong> ×14<br>Kill 5 enemies with shotguns in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-960px -256px;\"></span> <strong>Driver</strong> ×7<br>Kill 5 enemies with ground vehicles in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-832px -256px;\"></span> <strong>Wheelman</strong> ×5<br>Earn 5 Driver Assists in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-768px -320px;\"></span> <strong>Tanker</strong> ×5<br>Kill 5 enemies with siege vehicles in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-896px -256px;\"></span> <strong>Gunner</strong> ×2<br>Kill 5 enemies with mounted turrets in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -320px;\"></span> <strong>Heavy</strong> ×2<br>Kill 5 enemies with detached turrets in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-704px -256px;\"></span> <strong>Saboteur</strong> ×1<br>Destroy 5 enemy vehicles in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-0px -320px;\"></span> <strong>Pilot</strong> ×1<br>Kill 5 enemies with aircraft in a game.</li>\n\t<li><span class=\"medal\" style=\"background-position:-832px -320px;\"></span> <strong>Bodyguard</strong> ×1<br>Save 5 allies by killing their attacker in a game.</li>\n</ul>\n<h4>Skill</h4>\n<ul>\n\t<li><span class=\"medal\" style=\"background-position:-256px -384px;\"></span> <strong>Back Smack</strong> ×437<br>Kill an enemy by hitting them from behind with melee.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -384px;\"></span> <strong>Splatter</strong> ×265<br>Kill an enemy by hitting them with a vehicle.</li>\n\t<li><span class=\"medal\" style=\"background-position:-64px -384px;\"></span> <strong>Cluster Luck</strong> ×198<br>Kill 2+ enemies with a single grenade.</li>\n\t<li><span class=\"medal\" style=\"background-position:-640px -384px;\"></span> <strong>Odin&#8217;s Raven</strong> ×173<br>Detect 3+ enemies with a single Threat Sensor.</li>\n\t<li><span class=\"medal\" style=\"background-position:-576px -384px;\"></span> <strong>Kong</strong> ×117<br>Kill an enemy by throwing a Fusion Coil.</li>\n\t<li><span class=\"medal\" style=\"background-position:-384px -384px;\"></span> <strong>Reversal</strong> ×103<br>Kill an enemy who attacked you first.</li>\n\t<li><span class=\"medal\" style=\"background-position:-704px -448px;\"></span> <strong>Grand Slam</strong> ×77<br>Kill 2+ enemies with a single Gravity Hammer swing.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -384px;\"></span> <strong>Stick</strong> ×74<br>Kill an enemy by sticking them with a Plasma or Spike Grenade.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -384px;\"></span> <strong>Snipe</strong> ×63<br>Headshot an enemy with a Power sniper rifle.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -448px;\"></span> <strong>No Scope</strong> ×55<br>Kill an enemy with a Power sniper rifle without zooming.</li>\n\t<li><span class=\"medal\" style=\"background-position:-512px -448px;\"></span> <strong>Whiplash</strong> ×48<br>Kill a grappling enemy.</li>\n\t<li><span class=\"medal\" style=\"background-position:-0px -384px;\"></span> <strong>Harpoon</strong> ×37<br>Grapple a distant enemy.</li>\n\t<li><span class=\"medal\" style=\"background-position:-960px -384px;\"></span> <strong>Bank Shot</strong> ×27<br>Kill an enemy with a ricochet.</li>\n\t<li><span class=\"medal\" style=\"background-position:-704px -384px;\"></span> <strong>Tag &amp; Bag</strong> ×15<br>Kill 2+ enemies while revealing them with the Threat Sensor.</li>\n\t<li><span class=\"medal\" style=\"background-position:-896px -384px;\"></span> <strong>Bulltrue</strong> ×14<br>Save yourself or an ally by interrupting an enemy&#8217;s Energy Sword lunge.</li>\n\t<li><span class=\"medal\" style=\"background-position:-512px -384px;\"></span> <strong>Guardian Angel</strong> ×14<br>Save an ally&#8217;s life from far away.</li>\n\t<li><span class=\"medal\" style=\"background-position:-64px -448px;\"></span> <strong>Perfect</strong> ×13<br>Kill an enemy with a precision weapon with peak efficiency.</li>\n\t<li><span class=\"medal\" style=\"background-position:-640px -448px;\"></span> <strong>Boom Block</strong> ×12<br>Block an incoming projectile by deploying a Drop Wall.</li>\n\t<li><span class=\"medal\" style=\"background-position:-0px -512px;\"></span> <strong>Sneak King</strong> ×11<br>Kill a camouflaged enemy by hitting them from behind with melee.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -512px;\"></span> <strong>Ninja</strong> ×7<br>Kill an enemy by leaping over them and hitting them from behind with melee.</li>\n\t<li><span class=\"medal\" style=\"background-position:-896px -576px;\"></span> <strong>Counter-snipe</strong> ×7<br>Headshot an enemy while you both are zoomed with Power sniper rifles.</li>\n\t<li><span class=\"medal\" style=\"background-position:-576px -448px;\"></span> <strong>Windshield Wiper</strong> ×6<br>Kill an enemy attempting to hijack a vehicle.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -384px;\"></span> <strong>Chain Reaction</strong> ×5<br>Kill an enemy with a shock chain.</li>\n\t<li><span class=\"medal\" style=\"background-position:-960px -320px;\"></span> <strong>Dogfight</strong> ×3<br>Destroy an enemy aircraft while in one yourself.</li>\n\t<li><span class=\"medal\" style=\"background-position:-832px -384px;\"></span> <strong>Pancake</strong> ×3<br>Kill an enemy by flattening them with the Repulsor.</li>\n\t<li><span class=\"medal\" style=\"background-position:-256px -512px;\"></span> <strong>Quigley</strong> ×3<br>Kill 2+ enemies with a single S7 Sniper round.</li>\n\t<li><span class=\"medal\" style=\"background-position:-256px -448px;\"></span> <strong>Fire &amp; Forget</strong> ×3<br>Kill an enemy with an M41 <abbr>SPNK</abbr>r from far away.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -448px;\"></span> <strong>Hail Mary</strong> ×2<br>Kill an enemy with a grenade from far away.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -448px;\"></span> <strong>Mind the Gap</strong> ×1<br>Kill an enemy by sending them to their doom with the Repulsor.</li>\n\t<li><span class=\"medal\" style=\"background-position:-192px -512px;\"></span> <strong>Remote Detonation</strong> ×1<br>Kill an enemy by shooting a grenade.</li>\n\t<li><span class=\"medal\" style=\"background-position:-768px -384px;\"></span> <strong>Rideshare</strong> ×1<br>Deliver the objective carrier to the objective after driving a great distance.</li>\n\t<li><span class=\"medal\" style=\"background-position:-896px -448px;\"></span> <strong>Autopilot Engaged</strong> ×1<br>Kill the enemy driver of a moving vehicle with a Power sniper rifle.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -448px;\"></span> <strong>Ballista</strong> ×1<br>Kill an enemy with a Skewer from far away.</li>\n</ul>\n<h4>Style</h4>\n<ul>\n\t<li><span class=\"medal\" style=\"background-position:-576px -512px;\"></span> <strong>From the Grave</strong> ×127<br>Kill an enemy after you die.</li>\n\t<li><span class=\"medal\" style=\"background-position:-768px -512px;\"></span> <strong>Last Shot</strong> ×124<br>Kill an enemy with your magazine&#8217;s last round.</li>\n\t<li><span class=\"medal\" style=\"background-position:-384px -576px;\"></span> <strong>Yard Sale</strong> ×75<br>Kill an enemy who had a Power weapon and a full inventory.</li>\n\t<li><span class=\"medal\" style=\"background-position:-576px -576px;\"></span> <strong>360</strong> ×12<br>Kill an enemy by shooting them moments after spinning around.</li>\n\t<li><span class=\"medal\" style=\"background-position:-128px -576px;\"></span> <strong>Grapple-jack</strong> ×12<br>Grapple to and hijack an enemy vehicle.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -576px;\"></span> <strong>Off the Rack</strong> ×5<br>Kill an enemy with a weapon moments after retrieving it from its spawn location.</li>\n\t<li><span class=\"medal\" style=\"background-position:-704px -512px;\"></span> <strong>Quick Draw</strong> ×4<br>Kill an enemy with a pistol moments after switching to it.</li>\n\t<li><span class=\"medal\" style=\"background-position:-960px -512px;\"></span> <strong>Ramming Speed</strong> ×4<br>Destroy an enemy vehicle by hitting it with your own.</li>\n\t<li><span class=\"medal\" style=\"background-position:-448px -512px;\"></span> <strong>Mount Up</strong> ×2<br>Assemble a fully-loaded vehicle of 2+ allies after honking the horn.</li>\n\t<li><span class=\"medal\" style=\"background-position:-512px -512px;\"></span> <strong>Reclaimer</strong> ×2<br>Hijack an enemy vehicle that was once yours.</li>\n\t<li><span class=\"medal\" style=\"background-position:-320px -640px;\"></span> <strong>Blind Fire</strong> ×2<br>Kill a distant enemy by shooting them from inside a Shroud Screen.</li>\n\t<li><span class=\"medal\" style=\"background-position:-832px -576px;\"></span> <strong>Fastball</strong> ×1<br>Kill an enemy with the impact from a thrown grenade.</li>\n</ul><h3 id=\"capture-the-flag\">Capture the Flag</h3>\n<p>My favourite of Halo&#8217;s game types. The goal is to capture the enemy flag and return it to your base. I very much play the objective and will throw away lives trying to get one up.</p>\n<ul>\n<li>Flag Steals: 198</li>\n<li>Flag Grabs: 153</li>\n<li>Flag Captures: 78</li>\n<li>Flag Capture Assists: 46</li>\n<li>Flag Steal-to-Capture Conversion: 39.4%</li>\n<li>Flag Carriers Killed: 109</li>\n<li>Flag Returners Killed: 13</li>\n<li>Flag Returns: 92</li>\n<li>Flag Secures: 144</li>\n<li>Kills as Flag Carrier: 6</li>\n<li>Kills as Flag Returner: 18</li>\n<li>Time as Flag Carrier: 39 minutes and 24 seconds</li>\n</ul>\n<h3 id=\"attrition\">Attrition</h3>\n<p>Slayer, but each team has a limited number of lives, and players can be revived. I usually feel like too much of a burden to my team.</p>\n<ul>\n<li>Allies Revived: 132</li>\n<li>Elimination Assists: 12</li>\n<li>Eliminations: 19</li>\n<li>Enemy Revives Denied: 0</li>\n<li>Executions: 0</li>\n<li>Kills as Last Player Standing: 1</li>\n<li>Last Players Standing Killed: 1</li>\n<li>Rounds Survived: 9</li>\n<li>Times Revived by Ally: 171</li>\n</ul>\n<h3 id=\"infection\">Infection</h3>\n<p>A group of survivors try to survive against zombies. Once slain, survivors join the zombie team to hunt down more survivors. I find this mode very stressful, so don&#8217;t play it often.</p>\n<ul>\n<li>Alphas Killed: 3</li>\n<li>Spartans Infected: 5</li>\n<li>Spartans Infected as Alpha: 3</li>\n<li>Kills as Last Spartan Standing: 0</li>\n<li>Last Spartans Standing Infected: 0</li>\n<li>Rounds as Alpha: 1</li>\n<li>Rounds as Last Spartan Standing: 0</li>\n<li>Rounds Finished as Infected: 7</li>\n<li>Rounds Survived as Spartan: 0</li>\n<li>Rounds Survived as Last Spartan Standing: 0</li>\n<li>Time as Last Spartan Standing: 0 seconds</li>\n<li>Infected Killed: 4</li>\n</ul>\n<h3 id=\"oddball\">Oddball</h3>\n<p>Must hold onto a skull (the titular Oddball) to collect points, while stopping the enemy team from doing the same. Very much dependent on team members being helpful due to being unable to use weapons while holding the ball. Unfortunately, they are often not.</p>\n<ul>\n<li>Kills as Skull Carrier: 4</li>\n<li>Longest Time as Skull Carrier: 53 seconds</li>\n<li>Skull Carriers Killed: 4</li>\n<li>Skull Grabs: 2</li>\n<li>Time as Skull Carrier: 2 minutes and 15 seconds</li>\n<li>Skull Scoring Ticks: 132</li>\n</ul>\n<h3 id=\"total-control\">Total Control</h3>\n<p>Teams must capture and control all designated areas on a map while preventing the enemy team from doing the same.</p>\n<ul>\n<li>Zone Captures: 205</li>\n<li>Zone Defensive Kills: 38</li>\n<li>Zone Offensive Kills: 74</li>\n<li>Zone Secures: 32</li>\n<li>Total Zone Occupation Time: 48 minutes and 44 seconds</li>\n<li>Zone Scoring Ticks: 386</li>\n</ul>\n<h3 id=\"stockpile\">Stockpile</h3>\n<p>Two teams fighting for Power Seeds, which are located in neutral territory and must be collected and deposited at your base. I&#8217;m not much a fan of this gametype.</p>\n<ul>\n<li>Kills as Power Seed Carrier: 0</li>\n<li>Power Seed Carriers Killed: 1</li>\n<li>Power Seeds Deposited: 0</li>\n<li>Power Seeds Stolen: 0</li>\n<li>Time as Power Seed Carrier: 0 seconds</li>\n<li>Time as Power Seed Driver: 0 seconds</li>\n</ul>\n<h3 id=\"firefight\">Firefight</h3>\n<p>Multiplayer or single-player wave defence against computer-driven enemies.</p>\n<ul>\n<li>Kills: 9564</li>\n<li>Deaths: 245</li>\n<li>Assists: 2150</li>\n<li>Grunt Kills: 4147 (43.36%)</li>\n<li>Jackal Kills: 2567 (26.84%)</li>\n<li>Elite Kills: 454 (4.75%)</li>\n<li>Brute Kills: 1164 (12.17%)</li>\n<li>Hunter Kills: 30 (0.31%)</li>\n<li>Skimmer Kills: 1059 (11.07%)</li>\n<li>Boss Kills: 143 (1.50%)</li>\n</ul>\n<style>\n@media (min-width: 30rem) {\n\tarticle > div > ul {\n\t\tcolumns: 2;\n\t\tcolumn-gap: 2rem;\n\n\t\tli {\n\t\t\tbreak-inside: avoid;\n\t\t}\n\t}\n}\n\n.medal {\n\tdisplay: inline-block;\n\tblock-size: 4rem;\n\taspect-ratio: 1;\n\tvertical-align: middle;\n\tbackground-image: url(/assets/posts/halo-stats/infinite-medals.avif);\n\tbackground-size: 1024px auto;\n}\n</style>\n\n\t\t",
      "summary": "Statistics and data from my playing of the video games in the Halo series. My data extracted from Halo Waypoint combined with some light analysis. Covering the games in the Master Chief Collection and Halo Infinite. Kills, deaths, and how they all happened.",
      "date_published": "2026-09-05"
    },
    {
      "id": "https://vale.rocks/posts/minecraft-pi-edition",
      "url": "https://vale.rocks/posts/minecraft-pi-edition",
      "title": "The Curiosity That Is Minecraft: Pi Edition",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p><em>Minecraft: Pi Edition</em> is a modified port of the game Minecraft to the Raspberry Pi, a hobbyist single-board computer. It is a bit of an oddity, because it differs greatly from other editions of Minecraft, is completely free, saw only fleeting support from Minecraft&#8217;s developer Mojang, and is obscure, despite being a port of the best-selling game of all time.</p>\n<figure class=\"shorter pixelated\">\n<img src=\"/assets/posts/minecraft-pi-edition/mc-pi-edition-small-house.avif\" alt=\"A small Minecraft house made of wood. It has a planter out the front with a cyan rose in it. To the right is a patch of wheat. I'm holding an iron sword.\">\n<figcaption>\nA small house built in Pi Edition. Note the cyan rose, which was exclusive to old versions of Pocket Edition, as the colour red caused bad image ghosting on the Xperia Play.\n</figcaption>\n</figure><h2 id=\"history\">History</h2>\n<p>Minecraft was originally developed in Java for desktop operating systems. As the game grew in popularity, demand grew for it to appear on more platforms. In August 2011 the first port of the game, <em>Minecraft: Pocket Edition</em> (MC:PE), released on the Xperia Play. In October the game came to wider Android, and in November it came to iOS.</p>\n<p>To run on mobile phones of the time, the Pocket Edition was written in C++, rather than Java, and was severely cut down and optimised. For context, the most recent flagship Samsung phone at the time of MC:PE&#8217;s release was the Samsung Galaxy S II, and the most recent iPhone was the iPhone 4s. The Pocket Edition was far behind the Java Edition in features, something that hasn&#8217;t changed years on, with many parity issues <a href=\"https://minecraft.wiki/w/Parity_issue_list\">remaining unaddressed</a>, even now that Minecraft Bedrock Edition, which evolved from Pocket Edition, is the main and predominant version of the game.</p>\n<p>In November 2012, <a href=\"https://web.archive.org/web/20200716231638/https://www.mojang.com/2012/11/minecraft-is-coming-to-the-raspberry-pi/\">Mojang announced Minecraft was coming to the Raspberry Pi</a> with development being led by <a href=\"https://minecraft.wiki/w/Aron_Nieminen\">Aron Nieminen</a> and <a href=\"https://minecraft.wiki/w/Daniel_Frisk\">Daniel Frisk</a>.</p>\n<p>On December 20<sup>th</sup>, Mojang accidentally published the announcement blog post on the Minecraft: Pi Edition blog before quickly retracting it. However, when they <a href=\"https://web.archive.org/web/20170124210204/http://pi.minecraft.net/\">published the announcement blog post officially</a> upon release of the game, the post retained the initial, incorrect publish date.</p>\n<p>On December 26<sup>th</sup>, the game leaked online after it was accidentally uploaded unencrypted on Mojang&#8217;s repository, before being encrypted shortly thereafter. Daniel <a href=\"https://web.archive.org/web/20200716160833/https://twitter.com/danfrisk/status/283682787033247744\">said of the leak</a>, &#8216;I don&#8217;t mind if people use the leaked build, but be aware that it&#8217;s pre-alpha quality.&#8217;. The leaked version identified itself as &#8216;0.1.0 alpha&#8217; and was based upon Pocket Edition v0.5.0 alpha.</p>\n<p>Minecraft: Pi Edition released officially on February 11<sup>th</sup>, 2013. This initial version, v0.1.1 alpha, was the only version released. In January 2016, it was stated by then Mojang Developer Tommaso Checchi <a href=\"https://www.reddit.com/r/MCPE/comments/42g9cr/comment/cza7seq/\">in a thread on Reddit regarding the status of the Pi Edition</a> that:</p>\n<blockquote>\n<p>It ded :(</p>\n<p>The original team has stopped supporting it and starting with 0.9 <abbr>MCPE</abbr> became a lot more ambitious technically, which also means that it became a lot harder to strip down to run on a Raspberry Pi. Actually, we finished removing all Pi related code to reduce complexity in 2015.</p>\n<p>Maybe someday we&#8217;ll revisit it but I wouldn&#8217;t hold my breath :P</p>\n</blockquote>\n<p>In September 2014 Raspbian (now called &#8216;Raspberry Pi OS&#8217;) was updated to include Minecraft Pi. It remained pre-installed until August 2021, when the operating system updated to using Debian Bullseye as a base and <a href=\"https://downloads.raspberrypi.org/raspios_full_armhf/release_notes.txt#:~:ext=Minecraft%20removed%20from%20Recommended%20Software\">Minecraft Pi became incompatible</a>.</p>\n<h2 id=\"functionality\">Functionality</h2>\n<p>The Pi Edition is not a &#8216;game&#8217; in the same way that other versions of Minecraft are. It is designed to be hacked upon via its <abbr title=\"Applications Programming Interface\">API</abbr>, so out of the box there are a number of changes from Pocket Edition v0.6.1 alpha (on which Minecraft: Pi Edition is based). These are:</p>\n<ol>\n<li>Survival mode is stripped. You cannot join survival mode servers or set your own game mode to survival.</li>\n<li>The player is always called &#8216;StevePi&#8217;.</li>\n<li>Signs are always blank and cannot be edited.</li>\n<li>There is no audio (though a mute button still appears in the menu).</li>\n<li>The interface uses the Xperia Play design, rather than the standard touch interface.</li>\n<li>You can&#8217;t select a world&#8217;s seed or name. All worlds have the name &#8216;world&#8217;.</li>\n<li>The world is always visible via <abbr title=\"Local Area Network\">LAN</abbr>.</li>\n<li>Mobs are disabled.</li>\n<li>Chests, Crafting Tables, Furnaces, <abbr>TNT</abbr>, and the Nether Reactor Core are all non-functional.</li>\n<li>Fancy graphics are disabled.</li>\n<li>The bow doesn&#8217;t function. It can be drawn, but it doesn&#8217;t shoot arrows and will remain drawn until switched from.</li>\n<li>Saplings and wheat seeds do not grow unless bone meal is applied.</li>\n<li>Fire doesn&#8217;t spread and is also invisible.</li>\n<li>Coordinates are shown in the top left corner.</li>\n<li>You can sneak, which was otherwise exclusive to the Xperia Play version of Pocket Edition until v0.12.1.</li>\n</ol>\n<p>Most of these features remain in the game, just patched out. Some of these changes can be attributed to performance considerations. At the time of Pi Edition&#8217;s release, the most recent Raspberry Pi was the Raspberry Pi 1 Model A &#8211; a cheaper variant of the original Raspberry Pi with only <abbr>256MB</abbr> of memory (even less than the iPhone 4). The Pi Edition has bespoke <abbr title=\"Graphics Processing Unit\">GPU</abbr> code which explains some visual differences. It is because of this that screenshots of Pi Edition will appear blank, unless using a workaround such as <a href=\"https://github.com/AndrewFromMelbourne/raspi2png\">raspi2png</a>.</p>\n<p>Only &#8216;Old&#8217;-style worlds can be generated. They&#8217;re 256 blocks wide on the X and Z axes, and 128 blocks high on the Z axis. Rainforest, Swampland, Seasonal Forest, Forest, Savannah, Shrubland, Taiga, Desert, Plains, Ice Desert, and Tundra biomes are all present in the game. However, the Savannah and Shrubland have no special generation and the Ice Desert does not generate naturally. Due to the small world size it is uncommon to have much, if any, variation of biomes within a world. The files for worlds themselves are located at <code>~/.minecraft/games/com.mojang/minecraftWorlds</code>. They can be modified by the same means that are used to modify worlds in old versions of Pocket Edition.</p>\n<h2 id=\"api\"><abbr>API</abbr></h2>\n<p>Most of Pi Edition&#8217;s changes from Pocket Edition can be attributed to Pi Edition&#8217;s focus on hacking and experimenting. The edition was very much designed for people to dip their toes into development and to be used in educational contexts. There is a full <abbr>API</abbr> for interacting with Pi Edition with libraries for Python and Java bundled. The protocol specification is documented in a text file within the edition&#8217;s files. Curiously, despite the intent for users to hack on Pi Edition, debug symbols are stripped. This is particularly odd, as they weren&#8217;t stripped from Bedrock Edition until release version 1.13.0.</p>\n<p>People have done all sorts of things using the <abbr>API</abbr>. Many of these efforts can be seen on the <a href=\"https://www.minecraftforum.net/forums/minecraft-editions/minecraft-pi-edition\">Minecraft: Pi Edition board</a> of the Minecraft Forum. Some usages of the <abbr>API</abbr> I find most interesting are Dav Stott&#8217;s <a href=\"https://davstott.me.uk/index.php/2013/07/28/raspberry-pi-drawing-maps-inside-minecraft/\">Ordnance Survey map viewer</a> and the <a href=\"https://www.stuffaboutcode.com/minecraft/\">various experiments by Martin O&#8217;Hanlon</a>. Zhuowei Zhang <a href=\"https://github.com/zhuowei/RaspberryJuice\">created a Bukkit plugin called RaspberryJuice</a>, which implements the Pi Edition <abbr>API</abbr> on Java Edition, allowing scripts to be used across editions.</p>\n<h2 id=\"textures\">Textures</h2>\n<p>Minecraft: Pi Edition stores textures as <abbr>PNG</abbr> files within the <code>data/images/</code> directory. In Raspberry Pi OS, this directory is located within <code>/opt/minecraft-pi/</code>, making the full path <code>/opt/minecraft-pi/data/images/</code>. Many textures are stored in spritesheets.</p>\n<figure class=\"right pixelated\">\n<img src=\"/assets/posts/minecraft-pi-edition/mc-pi-edition-main-menu.avif\" alt=\"A simple menu with a tiled dirt texture background. There are two buttons: 'Start Game' and 'Join Game'. In the bottom left is the RakNet logo, while in the bottom right is text that reads '©Mojang AB'. Front and centre is the logo 'Minecraft: Pi Edition' with the version number.\">\n<figcaption>Pi Edition&#8217;s main menu.</figcaption>\n</figure><p>There are many textures which are carried across from Pocket Edition but which are unused. The relevant textures to modify are:</p>\n<ul>\n<li><code>terrain.png</code> - All block textures.</li>\n<li><code>particles.png</code> - Particles, such as water droplets and potion effects.</li>\n<li><code>mob/</code> - Contains the textures for mobs. <code>char.png</code> is the player skin.</li>\n<li><code>art/kz.png</code> - All paintings. Named &#8216;kz&#8217; for <a href=\"http://zetterstrand.com\">Kristoffer Zetterstrand</a>, who made the paintings.</li>\n<li><code>font/default8.png</code> - The font used for the interface.</li>\n<li><code>environment/clouds.png</code> - Clouds. Note that they&#8217;re only visible if you manually enable Fancy Graphics.</li>\n<li><code>gui/gui.png</code> - The buttons used in the menu and the in-game hotbar. The rest of the buttons are unused.</li>\n<li><code>gui/touch_gui</code> - Most unused, with the exception of the mute and third-person toggle buttons.</li>\n<li><code>gui/items.png</code> - All item textures.</li>\n<li><code>gui/icons.png</code> - The crosshair, health, armour, and breath interface elements. With the exception of the crosshair, these icons are unused due to being survival dependent.</li>\n<li><code>gui/pi_title.png</code> - The logo used on the main menu.</li>\n<li><code>gui/default_world.png</code> - Thumbnail used in the interface for all worlds.</li>\n<li><code>gui/gui_blocks.png</code> - Unlike Java Edition and newer versions of Bedrock Edition, Pi Edition does not automatically generate the display of blocks within the user&#8217;s inventory. Instead, it uses a pre-generated spritesheet containing <abbr>3D</abbr> representations of the blocks.</li>\n<li><code>gui/background.png</code> & <code>gui/bg32.png</code> - Tiled for the menu backgrounds.</li>\n<li><code>gui/cursor.png</code> - Mouse pointer.</li>\n<li><code>gui/logo/</code> - Logos of RakNet, the C++ networking library used by Pi Edition. Appears in the bottom left corner of the main menu.</li>\n</ul>\n<p>As they are just <abbr>PNG</abbr> files and not at all bespoke, they can be easily modified with image manipulation tools. Just ensure they&#8217;re saved as 32-bit <abbr>PNG</abbr>s, as otherwise they&#8217;ll appear corrupted.</p>\n<hr>\n<p>Minecraft: Pi Edition has largely fallen into irrelevance in the many years since it released. With it no longer being supported on the modern releases of the very devices it was built for, it is firmly a footnote of the past. It can still be found on and downloaded from the Minecraft website; however, the original Pi-specific website that was at <code>pi.minecraft.net</code> is gone.</p>\n<p>Outside of official support, a continuation and modernisation of Pi Edition titled <em><a href=\"https://gitea.thebrokenrail.com/minecraft-pi-reborn/minecraft-pi-reborn\">Minecraft: Pi Edition: Reborn</a></em>, or <em><abbr>MCPI</abbr>-Reborn</em>, has been under development in various forms for years. It brings more modern features and assorted fixes, in addition to patching back in functionality, such as survival mode, that sits latent in Pi Edition&#8217;s codebase. The source code for many versions of the Legacy Console Editions and the Pocket Edition &#8211; including the version upon which Pi Edition is based &#8211; leaked in March 2026 and has been referenced by the modding community to make their mods even more impressive.</p>\n\n\t\t",
      "summary": "The history and details of an obscure Minecraft version that was exclusively available on the Raspberry Pi. Based on the mobile Pocket Edition for phones but with some unique functionality. Namely, a native API for interacting with the game. Primarily created to serve as an educational tool.",
      "date_published": "2026-09-02"
    },
    {
      "id": "https://vale.rocks/posts/stoat-history",
      "url": "https://vale.rocks/posts/stoat-history",
      "title": "A Complete History of Stoat",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>In 2019 three students in their mid-teens &#8211; Paul Makles (Insert), <a href=\"https://renevinter.xyz\">Rene Vinter (Nizune)</a>, and <a href=\"https://fatalerrorcoded.eu\">Martin Löffler (FatalErrorCoded)</a> &#8211; established Riot (stylised <abbr>RIOT</abbr>), an online chat platform targeting gaming communities. Funded by donations on Patreon, Riot operated at a small scale and ultimately ceased development in mid-2019.</p>\n<figure class=\"shorter long\">\n<img src=\"/assets/posts/stoat-history/riot-landing-page.avif\" alt=\"A purple landing page with multiple sections showcasing Riot's capabilities. It touts being open-source, has the tagline 'Let's riot together', and one section shows off gaming communities.\">\n<figcaption>Riot landing page.</figcaption>\n</figure><p>Throughout 2020, the team worked on a new project: Revolt. Starting afresh with the lessons learned from Riot, rather than building upon it. Riot had been developed in <abbr>ECMAS</abbr>cript, while Rust was chosen for Revolt&#8217;s back-end as a result of Makles wishing to use the opportunity to learn the language. The name &#8216;Revolt&#8217; was originally just the name of the <abbr>API</abbr> server in development for the project, but it ended up sticking and becoming the name of the project as a whole. Work on Revolt began in late 2019 and continued through 2020.</p>\n<p>The back-end was established with a collection of services:</p>\n<ul>\n<li>January, for proxying images and generating embeds.</li>\n<li>Autumn, a file server.</li>\n<li>Delta, for the <abbr title=\"Representational State Transfer\">REST</abbr> <abbr>API</abbr>.</li>\n<li>Bonfire, for WebSocket events.</li>\n<li>Vortex, for voice communication.</li>\n</ul>\n<p>A web client called Revite (now referred to as &#8216;For Legacy Web&#8217;) was created, which was also installable on mobile devices as a <abbr title=\"Progressive Web App\">PWA</abbr> and on desktop operating systems via an <a href=\"https://www.electronjs.org\">Electron wrapper</a>. In January of 2021 the project went live in a closed beta state and in August officially launched in an open beta.</p>\n<figure class=\"left\">\n<img src=\"/assets/posts/stoat-history/revolt-pre-servers.avif\" alt=\"A rather barren chat interface showing a 'Testers' group selected from a list of conversations. A member list is shown to the right with a large chat pane in the centre and a message bar down the bottom. The top right corner shows the current user, and underneath it are tabs for 'Home', 'Friends', 'Saved Messages', and 'Developer'.\">\n<figcaption>A screenshot of Revite from April 2021, prior to the addition of servers.</figcaption>\n</figure><p>Initially being without servers at all, only group chats and direct messages, servers were eventually added, and in mid-June 2021, Makles created the first proper server on the platform: Revolt Testers. This server replaced the &#8216;Testers&#8217; group chat (pictured) and was later rebranded to the &#8216;Revolt Lounge&#8217;.</p>\n<p>Revolt&#8217;s first &#8216;influx&#8217; &#8211; the name given to mass inpourings of new users &#8211; occurred in September of 2021 when the platform found itself <a href=\"https://news.ycombinator.com/item?id=28434012\">on the front page of Hacker News</a>, reaching 642 upvotes. Nobody from the team posted or was aware of this post until a great deal of users began to show up. Message acknowledgements had to be disabled to prevent the platform from going offline. As result of Hacker News&#8217; reach, Revolt saw secondary exposure from additional sources such as <a href=\"https://lobste.rs/s/9tlgop/revolt_new_foss_self_hostable_discord\">Lobste.rs</a> and <a href=\"https://gigazine.net/gsc_news/en/20210919-revolt/\">Gigazine</a>. <a href=\"https://itsfoss.com/revolt/\">It&#8217;s <abbr>FOSS</abbr></a> published a particularly popular article which appeared on Google News.</p>\n<figure class=\"right\">\n<img src=\"/assets/posts/stoat-history/revite-2021.avif\" alt=\"A more populated interface, showing many more conversations, in-chat messages from bots, and a newly introduced server list to the far left of the page.\">\n<figcaption>A screenshot of Revite taken by Insert in June 2021.</figcaption>\n</figure><p>In very late 2021, the Discover service launched, providing an easy first-party way for people to explore Revolt. Via Discover, users can join servers, invite bots to servers they moderate, and apply themes to Revite.</p>\n<p>In May of 2022, a <a href=\"https://stoat.chat/updates/architecture-overhaul\">comprehensive rearchitecturing</a> of Revolt&#8217;s back-end was completed, following the effort&#8217;s beginnings in late January. This greatly improved the reliability and resilience of the platform, while greatly improving both the developer and user experiences. Of particular note was a greatly improved permission system, allowing for private channels in servers and greater control of user permissions by server administrators. A rudimentary <abbr>GIF</abbr> sharing service developed by Revolt and called Gifbox launched in August, though was not well supported after launch and eventually stopped working in mid-2024.</p>\n<p>In October of 2022, internet influencer and self-proclaimed misogynist facing multiple international charges for rape, human trafficking, and child abuse material Andrew Tate launched &#8216;The Real World&#8217;. A successor to his previous platform &#8216;Hustler&#8217;s University&#8217;, The Real World is equally as slimy. Part of the &#8216;manosphere&#8217;, the paid platform instructs users on how to make money by hustling with cryptocurrencies and such.</p>\n<p>In November it was discovered by a user in the Revolt Lounge that The Real World was completely built atop of Revolt. Paul Makles looked into it and confirmed that not only was it violating Revolt&#8217;s AGPLv3 licence, but that he&#8217;d been contacted by them prior to launch in an attempt to hire him onto the team. I gained access to the platform myself via a contact and can confirm first-hand that it was a modified version of Revite. The <abbr>API</abbr> responses from the back-end made explicit reference to Revolt, too.</p>\n<p>The Real World was hacked in May 2024, and almost a million user details were exposed, not due to a vulnerability in Revolt, but because they failed to configure their databases correctly. This was followed in November by another breach in which even more data was leaked and where the hackers flooded chats with <abbr>LGBTQ</abbr>+ emojis. Humorously, this November intrusion happened while Andrew Tate was actively live streaming. Unfortunately, with lack of resources to legally tackle The Real World&#8217;s licence violation, the platform has remained active.</p>\n<p>In February 2023, in-app reporting functionality was launched on Revolt as part of a significant push for user safety. This introduced the ability for users to report content to Revolt to be moderated on a platform level, something that had previously been managed across servers by the user-run bot <a href=\"https://automod.vale.rocks\">AutoMod</a>. Alongside this came a major update to <a href=\"https://github.com/stoatchat/rust-authifier\">Authifier</a>, changing its name from &#8216;rAuth&#8217; and becoming a more capable system to prevent spam and abuse of the service. Vinter officially departed from Revolt in early 2023, and Löffler&#8217;s contributions slowed around the same time, later ceasing entirely.</p>\n<p>The first major user milestone was reached in June of 2023, when the platform <a href=\"https://stoat.chat/updates/100k-users\">hit 100,000 registered users</a>. This occurred two days following <a href=\"https://stoat.chat/updates/evolving-usernames\">the launch of discriminators</a>, four-digit tags prefixed by an octothorpe which are present at the end of usernames to allow multiple accounts to have the same username and to dissuade a black market of rare username sales. Discord had <a href=\"https://discord.com/blog/usernames/\">announced their intent to remove discriminators</a> the previous month and was rolling the new system out at this time.</p>\n<p>In October, the platform&#8217;s first official native application &#8211; Revolt For Android &#8211; <a href=\"https://stoat.chat/updates/revolt-on-the-go\">was teased</a>. Following in December came the <a href=\"https://stoat.chat/updates/refreshing-revolt-web\">beta release of Revolt For Web</a>, a new web and desktop client following Google&#8217;s Material 3 design language intended to replace Revite.</p>\n<p>Publicly visible changes were low in early 2024 as lots of work was done behind the scenes. This changed with the short-lived but informative &#8216;Month in Revolt&#8217; series. The <a href=\"https://stoat.chat/updates/month-in-revolt-may-2024\">May entry</a> documented continued work on the Android app, voice and video calling, and an improved developer website. The voice and video work involved replacing Vortex &#8211; the previous voice service whose long-needed 2.0 release had entered a development hell following the departure of Martin Löffler &#8211; with a new <a href=\"https://livekit.com\">LiveKit</a>-based implementation which would also be able to facilitate video sharing.</p>\n<p>The <a href=\"https://stoat.chat/updates/month-in-revolt-july-2024\">July entry</a> (June was skipped) detailed improvements to the beta web client (specifically in regard to message formatting and settings), some development on a native iOS client, and various changes to the back-end, including conclusion of an architectural overhaul. The <a href=\"https://stoat.chat/updates/month-in-revolt-august-2024\">final of the monthly updates</a>, which released in August, noted more mobile client improvements and work on moderation systems, though development of the new web client stalled due to Paul Makles&#8217; unavailability.</p>\n<p>In October of 2024, Revolt reached another major milestone: half-a-million registered users. This came following a ban of Discord in Russia by the Roskomnadzor &#8211; the agency concerned with monitoring and controlling media and communications within Russia. The following day, Discord was banned in Turkey too. The huge number of Russian and Turkish speaking users necessitated that Revolt fast-track the onboarding of more moderators to handle the event. October also saw features such as pinned messages and webhooks begin to roll out. A private beta for the native Android app also occurred from mid-2024.</p>\n<p>In early 2025 the Revolt landing page was overhauled alongside tweaks to the wordmark and brand palette. The native Android app also launched into a long-awaited early access state on the Google Play Store, replacing the <abbr title=\"Trust Web Activity\">TWA</abbr> version that was previously available. It also ended up on the <a href=\"https://news.ycombinator.com/item?id=43277918\">front page of Hacker News again</a>.</p>\n<figure class=\"shorter\">\n<img src=\"/assets/posts/stoat-history/revolt-landing-page-early-2025.avif\" alt=\"A gradient-heavy landing page with a dark blue background. Large text reads 'Find your community', followed by 'Revolt is the chat app that's truly built with you in mind.'. A download button is prominent, with a skewed screenshot of Revite's interface visible behind it.\">\n<figcaption>The Revolt website in early 2025.</figcaption>\n</figure><p>As a result of a cease and desist notice regarding the name &#8216;Revolt&#8217;, the platform changed its name to &#8216;Stoat&#8217; after the species of mustelid. Stoat did not publicly divulge the sender of the cease and desist on the grounds of wishing to avoid harming negotiations. Temporary brand resources for the new name were hastily created, and the rebrand <a href=\"https://web.archive.org/web/20260210034916/https://stoat.chat/updates/long-live-stoat\">took place at the beginning of October, 2025</a>. Alongside changes to the brand, the new Stoat For Web client was officially launched and made the default client, replacing Revite. The new LiveKit-based voice system also launched; however, it wasn&#8217;t initially usable due to issues running it in a production deployment.</p>\n<p>On the 9<sup>th</sup> of February, 2026, <a href=\"https://discord.com/press-releases/discord-launches-teen-by-default-settings-globally\">Discord announced global age-verification measures</a>. Unhappy users, citing the invasion of privacy, their disdain for Discord&#8217;s chosen age-verification service&#8217;s ties to American surveillance firm Palantir, and existing grievances with Discord&#8217;s increasing profit-over-product mentality, moved to Stoat in droves. The resulting influx was intense for the team to handle and very strenuous on Stoat&#8217;s infrastructure. The drastic sudden increase in email activity saw the platform incorrectly added to spam lists, which caused sign-up delays.</p>\n<p>A <a href=\"https://vale.rocks/portfolio/stoat#icon\">new logo and mascot designed by myself</a> went live on February 12<sup>th</sup>, as <a href=\"https://bsky.app/profile/stoat.chat/post/3memon3azgk22\">announced on Bluesky</a>, and by February 19<sup>th</sup>, <a href=\"https://www.reddit.com/r/stoatchat/comments/1r8tfnb/stoat_user_count_and_other_assorted_figures_over/\">Stoat had reached 1,120,000 users</a>, and the platform continued to grow aggressively. Continued press coverage from the likes of <a href=\"https://www.techradar.com/computing/social-media/so-many-discord-users-are-flocking-to-this-alternative-platform-its-making-stoat-crash\">TechRadar</a>, <a href=\"https://www.youtube.com/watch?v=kWcuSvv6v90&\">Switch and Click</a>, <a href=\"https://www.youtube.com/watch?v=bzosJNHD8jI\">Linus Tech Tips</a>, <a href=\"https://www.youtube.com/watch?v=kpjcmXbmMVM&t=1882s\">Gamers Nexus</a>, and <a href=\"https://www.windowscentral.com/software-apps/discord-alternative-search-10000-percent-stoat\">Windows Central</a>, among others, attracted more and more people.</p>\n<p>The biggest events of the following months were the introduction of push notifications, which <a href=\"https://bsky.app/profile/stoat.chat/post/3mmn7m7gwzg2m\">came to Stoat For Android in May</a>; the <a href=\"https://stoat.chat/updates/introducing-gifbox\">launch of a completely overhauled Gifbox</a> sharing nothing but the name and idea of the original, following the shutdown of Tenor&#8217;s <abbr>API</abbr>; and then <a href=\"https://stoat.chat/release-notes/93eb1f4ec77444ca9fb13617e0e6c0b1\">video streaming in mid-July</a>. Video streaming had been hotly anticipated and was already implemented and available to people self-hosting, but this update saw the experience polished and the feature made widely available. The status page was also moved to <a href=\"https://stoatstatus.com\">stoatstatus.com</a>.</p>\n<p>In mid-August of 2026, <a href=\"https://agenciabrasil.ebc.com.br/en/geral/noticia/2026-08/brazil-orders-discord-suspend-live-streams-country\">Discord was ordered by Brazil to suspend video streaming within the country</a> following abuse of the service. As with previous restrictions of Discord&#8217;s service availability, this triggered an influx. A mass number of Brazilian users joined the platform, making use of the recently launched video-streaming functionality. An extra production node within the United States of America had been established to improve performance of the service outside of Europe on August 9<sup>th</sup>, but the unexpected influx saw it removed on the 22<sup>nd</sup> due to the great associated costs.</p>\n<figure class=\"shorter\">\n<img src=\"/assets/posts/stoat-history/stoat-for-web-august-2026.avif\" alt=\"A Material 3-styled client with a purple tint. Left to right is a server list, a list of channels in the current server 'AutoMod', a chat pane showing a rules channel, and then a list of users. Buttons to create a server, open Discover, open settings, go home, pin messages, and search messages can all be seen.\">\n<figcaption>A screenshot of Stoat For Web in August 2026.</figcaption>\n</figure><p>It was during late August that Stoat reached another milestone: one-and-a-half million users. It was also during August that the official Stoat server on platform, which had previously been called the &#8216;Revolt Lounge&#8217;, <a href=\"https://vale.rocks/micros/20260821-1025\">switched to allowing topical discussion only</a> rather than allowing all discussion. This was done to avoid centralisation of users in one server and to promote users dispersing across the platform. This brings us to Stoat as it stands as of this article&#8217;s publication.</p>\n\n\t\t",
      "summary": "An in-depth history of the Stoat chat platform. From its precursor Riot, through to all the additions and changes the platform has seen and received as it has grown. Details from when it was once Revolt to the change into Stoat and details of all the bumps and successes along the way.",
      "date_published": "2026-08-28"
    },
    {
      "id": "https://vale.rocks/posts/atproto-ethos",
      "url": "https://vale.rocks/posts/atproto-ethos",
      "title": "The AT Protocol Harkens An Old Web Ethos",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>Web3, the &#8216;era&#8217; of the web supposedly ushering in blockchain technologies and other such fluff, has undoubtedly been a bust. Perhaps not for the bank accounts of manipulators, but a bust in general. Blockchain has very few legitimate applications, <abbr title=\"Non-Fungible Token\">NFT</abbr>s went down like the Hindenburg, and cryptocurrencies have remained a niche with strong ties to crime and corruption.</p>\n<p>The hype-driven sham of Web3 followed Web 2.0, which did have substance. With adjacent names such as the &#8216;participative web&#8217; or the &#8216;social web&#8217;, it really gained popularity as a concept in the mid-2000s alongside the establishment of proper social applications like Flickr, Facebook, Last.fm, Twitter, del.icio.us, MySpace, and Foursquare. Part of the beauty of these applications was their rather open <abbr title=\"Application Programming Interface\">API</abbr>s. They made the web feel so alive. Fetching activity from social media and displaying it on articles, people showing their location check-ins on their sites, social bookmarking, the proliferation of <abbr>RSS</abbr> feeds, more interactive capabilities, content discovery via tagging, and so on and so forth all became core parts of what made the web the web.</p>\n<p>People feeding data through <a href=\"https://en.wikipedia.org/wiki/Yahoo_Pipes\">Yahoo! Pipes</a> to create automations and mashups of data, <a href=\"https://www.protopage.com\">Protopipe</a> to create rich custom web dashboards, content aggregators like StumbleUpon, Digg, and Reddit linking out to web curios, and people just hacking together with the data exposed and at their disposal directly. The web felt alive with data flowing freely and platforms largely ungated.</p>\n<p>Then, slowly but surely, everything started to close and tighten. Websites became platforms and began to optimise obsessively for keeping people engaged. External integrations or outgoing links became hazards, threatening to reduce time-on-page. Access to data through any means other than the platform&#8217;s desired gateways became a threat. The <abbr>API</abbr>s became more restricted, then got dropped altogether. Integrations switched off, and the hedges surrounding the gardens grew thicker and taller.</p>\n<p>However, there remains hope for this era and ethos of the web, and the AT Protocol is what is bringing it back into vogue.</p>\n<h2 id=\"the-at-protocol\">The AT Protocol</h2>\n<p>The &#8216;Authenticated Transfer Protocol&#8217;, or AT Proto for short, is a very simple system at its core. A user signs up on a Personal Data Server (<abbr>PDS</abbr>) on which they&#8217;re given a data repository. This data repository can hold data in the form of records, which are housed within collections. Each user can be identified via a Decentralised Identifier (<abbr>DID</abbr>). The records that are held can take the form of <abbr>JSON</abbr> or blobs, for content such as images or video.</p>\n<figure>\n<svg viewBox=\"0 0 800 500\" role=\"img\">\n    <desc>A diagram showing records nested in collections nested in a data repository nested in a Personal Data Server.</desc> \n    <defs>\n        <rect id=\"pds\" width=\"760\" height=\"460\" fill=\"light-dark(var(--white), var(--grey))\" stroke=\"var(--bright_blue)\" stroke-width=\"2\" />\n        <rect id=\"repo\" width=\"340\" height=\"390\" fill=\"oklch(from var(--blue) l c h / calc(alpha - 0.9))\" stroke=\"var(--blue)\" stroke-width=\"2\" />\n        <rect id=\"collection\" width=\"310\" height=\"145\" fill=\"oklch(from var(--green) l c h / calc(alpha - 0.85))\" stroke=\"var(--green)\"\n            stroke-width=\"2\" />\n        <rect id=\"record\" width=\"290\" height=\"30\" fill=\"light-dark(var(--bright_white), var(--dark_grey))\" stroke=\"var(--yellow)\" stroke-width=\"2\" />\n    </defs>\n    <!-- Outer Container -->\n    <use href=\"#pds\" x=\"20\" y=\"20\" />\n    <!-- User 1 Repository -->\n    <use href=\"#repo\" x=\"40\" y=\"70\" />\n    <use href=\"#collection\" x=\"55\" y=\"135\" />\n    <use href=\"#record\" x=\"65\" y=\"195\" />\n    <use href=\"#record\" x=\"65\" y=\"235\" />\n    <use href=\"#collection\" x=\"55\" y=\"295\" />\n    <use href=\"#record\" x=\"65\" y=\"355\" />\n    <use href=\"#record\" x=\"65\" y=\"395\" />\n    <!-- User 2 Repository -->\n    <use href=\"#repo\" x=\"420\" y=\"70\" />\n    <use href=\"#collection\" x=\"435\" y=\"135\" />\n    <use href=\"#record\" x=\"445\" y=\"195\" />\n    <use href=\"#record\" x=\"445\" y=\"235\" />\n    <use href=\"#collection\" x=\"435\" y=\"295\" />\n    <use href=\"#record\" x=\"445\" y=\"355\" />\n    <use href=\"#record\" x=\"445\" y=\"395\" />\n    <!-- Titles Group -->\n    <g font-weight=\"600\">\n        <text x=\"40\" y=\"50\">Personal Data Server</text>\n        <text x=\"55\" y=\"100\">Data Repository</text>\n        <text x=\"65\" y=\"160\">Collection</text>\n        <text x=\"65\" y=\"320\">Collection</text>\n        <text x=\"435\" y=\"100\">Data Repository</text>\n        <text x=\"445\" y=\"160\">Collection</text>\n        <text x=\"445\" y=\"320\">Collection</text>\n    </g>\n    <!-- Subtitles & Records Group -->\n    <g font-family=\"monospace\" font-size=\"0.8rem\">\n        <text x=\"55\" y=\"120\">@vale.rocks (did:plc:7qg&#8230;)</text>\n        <text x=\"65\" y=\"180\">app.bsky.feed.post</text>\n        <text x=\"75\" y=\"215\">Record: &quot;The AT Protocol Harkens&#8230;&quot;</text>\n        <text x=\"75\" y=\"255\">Record: &quot;Atmosphere apps are&#8230;&quot;</text>\n        <text x=\"65\" y=\"340\">site.standard.document</text>\n        <text x=\"75\" y=\"375\">Record:&apos;Web Platform Wishlist&apos;</text>\n        <text x=\"75\" y=\"415\">Record:&apos;Overview of Digital&#8230;&apos;</text>\n        <text x=\"435\" y=\"120\">@jaydip.me (did:plc:dl6&#8230;)</text>\n        <text x=\"445\" y=\"180\">app.bsky.feed.post</text>\n        <text x=\"455\" y=\"215\">Record: &quot;wanna see forums but&#8230;&quot;</text>\n        <text x=\"455\" y=\"255\">Record: &quot;no adobe tools were used&quot;</text>\n        <text x=\"445\" y=\"340\">app.bsky.graph.follow</text>\n        <text x=\"455\" y=\"375\">Record: Follow @vale.rocks</text>\n        <text x=\"455\" y=\"415\">Record: Follow @goose.art</text>\n    </g>\n</svg>\n<figcaption>A simple diagram of how records, collections, data repositories, and Personal Data Servers fit together.</figcaption>\n</figure><p><abbr>JSON</abbr> records conform to lexicons, which are schemas that keep data consistently structured and formatted. In addition to the unique <abbr>DID</abbr> each user has, they also have a handle, which is defined via a <abbr title=\"Domain Name System\">DNS</abbr> record. My handle is <code>@vale.rocks</code>. I&#8217;ve deliberately kept this explanation simple (though not inaccurate) for the sake of brevity, so you should read Dan Abramov&#8217;s <a href=\"https://overreacted.io/open-social/\">Open Social</a> if you&#8217;re interested in further detail.</p>\n<p>As an example, here is the record for my Bluesky profile, which is stored under the collection <code>app.bsky.actor.profile</code>:</p>\n<pre><code class=\"language-JSON\"><span class=\"hljs-punctuation\">{</span>\n  <span class=\"hljs-attr\">&quot;uri&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;at://did:plc:7qg6mz2xtzozxkgbcvf4pdnu/app.bsky.actor.profile/self&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;cid&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;bafyreiavinef6pltfb4bxml7mbbq3gf53buben4fwxgaa7af2nxefa7zqa&quot;</span><span class=\"hljs-punctuation\">,</span>\n  <span class=\"hljs-attr\">&quot;value&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n    <span class=\"hljs-attr\">&quot;$type&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;app.bsky.actor.profile&quot;</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;avatar&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n      <span class=\"hljs-attr\">&quot;ref&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n        <span class=\"hljs-attr\">&quot;$link&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;bafkreiav5vj6xi33c7pcr2wtl3bqxsynlgd7rwdpvetnik75nte4ms5xzy&quot;</span>\n      <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;size&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">812706</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;$type&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;blob&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;mimeType&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;image/png&quot;</span>\n    <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;banner&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n      <span class=\"hljs-attr\">&quot;ref&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-punctuation\">{</span>\n        <span class=\"hljs-attr\">&quot;$link&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;bafkreicca3ksn3adp6ixeorlppum5rccani2qjuchs24yq5uilx3z67eyq&quot;</span>\n      <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;size&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-number\">941911</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;$type&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;blob&quot;</span><span class=\"hljs-punctuation\">,</span>\n      <span class=\"hljs-attr\">&quot;mimeType&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;image/jpeg&quot;</span>\n    <span class=\"hljs-punctuation\">}</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;description&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Front-end developer, designer, writer, and avid user of the superpowered information superhighway.\\n\\n✧ https://vale.rocks\\n✧ https://fedi.vale.rocks/vale&quot;</span><span class=\"hljs-punctuation\">,</span>\n    <span class=\"hljs-attr\">&quot;displayName&quot;</span><span class=\"hljs-punctuation\">:</span> <span class=\"hljs-string\">&quot;Vale&quot;</span>\n  <span class=\"hljs-punctuation\">}</span>\n<span class=\"hljs-punctuation\">}</span>\n</code></pre><p>This record isn&#8217;t hidden away anywhere. It is public. It exists on the AT Protocol at <code>at://did:plc:7qg6mz2xtzozxkgbcvf4pdnu/app.bsky.actor.profile/self</code>. Bluesky pulls from this record if you <a href=\"https://bsky.app/profile/vale.rocks\">view my profile</a>, and you can view the record for yourself via online AT Proto viewers such as <a href=\"https://atproto.at/uri/at://did:plc:7qg6mz2xtzozxkgbcvf4pdnu/app.bsky.actor.profile/self\">Taproot</a> or <a href=\"https://pdsls.dev/at://did:plc:7qg6mz2xtzozxkgbcvf4pdnu/app.bsky.actor.profile/self\"><abbr>PDS</abbr>ls</a>.</p>\n<p>This is the beauty of the AT Protocol: your data is under your control. It exists in your data repository on the <abbr>PDS</abbr> you select, and unless the data is explicitly made private, it is public. Even data held within &#8216;Atproto Spaces&#8217;, which is the system for private data, is still stored in repositories on your <abbr>PDS</abbr> and remains completely under your control. At any time you can manage records yourself or move to another <abbr>PDS</abbr> without everything breaking.</p>\n<p>The most popular and well-known AT Protocol application is Bluesky. The AT Protocol stems from Bluesky, which was formed as a research group within Twitter as part of research into decentralising Twitter. However, Elon Musk&#8217;s acquisition of Twitter and rebranding of it into &#8216;X&#8217; saw Bluesky sever ties with Twitter and entirely become its own thing. While I think that Bluesky is flawed, like Twitter before it, the AT Protocol is solid.<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1</a></sup></p>\n<h2 id=\"an-open-atmosphere\">An Open Atmosphere</h2>\n<p>I spoke to the open nature of Web 2.0. Of such a variety of open systems which people used to the greatest extents they could. Of people creating a social internet with integrations and dynamic data which could be wielded and transformed to create a living ecosystem across the web.</p>\n<p>The Atmosphere, which is the name given to the ecosystem surrounding the AT Protocol, makes this aged reality a present one once again. <em>Your</em> data is openly accessible to <em>you</em>. I can access the records for my posts on Bluesky, for my <a href=\"https://tangled.org/vale.rocks\">code on Tangled</a>, for my <a href=\"https://atstore.fyi/profile/vale.rocks\">reviews on at-store</a>, for my <a href=\"https://keytrace.dev/@vale.rocks\">identity verification on Keytrace</a>, for my <a href=\"https://sifa.id/p/vale.rocks\">professional identity on Sifa</a>, for the <a href=\"https://npmx.dev/profile/vale.rocks\">npm packages I&#8217;ve liked on npmx</a>, or anything else I&#8217;ve done across the protocol. In fact, I do access these records regularly. I&#8217;ve got all sorts of automations that tie into Atmosphere, including <a href=\"https://vale.rocks/posts/the-implementation-of-this-site#at-protocol-integration\">integrations here on Vale.Rocks</a>.</p>\n<p>When a new app launches and I log in with my account on the Atmosphere, I&#8217;m greeted not by a blank slate but by an interface pre-populated by all my existing records. I don&#8217;t manage separate account details on every single Atmosphere using service. I update it once, and everything reads that changed record, though in most cases I&#8217;m given the affordance to change it on a per-service basis if I so choose.</p>\n<p>On people&#8217;s personal websites I can leave comments using my account on the AT Protocol, and increasingly I&#8217;ve seen people fetching data from their records across the Atmosphere. People publishing articles with <a href=\"https://standard.site\">Standard.site</a> records on platforms such as <a href=\"https://leaflet.pub\">Leaflet</a>, <a href=\"https://pckt.blog\">pckt</a>, and <a href=\"https://offprint.app\">offprint</a> and then displaying them on their own site, or showing the bookmarks they&#8217;ve saved with one of many bookmarking solutions, or just creating their own site entirely with something like <a href=\"https://blento.app\">Blento</a>. It is all of the creativity and dynamic integrations of liberal Web 2.0 <abbr>API</abbr>s, but with more data, presented in a way that is standardised and easy to access while being under the complete control of the user without some company able to lock it away.</p>\n<p>The AT Protocol puts your data in your hands while making it open and accessible and easy to integrate and manipulate. I can&#8217;t help but feel that it captures what the World Wide Web once was. In a climate where the web is only becoming more and more locked down in favour of protecting corporate interests and preventing scraping for artificial intelligence, it feels blissful to see a return to owning data and brandishing it without restraint.</p>\n<section class=\"footnotes\" data-footnotes>\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>I&#8217;m not sure microblogging can be done &#8216;right&#8217; in a social sense. The format itself promotes short, rash responses prone to degradation of context, <a href=\"https://vale.rocks/micros/20260819-0423\">which I&#8217;ve bemoaned before</a>. However, Bluesky&#8217;s moderation is also a bit shaky, as is <a href=\"https://techcrunch.com/2025/10/05/waffles-eat-bluesky/\">how they handle public relations</a>. Thankfully the AT Protocol doesn&#8217;t depend on them. They have the biggest <abbr>PDS</abbr>, and the <a href=\"https://atproto.com/blog/plc-directory-org\">Public Ledger of Credentials is centralised</a>. However they&#8217;re working to change this, and <code>did:web</code> doesn&#8217;t rely upon Bluesky. <a href=\"#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n</ol>\n</section>\n\n\t\t",
      "summary": "Love for the beauty of the AT Protocol and the older web principles it revitalises with open, public data. The opportunity for integrations and automations as seen of the web from roughly the mid-2000s through to the mid-2010s.",
      "date_published": "2026-08-25"
    },
    {
      "id": "https://vale.rocks/posts/hacker-news",
      "url": "https://vale.rocks/posts/hacker-news",
      "title": "Hacker News In Uncompromised Detail",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p><a href=\"https://news.ycombinator.com\">Hacker News</a> is a popular news aggregator and web forum created and run by United States-based venture capital firm Y Combinator. The site <a href=\"https://news.ycombinator.com/announcingnews.html\">officially launched on the 20<sup>th</sup> of February 2007</a> as &#8216;Startup News&#8217;. The idea of the site was for potential founders to establish themselves and become known to Y Combinator before they applied for funding and to bring back the atmosphere of Reddit (a Y Combinator-funded startup) when it first launched and before it became popular.</p>\n<p>The site was also partially a chance for Paul Graham to put to use <a href=\"http://arclanguage.org\">the Arc language</a>, a dialect of Lisp which he co-created with Robert Morris. A news app, known as <a href=\"https://github.com/arclanguage/anarki/tree/master/apps/news\">news.arc</a> was created to demonstrate the language and was used as the basis for Hacker News. News.arc does not use a conventional database, instead <a href=\"https://news.ycombinator.com/item?id=3515628\">writing content as files into directories</a>. In 2024, Hacker News <a href=\"https://news.ycombinator.com/item?id=44099006\">moved from using Arc-on-Racket</a> and instead embraced <a href=\"https://www.sbcl.org\">Steel Bank Common Lisp (<abbr>SBCL</abbr>)</a> via a compiler dubbed Clarc.</p>\n<p>In August 2007, the site <a href=\"https://news.ycombinator.com/hackernews.html\">rebranded from Startup News to Hacker News</a>, as we know it today. This rebrand saw the expansion of topics from just startups to also including more general &#8216;hacker&#8217; topics. &#8216;Hacker&#8217; as used in the site&#8217;s name refers not to people who maliciously exploit systems, but to people who tinker with and explore technology, possibly using it in ways unintended by the creators &#8211; <a href=\"https://phrack.org/issues/7/3\">The Conscience of a Hacker (The Hacker Manifesto)</a>-style.</p>\n<h2 id=\"terms--jargon\">Terms & Jargon</h2>\n<p>There is a decent amount of jargon on Hacker News. Many are standard forum colloquialisms, though there are also many phrases bespoke to the site.</p>\n<dl>\n<dt>Upvote</dt>\n<dd>A positive vote for a post or comment.</dd><dt>Downvote</dt>\n<dd>A negative vote for a comment. Posts cannot be downvoted.</dd><dt>Karma</dt>\n<dd>A point value assigned to users based on the number of upvotes they&#8217;ve received minus the number of downvotes they&#8217;ve received (and some anti-abuse shenanigans). It is possible that stories also have a <a href=\"https://news.ycombinator.com/item?id=29024089\">slightly different karma system</a>. A leaderboard of the users with the most karma can be found at <a href=\"https://news.ycombinator.com/leaders\">https://news.ycombinator.com/leaders</a></dd><dt>Parent</dt>\n<dd>The item above the current item. Depending on context, it can reference the above post, comment, or user.</dd><dt>Grandparent</dt>\n<dd>The parent of a parent.</dd><dt>OP</dt>\n<dd>Short for &#8216;Original Poster&#8217;. Usually refers to the person who posted a thread, though is sometimes also used to refer to the parent poster of a commenter.</dd><dt>Hug of Death</dt>\n<dd>When a linked site falls offline due to the sudden influx of users from Hacker News. People will often follow up when a site has been hugged to death with an archive of the content.</dd><dt>Flamewar</dt>\n<dd>When conduct moves on from critique and discussion into attacks and anger.</dd><dt>Flamebait</dt>\n<dd>Similiar in usage to the term &#8216;ragebait&#8217;. To flamebait is to intentionally stir angry retorts and unconstructive arguments rather than thoughtful discussion.</dd><dt>Shadowban/Hellban</dt>\n<dd>To ban a user without informing them they have been banned, such that their content is just not shown (or is shown less).</dd><dt>news.yc</dt>\n<dd>Another way of referring to Hacker News, which references the site&#8217;s domain name of `news.ycombinator.com`. It is also a reference to &#8216;news.arc&#8217;. It is less commonly used now but was a popular way to refer to the site in its earlier days.</dd>\n</dl><h2 id=\"voting\">Voting</h2>\n<p>Posts can be upvoted by any user of the site. If a user submits a link post with the same link as another recent post, their post is not submitted separately and instead they&#8217;re counted as an upvote of the earlier post. Comments can be upvoted by any user, but only downvoted by users with over 500 karma. The lowest score a comment can have is -4,<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1</a></sup> and comments cannot be downvoted more than 24 hours after their publication. Users also cannot downvote a comment if it is a direct reply to them. When a comment has a score in the negative, it becomes desaturated. To avoid flamewars, the display of comments is <a href=\"https://web.archive.org/web/20110618105517/http://ycombinator.com/newsnews.html#:~:text=Faster%2C%20Fewer%20Flamewars\">delayed more the more nested they become</a>.</p>\n<p>Users with more than 30 karma can flag submissions, which has the effect of a more strongly weighted downvote. Flagging is intended to be used for cases where a submission breaks <a href=\"https://news.ycombinator.com/newsguidelines.html\">the site guidelines</a>. Flagging has impact even <a href=\"https://news.ycombinator.com/item?id=13858395\">before an item is noted in the interface as being flagged</a>.</p>\n<p>Submissions marked as &#8216;dead&#8217; have been designated as such by either Hacker News&#8217; heuristics or by a moderator. They cannot be seen unless <code>showdead</code> is set to true on the viewing user&#8217;s account. In September 2015 it was made so that users with more than 30 karma can vouch for dead submissions, and enough vouches <a href=\"https://www.ycombinator.com/blog/two-hn-announcements/#:~:text=will%20unkill%20it\">will unkill it</a>.</p>\n<p>Submissions can be simultaneously both flagged and dead. Posts do not show as &#8216;[deleted]&#8217; if flagged or killed. They only show as deleted if the post author removed it or if they asked a Hacker News moderator to remove it.</p>\n<h2 id=\"posting\">Posting</h2>\n<p>Any register user can post on Hacker News, provided that moderation actions haven&#8217;t been taken against them. The site has two main types of posts: link posts and text posts. Posts with a link in the link fields are considered link posts, and everything else is considered a text post, even if links are included in the post body.</p>\n<p>The most common style of text post is <a href=\"https://news.ycombinator.com/ask\">Ask HN</a>, for asking Hacker News users questions. A format commonly used for both link and text posts is <a href=\"https://news.ycombinator.com/showhn.html\">Show HN</a>, for users showing off something they have created. <a href=\"https://news.ycombinator.com/newpoll\">Polls</a> can also be created by users with over 500 karma, though people very rarely use the feature. It isn&#8217;t an official content type, but &#8216;Tell HN&#8217; is often used for public service announcement-style posts.</p>\n<p>Post titles have a maximum length of 80 characters, and the guidelines outline they shouldn&#8217;t be editorialised unless it is misleading or linkbait. When submitting videos and <abbr title=\"Portable Document Format\">PDF</abbr>s, their title should be appended with &#8216;[video]&#8217; or &#8216;[pdf]&#8217;, respectively. Titles for posts linking to content over a year old should also be appended with their publication year, for example &#8216;Big News (2020)&#8217;. If a user fails to do this when submitting, a site moderator will usually change it for them.</p>\n<p>Submissions can be edited by the post author within two hours of posting, but after that time they are unable to be changed. Submissions can be deleted within those two hours, but only if there have been no child comments to avoid discussion from being deleted. Submissions can be replied to within a fortnight of their publication but upvoted at any time.</p>\n<h2 id=\"ranking\">Ranking</h2>\n<p>The Hacker News front page &#8211; especially a top spot &#8211; is a fairly major driver of traffic and discussion. Vale.Rocks has found itself featured there multiple times. The core ranking function (<code>frontpage-rank</code>) from the arc.news codebase was written as:</p>\n<pre><code class=\"language-lisp\">(<span class=\"hljs-name\">=</span> gravity* <span class=\"hljs-number\">1.8</span> timebase* <span class=\"hljs-number\">120</span> front-threshold* <span class=\"hljs-number\">1</span>\n   nourl-factor* .<span class=\"hljs-number\">4</span> lightweight-factor* .<span class=\"hljs-number\">3</span> )\n\n(<span class=\"hljs-name\">def</span> frontpage-rank (<span class=\"hljs-name\">s</span> (<span class=\"hljs-name\">o</span> scorefn realscore) (<span class=\"hljs-name\">o</span> gravity gravity*))\n  (<span class=\"hljs-name\">*</span> (<span class=\"hljs-name\">/</span> (<span class=\"hljs-name\">let</span> base (<span class=\"hljs-name\">-</span> (<span class=\"hljs-name\">scorefn</span> s) <span class=\"hljs-number\">1</span>)\n          (<span class=\"hljs-name\">if</span> (<span class=\"hljs-name\">&gt;</span> base <span class=\"hljs-number\">0</span>) (<span class=\"hljs-name\">expt</span> base .<span class=\"hljs-number\">8</span>) base))\n        (<span class=\"hljs-name\">expt</span> (<span class=\"hljs-name\">/</span> (<span class=\"hljs-name\">+</span> (<span class=\"hljs-name\">item-age</span> s) timebase*) <span class=\"hljs-number\">60</span>) gravity))\n     (<span class=\"hljs-name\">if</span> (<span class=\"hljs-name\">no</span> (<span class=\"hljs-name\">in</span> s!type &#x27;story &#x27;poll))  .<span class=\"hljs-number\">5</span>\n         (<span class=\"hljs-name\">blank</span> s!url)                  nourl-factor*\n         (<span class=\"hljs-name\">lightweight</span> s)                (<span class=\"hljs-name\">min</span> lightweight-factor*\n                                             (<span class=\"hljs-name\">contro-factor</span> s))\n                                        (<span class=\"hljs-name\">contro-factor</span> s))))\n</code></pre><p>If <math data-tex=\"P\" xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>P</mi></mrow><annotation encoding=\"application/x-tex\">P</annotation></semantics></math> = points and <math data-tex=\"T\" xmlns=\"http://www.w3.org/1998/Math/MathML\"><semantics><mrow><mi>T</mi></mrow><annotation encoding=\"application/x-tex\">T</annotation></semantics></math> = time in hours, this works out to:</p>\n<p><math data-tex=\"\\text{Rank} = \\frac{(P - 1)^{0.8}}{(T + 2)^{1.8}}\" xmlns=\"http://www.w3.org/1998/Math/MathML\" display=\"block\"><semantics><mrow><mtext>Rank</mtext><mo>=</mo><mfrac><mrow><mo stretchy=\"false\">(</mo><mi>P</mi><mo>−</mo><mn>1</mn><msup><mo stretchy=\"false\">)</mo><mn>0.8</mn></msup></mrow><mrow><mo stretchy=\"false\">(</mo><mi>T</mi><mo>+</mo><mn>2</mn><msup><mo stretchy=\"false\">)</mo><mn>1.8</mn></msup></mrow></mfrac></mrow><annotation encoding=\"application/x-tex\">\\text{Rank} = \\frac{(P - 1)^{0.8}}{(T + 2)^{1.8}}</annotation></semantics></math></p>\n<p>There are also further complexities in that original code to handle submissions with more nuance, but the main thing is that posts are presented based on the points they receive with a diminishing returns curve to avoid long-term domination of the front page. Text-only posts that do not have a <abbr>URL</abbr> are explicitly penalised. Additionally, <a href=\"https://news.ycombinator.com/item?id=16485753\">tutorials are downranked by moderators</a>, and there have historically been <a href=\"https://news.ycombinator.com/item?id=9097596\">certain terms which have penalties associated with them</a>.</p>\n<p>The algorithm shown above is a very simple approach, and the ranking system has become more complex with time to avoid gaming of the system. There is voting manipulation such that voting rings are thwarted. Sharing a link with other people or using alt accounts generally doesn&#8217;t work, nor does telling people to go to the newest page and upvote from there as a bypass. The exact details of Hacker News&#8217; protection heuristics are not public, as making them so would allow them to be bypassed trivially, but they do seem to be effective.</p>\n<p>In addition to the standard front page, there is also a classic ranked page. It uses the same ranking algorithm as the front page, though only factors in votes from users who registered before the 13<sup>th</sup> of February, 2008. It was originally announced as being &#8216;<a href=\"https://news.ycombinator.com/item?id=607271\">ranked using only votes from accounts over a year old</a>&#8217;. There are also a number of <a href=\"https://news.ycombinator.com/lists\">filtered lists for different post types</a>.</p>\n<p>Hacker News is editorially independent from Y Combinator and has <a href=\"https://news.ycombinator.com/newsfaq.html#cflag:~:text=YC%20suppressed%20on%20HN\">a policy</a> of moderating &#8216;less, not more, when YC or a YC startup is the topic.&#8217;. Y Combinator does, however, advertise batch applications in the site&#8217;s footer. Y Combinator-funded companies have the ability to post job advertisements on Hacker News, which appear at position 6 on the front page and have a fixed decay, and may also post <a href=\"https://news.ycombinator.com/launches\">Launch HN</a> posts.</p>\n<p>There is a degree of randomness to what ends up on the front page. A post can be submitted at one time and see no activity, then submitted again at another time and go to #1 on the front page. A post can even be submitted multiple times and not see any success. Hacker News attempts to address this in a few ways to give links multiple chances at success. Articles aren&#8217;t <a href=\"https://news.ycombinator.com/item?id=21852691\">considered duplicates if they haven&#8217;t seen significant attention</a> and users are able to submit the same link multiple times. There is also the second-chance pool and invitations to resubmit posts.</p>\n<h3 id=\"second-chance-pool--invited-links\">Second-Chance Pool & Invited Links</h3>\n<p>Oftentimes Hacker News submissions will be overlooked, even if they are extremely good and of high quality. Moderators often notice these links and will frequently give them another chance. Users can also email the moderators to request that a submission be given a second-chance if one really deserves it.</p>\n<p>When a submission is given a second chance, its post date is updated, and so are the post dates of any comments. Originally, <a href=\"https://news.ycombinator.com/item?id=48740177\">comment post dates weren&#8217;t changed</a>, but that led to confusion from users as to how a comment was commented before a post was posted, but the updated approach of bringing forward comment timestamps also confuses users. Users are sent an email inviting them to repost their submission if it is too old to be placed in the second-chance pool.</p>\n<p>Submissions in the second-chance pool or those which have been invited for resubmission are added directly to the front page for a brief period, giving them great visibility and often leading to them remaining there for long periods. Posts included in the second-chance pool are often referred to as having been &#8216;re-upped&#8217;.</p>\n<h2 id=\"moderation\">Moderation</h2>\n<p>Hacker News was originally moderated by Paul Graham, one of Y Combinator&#8217;s co-founders and the creator of Hacker News. At the end of March 2014, Graham stepped down from day-to-day operations at Y Combinator.</p>\n<p>In his place as moderator, he announced Daniel Gackle would be taking over as primary moderator of the site. In taking on the role, he retired his account &#8216;gruseom&#8217; in favour of &#8216;dang&#8217;.<sup><a id=\"footnote-ref-2\" href=\"#footnote-2\" data-footnote-ref aria-describedby=\"footnote-label\">2</a></sup> Scott Bell <a href=\"https://news.ycombinator.com/item?id=12073675\">publicly joined Hacker News as a moderator in July 2016</a>, though he had been moderating privately before that time. He <a href=\"https://news.ycombinator.com/item?id=25055115\">ceased working on Hacker News in 2019</a>. Tom Howard was publicly announced as a moderator <a href=\"https://news.ycombinator.com/item?id=43558671\">at the start of April, 2025</a>. As dang changed accounts when switching to a moderator position, Tom Howard dropped his &#8216;tomhoward&#8217; account for &#8216;tomhow&#8217;.</p>\n<p>Based upon previous cases, moderators typically act privately before being publicly announced, and their departures are often made without publication.</p>\n<p>In addition to moderating Hacker News, it is commonly alluded to that Hacker News&#8217; full-time moderators also develop the site and maintain the site&#8217;s anti-spam and anti-rank-gaming measures. Previously, <a href=\"https://news.ycombinator.com/user?id=kevin\">Kevin Hale</a> and <a href=\"https://news.ycombinator.com/user?id=kogir\">Nick Sivo</a> have been <a href=\"https://www.ycombinator.com/blog/meet-the-people-taking-over-hacker-news/\">noted as working on the site</a>. It is also suggested by moderators&#8217; use of plural terms that there are more moderators than are publicly known, though they are not full-time.</p>\n<p>Moderation actions take a variety of forms. Shadowbanning is one method and involves a user or domain being flagged such that any submissions made are instantly marked as &#8216;[dead]&#8217;. These submissions can be vouched for, however.</p>\n<p>By inspecting the source code of news.arc, a number of unexposed moderation functions which still exist on the site can be identified. Many have been removed, but many still exist. Those which are live at time of publication are:</p>\n<ul>\n<li><code>/newsadmin</code> - Configuration of caching, comment-kill/ignore regexes, lightweights list, kill-all-by-user, and banned IPs.</li>\n<li><code>/badips</code> - IP addresses with dead submissions and one-click ban toggles</li>\n<li><code>/badlogins</code> - Last 100 failed login attempts (time, IP, and attempted username)</li>\n<li><code>/goodlogins</code> - Last 100 successful logins (time, IP, username)</li>\n<li><code>/killed</code> - All dead/killed items (stories and comments)</li>\n<li><code>/spurned</code> - Throttled/blocked IPs. If not an admin, it returns a blank page instead of requesting login like the other pages.</li>\n</ul>\n<h2 id=\"name-colours\">Name Colours</h2>\n<p>Under specific conditions, users&#8217; names on Hacker News are displayed with specific colours. If a user&#8217;s account is under two weeks old, they are considered a &#8216;noob&#8217;, and their name will appear green on any posts or comments they make. This green colour will persist on those posts and comments even after their account ages past two weeks. A similar feature was trialled for domains in 2015, though <a href=\"https://news.ycombinator.com/item?id=10223645\">the community disliked it and it was promptly removed</a>. Alumni of Y Combinator have orange names, though the orange colour is only shown to other Y Combinator alumni.</p>\n<p>In February 2009, <a href=\"https://web.archive.org/web/20110618105517/http://ycombinator.com/newsnews.html#:~:text=Comment%20Features\">there was an experiment</a> where users who had at least 25 comments on their account and an average score of at least 3.5 over their 50 most recent comments would have orangey-grey names. This was later removed.</p>\n<h2 id=\"themes\">Themes</h2>\n<p>Following the death of significant individuals, the Hacker News navigation bar gains a thin black top border to commemorate them. The black bar was <a href=\"https://news.ycombinator.com/item?id=644954\">first used in June 2009</a> upon the passing of Rajeev Motwani.</p>\n<p>On Christmas day, Hacker News takes a festive colour scheme. The usually orange navigation bar becomes a deep red, and the usually grey numbers indicating a post&#8217;s ranking alternate between red and green.</p>\n<p>Users with karma exceeding 250 can change the colour of Hacker News&#8217; top bar from the default of <span style=\"background: #ff6600; color: var(--black);\">#ff6600</span> to another hex code of their choosing. Alpha values are not supported, and attempting to input an invalid value resets the colour back to the default. This feature was <a href=\"https://web.archive.org/web/20110618105517/http://ycombinator.com/newsnews.html#:~:text=Change%20Color\">added in early 2008</a> as a thanks to people who contribute. A list of top bar colours recently chosen by users is made public at <a href=\"https://news.ycombinator.com/topcolors\">https://news.ycombinator.com/topcolors</a>.</p>\n<h2 id=\"search\">Search</h2>\n<p>Hacker News has had search functionality provided by a few organisations. The first official support functionality was <a href=\"https://www.ycombinator.com/blog/hacker-news-news/\">launched in mid-2011</a> and provided by Octopart as a test of their document-oriented datastore with search, ThriftDB, which is now defunct. Paul Graham had mentioned Octopart was working on a search implementation <a href=\"https://news.ycombinator.com/item?id=36008\">as far back as July 2007</a>. This iteration of search was available as <abbr>HNS</abbr>earch at <code>www.hnsearch.com</code> and was <a href=\"https://news.ycombinator.com/item?id=7404972\">shut down in March 2014</a>.</p>\n<p>Before the ThriftDB functionality, the most popular search solution was SearchYC, which launched in 2007. It <a href=\"https://web.archive.org/web/20110630192029/http://blog.searchyc.com/\">stopped operating</a> shortly after the announcement of the official search. Users were sad to see it go, as SearchYC was extremely well-loved and feature-rich.</p>\n<p>Algolia, which was in Y Combinator&#8217;s Winter 2014 batch, launched a replacement to ThriftDB search in early 2014. Soon after they <a href=\"https://news.ycombinator.com/item?id=7126301\">made further updates</a> to handle filtering, improve the UI, and more. During this period, it was more of a <a href=\"https://www.algolia.com/blog/product/new-experimental-version-of-hacker-news-search-built-with-algolia\">full Hacker News client</a> with a then-modern UI, rather than just a search tool.</p>\n<p>There were major overhauls <a href=\"https://news.ycombinator.com/item?id=8912684\">at the start of 2015</a>, most notably vastly simplifying the interface. In late 2023, the Algolia search system <a href=\"https://news.ycombinator.com/item?id=37870077\">received a significant update</a> improving performance and deployment, as well as search filtering options. In 2025, the entire Algolia search was <a href=\"https://news.ycombinator.com/item?id=47116557\">fully rewritten by Jeff Slentz</a>, and the original codebase was <a href=\"https://github.com/algolia/hn-search\">subsequently archived</a> in February 2026.</p>\n<p>Another significant search service for Hacker News was Trieve HN Discovery by Y Combinator winter batch 2024 company, Trieve. Their search system provided many filters and features, including many AI-enabled features. Trieve was <a href=\"https://www.trieve.ai/blog/trieve-is-being-acquired-by-mintlify\">acquired by Mintlify</a> in mid-2025, and their Hacker News search service was closed as a result. It is likely the <a href=\"https://web.archive.org/web/20240829174941/https://hn.trieve.ai/about#:~:text=%246835%2E39\">monthly cost of $6835.39</a> was also a contributing factor to the closing. It was available at <code>hn.trieve.ai</code>.</p>\n<p>As part of research prior to releasing their search service, Trieve wrote a <a href=\"https://www.trieve.ai/blog/history-of-hnsearch\">history of Hacker News Search</a>, which covers more services which I have omitted here.</p>\n<h2 id=\"api\"><abbr>API</abbr></h2>\n<p>Being <em>Hacker</em> News and a popular location for a variety of software-developing professionals, the wish to programmatically interact with the site is to be expected. The main benefit of an <abbr>API</abbr> being the ability to create custom front-ends. So many front-ends have been created &#8211; especially ones which aggregate Hacker News with other similar sites, such as <a href=\"https://lobste.rs\">Lobsters</a>, or which are native to specific platforms.</p>\n<p>Since the site&#8217;s inception people had been scraping Hacker News for their needs, which is a brittle approach. When Y Combinator looked to make interface improvements and move to a new rendering engine, they realised that it would involve changes to the site&#8217;s <abbr>HTML</abbr> and break people&#8217;s scrapers. To address this, they <a href=\"https://www.ycombinator.com/blog/hacker-news-api\">launched a proper Firebase <abbr>API</abbr> in early October 2014</a> with a three-week grace period to allow developers to migrate. This <abbr>API</abbr> remains current and functional as of initial publication.</p>\n<p>Alongside <abbr>HNS</abbr>earch&#8217;s launch was the launch of the <abbr>HNS</abbr>earch <abbr>API</abbr> and a <a href=\"https://web.archive.org/web/20120709050021/http://www.hnsearch.com/contest\">contest to create something using it</a>, with the best entry as voted by the community receiving a widescreen Dell monitor as a prize. There were 27 submissions, and the <a href=\"https://web.archive.org/web/20130525225904/http://blog.hnsearch.com/hnsearch-contest-winner-hn-trends\">winner was HN Trends by Jerod Santo</a>.</p>\n<p>The <abbr>HNS</abbr>earch <abbr>API</abbr> was succeeded by the Algolia equivalent for handling searches. Many other third-party Hacker News search solutions have also exposed their own <abbr>API</abbr>s, though adoption has been lower than the Firebase <abbr>API</abbr> and official search <abbr>API</abbr> offering.</p>\n<h2 id=\"demographics\">Demographics</h2>\n<p>Hacker News intentionally doesn&#8217;t track users too strictly, so the available data is limited. Unsurprisingly, Hacker News is a very United States-oriented website. The below ranges consider if users are logged in, with the United States&#8217; representation dropping if looking at all users. These figures seem reasonable considering <a href=\"https://vale.rocks/posts/traffic-analysis\">the analytics of this site</a>, which has seen significant Hacker News traffic.</p>\n<figure>\n<div class=\"table-wrapper\"><table>\n<thead>\n<tr>\n<th align=\"left\">Region/Country</th>\n<th align=\"left\">Share Range</th>\n<th align=\"left\">Notes</th>\n</tr>\n</thead>\n<tbody><tr>\n<td align=\"left\"><strong>United States of America</strong></td>\n<td align=\"left\">32% - 56%</td>\n<td align=\"left\">Includes Silicon Valley; <45% (or as low as 33%) for total users.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Silicon Valley</strong></td>\n<td align=\"left\">5% - 14%</td>\n<td align=\"left\">Part of United States total; <10% if measuring total users only.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Europe</strong></td>\n<td align=\"left\">28% - 35%</td>\n<td align=\"left\">Total for the region.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>United Kingdom</strong></td>\n<td align=\"left\">5% - 8%</td>\n<td align=\"left\">Share of European total.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Germany</strong></td>\n<td align=\"left\">4% - 7%</td>\n<td align=\"left\">Share of European total.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>France</strong></td>\n<td align=\"left\">1% - 3%</td>\n<td align=\"left\">Share of European total.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Netherlands</strong></td>\n<td align=\"left\">2%</td>\n<td align=\"left\">Share of European total.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Switzerland</strong></td>\n<td align=\"left\">1%</td>\n<td align=\"left\">Share of European total.</td>\n</tr>\n<tr>\n<td align=\"left\"><strong>Canada / Australia / New Zealand</strong></td>\n<td align=\"left\">7% - 8%</td>\n<td align=\"left\"></td>\n</tr>\n<tr>\n<td align=\"left\"><strong>India</strong></td>\n<td align=\"left\">2% - 7%</td>\n<td align=\"left\"></td>\n</tr>\n<tr>\n<td align=\"left\"><strong>China</strong></td>\n<td align=\"left\">0.5% - 3%</td>\n<td align=\"left\">Includes Hong Kong.</td>\n</tr>\n</tbody></table>\n<figcaption>Reported stats as of early 2018. <cite>Credit: <a href=\"https://news.ycombinator.com/item?id=16633521\">Dang</a></cite>.</figcaption>\n</figure><p>As of 2020, <a href=\"https://news.ycombinator.com/item?id=22767439\">Dang stated</a> that Hacker News&#8217; active user count had been ever uptrending, though with great swings, for the previous decade.</p>\n<h2 id=\"notable-posts\">Notable Posts</h2>\n<p>In 2007, Drew Houston made a post on Hacker News announcing <a href=\"https://www.dropbox.com\">Dropbox</a>, a Y Combinator summer 2007 batch start-up which was launching. In <a href=\"https://news.ycombinator.com/item?id=9224\">a now infamous comment</a>, user BrandonM replied with issues he had identified with the startup. The &#8216;Dropbox Comment&#8217; has become a term to refer to technical users dismissing complex products and multi-billion-dollar ideas as unnecessary or trivial, as well as a symbol of Hacker News&#8217; cynicism. dang provided <a href=\"https://news.ycombinator.com/item?id=27068148\">further discussion of the comment in a 2021 comment</a>.</p>\n<p>Under a thread about Paul Graham&#8217;s then-recent essay &#8216;The Equity Equation&#8217;, user sanj <a href=\"https://news.ycombinator.com/item?id=35079\">replied to a comment by user cperciva</a> with, &#8216;Did you win the Putnam?&#8217;, a reference to a <a href=\"https://maa.org/putnam/\">prestigious mathematics competition</a>, to which cperciva in turn replied, &#8216;Yes, I did.&#8217;. Paul Graham chimed in to say, &#8216;That has to be the comeback of all time.&#8217;.</p>\n<p>My own Hacker News claim to fame is that I successfully <a href=\"https://vale.rocks/micros/20260512-0652\">made a post on Hacker News that got negative points</a>. This is notable, as top-level posts cannot usually be downvoted. As aforementioned, only comments can be downvoted and the option is restricted behind a karma threshold. Apparently it was due to the <a href=\"https://news.ycombinator.com/item?id=48114191\">exploitation of a race condition</a> when rapidly upvoting and unvoting.</p>\n<h2 id=\"miscellaneous\">Miscellaneous</h2>\n<p>The site technically went live <a href=\"https://news.ycombinator.com/front?day=2006-10-09\">as early as October 9<sup>th</sup>, 2006</a>, though this was in a private state only for people related to Y Combinator or known to Paul Graham. Activity quickly petered off after the private launch and didn&#8217;t pick back up until the site launched publicly. Despite the site being live privately before the public release, the &#8216;Go back a day&#8217; link on the archival front page viewer doesn&#8217;t appear on the page for the 18<sup>th</sup> of February 2007, making previous days inaccessible from the interface and requiring the editing of the day query parameter. If you attempt to <a href=\"https://news.ycombinator.com/front?day=2006-10-08\">view the front page before Hacker News launched</a>, you get a cheeky &#8216;HN didn&#8217;t exist yet.&#8217;.</p>\n<p>Starting in 2015, highlights from Hacker News would be <a href=\"https://www.ycombinator.com/blog/hacker-news-highlights\">posted on the Y Combinator blog</a>. Though the series was never officially announced to be discontinued, the last post was <a href=\"https://www.ycombinator.com/blog/hacker-news-highlights-august-to-november-2018/\">published in December 2018</a>.</p>\n<p>As Hacker News is not obsessed with extracting value from its users, there are &#8216;noprocrast&#8217;, &#8216;maxvisit&#8217;, and &#8216;minaway&#8217; values which can be set by users on their accounts to restrict their usage of the site and to help them maintain healthy relationships with it. noprocrast (short for &#8216;no procrastinate&#8217;) toggles the limits, maxvisit sets the maximum amount of time you can browse before being blocked from the site, and minaway sets the amount of time the block lasts before it lapses. These blocks are trivial to bypass but help in setting limits.</p>\n<p>&#8216;delay&#8217; is another value that can be set by users on their profile, and it defines the amount of time before a comment goes live, giving users time to edit them before they&#8217;re seen. It can be set to a maximum of ten minutes.</p>\n<section class=\"footnotes\" data-footnotes>\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>There initially was no lower bound for comment score, but it was <a href=\"https://web.archive.org/web/20110618105517/http://ycombinator.com/newsnews.html#:~:text=capped%20the%20minimum%20score%20of%20a%20comment%20at%20%2D8\">set to -8 in February 2009</a> before later being revised to its current limit. <a href=\"#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"footnote-2\">\n<p>&#8216;dang&#8217; being derived from Daniel Gackle (pronounced Gackley), not the exclamation or Asian surname. <a href=\"#footnote-ref-2\" data-footnote-backref aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n</ol>\n</section>\n\n\t\t",
      "summary": "Everything I personally know about the forum and news aggregator Hacker News spanning the site's history, the people behind it, the software that runs it, the site's culture, and its features. Generally undocumented or underdocumented details and features are also included.",
      "date_published": "2026-07-24"
    },
    {
      "id": "https://vale.rocks/posts/web-platform-wishlist",
      "url": "https://vale.rocks/posts/web-platform-wishlist",
      "title": "Web Platform Wishlist",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>The web platform is a wonderful thing. A collection of standards and implementations that power the ever-wondrous World Wide Web &#8211; <abbr>HTML</abbr>, <abbr>CSS</abbr>, <abbr>ECMAS</abbr>cript, <abbr>SVG</abbr>, WebAssembly, <abbr>HTTP</abbr>, etc. However, it can always be better. As such, here is my wishlist. This page documents what I&#8217;d love to see added to the standards or better implemented in browsers. Importantly, this isn&#8217;t just a collection of cool things I think could conceptually be great, but are instead actual features I&#8217;ve found myself wishing for and wanting while developing.</p>\n<p>From this wishlist I&#8217;ve opted to omit features I&#8217;m excited for but which I&#8217;m already aware that all major browsers are actively implementing or working towards.</p>\n<h2 id=\"html\"><abbr>HTML</abbr></h2>\n<ul>\n<li>I would like <code>&lt;abbr&gt;</code> to not be awful. You can&#8217;t access the <code>title</code> attribute, into which an expansion of the abbreviation can optionally be included, and <a href=\"https://adrianroselli.com/2024/01/using-abbr-element-with-title-attribute.html\">assistive technologies handle it poorly (and inconsistently)</a>.</li>\n</ul>\n<h2 id=\"css\"><abbr>CSS</abbr></h2>\n<ul>\n<li><p>Logical versions of everything. I want everything that can have a logical version to have a logical version. That means more logical properties. I love logical properties &#8211; can&#8217;t get enough of them. I also wish lots of functions had logical versions. For example, <code>translate</code>, <code>scale</code>, <code>skew</code>, and <code>rotate</code>. Could be <code>translateInline</code> as a logical version of <code>translateX</code>, and so forth. Extend this to shadows and such too.</p>\n<p>Maybe some sort of system to opt-in to logical mappings could be introduced, similar to <code>color-scheme: light dark;</code> to opt-in to light/dark modes?</p>\n</li>\n<li><p>Shorthand for logical properties. Regardless of one&#8217;s feelings on shorthand, I don&#8217;t think it should only interpret values as physical. For example, I shouldn&#8217;t have to write:</p>\n<pre><code class=\"language-css\"><span class=\"hljs-attribute\">margin-block</span>: <span class=\"hljs-number\">1rem</span>;\n<span class=\"hljs-attribute\">margin-inline</span>: <span class=\"hljs-number\">2rem</span>;\n</code></pre></li>\n<li><p>Allow logical properties for media queries. <code>@media (max-inline-size: 45rem) {</code> is not valid at present, and I think it should be.</p>\n</li>\n<li><p>Fit text to width. Sometimes I want to fit text to the width of the page, but that can be an exercise in frustration and dealing with complex fluid type systems or breakpoints. Something akin to <code>font-size: fit</code> would be lovely.</p>\n</li>\n<li><p>A native way to expose content exclusively to screen readers. Something along the lines of <code>display: visually-hidden;</code>. <code>.sr-only</code> and <code>.visually-hidden</code> classes everywhere indicate there is a solid desire for the feature, but those classes are <a href=\"https://dbushell.com/2026/02/20/visually-hidden/\">extremely messy</a>. There are so many potential footguns here, however, which makes their potential inclusion risky.\nVisually hiding content and only displaying it to screen readers is also usually a bad user interface smell, as what must be conveyed to screenreaders by use of such hacks is usually beneficial to all users. Take, for example, labels for what a button with only an icon does.</p>\n</li>\n<li><p>Gradient shadows. Where a shadow&#8217;s colour can currently be set, gradients should be able to be set. This is a simple feature but an extremely versatile one with many applications that people currently use hacks to achieve.</p>\n</li>\n<li><p><a href=\"https://github.com/w3c/csswg-drafts/issues/1332\">Gradient easing</a>. Gradients already have rather comprehensive syntax for controlling their appearance, but I&#8217;d love to see the ability to change the easing of a gradient. I&#8217;ve previously used generators to achieve an easing effect, with messy code such as this:</p>\n<pre><code class=\"language-css\"><span class=\"hljs-attribute\">background</span>: <span class=\"hljs-built_in\">linear-gradient</span>(\n    <span class=\"hljs-number\">180deg</span>,\n    <span class=\"hljs-built_in\">color-mix</span>(in oklch, <span class=\"hljs-built_in\">oklch</span>(<span class=\"hljs-number\">18%</span> <span class=\"hljs-number\">0.003</span> <span class=\"hljs-number\">17.5</span>) <span class=\"hljs-number\">100%</span>, transparent) <span class=\"hljs-number\">0%</span>,\n    <span class=\"hljs-built_in\">color-mix</span>(in oklch, <span class=\"hljs-built_in\">oklch</span>(<span class=\"hljs-number\">18%</span> <span class=\"hljs-number\">0.003</span> <span class=\"hljs-number\">17.5</span>) <span class=\"hljs-number\">45%</span>, transparent) <span class=\"hljs-number\">25%</span>,\n    <span class=\"hljs-built_in\">color-mix</span>(in oklch, <span class=\"hljs-built_in\">oklch</span>(<span class=\"hljs-number\">18%</span> <span class=\"hljs-number\">0.003</span> <span class=\"hljs-number\">17.5</span>) <span class=\"hljs-number\">15%</span>, transparent) <span class=\"hljs-number\">50%</span>,\n    <span class=\"hljs-built_in\">color-mix</span>(in oklch, <span class=\"hljs-built_in\">oklch</span>(<span class=\"hljs-number\">18%</span> <span class=\"hljs-number\">0.003</span> <span class=\"hljs-number\">17.5</span>) <span class=\"hljs-number\">5%</span>, transparent) <span class=\"hljs-number\">75%</span>,\n    <span class=\"hljs-built_in\">color-mix</span>(in oklch, <span class=\"hljs-built_in\">oklch</span>(<span class=\"hljs-number\">18%</span> <span class=\"hljs-number\">0.003</span> <span class=\"hljs-number\">17.5</span>) <span class=\"hljs-number\">0%</span>, transparent) <span class=\"hljs-number\">100%</span>\n);\n</code></pre></li>\n<li><p><a href=\"https://github.com/w3c/csswg-drafts/issues/11134\">Better blurs</a>. Currently we&#8217;ve only got Gaussian blurs, which are good, but imperfect. I&#8217;d love to see radial blurs and directional blurs. You can use <abbr>SVG</abbr> filters to achieve such effects, but they are unnecessarily clunky.</p>\n</li>\n<li><p>Allow multiple pseudo-elements. Only having <code>::before</code> and <code>::after</code> seems arbitrary, and while not a limit I hit often is a limit I hit sometimes (especially when hacking on <abbr>HTML</abbr> I cannot edit). Allowing more seems minimally disruptive. It could, however, promote bad coding practices via poor separation of concerns.</p>\n</li>\n<li><p>Style the handle on resizeable elements, such as text areas.</p>\n</li>\n<li><p>Text overflow truncation from centre. A most wonderful UX consideration that Apple famously introduced in Finder is the truncation of text in the centre, rather than the end. Compare <code>a_really_long_file_name...</code> to <code>a_really_lo...or_a_file.md</code>. The latter preserves the extension and gives more contextual clues to the user.</p>\n</li>\n<li><p>Hanging punctuation. A lovely little typographic flourish that places punctuation off the start and ends of lines. It has been in WebKit since 2016.</p>\n</li>\n<li><p>Better stroked text. <code>-webkit-text-stroke</code> exists, but it is vendor-prefixed, limited, and for most fonts looks awful. It should accept gradients and allow placing the stroke inside, outside, or along the edge.</p>\n</li>\n<li><p>A better <code>@supports</code>. <code>@supports</code> is borderline useless. Often features (especially new ones) are only partially implemented, but <code>@supports</code> has no concept of partial implementation and thus returns true. New features are the ones you especially need the supports at-rule for! Not to mention all <a href=\"https://alvaromontoro.com/blog/68095/supports-lies-css-says-yes-browsers-say-lol-no\">the other issues</a>.</p>\n</li>\n<li><p>More pseudo-classes. <code>:sticky</code> for if an element is currently sticky, <code>:overflow</code> for if overflowing, etc. These are things that people commonly use JavaScript to detect just so they can pass it on to <abbr>CSS</abbr>. To cut out the JavaScript middle man would be much cleaner.</p>\n</li>\n<li><p><a href=\"https://github.com/w3c/csswg-drafts/issues/5273\">Allow scale to accept absolute lengths</a>. Rarely, but occasionally, I need the power to change the scale of an element to a precise size, and that is currently either only achievable with considered maths, or is just impossible.</p>\n</li>\n</ul>\n<h2 id=\"svg\"><abbr>SVG</abbr></h2>\n<ul>\n<li><abbr>SVG</abbr> filters are amazing. You can do so much with them, <span style=\"filter: url(#distort);\">like beautiful distortion of elements or other such filters.</span> Just have a look at how effectively they&#8217;re used on the absolutely gorgeous <a href=\"https://strangersbyspring.com\">Strangers By Spring</a>. Unfortunately, they&#8217;re rather unperformant in browsers, especially at scale, such as over a whole page. If there is a single thing I&#8217;d like to see changed on the web platform, it is this.</li>\n</ul>\n<svg aria-hidden=\"true\" class=\"svg-filter\">\n\t<defs>\n\t\t<filter id=\"distort\">\n\t\t\t<feTurbulence baseFrequency=\"0.01 0.03\" numOctaves=\"2\" />\n\t\t\t<feDisplacementMap in=\"SourceGraphic\" scale=\"10\" xChannelSelector=\"R\" yChannelSelector=\"R\">\n\t\t</filter>\n\t</defs>\n</svg><ul>\n<li><p>Better support for accessibility technologies via semantics and <abbr>ARIA</abbr> roles. I often use <abbr>SVG</abbr>s for graphs and diagrams, so the ability to better expose that content without having to impose rigid alt text would be brilliant.</p>\n</li>\n<li><p>Native text wrapping. This seems like a very obvious inclusion. It shouldn&#8217;t be necessary to manually break a paragraph of text into new lines.</p>\n</li>\n</ul>\n<h2 id=\"miscellaneous\">Miscellaneous</h2>\n<ul>\n<li><p>I want WebXR supported across more browsers on more platforms. Spatial computing for productivity is steadily becoming more viable, and I hope more browsers take advantage of this.</p>\n</li>\n<li><p>I want more diversity in browser engines. I want to see more engines thrive and <a href=\"https://vale.rocks/posts/everything-is-chrome\">less Chromium everywhere</a>. I&#8217;m excited to see how Servo and Ladybird&#8217;s LibWeb influence this.</p>\n</li>\n<li><p>I want <a href=\"https://xslt.rip\"><abbr>XSLT</abbr> to stay</a>. So many people use it for styling <abbr>RSS</abbr> and Atom feeds, as I&#8217;ve noted while reviewing submissions to <a href=\"https://personalsit.es\">PersonalSit.es</a>. It&#8217;ll be a shame for the accessibility of feeds and all the very many sites which rely on <abbr>XSLT</abbr>.</p>\n</li>\n</ul>\n\n\t\t",
      "summary": "A list of features I'd personally like to see added to web platform standards or better implemented in browsers. Improvements to HTML, new CSS, other web systems, or wider parts of the web platform that I think could be improved or expanded on to make the web a better place for users to use and for developers to develop on.",
      "date_published": "2026-06-29"
    },
    {
      "id": "https://vale.rocks/posts/extended-reality-browsers",
      "url": "https://vale.rocks/posts/extended-reality-browsers",
      "title": "Web Browsers in Augmented, Mixed, and Virtual Reality",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>Head-mounted virtual reality, augmented reality, and mixed reality devices have received many browsers over the years. Fundamentally, these browsers present a different user experience to browsers on other devices. They&#8217;re a very different medium, requiring different considerations and with very different requirements, constraints, considerations, and technologies.</p>\n<p>Unlike browsers for other platforms, browsers for virtual reality need to consider a spatial context. Interfaces are not limited to a single surface, or even to multiple surfaces. The interface can wrap around the user, enveloping them, be scaled to a screen the size of the moon, or shrunk down infinitesimally small. The screen can curve or lie flat. A screen can be one of a thousand orbiting a user, and it can be grabbed, resized, and thrown around at will. For as much as a webpage might be viewed in a living room via passthrough, it might be viewed from a lawn chair on the moon. A browser viewport is much more abstract of a concept.</p>\n<p>Not to mention, input devices vary greatly. Some devices will have users using controllers, others will have them reaching out with their hands and prodding interfaces. Some folks still will use a mouse and keyboard or a typical game controller. The social aspect of XR experiences also makes it more likely for multiple people to be interfacing with and controlling a single browser instance.</p>\n<p>In addition to standard browsing functionality, such browsers also enable experiences unique to the medium. Through WebVR, and later WebXR, virtual reality experiences, such as those that span 180° or 360° around the user, can be created. The user&#8217;s device can be detected, as can their input method, and even as much as exactly where they&#8217;re looking if the headset is capable of eye tracking.</p>\n<p>Especially during earlier years of the medium through the 2010s, web browsers were crucial due to lack of first-party app support. In many cases web browsers were the only way to watch content from streaming services, for example. Having capable web browsers with a diverse number of engines and features without imposed restrictions from the operating system to hinder viability is also key for a thriving ecosystem and an open web.</p>\n<h2 id=\"pcvr\"><abbr>PCVR</abbr></h2>\n<p>Personal computer virtual reality (<abbr>PCVR</abbr>) refers to virtual reality which is powered by an external computer, rather than compute self-contained within the headset. <abbr>PCVR</abbr>&#8217;s early days were very scrappy. One of the first commercial headsets was the Oculus Rift Development Kit 1 (DK1), which was very little more than a screen and some lenses in a box that could be strapped to one&#8217;s face.</p>\n<p>Initially, the only browser option available was to use a desktop browser displayed on the headset with no special VR considerations &#8211; essentially treating it as a monitor. This changed as browsers began to support WebVR, and then later WebXR, and websites took advantage of the new functionality. Firefox supports WebVR on Microsoft Windows from version 55 onwards, and Edge supported it from versions 15 to 18. Chromium and derivatives support WebXR from version 79, with some taking it further, such as Opera, who were the <a href=\"https://blogs.opera.com/desktop/2017/09/watch-every-video-vr-opera-developer-49/\">first to add 360° video support</a>.</p>\n<p>Mozilla implemented their WebVR into desktop Firefox as part of a big push into the virtual reality space in 2015 with their <a href=\"https://web.archive.org/web/20150801153220/https://mozvr.com/\">MozVR initiative</a>. They began to integrate VR capabilities into Firefox itself and released A-Frame, a web framework for creating WebVR (and later WebXR) experiences.</p>\n<p><a href=\"https://janusvr.com\">JanusVR</a>, later <a href=\"https://vesta.janusxr.org/news\">revived by the community as JanusXR</a>, is a web browser of sorts. Rather than a browser chrome around webpage content, JanusVR presents web pages spatially, as panes in a <abbr>3D</abbr> world. Websites have <abbr>3D</abbr> spaces associated with them, where users in avatar form can meet and interact with the webpage. Different websites can be travelled between at will via doorway-like portals. Development of the project started in mid-2013.</p>\n<figure class=\"right\">\n<img src=\"/assets/posts/extended-reality-browsers/janusvr.avif\" alt=\"A modern room with a large browser window displaying Vale.Rocks' landing page. In the lower left corner of the screen is a chat interface, and to the right are buttons to edit the environment and modify settings.\">\n<figcaption>JanusXR, as viewed in a non-VR desktop browser.</figcaption>\n</figure><p>By incorporating the bespoke JanusVR Markup Language (<abbr>JML</abbr>) into a website, how this <abbr>3D</abbr> space is presented can be managed. The user interface can be customised, interactive experiences like games can be implemented into the space, and the entire space can be transformed into different rooms with different appearances. Users in the space can place objects and change their appearance as needed. JanusVR is also embeddable, allowing it to be accessed through websites. Janus VR Incorporated <a href=\"https://www.reddit.com/r/janusVR/comments/e7ga32/a_letter_to_the_janus_vr_community/\">dissolved at the conclusion of 2019</a>.</p>\n<p><a href=\"https://web.archive.org/web/20201125142646/https://native.exokit.org/\">Exokit</a> was a bespoke WebXR engine primarily designed for packaging WebXR experiences as standalone applications and allowing them to expand beyond a browser sandbox into using native libraries and systems. While its engine is bespoke, it does offload <abbr>2D</abbr> pages to Chromium Embedded Framework (<abbr>CEF</abbr>). Exokit built a lot of demos and systems atop their engine, and one of these was a browser. Developed in 2019, it was short-lived, and development ceased a few months later. Its unique feature was the ability to merge XR worlds, placing multiple WebXR experiences in the same space which could be manoeuvred around. A separate browser-like front-end for Exokit <a href=\"https://github.com/exokitxr/exokit-frontend\">was also made</a>. Ultimately it seems that the project never quite found its footing beyond a few native ports of WebXR games and that it was discontinued before full browser capabilities became fully realised.<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1</a></sup></p>\n<p>Though not a dedicated browser per se, <a href=\"https://store.steampowered.com/app/584200/MultiVRse/\">MultiVR.se</a> is a room-scale virtual reality environment application launched in 2017 which allows for opening browsers and placing them around <abbr>3D</abbr> space. Multiple browser windows can be open, though the browser is extremely simple with minimal controls &#8211; navigation forward/back, an address bar, and a home button.</p>\n<p><a href=\"https://web.archive.org/web/20190520022458/https://www.supermedium.com/\">Supermedium</a> was a virtual reality browser launched in 2018. It was part of venture capital firm Y-Combinator&#8217;s Winter 2018 batch. The browser did not have support for viewing standard <abbr>2D</abbr> webpages and was instead entirely centred around WebVR content. The developers of Supermedium took over maintenance of A-Frame from MozVR. In 2020 Supermedium pivoted from creating a VR browser to making a VR comic book reader for the Oculus Quest.</p>\n<p><a href=\"https://store.steampowered.com/app/685110/Metachromium/\">Metachromium</a> released in 2020 and is a Chromium browser overlay designed to provide access to WebXR experiences and work atop other VR software or SteamVR Home. It was abandoned, never leaving early access.</p>\n<h2 id=\"google-glass\">Google Glass</h2>\n<p>Google Glass was Google&#8217;s ill-fated but ambitious attempt to make spectacles with a screen. Prototype devices were first sold in 2012, and the product became generally available in 2013. Google Glass runs Glass OS, also called Google XE, an Android-based operating system built specifically for the smart glasses.</p>\n<p>With the <a href=\"https://web.archive.org/web/20140706081509/https://support.google.com/glass/answer/3214744?hl=en\">XE7 update in 2013</a>, web browsing capabilities were added. The current page can be scrolled with one finger on the trackpad and zoomed with two. By placing two fingers on the trackpad and moving one&#8217;s head, the page can be panned around. To click, the touchpad can be tapped to select whatever is in the centre of the screen. The browser is limited and ephemeral, being designed to view information at a quick glance and not being intended for general browsing. It displays the mobile versions of pages and lacks tab management, complex settings, cookies, etc. It is even devoid of any browser chrome.</p>\n<p>Despite the limitations, the browser has full support for then-modern web standards. Version XE9 added syncing of searches with Google account search history, and XE10 allowed opening links directly from notifications.</p>\n<h2 id=\"cardboard\">Cardboard</h2>\n<p>In 2014 Google began experimenting with phone-based virtual reality via <a href=\"https://arvr.google.com/cardboard/\">Google Cardboard</a> &#8211; named as such due to the headset quite literally being a folded bit of cardboard. With some lenses and a smartphone set inside the cardboard headset, it exposed a very basic VR system.</p>\n<p>Google Cardboard is handled on an app-by-app basis, rather than being an operating system with provided functionality, so there is no inbuilt browser. There are, however, a range of browsers designed for use with the Cardboard. Chrome and many other Chromium-based browsers have WebVR/WebXR support which can work on the Cardboard, though lack general browsing capabilities. For general browsing, <a href=\"https://fulldive.com/project/fulldive-vr/\">Fulldive VR</a> and Vuplex VR Web Browser were relatively popular among the more enthusiast crowd, albeit limited. The Cardboard is simply not equipped for a comprehensive browser experience due to the low resolution and poor input method, though some people mirrored their computer display to the headset in pursuit of something more capable.</p>\n<p>Alongside the Cardboard, Google promoted <a href=\"https://developers.google.com/vr/develop/web/vrview-web\">VR View for the Web</a>, a library to facilitate embedding 360° photos and videos into websites.</p>\n<h2 id=\"gear-vr\">Gear VR</h2>\n<p>The Gear VR is a headset from Samsung, which, like Google&#8217;s Cardboard, requires a flagship Samsung phone to be inserted. Unlike the Cardboard, however, it has a controller allowing for much more precise and capable input.</p>\n<p>Gear VR released in 2015, and the same year Samsung <a href=\"https://news.samsung.com/global/samsung-launches-optimized-web-browser-for-gear-vr\">launched a browser for their Gear VR system</a> aptly titled &#8216;Samsung Internet for Gear VR&#8217;. The browser is built on Chromium and supports multiple windows (only one can be active at a time), tabs, bookmarks, voice input, and settings for the search engine and control over gaze selection. Version 4.2 <a href=\"https://news.samsung.com/global/samsung-internet-for-gear-vr-update-makes-browsing-more-immersive\">at the end of 2016</a> introduced the ability to select a 360° image for menus, support for v1.0 of WebVR, and a feature called <a href=\"https://samsunginternet.github.io/docs/skybox\">Skybox</a>, which allows websites to set their own 360° image.</p>\n<p>A <a href=\"https://developers.meta.com/horizon/blog/carmel-developer-preview-launches-today/\">developer preview under the codename &#8216;Carmel&#8217;</a> was made available for the Gear VR in 2016, primarily as a test of <abbr>3D</abbr> WebVR content. It was based on Chromium, and being an early development test, it lacked any proper interface other than some buttons to visit demos. Developers were advised to use Chrome Remote Debugging for Android as part of their experimenting. Carmel later graduated into the full Oculus Browser on the Gear VR.</p>\n<p>As part of the XR push Mozilla made with MozVR, they launched <a href=\"https://blog.mozilla.org/en/firefox/firefox-reality-now-available/\">Firefox Reality</a> for standalone Android-based VR headsets in September 2018. Built upon the Gecko engine, in contrast to other browsers available for standalone VR at the time, Firefox Reality started off simple and quickly started packing on features.</p>\n<p>Firefox Reality is not a simple port of Firefox for Android or desktop and instead has a completely tailored interface with large, easy-to-access buttons and elements laid out in <abbr>3D</abbr> space. The browser features voice input, private searches, resizing the window, navigation, choosing a 360° environment, viewing browsing history, downloading content, installing extensions, switching between mobile/desktop versions of sites, and other browser staples. In addition to browsing related buttons, the UI displays stats, such as Wi-Fi connection strength and battery levels, and the browser also had full integration with Firefox syncing, allowing sending tabs to and from the headset, as well as syncing bookmarks.</p>\n<p>Vuplex VR Browser released in 2019 for the Gear VR. It uses the Android System WebView and supports multiple, arrangeable open windows and tabs within those windows, so the user can have multiple pages open simultaneously. Expected navigation features are present, as is history management. The skybox can be customised, but bookmarks and tab rearranging aren&#8217;t present. The browser was likely released as marketing for <a href=\"https://developer.vuplex.com/webview/overview\">Vulplex&#8217;s <abbr>3D</abbr> WebView</a>.</p>\n<h2 id=\"daydream\">Daydream</h2>\n<p>Much like Samsung&#8217;s Gear VR and expanding on what they started with the Cardboard, Google released the phone-based Daydream platform in 2016, built into Android. In November, the first Daydream headset, the first-generation Daydream View, released. Unlike the Cardboard, Daydream has first-class controller support.</p>\n<p>Being a Google platform, <a href=\"https://blog.google/products-and-platforms/products/chrome/browse-web-vr-chrome-launches-daydream-view/\">Chrome launched for the Daydream</a> in July 2018. Despite how it was marketed, Chrome on Daydream is not a separate browser but is instead Chrome for Android. It supported WebVR, and, later, WebXR. In addition to being launchable directly from the Daydream&#8217;s home screen, sites can be opened directly by navigating to them on Chrome on the phone and then placing the phone in a Daydream headset. Support for Daydream was removed from Chrome with Chrome 85.</p>\n<p>Daydream received Firefox Reality when the browser launched in 2018 and Vuplex VR Web Browser in 2019. Both browsers stopped receiving updates when the Daydream platform was discontinued in October 2019.</p>\n<h2 id=\"oculus-go\">Oculus Go</h2>\n<p>The <a href=\"https://vale.rocks/posts/oculus-go\">Oculus Go</a> was Oculus&#8217; first standalone virtual reality headset and released in 2018. It is roughly a self-contained version of the Gear VR, having all the compute integrated and no phone required.</p>\n<p>The Go has an inbuilt browser. It is the Chromium-based Oculus Browser. It has support for tabs, private mode, bookmarks, and allows downloads. It has a limited selection of settings, such as to change the default search engine. The width of the browser window can be configured, the page can be zoomed, and it is possible to switch between desktop and mobile versions of sites. The browser only received minor updates, bumping the Chromium version and tweaking performance.</p>\n<figure class=\"left\">\n<img src=\"/assets/posts/extended-reality-browsers/oculus-go.avif\" alt=\"A tri-pane interface. The left pane shows tabs, the middle pane shows the browser viewport with buttons above it, and the right pane shows an empty bookmarks panel. Below is the operating system interface, and in the background is a pool.\">\n<figcaption>DuckDuckGo in the Oculus Go&#8217;s in-built browser.</figcaption>\n</figure><p>Being so similar, the Oculus Go maintained backwards compatibility with the bulk of Gear VR applications. As such, in mid-2018 <a href=\"https://www.meta.com/en-gb/experiences/samsung-internet/849609821813454/\">Samsung Internet released for the Go</a>, being a port of the Gear VR version and having the same functionality.</p>\n<p>Firefox Reality was immediately available for the Go, alongside the Quest and Viveport versions, when the browser launched in 2018. Vuplex VR Browser was also made available, being the same as the Gear VR version. No further browser releases or updates were published to the Oculus Store after December 4<sup>th</sup>, 2020, due to Oculus disallowing new submissions or updates for Oculus Go applications.</p>\n<h2 id=\"vive-focus\">Vive Focus</h2>\n<p>The Vive Focus line of headsets are standalone Android-based devices.</p>\n<p>The devices originally had Firefox Reality, however, Mozilla <a href=\"https://blog.mozilla.org/en/mozilla/update-on-firefox-reality/\">stopped supporting it in 2022</a>. Open-source consulting firm Igalia approached Mozilla, picked up the project, and continued it as <a href=\"https://wolvic.com\">Wolvic</a>. A direct continuation of Firefox Reality, Wolvic maintains all the same features and functionality with improvements atop.</p>\n<p>Wolvic doesn&#8217;t have a direct release for the Vive Focus, but Vive does distribute an extremely lightly modified version of Wolvic as <abbr>VIVE</abbr> Browser.</p>\n<h2 id=\"magic-leap\">Magic Leap</h2>\n<p>Magic Leap are a series of augmented and mixed reality headsets by Magic Leap Incorporated which target the enterprise space. On account of being an enterprise product, Magic Leap are rare to disclose details about their device and systems, making public documentation of their browsers rather limited.</p>\n<p>The company&#8217;s first headset, Magic Leap 1, released in 2018 and runs Lumin OS, a proprietary system built upon Linux/Android. The OS includes Magic Leap&#8217;s own Chromium-based Helio browser. Version 0.94 largely improved browser controls and input. 0.96 changed the browser to <a href=\"https://web.archive.org/web/20190820004200/https://www.magicleap.com/news/product-updates/lumin-os-0-96-and-sdk-0-21#:~:text=re%2Drendered%20based%20on%20available%20physical%20pixels\">render based on physical pixels</a>, rather than downsampling. 0.97 in 2019 introduced dark mode support and the ability to create bookmarks that exist spatially. On websites with a white background, the dark mode <a href=\"https://magic-leap.reality.news/news/hands-magic-leaps-helio-app-is-best-window-into-web-available-augmented-reality-0186508/#:~:text=floating%20in%20the%20air%20with%20no%20background\">disables the background</a>, leaving the page content floating in augmented reality. Lumin OS 0.98.10 added the ability to lay web pages flat on horizontal surfaces, such as tables, and improved streaming support. Version 0.98.20 added support for WebRTC for better compatibility with video conferencing software. The Magic Leap 1, along with its browser, reached end of life in December 2024.</p>\n<p>The Magic Leap 2 released in 2022 and runs a greatly modified version of Lumin OS. Titled Magic Leap OS, it is based entirely on Android. <a href=\"https://www.magicleap.care/hc/en-us/articles/11429416677901-Web-Browser-Overview\">An inbuilt browser titled &#8216;Web Browser&#8217;</a> was added with OS version 1.1.0. It is Chromium-based and completely new, not built upon Helio and lacking many of its features. It supports navigating forward and back, cookies, WebXR, JavaScript, rendering at a resolution of 1065x616 px, downloading and installing applications, and scanning QR codes through the device&#8217;s inbuilt browser. It doesn&#8217;t support multiple windows, tabs, or bookmarks.</p>\n<p>Before the browser released, a pre-release version of the operating system (B3E.220721.07-R.026) added a separate WebXR Viewer application for developers to test compatibility, though it lacked any general browser functionality. Version 1.2.0-dev1 added controller-less interactions with the browser. Version 1.2.0 added support for creating <abbr>APK</abbr>s which open websites in their own browser session, à la <abbr>PWA</abbr>s. Version 1.3.0-dev1 (full release 1.3.1) introduced a downloads page to the browser.</p>\n<p>The Magic Leap 2 <a href=\"https://developer-docs.magicleap.cloud/docs/guides/third-party/wolvic/\">supports Wolvic</a>, and it can be configured as the default browser. It supports OpenXR eye tracking.</p>\n<h2 id=\"windows-mixed-reality\">Windows Mixed Reality</h2>\n<p>Windows Mixed Reality was a virtual and augmented reality platform from Microsoft that runs upon Windows. The first headset released was the Microsoft HoloLens in 2016.</p>\n<p>Being a Microsoft venture, Microsoft Edge was available for the device. Initially the EdgeHTML version which has been retroactively dubbed &#8216;Microsoft Edge Legacy&#8217;. It has a simplified interface from the desktop version, sporting bigger buttons for easier selection, though contains the same tabs, bookmarks, downloads, history, reading view, and other features expected from Edge Legacy. Atop the browser window are three tools: scroll, drag, and zoom, to allow easy navigation without fiddling. It supports WebVR.</p>\n<p>The updated Chromium-based version of Edge later replaced the legacy version with the Windows Holographic 21H1 update. This switch replaced the WebVR support with Chromium&#8217;s WebXR support and added spatial sound from single browser windows. Instead of a modified interface tailored for limited XR input dexterity, this updated version is Microsoft Edge&#8217;s desktop interface almost exactly as-is. A cool effect the browser incorporates is three-dimensional raising of some browser interface elements when they&#8217;re open.</p>\n<p>Being essentially standalone <abbr>PCVR</abbr>, other browsers available on Windows could also be used and accessed.</p>\n<h2 id=\"oculusmeta-quest\">Oculus/Meta Quest</h2>\n<p>Oculus released the first Quest in 2019 as a successor to the Oculus Go, and is again fully standalone. In a departure from the Go, however, headsets in the Quest line have six degrees of freedom, are much more powerful, and support more input methods, such as multiple controllers and hand tracking.</p>\n<p>The Quest&#8217;s operating system, HorizonOS, previously known as Meta Quest OS, is based on the operating system previously used on the Oculus Go. As such, it carries over the same Chromium-based browser, here called the Meta Quest Browser (previously the Oculus Quest Browser).</p>\n<p>The interface of the web browser on the Quest was near-identical to the web browser on the Oculus Go at launch, with a few minor cosmetic changes and the same three-panel design: one for tabs, one for the browser viewport, and one for bookmarks/downloads/settings. The first interface overhaul came in June 2019. In November support for 60 <abbr>FPS</abbr> display was added alongside page zoom control, and a month later WebXR support was enabled, having been added experimentally in November 2018.</p>\n<p>The first major overhaul came in March 2020 with the launch of the Quest 2. The browser lost its three-panel design, instead being one display with the previous functionality of the left and right panels being moved into buttons next to the address bar and other browser interface elements, more akin to a typical desktop browser. This update also started requesting the desktop versions of sites by default, rather than the mobile versions.</p>\n<p>WebVR support was dropped in April 2020, and in September 2021, Google Safe Browsing filtering was added. In March 2024 support for multiple browser windows and browser extensions was implemented, and in April 2024 tabs were made rearrangeable by dragging. May 2024 brought push notification support, in August the browser began collapsing the tab bar if only one tab was open, and in September support for Dolby Atmos, Spatial Audio, and Logitech MX Ink was added. In January 2025 it was made so that a <abbr>PDF</abbr> reader is automatically installed, passwords can be imported, and site permissions can be more easily managed.</p>\n<p>Most updates following the 2020 overhaul were minor from a visual perspective, mainly tweaking the interface to adhere to general operating system design changes. This changed in 2025, where the new Navigator user interface began to roll out. Fully rolling out in April 2026, Navigator is an attempt to embrace spatial computing and modifies the OS and browser to facilitate it, putting a much greater focus on augmented reality usage and multitasking with multiple windows.</p>\n<p>In June 2025 support for using the Avatar Selfie Camera was added, and the following month the main menu user interface was tweaked. In May 2026 the ability to anchor browser windows to walls on the Quest 3 and later was introduced. It receives very active development with constant performance improvements, bug fixes, and bumps to the underlying Chromium version.</p>\n<figure class=\"shorter\">\n<img src=\"/assets/posts/extended-reality-browsers/quest-3-oculus-browser.avif\" alt=\"A minimalist browser window floating in the air. At the top is the browser chrome with tabs, navigation controls, and other expected browser buttons. In the background are grassy mountains with waterfalls.\">\n<figcaption>Vale.Rocks viewed in Browser version 146.2 on the Quest 3.</figcaption>\n</figure><p>Originally Firefox Reality was available for Quest headsets, but when it was discontinued, Wolvic became available to download. It functions the same as on other headsets, and, on the Quest Pro, supports OpenXR eye tracking as of version 1.7.1.</p>\n<p>Igalia has modified the browser to be engine agnostic, allowing them to <a href=\"https://wolvic.com/blog/Chromium_Beta_APKs/\">introduce support for a Chromium-based version</a> in addition to Gecko. The reason for this decision was Mozilla&#8217;s deprioritisation of focus on XR improvements and many other XR browsers building upon Chromium and thus providing upstream support. The first full release of the Chromium-based version of Wolvic <a href=\"https://wolvic.com/blog/chromium_release_1.0/\">came in September 2024</a>. However, the Gecko version is the version available in platform stores. In November 2025, Igalia announced that, due to the changing XR landscape, Wolvic would be <a href=\"https://wolvic.com/blog/next-steps/\">moving into maintenance mode</a>. Despite this, minor feature updates have continued.<sup><a id=\"footnote-ref-2\" href=\"#footnote-2\" data-footnote-ref aria-describedby=\"footnote-label\">2</a></sup></p>\n<p>Released in 2022, <a href=\"https://www.reality-browser.com\">Reality Browser</a> is an extremely simple browser that allows pages to be placed in <abbr>3D</abbr> space. Multiple windows can be opened, arranged, and resized, and it supports navigating forward/back, refreshing the page, typing in the address bar, and bookmarking sites.</p>\n<p>VoiceSurfer is a simple German browser released in 2023 by <a href=\"https://nau-hau.com\"><abbr>NAU</abbr>-<abbr>HAU</abbr></a> designed for use by people with accessibility considerations limiting movement and dexterity. It has large buttons and can be controlled entirely by voice, hence the name. A slightly different version was previously released under the name &#8216;Mimik Browser&#8217;.</p>\n<p>The pseudo-operating-system application <a href=\"https://fluid.so\">Fluid</a> released in 2023 and provides a spatial environment in which browser windows can be placed. Multiple windows can be accessed at once and can be pinned to follow you around. Websites can be added to the environment&#8217;s app drawer for easy access, pages can be zoomed, made full screen, and you can switch between desktop and mobile versions of sites. The browser also supports <a href=\"https://docs.fluid.so/browser-engines\">multiple browser engines</a> &#8211; namely Blink and Gecko &#8211; including on a per-tab basis. When using Gecko, extensions can be installed.</p>\n<p><a href=\"https://oasis-browser.com\">Oasis Browser</a> is a very simple spatial Chromium-based browser that was also released in 2023. It allows customising a space by setting the skybox and placing furniture. In this space one can then create and arrange browser windows, each of which can be resized and support multiple tabs, zooming, bookmarks, and navigation.</p>\n<p>Another 2023 release is <a href=\"https://www.spaceframe.xyz\">Spaceframe</a>, which is a spatial notebook of sorts. Browser windows, images, and text can be placed in <abbr>3D</abbr> space and connections drawn between them. The browser functionality is intensionally simple and allows bookmarks. Links open in new windows, as part of the spatial arrangement. The canvas, which is what Spaceframe calls the environment in which its content exists, can be zoomed into and out from, as well as moved around, with the content dynamically changing its display for best presentation at whatever size.</p>\n<p>The Quest 1 was discontinued in 2020 and received its last feature update <a href=\"https://communityforums.atmeta.com/blog/AnnouncementsBlog/meta-quest-build-v50-release-notes/1031710#:~:text=We%20won%E2%80%99t%20be%20shipping%20new%20features%20to%20Quest%201%20starting%20with%20v50\">with version 50 in February 2023</a>. The ability for developers to update apps on the Meta Store ended in May 2025, meaning any more recent browsers or browser versions must be sideloaded.</p>\n<h2 id=\"pico\">Pico</h2>\n<p>Very early Pico headsets, such as the Pico Goblin, had an inbuilt browser, though it lacked any support for WebVR or WebXR and was just a flat mobile browser interface.</p>\n<p>General details of Pico&#8217;s own web browser are extremely poorly documented, with very little information existing in English or Chinese. The browser is Chromium-based and since at least 2024 allows tabs, bookmarks, downloads, setting the search engine, switching between the mobile and desktop versions of sites, searching in-page, incognito windows, WebXR, viewing browsing history, and zooming. The browser can also add shortcuts, which appear in the system dock. System version 5.11.0 in September 2024 added the browser application itself to the system dock, and 5.12.0 in November 2024 added support for multiple browser windows.</p>\n<p>Pico OS 6 <a href=\"https://developer.picoxr.com/document/web/web-app/\">introduced support for progressive web apps (<abbr>PWA</abbr>s)</a> and even allows them in the Pico app store. Web apps are very well supported and are extremely well documented on the platform for developers to take advantage of.</p>\n<p>Firefox Reality was supported on a range of Pico devices before its discontinuation in 2022. Wolvic picked up support, though, supporting the existing devices, and adding support for the Pico 4 and Pico <abbr>4E</abbr> <a href=\"https://wolvic.com/blog/release_1.3/\">in Wolvic 1.3</a>. The Pico 4 Ultra gained support with <a href=\"https://wolvic.org/blog/release_1.7.1/\">Wolvic version 1.7.1</a>, and the same version added OpenXR eye tracking support for the Pico <abbr>4E</abbr>.</p>\n<h2 id=\"huawei\">Huawei</h2>\n<p>Huawei released two sets of smart glasses. In 2019 they released the three degrees of freedom Huawei VR Glass and followed it up in late 2020 with a six degrees of freedom variant, and in 2022 they released a successor called the Huawei Vision Glass.</p>\n<p>The glasses have no on-board compute, instead requiring tethering to another device. They&#8217;re primarily intended for use with devices running Harmony OS (<ruby>鸿<rt>hóng</rt>蒙<rt>méng</rt>操<rt>cāo</rt>作<rt>zuò</rt>系<rt>xì</rt>统<rt>tǒng</rt></ruby>), which is roughly a Chinese equivalent of Android.</p>\n<p>Wolvic is available on the Huawei App Gallery both inside and outside of mainland China for use with the glasses.</p>\n<h2 id=\"lynx-r\">Lynx-R</h2>\n<p>The Lynx R1 was released by French company <a href=\"https://lynx-r.com\">Lynx-R</a> in 2022. It is aimed at a professional market, primarily enterprise. The device does not have a bespoke browser, instead <a href=\"https://portal.lynx-r.com/downloads/firmware/lynx-r-1/\">bundling Wolvic with its firmware</a>.</p>\n<h2 id=\"apple-vision-pro\">Apple Vision Pro</h2>\n<p>Apple released their Vision Pro headset in 2024 with an operating system built upon iPadOS. Input is primarily achieved via hand tracking and gestures. For the device, they released a port of Safari with extended reality-specific considerations, such as a new interface which would later become the basis for the Liquid Glass redesign of Safari on Apple&#8217;s other devices. It has feature parity with Safari on Apple&#8217;s other platforms, including tabs, extensions, iCloud syncing, and so forth.</p>\n<p>The browser has a feature titled &#8216;spatial browsing&#8217;, which is akin to a reader mode. It reformats the page for simpler reading and displays spatial media which can be viewed with parallax, like looking in through a window. The parallax effect is even evident when scrolling along a page. In some cases static images are also transformed into spatial scenes.</p>\n<p>visionOS 2 enabled WebXR support by default. With visionOS 26, Apple <a href=\"https://webkit.org/blog/17118/a-step-into-the-spatial-web-the-html-model-element-in-apple-vision-pro/\">introduced the <abbr>HTML</abbr> <code>&lt;model&gt;</code> element</a>, allowing the easy embedding of <abbr>3D</abbr> models onto webpages. The models can be animated. With visionOS 27 <a href=\"https://developer.apple.com/videos/play/wwdc2026/320/\">Immersive Backdrops were implemented</a>, providing an <abbr>API</abbr> to allow developers to present full <abbr>3D</abbr> environments around users. visionOS 27 also made it possible to curve Safari&#8217;s window.</p>\n<p>Various other browsers are available, though visionOS has the same Apple-imposed browser restriction as iOS, where WebKit is the only engine available. The difference between browsers is their interface. <a href=\"https://apps.apple.com/app/lens-browser-for-vision/id6478033172\">Lens</a> shows websites as they appear on other devices, without optimising for a spatial context.</p>\n<h2 id=\"android-xr\">Android XR</h2>\n<p>Samsung&#8217;s Galaxy XR headset launched in 2025 as the first <a href=\"https://www.android.com/xr/\">Android XR</a> device. Android XR being a version of Google&#8217;s Android operating system built for virtual and augmented reality usage. Unlike Samsung&#8217;s previous headset, the Gear VR, the Galaxy XR is fully standalone and does not require a phone to be inserted.</p>\n<p>Android XR is completely compatible with existing Android apps, allowing it to run a wide variety of browsers already available for phones and tablets as screens in virtual space. Google Chrome functions exactly as it does on mobile, though has <a href=\"https://developer.android.com/develop/xr/web\">full support for WebXR</a>.</p>\n<section class=\"footnotes\" data-footnotes>\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>Exokit&#8217;s history is rather opaque and poorly archived on account of Exokit using Exokit and WebXR to market and document Exokit. As such, archival efforts such as the Internet Archive were unable to preserve copies of the very dynamic pages.</p>\n<p>Exokit itself was compatible with a range of headsets, including Oculus&#8217; standalone devices, Google Daydream and Cardboard, Magic Leap, HoloLens, and <abbr>PCVR</abbr>, though it is unclear if the browser had specific versions for this platform. <a href=\"#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"footnote-2\">\n<p>My great thanks to Brian Kardell, who has worked on the Wolvic project at Igalia, for taking the time to <a href=\"https://bsky.app/profile/vale.rocks/post/3mp3k7jzlks2u\">answer some of my questions</a>. <a href=\"#footnote-ref-2\" data-footnote-backref aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n</ol>\n</section>\n\n\t\t",
      "summary": "Overview and history of browsers on head-mounted extended reality devices, such as those by Oculus/Meta, Google, Vive, and Apple. Covering browsers available on the devices and the functionality they're capable of, including idiosyncrasies isolated to specific browsers and devices.",
      "date_published": "2026-06-26",
      "date_modified": "2026-06-29"
    },
    {
      "id": "https://vale.rocks/posts/oculus-go",
      "url": "https://vale.rocks/posts/oculus-go",
      "title": "The Oculus Go",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>The Oculus Go was Oculus&#8217; (now Meta) first attempt at a standalone virtual reality headset. Indeed, it was one of the first commercial attempts at a standalone VR headset entirely. By contemporary standards, it is extremely obsolete, though not completely useless. It can still run a range of software designed for it and is a reasonably open platform.</p>\n<p>It was <a href=\"https://developers.meta.com/horizon/blog/introducing-oculus-go/\">first announced in October 2017</a> and released in May the subsequent year. It released in two models &#8211; one with <abbr>32GB</abbr> of storage and another with <abbr>64GB</abbr>. Sales of the Go ended in 2020, with new releases and updates of Go software to the Oculus Store being barred after the 4<sup>th</sup> of December 2020. The device received its final update with build 18.05 in September 2021.</p>\n<p>The specs are as follows:</p>\n<ul>\n<li><abbr>60H</abbr>z <abbr>538PPI</abbr> 2560x1440 <abbr>WQHD</abbr>, fast-switch <abbr>LCD</abbr> display (1280x1440 per eye).<ul>\n<li>Horizontal <abbr>RGB</abbr> stripe subpixel layout.</li>\n<li>Software can overclock display, reaching <abbr>72H</abbr>z.</li>\n</ul>\n</li>\n<li>89° horizontal field-of-view (<abbr>FOV</abbr>).</li>\n<li>90° vertical field-of-view.</li>\n<li>Fixed 63.5mm interpupilary distance (<abbr>IPD</abbr>).</li>\n<li>Stereo speakers.</li>\n<li>2600 mAh battery.</li>\n<li>Quad-core Qualcomm Snapdragon 821 <abbr>CPU</abbr>.<ul>\n<li>Kryo (2 x 2.15 GHz, 2 x 1.59 GHz).</li>\n</ul>\n</li>\n<li>Adreno 530 <abbr>GPU</abbr>.</li>\n<li><abbr>3GB</abbr> <abbr>RAM</abbr> (LPDDR4).</li>\n<li>WiFi 5.</li>\n<li>Bluetooth 4.1.</li>\n</ul>\n<p>The device has two ports: a Micro-<abbr>USB</abbr> port on the left side for charging and data transfer and a 3.5mm headphone port just below it for audio out. Centred atop the headset is a power button, and a status <abbr>LED</abbr> is present to its immediate left. The <abbr>LED</abbr> is red when at less than 15% battery, white when the screen is on, white and blinking when the device is restarting, and orange when the device is starting. While charging, the light is green when above 95% charged and orange when below. Further to the left of the unit&#8217;s top are volume control buttons. Two arms extend back from the sides, acting as mounting points for the headband and piping output from the speakers.</p>\n<figure class=\"shorter\">\n<img src=\"/assets/posts/oculus-go/oculus-go-table.avif\" alt=\"A grey headset with a black foam facial interface. Two lenses can be seen, with a small black proximity sensor between them. On the table rests a short, slim controller with a touchpad and two buttons in a neat row.\">\n<figcaption>The Oculus Go headset and controller.</figcaption>\n</figure><p>The Go has two Fresnel lenses, and between them is a small proximity sensor so the headset can detect when a head is present. There is no positional tracking, so the headset is limited to three degrees of freedom (3DoF) &#8211; it can only track pitch, yaw, and roll and has no concept of forward/back, up/down, or left/right. The headset&#8217;s single controller is small, with two buttons (one flat and one convex for tactile identification), a small, clickable, circular trackpad, a trigger, and a small under-plastic <abbr>LED</abbr>. It is powered by an AA battery which is installed by pulling the lower half of the controller&#8217;s external casing off and is symmetrical, making it ambidextrous. If operating the device without a controller, whatever is in the centre of the display can be selected by pressing the volume down button.</p>\n<p>The device weighs 470 grams and has a decently comfortable head strap making it rather light and comfortable for long-term use, such as for watching media. Unfortunately, while good by 2018 standards, the display suffers badly <a href=\"https://vale.rocks/micros/20260624-0210\">from the screen door effect</a> and doesn&#8217;t reach full blacks due to being <abbr>LCD</abbr>, not <abbr>OLED</abbr>.</p>\n<h2 id=\"installing-the-spacer\">Installing the Spacer</h2>\n<p>The facial interface is removable, and an included spacer can be placed behind it so that glasses can be worn with the headset. Unfortunately, the instructional video <a href=\"https://www.youtube.com/watch?v=YA5U8MbkUrE\">Inserting the Glasses Spacer</a> is unlisted, and, as such, is difficult to find.</p>\n<p>The process is as follows:</p>\n<ol>\n<li>Set the flat side of the headset down on a surface.</li>\n<li>Bend the two arms onto which the head strap connects up.</li>\n<li>Pull off the rings around the lenses.</li>\n<li>Pull the soft facial interface from the headset.</li>\n<li>Place the spacer flush where the facial interface sat.</li>\n<li>Replace the facial interface atop the spacer, ensuring it is flush and sits under the ridge of the proximity sensor.</li>\n<li>Reinstall the rings around the lenses.</li>\n<li>Bend the arms back into place.</li>\n</ol>\n<p>It is worth keeping in mind that great care should still be taken even with the spacer, as there is a risk of glasses irreparably scratching the lenses.</p>\n<h2 id=\"initial-setup\">Initial Setup</h2>\n<p>Since release people have been critical of the setup requirements. The Oculus Go <em>requires</em> the smartphone app for initial setup. You <em>must</em> go through the asinine phone process to install the unlocked software, and you must also have an Oculus Go controller. This is non-negotiable. The Oculus Go <em>cannot</em> be setup without a phone running the Meta Horizon app (previously the Meta Quest app, previously the Oculus app).</p>\n<p>Supporting the Oculus Go is not a priority for Meta, and the app frequently introduces incompatibilities or failures. If you have the app but it fails to recognise your headset or you get stuck on a specific stage of setup (most infamously the &#8216;Health and safety&#8217; step), it may be necessary to use an older version of the app. Version 244.0.0.4.117 of the Meta Horizon app for Android is frequently cited as working.</p>\n<h2 id=\"unlocking\">Unlocking</h2>\n<p>With an unlocked headset, you can do whatever you like. You can modify the experience and install whatever software you want, such as games, apps, or enhancements like the <a href=\"https://github.com/petermg/TheOcularMigraineMCP\">Ocular Migraine Master Control Program</a>. It is similar to having a rooted Android phone. <a href=\"https://sidequestvr.com\">SideQuest</a> hosts a number of applications for the Go.</p>\n<p>There are a few guides out there for unlocking. In addition to the one I&#8217;ve written below, these may also be of use:</p>\n<ul>\n<li><a href=\"https://developers.meta.com/horizon/blog/unlocking-oculus-go/\">Unlocking Oculus Go</a> - The official guide. Unfortunately, it gets some details wrong. For example, they incorrectly state that you must hold volume up, rather than volume down.</li>\n<li><a href=\"https://www.reddit.com/r/virtualreality/comments/qdkf93/tutorial_unlocking_the_oculus_go/\">Tutorial: Unlocking The Oculus Go</a></li>\n<li><a href=\"https://headjack.io/knowledge-base/sideload-install-app-apk-oculus-go-quest/\">How to sideload apps on Oculus Go & Quest</a></li>\n</ul>\n<p>You will need to install the Android Debug Bridge (<code>adb</code>) and <code>fastboot</code> on a computer. These are command-line applications that allow direct interfacing with Android. They can be downloaded from the <a href=\"https://developer.android.com/tools/releases/platform-tools\">Android <abbr>SDK</abbr> Platform Tools</a>. You will likely also need to install the <a href=\"https://developers.meta.com/horizon/downloads/package/oculus-go-adb-drivers/\">Oculus Go <abbr>ADB</abbr> Drivers</a>.</p>\n<p>You will also need to download the <a href=\"https://developers.meta.com/horizon/downloads/package/oculus-go-sw-unlock/\">Oculus Go SW Unlock</a>. It should download as <code>Oculus_Go_SW_Unlock_v1.zip</code> and be <abbr>711MB</abbr> in size. You will need to unzip this folder.</p>\n<p>The unlocking process is as follows:</p>\n<ol>\n<li><p>Completely power off the headset (can be achieved by holding the power button).</p>\n</li>\n<li><p>Connect the Oculus Go to your computer with Android <abbr>SDK</abbr> Platform Tools.</p>\n</li>\n<li><p>Turn the headset on by holding volume down and the power button. You should be presented with a menu:</p>\n<blockquote>\n<p><span style=\"color: light-dark(var(--orange), var(--yellow)); border-block: 2px solid currentColor; font-size: 1.25rem;\"><abbr>USB</abbr> Update Mode</span></p>\n<p><span style=\"color:var(--green);\">Use volume buttons to move selection.</span><br><span style=\"color:var(--green);\">Power button to select.</span></p>\n<p><span style=\"border-block: 1px solid currentColor;\">Exit and boot the device</span><br><span style=\"border-block: 1px solid currentColor;\">Factory reset</span><br><span style=\"border-block: 1px solid currentColor;\">Enable sideloading update</span><br><span style=\"border-block: 1px solid currentColor;\">Power off</span></p>\n</blockquote>\n<p>Select &#8216;Enable sideloading update&#8217;. The headset&#8217;s <abbr>LED</abbr> should begin blinking purple.</p>\n</li>\n<li><p>Run <code>adb sideload unlocked_build.zip</code>, ensuring that <code>unlocked_build.zip</code> points to the archive extracted from <code>Oculus_Go_SW_Unlock_v1.zip</code>. Make sure you run this command <em>while</em> the <abbr>LED</abbr> is blinking purple. After running the command, the device will take a few moments and then reboot.</p>\n</li>\n<li><p>Reboot to the bootloader with the command <code>adb reboot bootloader</code>, or by holding the volume down button while the headset boots and selecting &#8216;Exit and boot the device&#8217;. If those methods fail, you can use the command <code>fastboot oem unlock</code>, though it should be noted that this method factory resets the device and wipes all data.</p>\n</li>\n</ol>\n<p>The device is now completely unlocked, allowing you to root it or do whatever you wish. The device will now show a warning screen while booting, which indicates that the software does not have an Oculus signature and thus that our unlocking has been successful.</p>\n<blockquote>\n<p><span style=\"color: light-dark(var(--orange), var(--yellow));\">Your device software can&#8217;t be checked for corruption. Please lock the bootloader.</span><br>Visit this link on another device:<br><a href=\"https://support.oculus.com/\">https://support.oculus.com/</a><br>Your device will boot in 5 seconds. Press power key to skip.</p>\n</blockquote>\n<h3 id=\"troubleshooting\">Troubleshooting</h3>\n<p>If, once unlocked, you find yourself stuck in the setup or needing to bypass it, you can do so with this command: <code>adb shell am startservice -a firsttimenux.ota.SKIP_NUX -n com.oculus.companion.server/com.oculus.firsttimenux.ota.OtaIntentService</code></p>\n<p>If step 3 didn&#8217;t work for you, you&#8217;ll need to use a more complex method to access the sideloading mode. You can try the command <code>adb reboot sideload</code>. If that doesn&#8217;t work, you can try <code>adb reboot bootloader</code>, from where you should be able to select the &#8216;Enable sideloading update&#8217; option as previously described.</p>\n<p>If step 4 returns <code>failed to read command: No error</code> or progress freezes, try plugging in the Go via a <abbr>USB</abbr> 2.0 port. Sometimes faster ports cause issues.</p>\n<p>If the Go fails to install the unlocked software as part of step 4, you will need to redo the process but first explicitly enable developer mode. You should be able to do this by toggling Developer Mode in the Go&#8217;s settings within the settings on your phone. If you aren&#8217;t given the option, you can try an older version of the app. If it still isn&#8217;t present, it is likely because you need <a href=\"https://developers.meta.com/horizon/documentation/native/android/mobile-device-setup/\">a registered, verified developer account</a>.</p>\n<p>If you find yourself stuck on a screen with three dots in a grey capsule akin to a typing indicator in a messaging app, you must pair your headset with the app.</p>\n\n\t\t",
      "summary": "Oculus' 2018 virtual reality headset, the Oculus Go, viewed from a modern perspective. Includes tutorials for installing a the glasses spacer and unlocking the software for improved long-term viability.",
      "date_published": "2026-06-23"
    },
    {
      "id": "https://vale.rocks/posts/pda-browsers",
      "url": "https://vale.rocks/posts/pda-browsers",
      "title": "Web Browsers on PDAs",
      "content_html": "\n\t\t\t\n\t\t\t\n\t\t\t<p>From the moment the technology arrived to allow personal digital assistants (<abbr>PDA</abbr>s)<sup><a id=\"footnote-ref-1\" href=\"#footnote-1\" data-footnote-ref aria-describedby=\"footnote-label\">1</a></sup> a connection to the internet, people started connecting them to the internet, as is the natural order of things. Initially their connections were just for the most fledgeling of information fetching, but as the &#8217;90s progressed and the World Wide Web became a feature of the digital landscape, <abbr>PDA</abbr>s received browsers.</p>\n<p>Existent from when technology permitted to when society moved on and the smartphone took reign, browsers on <abbr>PDA</abbr>s were some of the first and most popular entries to the mobile web but held out only briefly while the incoming technology got settled.</p>\n<p>There can be two main &#8216;types&#8217; of browsers on <abbr>PDA</abbr>s considered: Those which could only access i-mode (iモード), Wireless Application Protocol (<abbr>WAP</abbr>), and Wireless Markup Language (<abbr>WML</abbr>) pages and those which comply with larger web standards and interface with sites written in <abbr>HTML</abbr>. This article covers the latter, full web browsers.</p>\n<div class=\"markdown-alert markdown-alert-note\">\n<p class=\"markdown-alert-title\"><svg class=\"octicon octicon-info mr-2\" viewBox=\"0 0 16 16\" width=\"16\" height=\"16\" aria-hidden=\"true\"><path d=\"M0 8a8 8 0 1 1 16 0A8 8 0 0 1 0 8Zm8-6.5a6.5 6.5 0 1 0 0 13 6.5 6.5 0 0 0 0-13ZM6.5 7.75A.75.75 0 0 1 7.25 7h1a.75.75 0 0 1 .75.75v2.75h.25a.75.75 0 0 1 0 1.5h-2a.75.75 0 0 1 0-1.5h.25v-2h-.25a.75.75 0 0 1-.75-.75ZM8 6a1 1 0 1 1 0-2 1 1 0 0 1 0 2Z\"></path></svg>Note</p>\n<p>Even with web browsers as a subject, the web was in such an infancy during early years of <abbr>PDA</abbr> availability that much information either never reached it or has been lost since. I&#39;m sure a wealth of information exists hidden away in archives, but it is isolated such that discovering it is difficult.</p>\n<p>Corrections and leads <a href=\"https://vale.rocks/contact\">are welcome</a>.</p>\n</div>\n<p>Unfortunately, to cover every <abbr>PDA</abbr> released and the browsers available to each is unrealistic, so instead <abbr>PDA</abbr> browsers are presented here by operating system. Through the &#8217;90s, <abbr>PDA</abbr>s had to make use of computer syncing systems, external modems, and dial-up to facilitate internet access. Towards the very end of the &#8216;90s, infrared (IR) connections became reasonably popular, where by lining up the IR port on a <abbr>PDA</abbr> with the one on a mobile phone, a very slow and unreliable connection could be established. Around the turn of the millennium, some devices started to receive inbuilt antennas, and expansion systems became popular &#8211; often bulky additions with Wi-Fi cards or cellular modems. By 2003, high-end <abbr>PDA</abbr>s began to release, with Wi-Fi and Bluetooth built-in.</p>\n<h2 id=\"epoc\"><abbr>EPOC</abbr></h2>\n<p>Also called <abbr>SIBO</abbr> or EPOC16 (in reference to being 16-bit), <abbr>EPOC</abbr> was developed by Psion and first released in 1989. Unlike later <abbr>PDA</abbr> operating systems, <abbr>EPOC</abbr> never developed a broad browser ecosystem.</p>\n<p>The earliest browser available for <abbr>EPOC</abbr> was <a href=\"https://web.archive.org/web/20031102141553/http://members.v3space.com/3forall/pmi.htm\">PsiMail Internet</a>, which had a web browser simply titled &#8216;Web&#8217;. It roughly complies with HTML2, though shows tables improperly, cell by cell. It supports the display of forms and <abbr>GIF</abbr>s, though not <abbr>JPEG</abbr>s, and images default to being disabled.</p>\n<p>They also bundled <abbr>STNC</abbr> HitchHiker, which was built by British start-up <abbr>STNC</abbr>. However, in 1999 <abbr>STNC</abbr> was <a href=\"https://www.eetimes.com/microsoft-acquires-provider-of-epoc-browser-technology/\">acquired by Microsoft</a>, who were launching their own Windows Mobile operating system for <abbr>PDA</abbr>s, and subsequent releases of HitchHiker on <abbr>EPOC</abbr> ceased.</p>\n<p>Following this, Psion made a deal with Opera, who began supporting the <abbr>EPOC</abbr> in 2000 with <a href=\"https://press.opera.com/2000/07/06/opera-3-62-for-epoc-launched/\">the release of Opera 3.62</a> touting:</p>\n<blockquote>\n<p>Opera 3.62 for <abbr>EPOC</abbr> features Web browser functionality, full colour (256 colours) support, full zooming key mapped to a range of zoom levels, 128-bit encryption, <abbr>SSL</abbr> 2 and 3, <abbr>TLS</abbr> 1.0, <abbr>HTML</abbr> 3.2, Support for Java Applets using <abbr>EPOC</abbr> native Java implementation, JavaScript 1.1, and CSS1.</p>\n</blockquote>\n<p>Opera became the default browser on <abbr>EPOC</abbr> devices.</p>\n<h2 id=\"apple-newton\">Apple Newton</h2>\n<p>The device for which the name &#8216;<abbr>PDA</abbr>&#8217; was coined,<sup><a id=\"footnote-ref-2\" href=\"#footnote-2\" data-footnote-ref aria-describedby=\"footnote-label\">2</a></sup> the Apple Newton, released in 1993. With help from the 1996 Newton Internet Enabler, which included an application titled Internet Setup, a <abbr>TCP</abbr>/IP stack, and a NewtonScript <abbr>API</abbr>, the Newton could get online.</p>\n<p>First announced as NewtonWWW before later changing its name, PocketWeb released in late 1994 and received several updates throughout the Newton&#8217;s life. <a href=\"https://web.archive.org/web/20190813024245/http://www.teco.edu/static/research/pda/pocketweb/\">Developed by TecO</a>, it could make use of an external proxy in some cases to bypass the Newton&#8217;s limitations. Version 2.4 brought the ability to display <abbr>GIF</abbr>s, though other images could be loaded via the proxy.</p>\n<p><a href=\"https://web.archive.org/web/19961022181719/www.allpen.com/nethopper10.html\">NetHopper</a>, which was developed by AllPen Software and released in late 1996. It has image support (defaulting to disabled), with ability to scale images to fix the screen, as well as the ability to create, edit, and delete bookmarks. A button exists to list the current webpages&#8217; headings so they can be jumped to easily, and the browser has plug-in functionality, though it requires plug-ins for even basic functionality like support for <abbr>HTTP</abbr>.</p>\n<p>NetHopper versions 3.0 and 3.2 <a href=\"https://web.archive.org/web/19970526010627/http://www.allpen.com/nethopper3.html#:~:text=NetHopper%20is%20now%20bundled\">were bundled on some Newton devices</a> and on November 17, 1997, AllPen was acquired by Spyglass. Spyglass later <a href=\"https://web.archive.org/web/20010529210019/http://www.spyglass.com/solutions/technologies/nethopper/\">dropped support for NetHopper</a> with the announcement that Apple would be discontinuing the Newton, and were then acquired themselves by OpenTV.</p>\n<p>Newt&#8217;s Cape, also going by Newtscape, was released by solo developer Steve Weyer in 1999. It supported <abbr>HTML</abbr> 2.0 (with some <abbr>HTML</abbr> 3.2 features), basic forms, text formatting, and image loading. The browser could also create Newton books from webpages. It was <a href=\"https://communicrossings.com/html/newton/newtscape.htm\">released as freeware in 2018</a>. A tool designed to compliment Newt&#8217;s Cape, titled <a href=\"https://web.archive.org/web/20210422131111/https://cs.gmu.edu/~sean/projects/newton/Hemlock/\">Hemlock</a>, was available and compiled search results from multiple sites together.</p>\n<p>LunaSuite Pro released in 1997 or 1998, complete with <a href=\"https://web.archive.org/web/19980611214502/http://www.lunatech.com/products/lunasuite/features/web.ltml\">LunaSuite Web</a>, the Newton&#8217;s most capable web browser. It adds three ways to access the web. Via the app Go-To, which lets a user directly input a <abbr>URL</abbr>; via Bookmarks, which provides a selection of pre-selected pages (that can also be managed); or via LunaRoamer, which is a complete browser interface. Through LunaRoamer, Go-To and Bookmarks can also be accessed. The browser supports <abbr>GIF</abbr> and <abbr>JPEG</abbr> images, including animated <abbr>GIF</abbr>s; audio in Sun Microsystem&#8217;s <code>.au</code> format; some of <abbr>HTML</abbr> 3.2, including frames, tables, and forms; and configurable <abbr>URL</abbr> filtering. Unfortunately, being the most capable browser, it pushes the Newton a bit <em>too</em> far at times, leading to instability.</p>\n<p>In 1998 <a href=\"https://www.newted.org/resources/notesweb/Read_Me_Japanese.html\">NotesWeb</a> was released. Instead of being a full, dedicated application, it is an applet that uses the Newton&#8217;s Notes application. Extremely simple in function, it doesn&#8217;t support frames or forms, nor bookmarks, caching, or proxies.</p>\n<p><a href=\"https://40hz.org/Pages/newton/packages/courier/\">Courier</a> is a simple, text-only web browser for Newton OS 2.1 which first released in 2003. Unlike typical browsers, Courier treats webpages like notes in the Newton&#8217;s notepad, which itself acts like a normal notepad. There are no &#8216;bookmarks&#8217; for you can save a page by simply opening a new note, almost like a browser tab. However, these tabs can be filed into folders and renamed arbitrarily, and their individual history is saved. It is a very interesting system.</p>\n<figure class=\"pixelated\">\n<img src=\"/assets/posts/pda-browsers/newton-courier.avif\" alt=\"A monochrome interface displaying the textual results of a DuckDuckGo search for 'Declan Chidlow'. The search engine's filter dropdowns have been rendered as text and are displaying every item in them at the top of the screen. A row of buttons is present at the bottom of the browser interface.\">\n<figcaption>Courier version 1.1.1 on Newton OS 2.1 searching on DuckDuckGo.</figcaption>\n</figure><h2 id=\"palm-os\">Palm OS</h2>\n<p>Later known as Garnet OS, Palm OS was released in 1996 and made available on a wide range of <abbr>PDA</abbr>s. Before full-fledged browsers quite made it to Palm OS, <a href=\"http://www.junefabrics.com/pocketwebclipping/faq.php\">web clipping apps</a> (also called Palm Query Applications or <abbr>PQA</abbr>s) were popular as a method to scrape websites and display parts of their content in <abbr>PDA</abbr>-optimised forms. They persisted even once browsers were available, but browser&#8217;s more comprehensive capabilities largely obsoleted them.</p>\n<p>Around the turn of the millennium, Softview <a href=\"http://softview.us/palmclient.html\">brought their very rudimentary proxy browser to Palm OS</a>.</p>\n<p>Developed by <abbr>ILINX</abbr>, Palmscape was a very popular browser released in 1997 for Palm OS devices. Palmscape supports <abbr>HTML</abbr> 3.2, including frames and tables, and supported displaying images via a proprietary external proxy. A companion program for Windows called Palmscape Cruiser could download pages and send them to Palm OS devices for offline perusal. Sales of Palmscape <a href=\"https://web.archive.org/web/20021212141709/http://www.ilinx.co.jp/en/whatsnew/02-05-15.html\">ended in 2002</a>.</p>\n<figure class=\"left pixelated\">\n<img src=\"/assets/posts/pda-browsers/palm-xiino.avif\" alt=\"A colourful interface displaying a browser homepage, which lists information about the browser. The logo is rendered as an image. Just under the homepage are browser navigation buttons. Most of the screen displays buttons and device inputs.\">\n<figcaption>Xiino on Palm OS v5.2.1</figcaption>\n</figure><p>After Palmscape, <abbr>ILINX</abbr> moved focus to Xiino, a successor to Palmscape. It kept Palmscape&#8217;s features, but introduced support for JavaScript, <abbr>SSL</abbr>, and a few more minor configuration options. Like with Palmscape, a companion program for Windows called Xiino Cruiser was made available.</p>\n<p>The proxy browser <a href=\"https://www.gribble.org/papers/wingman.pdf\">Top Gun Wingman</a> released in October 1997 with support for much of <abbr>HTML</abbr> 3 and caching of sites. It was rapidly iterated upon, with several versions being released in quick succession soon after initial release. These updates brought the ability to download databases and applications, horizontal scrolling, interface improvements, support for large images, bug fixes, and other minor improvements.</p>\n<p>Wingman was later commercialised as ProxiWeb, touting its proxy system, &#8216;SmartProxy&#8217;. Several versions were released, with many improvements upon Wingman. It brought cookies, bookmarks, <abbr>SSL</abbr> support, <abbr>HTML</abbr> forms, some support for frames, and various other browser staples. Ultimately, ProxiNet, who developed ProxiWeb, was <a href=\"https://www.nytimes.com/1999/10/30/business/company-news-puma-technology-acquires-proxinet-for-86-million.html\">ultimately acquired by Puma Technology (PumaTech)</a> in 1999. PumaTech subsequently rebranded ProxiWeb to &#8216;Browse-it&#8217;, under which they added a feature called &#8216;SnapShots&#8217; so full pages or sections of sites could be saved for offline access.</p>\n<p><a href=\"https://web.archive.org/web/20000229193936/http://www.smartcodesoft.com/products/handhelds/hh_handweb.html\">HandWEB</a> is a browser developed by Smartcode Software and released in 1997. It supports <abbr>HTML</abbr> 2, bookmarks, history, and other typical browser features. There are two major versions of HandWEB. 2.0 introduced support for <abbr>GIF</abbr>s, cookies and authentication, bookmark sorting, forms, caching, and offline browsing. It doesn&#8217;t support frames or JavaScript. In March 2000 Smartcode <a href=\"https://web.archive.org/web/20000511105957/http://www.smartcodesoft.com\">announced HandWEB&#8217;s end of life</a>.</p>\n<p>Qualcomm had entered the Palm OS market in 1998 with their phone/<abbr>PDA</abbr> hybrid, the pdQ. A couple of years later in 2000, <a href=\"https://www.qualcomm.com/news/releases/2000/06/new-qualcomm-eudora-internet-suite-provides-email-and-web-browsing-millions\">they launched Eudora Internet Suite (<abbr>EIS</abbr>)</a>. One part of <abbr>EIS</abbr> is the Eudora Web browser, which comes complete with bookmarks and offline reading capabilities. Qualcomm continued to improve their suite, releasing updates in subsequent years.</p>\n<p>Released in late 2000, Blazer was an incredibly popular proxy browser for Palm OS 3.1 and higher. It was first developed by Bluelark Systems, who were acquired by Handspring a month after the browser&#8217;s launch. It received four major versions. Blazer 2 brought an improved interface, <abbr>SSL</abbr>, the ability to use proxies, and better colour display. In September 2005, Blazer 1 and 2 were rendered inoperable due to the proxy service being turned off. Blazer 3 was a complete overhaul, moving from a proxy system to <a href=\"https://www.access-company.com/en/news_event/archives/2003/07152003/\">using Access&#8217;s NetFront 3.0 engine</a>. Blazer 4 improved the interface, integrated a <abbr>VPN</abbr>, allowed saving pages, and added bookmarks. Release 4.3 added a fast mode, which disabled images and/or <abbr>CSS</abbr> for quicker page loading. Blazer 4.5 was the last version of the browser to be released, and added video playback support via Kinoma Video Player.</p>\n<p>Palm OS 5 received an inbuilt browser when it released in 2002 in the form of Access&#8217; NetFront 3.0 browser. The first <abbr>ARM</abbr>-native, proxy-less browser for Palm OS, it supports <abbr>HTML</abbr> 4.01, <abbr>CSS</abbr>, JavaScript 1.5 and other web standards. Access would later acquire PalmSource, who owned the rights to Palm OS, in 2005, turning it into Garnet OS.</p>\n<p>Also in 2002, the company Novarra released WebPro (also written Web Pro) for Palm&#8217;s high-end, business-oriented Tungsten line of <abbr>PDA</abbr>s. It received at least three major versions. Prior to WebPro, Novarra <a href=\"https://web.archive.org/web/20010205054200/http://novarra.com/product.htm\">had a browser titled PocketScape</a> and then <a href=\"https://web.archive.org/web/20010411063739/http://www.novarra.com/product_spec.htm\">Novarra WirelessWeb Enterprise Suite</a>, which included a proxy-based browser. It is unclear if these browsers were built upon each other or the base for WebPro. Nokia acquired Novarra in 2010.</p>\n<p>In 2007, a developer by the name of Donald Kirker released the beta of <a href=\"http://www.wapuniverse.com\">Universe 3</a>. The open-source browser is built upon <abbr>WAPU</abbr>niverse, a previously developed browser which only supported Wireless Application Protocol content. Universe 3 is feature-packed, with support for a range of image formats, private browsing functionality, up to three tabs, and an integrated <abbr>RSS</abbr> reader. Unfortunately, development fizzled out, and it never left beta.</p>\n<h2 id=\"symbian-os\">Symbian OS</h2>\n<p>Starting its life as the 32-bit version of <abbr>EPOC</abbr>, often referred to as EPOC32, it would be renamed Symbian OS in 1998 and first released on devices in 1997. As far as dedicated <abbr>PDA</abbr>s were concerned, they mainly continued running <abbr>EPOC</abbr> with the same browsers.</p>\n<p>When Symbian came into being in 1998 and Symbian Limited was established as a partnership between Psion, Nokia, Ericsson, and Motorola, focus very much shifted to &#8216;smartphones&#8217;, or, as was the nomenclature at the time, &#8216;communicators&#8217;. As such, dedicated <abbr>PDA</abbr>s largely moved from Symbian to Palm OS or Windows Mobile.</p>\n<h2 id=\"windows-mobile\">Windows Mobile</h2>\n<p>Windows Mobile first released in 2000, based on Windows CE. It first released as the Pocket PC 2000 operating system but was later rebranded and spread to a wide range of <abbr>PDA</abbr>s by a variety of manufacturers.</p>\n<p>Pocket Internet Explorer was first released in late 1996 for Windows CE 1.0. Despite the name, the only association Pocket Internet Explorer has with the version of Internet Explorer for desktop is the name itself. It was written from scratch to be lightweight and didn&#8217;t use Internet Explorer&#8217;s Trident layout engine. It followed Microsoft&#8217;s naming scheme of just prefixing everything <abbr>PDA</abbr> related with &#8216;Pocket&#8217;. Pocket Word, Pocket Excel, Pocket Streets, Pocket <abbr>MSN</abbr>, etc.</p>\n<p>A minor update, version 1.1, was released, adding support for cookies, <abbr>HTTPS</abbr>, and <abbr>SSL</abbr>. Version 2, in late 1997, added offline browsing, image resizing, and improved <abbr>HTML</abbr> support to include frames and tables. Version 3 from mid-1998 added JScript support and more secure protocols. Version 4 was a major release, introducing support for <abbr>CSS</abbr>, ActiveX, and <abbr>VBS</abbr>cript, as well as improved <abbr>HTML</abbr> and <abbr>HTTPS</abbr> support. A slightly modified version was released for Pocket PC 2002 with <abbr>WAP</abbr> support. Very little information exists about Pocket Internet Explorer 5.</p>\n<figure>\n<img src=\"/assets/posts/pda-browsers/ipaq-pocket-internet-explorer.avif\" alt=\"A grey PDA in a dock open to a Pocket MSN subscription page in Internet Explorer. The browser has an address bar at the top and a menu at the bottom. The operating system menu can be seen at the very top, and the entire interface is Luna themed. In the background is 2000s tech miscellany.\">\n<figcaption>Pocket Internet Explorer 4 on a HP iPAQ running Windows Mobile 2003 Second Edition</figcaption>\n</figure><p>It was later rebranded to <a href=\"https://learn.microsoft.com/en-us/archive/blogs/windowsmobile/internet-explorer-mobile-6\">Internet Explorer Mobile</a> with version 6. Besides the name change, version 6 integrated Adobe Flash Lite 3.1 (based on Flash 8), Jscript v5.7 from Internet Explorer 8, the ability to wrap text for improved mobile display, better cursor navigation, easy switching between mobile/desktop versions of pages via User Agent manipulation, and multiple zoom levels. It also overhauled the interface to be more touch-friendly and added gesture support. Later, Internet Explorer Mobile and its bespoke lightweight engine would go on to be used on the Windows Phone platform.</p>\n<p>ProxiNet released their ProxiWeb browser for Windows Mobile, and Browse-it was also made available following ProxiNet&#8217;s acquisition by PumaTech and the browser&#8217;s rebranding.</p>\n<p>Microsoft made brief attempts to release a proxy-only browser which rendered pages server-side to Windows Mobile via their <a href=\"https://web.archive.org/web/20070614014343/http://labs.live.com/deepfish/\">Deepfish experiment</a>. It released in 2007 in an invite-only capacity and never grew beyond a technology preview within Microsoft Live Labs. Desktop versions of content were presented, with users expected to pan around pages to view it. It did not support interactive features, such as ActiveX controls, animations, <abbr>AJAX</abbr>, cookies, JavaScript, or <abbr>HTTP</abbr> <abbr>POST</abbr>.</p>\n<p>In 2001, Bitstream Incorporated released ThunderHawk, a proxy browser. Instead of trying to format or alter pages for small <abbr>PDA</abbr> screens like some other browsers, ThunderHawk displays the full desktop version of sites. Feature support depended on device especially as it was also ported to Symbian and Java ME, but it had incremental rendering, persistent cookies, history, bookmarks, and other comprehensive browser features at that time usually limited to desktop. To bypass the issues inherent to displaying a page built for desktop on a small screen, the browser has a split-screen mode allowing the full page to be viewed on one part of the screen alongside a zoomed-in version on a lower part of the screen. It received steady updates until 2008, improving page rendering, the interface, and making minor improvements.</p>\n<p>Also in 2001, the proxy browser SoftView <a href=\"http://softview.us/winclient.html\">received a port to Windows Mobile</a>.</p>\n<p>A version of Firefox ported to <abbr>PDA</abbr>s as <a href=\"https://www-archive.mozilla.org/projects/minimo/\">Minimo</a>, a portmanteau of &#8216;mini&#8217; and &#8216;Mozilla&#8217;, became available in 2004. Bits of Firefox were stripped out, and the interface was overhauled so that it would work on such minimal devices. It has support for JavaScript and <abbr>AJAX</abbr>, multiple tabs, widgets and extensions, <abbr>RSS</abbr>, and secure protocols. Though very capable and compliant to then-modern web standards, due to being built upon full-desktop Gecko rather than an engine designed for embedding and as a result of being crammed onto such low-power devices, its performance is poor. The project was dropped in late-2007, though development had slowed before then.</p>\n<p>Opera Mini was available, though not natively on Windows Mobile at first. Users wanting to access the browser instead had to use a Java emulator or wrapper to access the Java Platform, Micro Edition (J2ME) version on their <abbr>PDA</abbr>s. This changed in 2010, with <a href=\"https://press.opera.com/2010/03/04/opera-mini-goes-native-on-windows-mobile-phones/\">the beta release of a native version of Opera Mini 5</a> for Windows Mobile versions 5 and 6. As with the J2ME version, it has features including tabs, password management, and bookmarks. It came out of beta with <a href=\"https://press.opera.com/2010/09/09/better-browsing-on-windows-mobile/\">Opera Mini 5.1 in September of 2010</a>.</p>\n<p>A native, non-proxy version of Opera also became established in the form of Opera Mobile, which <a href=\"https://press.opera.com/2006/01/18/good-call-opera-mobile-web-browser-now-available-in-beta-for-windows-mobile-pocket-pc/\">released for Pocket PC devices in 2006</a>. It had previously been made available for Windows Mobile-running smartphones. Unlike Opera Mini, Opera Mobile renders pages on-device. <a href=\"https://press.opera.com/2007/10/01/opera-mobile-8-65-for-windows-mobile-now-available-for-smartphone-and-pocket-pc-enthusiasts-handset-oems-and-mobile-carriers/\">Opera Mobile 8.65</a> brought Macromedia Flash 7 and various interface and usability improvements.</p>\n<p>Another proxy-only browser was Skyfire, which released in 2008 and also used a proprietary service provided by Skyfire to render websites with Firefox before displaying them on the user&#8217;s device. Alongside the version for Symbian OS, Skyfire <a href=\"https://web.archive.org/web/20110716082414/http://www.skyfire.com/press/blog/72-retirement\">retired version 1.0</a>, which was available on Windows Mobile in late 2010.</p>\n<p>In 2002, NetFront <a href=\"https://www.access-company.com/en/news_event/archives/2002/02202002/\">released a version of its proprietary browser</a> for Windows Mobile devices, supporting <abbr>HTML</abbr> 4.01, <abbr>CSS</abbr> and some CSS2, JavaScript 1.5, tabbed browsing (up to five), images, bookmarks, cookies, and other such technologies. It had specific considerations for small screens, such as adapting tables to display vertically to avoid horizontal overflow. By <a href=\"https://www.access-company.com/en/news_event/archives/2006/051706/\">v3.3</a> it had support for Java and Macromedia Flash, as well as <abbr>RSS</abbr>/Atom support and machine translation capabilities.</p>\n<p>In 2008, Torch Mobile released Iris &#8211; a native browser for Windows Mobile using the WebKit engine. It supports tabs, bookmarks, and other browser features, as well as all the web standards expected from WebKit, including <abbr>SVG</abbr>, XPath, and <abbr>XSLT</abbr> support. The interface is optimised for touch, with large, simple buttons. Slow-performing, but with great support for web technologies, BlackBerry Limited (then known as Research In Motion) <a href=\"https://web.archive.org/web/20090827095823/http://www.torchmobile.com/blog/?p=33\">acquired Torch Mobile in 2009</a> and ceased development of the browser.</p>\n<p>For Windows Mobile 6, Mozilla made another port of Firefox under the codename &#8216;Fennec&#8217;. There were three public alpha releases. <a href=\"https://website-archive.mozilla.org/www.mozilla.org/fennec_releasenotes/projects/fennec/1.0a1-wm/releasenotes/\">The first</a> laid significant groundwork with a lot of solid features. It has tagged bookmarks, tabbed browsing, Firefox&#8217;s &#8216;Awesome Bar&#8217; (the address bar), support for add-ons, password management, pop-up blocking, a download manager, zoom, and other features. The next release, <a href=\"https://website-archive.mozilla.org/www.mozilla.org/fennec_releasenotes/projects/fennec/1.0a2-wm/releasenotes/\">Alpha 2</a>, polished the experience and added a JavaScript error console. <a href=\"https://website-archive.mozilla.org/www.mozilla.org/fennec_releasenotes/projects/fennec/1.0a3-wm/releasenotes/\">Alpha 3</a>, which was the final publicly released version of the browser, improved the interface and browser performance, added kinetic scrolling and scrolling of frames, improved zooming, and added support for multiple screen sizes. <a href=\"https://web.archive.org/web/20110724003157/https://blog.pavlov.net/2010/03/22/stopping-development-for-windows-mobile/\">Development of the browser ceased</a> in 2010 after Windows Mobile 7 &#8211; a major update targeting Windows Phone &#8211; was announced to not support native applications.</p>\n<p>Due to the success of smartphones, later browser releases for Windows Mobile could sometimes be installed on non-phone <abbr>PDA</abbr>s but were much more oriented towards the incoming technology of smartphones.</p>\n<h2 id=\"zaurus\">Zaurus</h2>\n<p>In late 1993 Sharp Corporation launched their Zaurus line of <abbr>PDA</abbr>s in Japan, initially running a proprietary operating system. During this time, the Zaurus mainly ran a bespoke browser from Sharp itself. Around 2000, Compact NetFront by Access, in partnership with Sharp, released, bringing a much more complete and comprehensive browser experience.</p>\n<p>Beginning with the SL series of Zaurus <abbr>PDA</abbr>s in 2002, Sharp switched from a completely proprietary OS to a Linux distribution. The SL series was also the first Zaurus device to be sold commercially outside of Japan by Sharp. Following the switch to Linux, more browsers became supported. Both Opera and NetFront were available, with features expected for <abbr>PDA</abbr>s of the era.</p>\n<p>Picsel Technologies released Picsel Browser for some of these machines. Picsel Browser uses a technology they called <a href=\"https://web.archive.org/web/20040725144921/http://www.picsel.com/pdf/picselbrowser.pdf\">ePAGE</a>, which renders not only <abbr>HTML</abbr> but also <abbr>PDF</abbr>s, Microsoft Office documents, images, Flash files, and text files to a bespoke format so they can be displayed. People were <a href=\"https://www.oesf.org/forum/index.php?topic=12436.0\">impressed by the browser</a>, though noted that the rendering system made some interactive elements static. The browser features zooming and kinetic scrolling.</p>\n<p>As a result of Zaurus&#8217;s success, Linux base, and open platform, people created new <abbr>ROM</abbr>s and software for the device. Popularly installed were OpenZaurus, Ångström, Cacko, and pdaXrom. This allows running full desktop environments capable of running full desktop browsers, essentially turning Zaurus devices into mini-laptops and bringing the full range of browsers available on Linux to the devices &#8211; the same as many other <abbr>PDA</abbr>s.</p>\n<hr>\n<p>Personal digital assistants faded away following smartphones but do still exist in some capacity. Modern variants of the idea exist and are used in-industry, though almost all are extremely limited and specific to the point of lacking a browser, or are more general and run a major operating system onto which a variety of web browsers can be installed.</p>\n<section class=\"footnotes\" data-footnotes>\n<h2 id=\"footnote-label\" class=\"sr-only\">Footnotes</h2>\n<ol>\n<li id=\"footnote-1\">\n<p>The exact definition of <abbr>PDA</abbr> is tricky to pin down, especially as it was fluid throughout the life of <abbr>PDA</abbr>s. In an attempt to keep some form of scope, I&#8217;ll be excluding mobile phones with <abbr>PDA</abbr> capabilities and full computers running desktop operating systems in <abbr>PDA</abbr>-like form factors. <a href=\"#footnote-ref-1\" data-footnote-backref aria-label=\"Back to reference 1\">↩</a></p>\n</li>\n<li id=\"footnote-2\">\n<p>Arguably, Apple delivered the killing blow to the entire <abbr>PDA</abbr> product category in 2007 with the release of the iPhone. Despite other smartphones existing, the iPhone was undoubtedly a turning point for the already declining <abbr>PDA</abbr> product category. <em>Apple giveth, and Apple taketh away.</em> <a href=\"#footnote-ref-2\" data-footnote-backref aria-label=\"Back to reference 2\">↩</a></p>\n</li>\n</ol>\n</section>\n\n\t\t",
      "summary": "A history of internet web browsers on personal digital assistant devices and operating systems, including EPOC, Apple Newton, Palm OS, and Windows Mobile (Pocket PC). From small, bespoke browsers with unique features to large mainstream browsers with PDA presence.",
      "date_published": "2026-06-20",
      "date_modified": "2026-06-22"
    }
  ]
}