about summary refs log tree commit diff
diff options
context:
space:
mode:
authorStarfall <us@starfall.systems>2023-08-17 14:36:27 -0500
committerStarfall <us@starfall.systems>2023-08-17 14:36:27 -0500
commit9ac704b74726279cbd0d2220f8e15a86ef81ba50 (patch)
treef1074f923ad1513767a40497ef163621bf88a334
parentaf7bf0f4579cf5045ad125ae51d70269e1919983 (diff)
update site
-rw-r--r--html/blog/2023-W25/index.html3
-rw-r--r--html/blog/centralization-through-decentralization/index.html3
-rw-r--r--html/blog/feed.xml115
-rw-r--r--html/blog/index.html17
-rw-r--r--html/blog/java-timezones/index.html7
-rw-r--r--html/blog/lament-for-the-commons/index.html7
-rw-r--r--[-rwxr-xr-x]html/index.html107
-rw-r--r--[-rwxr-xr-x]html/resources/index.html77
-rw-r--r--html/resources/mutant-standard/index.html182
9 files changed, 318 insertions, 200 deletions
diff --git a/html/blog/2023-W25/index.html b/html/blog/2023-W25/index.html
index 02e3b38..a36405d 100644
--- a/html/blog/2023-W25/index.html
+++ b/html/blog/2023-W25/index.html
@@ -21,6 +21,9 @@
 				<a href="/">Home</a>
 			</li>
 			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
 				<a href="/blog/" class="active">Blog</a>
 			</li>
 			<li>
diff --git a/html/blog/centralization-through-decentralization/index.html b/html/blog/centralization-through-decentralization/index.html
index faa6160..8532c5c 100644
--- a/html/blog/centralization-through-decentralization/index.html
+++ b/html/blog/centralization-through-decentralization/index.html
@@ -21,6 +21,9 @@
 				<a href="/">Home</a>
 			</li>
 			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
 				<a href="/blog/" class="active">Blog</a>
 			</li>
 			<li>
diff --git a/html/blog/feed.xml b/html/blog/feed.xml
index aeacb7c..25f0540 100644
--- a/html/blog/feed.xml
+++ b/html/blog/feed.xml
@@ -16,127 +16,38 @@
 		<title>Timezones in Java</title>
 		<updated>2023-08-15T16:10:00Z</updated>
 		<link href="https://starfall.systems/blog/java-timezones/"/>
-		<id>https://starfall.systems/blog/java-timezones/</id><content type="html">&lt;p&gt;Recently ran into an issue at work that we couldn&#39;t find a direct answer to anywhere on the Internet (thanks to the terrible state of search in the modern day after Search Engine Optimization and Large Language Models have screwed it over, but that&#39;s another topic...) relating to three-letter abbreviations for timezones.&lt;/p&gt;
+		<id>https://starfall.systems/blog/java-timezones/</id>
+		<summary type="html">&lt;p&gt;Recently ran into an issue at work that we couldn&#39;t find a direct answer to anywhere on the Internet (thanks to the terrible state of search in the modern day after Search Engine Optimization and Large Language Models have screwed it over, but that&#39;s another topic...) relating to three-letter abbreviations for timezones.&lt;/p&gt;
 &lt;p&gt;Long story short, use canonical timezone names &lt;a href=&quot;http://web.cs.ucla.edu/~eggert/tz/tz-link.htm&quot;&gt;from tzdb&lt;/a&gt; like &amp;quot;America/New_York&amp;quot; instead of abbreviations like &amp;quot;ET&amp;quot;.&lt;/p&gt;
-&lt;p&gt;The abbreviations like EST, CDT, CET, BST... mostly don&#39;t work any more, and for good reasons. Is MST Malaysian Standard Time (UTC+8) or North America Mountain Standard Time (UTC-7)? They might be standardized within a given nation&#39;s borders, but not worldwide. So, if you run across an error that looks like &lt;em&gt;this&lt;/em&gt; when trying to parse a date:&lt;/p&gt;
-&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;java.time.format.DateTimeParseException: Text &#39;01/01/1999 - 00:00:00 EDT&#39; could not be parsed: null
-    at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
-    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
-    at java.base/java.time.format.LocalDateTime.parse(LocalDateTime.java:492)
-    at [ REDACTED ]
-
-    Caused by:
-    java.lang.NullPointerException
-        at java.base/java.time.format.DateTimeFormatterBuilder$PrefixTree.prefixLength(DateTimeFormatterBuilder.java:4527)
-        at java.base/java.time.format.DateTimeFormatterBuilder$PrefixTree.add0(DateTimeFormatterBuilder.java:4396)
-        at java.base/java.time.format.DateTimeFormatterBuilder$PrefixTree.add(DateTimeFormatterBuilder.java:4391)
-        at java.base/java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.getTree(DateTimeFormatterBuilder.java:4138)
-        at java.base/java.time.format.DateTimeFormatterBuilder$ZoneTextPrinterParser.parse(DateTimeFormatterBuilder.java:4249)
-        at java.base/java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.parse(DateTimeFormatterBuilder.java:2370)
-        at java.base/java.time.format.DateTimeFormatter.parseUnresolved0(DateTimeFormatter.java:2107)
-        at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2036)
-        at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)
-        ... 3 more
-&lt;/code&gt;&lt;/pre&gt;
-&lt;p&gt;... it&#39;s likely that you&#39;re trying to use a three letter abbreviation for a timezone (here, &amp;quot;EDT&amp;quot; being used instead of &amp;quot;America/New_York&amp;quot;).&lt;/p&gt;
-&lt;p&gt;Confusingly, &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/format/DateTimeFormatter.html&quot;&gt;the documentation for DateTimeFormatter&lt;/a&gt; actually includes an example of a zone-name that&#39;s a three-letter acronym! ZoneId &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/ZoneId.html#SHORT_IDS&quot;&gt;has a list of them included for backwards compatibility&lt;/a&gt; but I couldn&#39;t figure out if they&#39;re actually parseable (leaning towards no).&lt;/p&gt;
-&lt;p&gt;And as an extra layer, this behavior relies on the underlying system. The abbrevations worked just fine on our work MacBook but not on the Jenkins build nodes. I don&#39;t have an answer for exactly why, but my guess is that Mac tooling happily responds with UTC as a default time zone when it doesn&#39;t know what you&#39;re asking, while GNU ones error. You can see the same kind of difference on the &lt;code&gt;date&lt;/code&gt; program for each:&lt;/p&gt;
-&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;[starfall@mac:~] % TZ=unknown date
-Tue Aug 15 15:28:39 UTC 2023
-
-[starfall@arch:~] % TZ=unknown date
-Tue Aug 15 03:28:39 PM unknown 2023
-&lt;/code&gt;&lt;/pre&gt;
-&lt;p&gt;One solution is to just use times with offsets, but there are valid reasons to choose to use a time with timezone instead. Here&#39;s a few ways you can parse them properly.&lt;/p&gt;
-&lt;h3&gt;Example 1&lt;/h3&gt;
-&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;String stringWithTz = &amp;quot;2023-08-15 10:28:39 America/Chicago&amp;quot;;
-DateTimeFormatter formatter = DateTimeFormatter.ofPattern(&amp;quot;yyyy-MM-dd HH:mm:ss VV&amp;quot;, Locale.US);
-Instant instant = Instant.from(formatter.parse(stringWithTz));
-&lt;/code&gt;&lt;/pre&gt;
-&lt;p&gt;Usually you will be able to use an Instant. These are stored without any time zone or offset, just as a moment in ... something that&#39;s close enough to UTC for most work. If the details matter, read &lt;a href=&quot;https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/Instant.html&quot;&gt;the documentation&lt;/a&gt;.&lt;/p&gt;
-&lt;p&gt;The above Instant is 2023-08-15T15:28:39Z.&lt;/p&gt;
-&lt;h3&gt;Example 2&lt;/h3&gt;
-&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;String stringWithTz = &amp;quot;2023-08-15 10:28:39 America/Chicago&amp;quot;;
-DateTimeFormatter formatter = DateTimeFormatter.ofPattern(&amp;quot;yyyy-MM-dd HH:mm:ss VV&amp;quot;, Locale.US);
-ZonedDateTime zdt = ZonedDateTime.parse(stringWithTz, formatter);
-&lt;/code&gt;&lt;/pre&gt;
-&lt;p&gt;This gets you a ZonedDateTime, which keeps the time zone information around. Usually an Instant will be fine instead, unless you really need to keep track of which datetime came from which timezone.&lt;/p&gt;
-&lt;p&gt;The above ZonedDateTime is 2023-08-15T10:28:39-05:00 (the same time as the Instant in example 1).&lt;/p&gt;
-&lt;h3&gt;Example 3&lt;/h3&gt;
-&lt;pre&gt;&lt;code class=&quot;language-java&quot;&gt;String isoString = &amp;quot;2023-08-15T10:28:39&amp;quot;;
-ZoneId timezone = ZoneId.of(&amp;quot;America/Chicago&amp;quot;);
-ZonedDateTime zdt = LocalDateTime.parse(isoString).atZone(timezone);
-Instant instant = Instant.from(zdt);
-&lt;/code&gt;&lt;/pre&gt;
-&lt;p&gt;If you don&#39;t have time zones in your strings, you can hydrate them with one like this. Keeping the LocalDateTime without a timezone is not recommended unless you have a very good reason, like they&#39;re historical dates from one location that won&#39;t be compared across timezones.&lt;/p&gt;
-&lt;p&gt;The Instant and ZonedDateTime here are the same as the previous two examples.&lt;/p&gt;
-</content>
-	</entry>
+</summary>
+		</entry>
 
 	<entry>
 		<title>Lament for the Commons</title>
 		<updated>2023-07-03T19:00:00Z</updated>
 		<link href="https://starfall.systems/blog/lament-for-the-commons/"/>
-		<id>https://starfall.systems/blog/lament-for-the-commons/</id><content type="html">&lt;blockquote&gt;
+		<id>https://starfall.systems/blog/lament-for-the-commons/</id>
+		<summary type="html">&lt;blockquote&gt;
 &lt;p&gt;&amp;quot;The old world is dying, and the new world struggles to be born: now is the time of monsters.&amp;quot; -- Antonio Gramsci&lt;/p&gt;
 &lt;/blockquote&gt;
 &lt;p&gt;It might be slightly overblown to be quoting an Italian communist imprisoned by Mussolini to criticise the decisions made by corporate social media this past month or so, but given their contributions to fascism globally, maybe it isn&#39;t... Either way, it has been interesting to see them all seemingly competing for &#39;worst decision&#39;.&lt;/p&gt;
-&lt;p&gt;Reddit shut off most of the clients that other people did &lt;em&gt;for&lt;/em&gt; them, making all that effort and work rather pointless, and now &lt;a href=&quot;https://www.reddit.com/r/Blind/comments/14nzwkm/&quot;&gt;blind Reddiors can&#39;t moderate r/blind&lt;/a&gt; despite assurances that accessibility apps wouldn&#39;t be affected and the accessibility of the official app would be improved.&lt;/p&gt;
-&lt;p&gt;Twitter, not to be one-upped, has now disabled the ability to view anything while not logged in, and paywalled actually being able to use the site. Ironically, even &lt;a href=&quot;https://twitter.com/elonmusk/status/1675187969420828672&quot;&gt;the announcement&lt;/a&gt; isn&#39;t viewable. 600 tweets a day is, well, pratically nothing? On the Fediverse, our friends who actually post daily (sometimes to stream of consciousness levels) and have conversations average about 45-60 posts a day. We aren&#39;t particularly active anywhere and still manage to hit an average of 9.&lt;/p&gt;
-&lt;p&gt;Even Google has decided this week to do a trial run of only letting people watch 3 videos if they have an adblocker. I&#39;m just waiting for the fourth shoe to drop on Discord.&lt;/p&gt;
-&lt;p&gt;The thing that gets me the most about all this is just how much of the past 10-20 years of culture and knowledge is just going to be lost. How many times during the protests on Reddit did we fail to find the answer we were looking for on a web search, because the answer can be found only where one person decided to share their knowledge and everyone else was relying on that? How many entertaining and teaching videos are likely going to be locked on YouTube behind obnoxious, &lt;a href=&quot;https://www.sciencedirect.com/science/article/pii/S0195925517303505&quot;&gt;energy-wasting&lt;/a&gt;, mind-warping advertising?&lt;/p&gt;
-&lt;p&gt;I don&#39;t pretend to have the answers for how to get more people to care about things like service continuity or not putting the majority of the English-speaking world&#39;s knowledge on a single-digit number of websites backed by corporations that are in advertising business, not the information-hosting business. Most people don&#39;t think about things like that and shouldn&#39;t have to, because it&#39;s nerd shit that people like me should care about making happen for them, they just want to go to wherever the &lt;em&gt;stuff&lt;/em&gt; is.&lt;/p&gt;
-&lt;blockquote&gt;
-&lt;p&gt;The law locks up the man or woman&lt;br /&gt;
-Who steals the goose off the common&lt;br /&gt;
-But leaves the greater villain loose&lt;br /&gt;
-Who steals the common from the goose.&lt;/p&gt;
-&lt;p&gt;The law demands that we atone&lt;br /&gt;
-When we take things we do not own&lt;br /&gt;
-But leaves the lords and ladies fine&lt;br /&gt;
-Who takes things that are yours and mine.&lt;/p&gt;
-&lt;p&gt;The poor and wretched don&#39;t escape&lt;br /&gt;
-If they conspire the law to break;&lt;br /&gt;
-This must be so but they endure&lt;br /&gt;
-Those who conspire to make the law.&lt;/p&gt;
-&lt;p&gt;The law locks up the man or woman&lt;br /&gt;
-Who steals the goose from off the common&lt;br /&gt;
-And geese will still a common lack&lt;br /&gt;
-&#39;Till they go and steal it back.&lt;/p&gt;
-&lt;p&gt;-- Author unknown, 18th century England&lt;/p&gt;
-&lt;/blockquote&gt;
-</content>
-	</entry>
+</summary>
+		</entry>
 
 	<entry>
 		<title>Things We Read This Week</title>
 		<updated>2023-06-26T00:00:00Z</updated>
 		<link href="https://starfall.systems/blog/2023-W25/"/>
-		<id>https://starfall.systems/blog/2023-W25/</id><content type="html">&lt;p&gt;Lots of things about social media history, and some of the utterly fucked up things that Facebook has pulled off in the name of profit, have rolled across our vision this week, as Facebook&#39;s plans to potentially federate with ActivityPub have crystallized a bit and large instance administrators may or may not have met with them under NDA.&lt;/p&gt;
-&lt;p&gt;&lt;a href=&quot;https://www.cs.columbia.edu/~smb/papers/netnews-hist.pdf&quot;&gt;Netnews: The Origin Story&lt;/a&gt; (draft version) by Steven M. Bellovin, about the&lt;/p&gt;
-&lt;p&gt;&lt;a href=&quot;https://web.archive.org/web/20060128124141/http://www.shirky.com/writings/group_enemy.html&quot;&gt;&amp;quot;A Group Is Its Own Worst Enemy&amp;quot;&lt;/a&gt; by Clay Shirky&lt;/p&gt;
-&lt;p&gt;&lt;a href=&quot;https://ploum.net/2023-06-23-how-to-kill-decentralised-networks.html&quot;&gt;How to Kill a Decentralized Network (such as the Fediverse)&lt;/a&gt; by Ploum, which talks in large part about how Google embraced and then effectively killed XMPP (not mentioned: Facebook Messenger also used XMPP around the same time and did most of the same things that Google did), and how Microsoft tried to kill Samba and Open/LibreOffice.&lt;/p&gt;
-&lt;p&gt;&lt;a href=&quot;https://www.tiktok.com/@uzoiswho/video/7244559309760154923&quot;&gt;this TikTok by uzoiswho&lt;/a&gt;, which we saw Are0h post. Pull quote: &amp;quot;Being nonbinary is a way of life. ... Are you dismantling the binaries in your life or are you just an agent of patriarchy that uses they/them pronouns?&amp;quot;&lt;/p&gt;
-&lt;p&gt;&lt;a href=&quot;https://twitter.com/AdamKeiper/status/1524440696249274368&quot;&gt;Twitter thread about the Noodler&#39;s Ink antisemitism controversy from last year that I somehow missed.&lt;/a&gt; Thread doesn&#39;t note the complete resolution but the gist of it is that Nathan discontinued a few inks, renamed about a dozen, made a $3600 USD donation to the ADL, and shops still carry his inks.&lt;/p&gt;
-&lt;p&gt;Also had the misfortune of reading someone (who we choose not to name because she&#39;s not worth the time) try to defend herself from us calling out degendering by saying it was actually &lt;em&gt;validating&lt;/em&gt; to use the other&#39;s correct pronouns. Technically correct, I guess, she did use she/they for someone whose pronouns are she/they, but choosing &amp;quot;they&amp;quot; in the post where you exclude them from &amp;quot;transfemmes&amp;quot; is not subtle.&lt;/p&gt;
-&lt;p&gt;I have read &lt;a href=&quot;https://juliaserano.medium.com/what-is-transmisogyny-4de92002caf6&quot;&gt;Serano&#39;s short article&lt;/a&gt; and her books on transmisogyny so many times that I was trying to look for something else as a palate cleanser and came across &lt;a href=&quot;https://www.harpersbazaar.com/culture/features/a33614214/ashlee-marie-preston-transmisogynoir-essay/&quot;&gt;The Anatomy of Transmisogynoir&lt;/a&gt; by Ashlee Marie Preston.&lt;/p&gt;
-</content>
-	</entry>
+		<id>https://starfall.systems/blog/2023-W25/</id></entry>
 
 	<entry>
 		<title>Centralization Through Decentralization</title>
 		<updated>2023-05-25T01:00:00Z</updated>
 		<link href="https://starfall.systems/blog/centralization-through-decentralization/"/>
-		<id>https://starfall.systems/blog/centralization-through-decentralization/</id><content type="html">&lt;p&gt;An opinion piece was recently published in Wired magazine titled &lt;a href=&quot;https://www.wired.com/story/the-hidden-dangers-of-the-decentralized-web/&quot;&gt;&amp;quot;The Hidden Dangers of the Decentralized
+		<id>https://starfall.systems/blog/centralization-through-decentralization/</id>
+		<summary type="html">&lt;p&gt;An opinion piece was recently published in Wired magazine titled &lt;a href=&quot;https://www.wired.com/story/the-hidden-dangers-of-the-decentralized-web/&quot;&gt;&amp;quot;The Hidden Dangers of the Decentralized
 Web&amp;quot;&lt;/a&gt;. It makes a lot of basic factual errors, conflates valid reasons to mistrust centralized social media with antisemitic conspiracy theories and grifts, and somehow even manages to make basic security practice out as conspiratorial. I&#39;m not all that interested in giving it the time of day, except for one paragraph that stuck out to me.&lt;/p&gt;
-&lt;blockquote&gt;
-&lt;p&gt;While the platforms offered by Meta and Alphabet are certainly not without issue, it is hard to deny the convenience of their established existence, which makes it possible to communicate, be entertained, shop, and more all in the same place. By contrast, users of decentralized platforms will need to download a slew of apps for everything they want to do online, because these features will no longer all exist in one place.&lt;/p&gt;
-&lt;/blockquote&gt;
-&lt;p&gt;Even if we accept the premise that you can somehow get by while restricting all your shopping to Facebook Marketplace, this state of things is not even 10 years old. &lt;a href=&quot;https://about.fb.com/news/2016/10/introducing-marketplace-buy-and-sell-with-your-local-community/&quot;&gt;Facebook Marketplace launched in 2016.&lt;/a&gt; Youtube and Gmail are both Alphabet/Google products, but they come bundled &lt;em&gt;today&lt;/em&gt; on flagship phones as two separate apps. If you want to see people whose primary presence is on Facebook, Instagram, Snapchat, Youtube, Twitch, TikTok, Tumblr... you need all of those apps installed. Or you could use your web browser, because each of those is available as a website still (despite what these corporations would want -- they push very heavily on &amp;quot;better in the app!&amp;quot; experiences because it gives them more ownership of what your eyeballs are doing).&lt;/p&gt;
-&lt;p&gt;That&#39;s not the experience you get from decentralization. If you make an account somewhere that runs the Twitter-like Mastodon or Calckey, you can follow people from the other. Or from the 2010-era Facebook-like Friendica. Or the YouTube-like Peertube. Or the Instagram-like Pixelfed. Sign up in one place, see people everywhere. Or so the story goes. In practice, this interoperability is often kind of unstable, but it&#39;s better than the literal nothing you get between two platforms owned by different corporations (or even by the &lt;em&gt;same&lt;/em&gt; corporation; Instagram stories started showing on Facebook ... a few months ago?).&lt;/p&gt;
-&lt;p&gt;And do you know what I had 10 years ago that I don&#39;t now? Literally all of my instant messaging in one place. On my laptop, I had a piece of free software called Pidgin. On this one app, I was logged into MSN Messenger, Skype, ICQ, Facebook Messenger (which used XMPP until 2015), the IRC server for my university honors program, and Twitch chat (which is still &lt;a href=&quot;https://dev.twitch.tv/docs/irc/&quot;&gt;a version of IRC&lt;/a&gt;). The only thing it didn&#39;t do was text messaging, but I carried a phone for that. One application, one unified experience, six accounts that I set up once and barely had to interact with again.&lt;/p&gt;
-&lt;p&gt;It is not decentralization that results in &amp;quot;app fatigue&amp;quot; as this joke of an article calls it. If you want a centralized experience, you need stuff that&#39;s built to work together by design. Or that&#39;s hacked to work together, in the case of Pidgin/libpurple plugins talking all sorts of proprietary protocols like the AOL and Windows Live Messenger ones. Stuff built to make money off of you is incentivized to pen you in. Ever tried to use Facebook Messenger from the browser on your phone?&lt;/p&gt;
-</content>
-	</entry>
+</summary>
+		</entry>
 
 </feed>
diff --git a/html/blog/index.html b/html/blog/index.html
index 897b848..8493127 100644
--- a/html/blog/index.html
+++ b/html/blog/index.html
@@ -21,6 +21,9 @@
 				<a href="/">Home</a>
 			</li>
 			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
 				<a href="/blog/" class="active" aria-current="page">Blog</a>
 			</li>
 			<li>
@@ -48,13 +51,19 @@
 	<h2><a href="/blog/java-timezones/">Timezones in Java</a></h2>
 	<time datetime="2023-08-15 16:10:00.000Z" title="2023-08-15 16:10:00.000Z">
 		2023-08-15
-	</time></article>
+	</time><p><p>Recently ran into an issue at work that we couldn't find a direct answer to anywhere on the Internet (thanks to the terrible state of search in the modern day after Search Engine Optimization and Large Language Models have screwed it over, but that's another topic...) relating to three-letter abbreviations for timezones.</p>
+<p>Long story short, use canonical timezone names <a href="http://web.cs.ucla.edu/~eggert/tz/tz-link.htm">from tzdb</a> like &quot;America/New_York&quot; instead of abbreviations like &quot;ET&quot;.</p>
+</article>
 
 <article class=blogpost>
 	<h2><a href="/blog/lament-for-the-commons/">Lament for the Commons</a></h2>
 	<time datetime="2023-07-03 19:00:00.000Z" title="2023-07-03 19:00:00.000Z">
 		2023-07-03
-	</time></article>
+	</time><p><blockquote>
+<p>&quot;The old world is dying, and the new world struggles to be born: now is the time of monsters.&quot; -- Antonio Gramsci</p>
+</blockquote>
+<p>It might be slightly overblown to be quoting an Italian communist imprisoned by Mussolini to criticise the decisions made by corporate social media this past month or so, but given their contributions to fascism globally, maybe it isn't... Either way, it has been interesting to see them all seemingly competing for 'worst decision'.</p>
+</article>
 
 <article class=blogpost>
 	<h2><a href="/blog/2023-W25/">Things We Read This Week</a></h2>
@@ -66,7 +75,9 @@
 	<h2><a href="/blog/centralization-through-decentralization/">Centralization Through Decentralization</a></h2>
 	<time datetime="2023-05-25 01:00:00.000Z" title="2023-05-25 01:00:00.000Z">
 		2023-05-24
-	</time></article>
+	</time><p><p>An opinion piece was recently published in Wired magazine titled <a href="https://www.wired.com/story/the-hidden-dangers-of-the-decentralized-web/">&quot;The Hidden Dangers of the Decentralized
+Web&quot;</a>. It makes a lot of basic factual errors, conflates valid reasons to mistrust centralized social media with antisemitic conspiracy theories and grifts, and somehow even manages to make basic security practice out as conspiratorial. I'm not all that interested in giving it the time of day, except for one paragraph that stuck out to me.</p>
+</article>
 
 
 
diff --git a/html/blog/java-timezones/index.html b/html/blog/java-timezones/index.html
index 2e83010..9432dfa 100644
--- a/html/blog/java-timezones/index.html
+++ b/html/blog/java-timezones/index.html
@@ -21,6 +21,9 @@
 				<a href="/">Home</a>
 			</li>
 			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
 				<a href="/blog/" class="active">Blog</a>
 			</li>
 			<li>
@@ -32,8 +35,8 @@
 
 <article>
 2023-08-15<p>Recently ran into an issue at work that we couldn't find a direct answer to anywhere on the Internet (thanks to the terrible state of search in the modern day after Search Engine Optimization and Large Language Models have screwed it over, but that's another topic...) relating to three-letter abbreviations for timezones.</p>
-<p>Long story short, use canonical timezone names <a href="http://web.cs.ucla.edu/~eggert/tz/tz-link.htm">from tzdb</a> like &quot;America/New_York&quot; instead of abbreviations like &quot;ET&quot;.</p>
-<p>The abbreviations like EST, CDT, CET, BST... mostly don't work any more, and for good reasons. Is MST Malaysian Standard Time (UTC+8) or North America Mountain Standard Time (UTC-7)? They might be standardized within a given nation's borders, but not worldwide. So, if you run across an error that looks like <em>this</em> when trying to parse a date:</p>
+<p>Long story short, use canonical timezone names <a href="http://web.cs.ucla.edu/~eggert/tz/tz-link.htm">from tzdb</a> like &quot;America/New_York&quot; instead of abbreviations like &quot;ET&quot;.
+The abbreviations like EST, CDT, CET, BST... mostly don't work any more, and for good reasons. Is MST Malaysian Standard Time (UTC+8) or North America Mountain Standard Time (UTC-7)? They might be standardized within a given nation's borders, but not worldwide. So, if you run across an error that looks like <em>this</em> when trying to parse a date:</p>
 <pre><code class="language-java">java.time.format.DateTimeParseException: Text '01/01/1999 - 00:00:00 EDT' could not be parsed: null
     at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2017)
     at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1952)
diff --git a/html/blog/lament-for-the-commons/index.html b/html/blog/lament-for-the-commons/index.html
index d24bc2d..ac18a8c 100644
--- a/html/blog/lament-for-the-commons/index.html
+++ b/html/blog/lament-for-the-commons/index.html
@@ -21,6 +21,9 @@
 				<a href="/">Home</a>
 			</li>
 			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
 				<a href="/blog/" class="active">Blog</a>
 			</li>
 			<li>
@@ -34,8 +37,8 @@
 2023-07-03<blockquote>
 <p>&quot;The old world is dying, and the new world struggles to be born: now is the time of monsters.&quot; -- Antonio Gramsci</p>
 </blockquote>
-<p>It might be slightly overblown to be quoting an Italian communist imprisoned by Mussolini to criticise the decisions made by corporate social media this past month or so, but given their contributions to fascism globally, maybe it isn't... Either way, it has been interesting to see them all seemingly competing for 'worst decision'.</p>
-<p>Reddit shut off most of the clients that other people did <em>for</em> them, making all that effort and work rather pointless, and now <a href="https://www.reddit.com/r/Blind/comments/14nzwkm/">blind Reddiors can't moderate r/blind</a> despite assurances that accessibility apps wouldn't be affected and the accessibility of the official app would be improved.</p>
+<p>It might be slightly overblown to be quoting an Italian communist imprisoned by Mussolini to criticise the decisions made by corporate social media this past month or so, but given their contributions to fascism globally, maybe it isn't... Either way, it has been interesting to see them all seemingly competing for 'worst decision'.
+Reddit shut off most of the clients that other people did <em>for</em> them, making all that effort and work rather pointless, and now <a href="https://www.reddit.com/r/Blind/comments/14nzwkm/">blind Reddiors can't moderate r/blind</a> despite assurances that accessibility apps wouldn't be affected and the accessibility of the official app would be improved.</p>
 <p>Twitter, not to be one-upped, has now disabled the ability to view anything while not logged in, and paywalled actually being able to use the site. Ironically, even <a href="https://twitter.com/elonmusk/status/1675187969420828672">the announcement</a> isn't viewable. 600 tweets a day is, well, pratically nothing? On the Fediverse, our friends who actually post daily (sometimes to stream of consciousness levels) and have conversations average about 45-60 posts a day. We aren't particularly active anywhere and still manage to hit an average of 9.</p>
 <p>Even Google has decided this week to do a trial run of only letting people watch 3 videos if they have an adblocker. I'm just waiting for the fourth shoe to drop on Discord.</p>
 <p>The thing that gets me the most about all this is just how much of the past 10-20 years of culture and knowledge is just going to be lost. How many times during the protests on Reddit did we fail to find the answer we were looking for on a web search, because the answer can be found only where one person decided to share their knowledge and everyone else was relying on that? How many entertaining and teaching videos are likely going to be locked on YouTube behind obnoxious, <a href="https://www.sciencedirect.com/science/article/pii/S0195925517303505">energy-wasting</a>, mind-warping advertising?</p>
diff --git a/html/index.html b/html/index.html
index 4095c0c..4ffa897 100755..100644
--- a/html/index.html
+++ b/html/index.html
@@ -1,89 +1,74 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang=en-US dir=ltr>
-<title>Starfall</title>
-<meta charset=UTF-8>
-<meta name=robots content="noindex, nofollow">
-<meta name=viewport content="width=device-width, initial-scale=1">
-<link rel=stylesheet href=/css/terminal.css>
-<script src=/js/theming.js></script>
+<head>
+	<title>starfall.systems</title>
+	<meta charset=UTF-8>
+	<meta name=robots content="noindex, nofollow">
+	<meta name=viewport content="width=device-width, initial-scale=1">
+	<link rel=stylesheet href=/css/terminal.css>
+	
+</head>
+
+<body>
+<!-- todo color picker -->
 
 <header>
-	<h1>https://starfall.systems</h1>
+	<h1>starfall.systems</h1>
 	<nav aria-label=primary>
+		
 		<ul>
-			<li><a href=/ class="active" aria-current="page">Home</a>
-			<li><a href=/blog>Blog</a>
-			<li><a href=/resources>Resources</a>
-			<li><a href=https://git.starfall.systems>Git</a>
+			<li>
+				<a href="/" class="active" aria-current="page">Home</a>
+			</li>
+			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
+				<a href="/blog/">Blog</a>
+			</li>
+			<li>
+				<a href="https://git.starfall.systems">Git</a>
+			</li>
 		</ul>
 	</nav>
 </header>
 
+<main>
+
 <section id=about>
-	<p><strong>Starfall</strong>: We're devin and Alex Starfall, the median plural system that runs the <a href=https://plural.cafe>Plural Café</a> Mastodon instance, and tries to get some other cool stuff done during our free time.
-	<p><strong>devin starfall</strong> (he/him, she/her, zie/zir, or snek/snem): The kind of queer that keeps gatekeepers up at night, and an actual diamondback rattlesnake. Rarely uses capital letters, especially for his name.
-	<p><strong>Alecto "Alex" Starfall</strong> (she/her): Holds down our day job as a mid-level software engineer and writes guides for <a href=https://median-xl.com rel=noreferrer>her favorite Diablo II mod</a> to pass the time.
+	<p>We are viperidae and leporidae. Fluorite and bismuth. devin and Alex.
+	<p>Under various identities, we do:
+	<ul>
+		<li>Professional software witchcraft, since Jan. 2018
+		<li>Server admin and community moderation for the <a href=https://plural.cafe>Plural Café</a> Mastodon instance, since Nov. 2019
+		<li>Diablo II modding, since May 2022
+	</ul>
 </section>
 
 <section id=contact>
 	<h2>Contact</h2>
-	<ul>
-		<li>Fediverse: <a href=https://starfall.plural.cafe rel=me>@starfall@plural.cafe</a>
+	<ul><li>Fediverse: <a href=https://starfall.plural.cafe rel=me>@starfall@plural.cafe</a>
 		<li>Matrix: <a href=https://matrix.to/#/@starfall:nora.codes rel=me>@starfall:nora.codes</a>
 		<li>Email: <a href=mailto:us@starfall.systems rel=me>us@starfall.systems</a> (<a href=/files/starfall.gpg>PGP Public Key</a> [gpg, 1.7 KiB])
 	</ul>
-	<details>
-		<summary>Matrix Session Keys</summary>
+	<details><summary>Matrix Session Keys</summary>
 		<table>
-			<tr>
-				<th>Name
-				<th>ID
-				<th>Key
-			<tr>
-				<td>Regulus
-				<td><code>HRWASXBNFQ</code>
-				<td><code>h3Ke 7bG8 dVvP cEpp Vdxf re1q 6FnE 8hNz 3KQQ Clh1 A/0</code>
-			<tr>
-				<td>Heze
-				<td><code>NHOLXPXSBB</code>
-				<td><code>CWOS ebp0 nO6q qw3z 0tyB QHUw GdXI D5yu WZES sRev qWo</code>
+			<tr><th>Name <th>ID <th>Key
+			<tr><td>Regulus <td>HRWASXBNFQ <td>h3Ke 7bG8 dVvP cEpp Vdxf re1q 6FnE 8hNz 3KQQ Clh1 A/0
+			<tr><td>Heze <td>NHOLXPXSBB <td>CWOS ebp0 nO6q qw3z 0tyB QHUw GdXI D5yu WZES sRev qWo
 		</table>
-		<p>In Element, you can check that these keys match by opening our profile, clicking on the text that says "3 sessions", then clicking on each one and using "Manually Verify by Text" to confirm that the information matches what we show here.
+		<p>In Element, you can check that these keys match by opening our profile in a chat, clicking on the text that says "2 sessions", then clicking on each one and "Manually Verify by Text". Make sure all the information matches.
+		<p>Other clients may have a different process, can't help you there.
 	</details>
 </section>
 
+</main>
+
 <footer>
 <section>
-	<p>This site is 100% hand-coded and <a href=https://git.starfall.systems/web/>source-available</a>. © 2020-2022 Starfall. See <a href=https://git.starfall.systems/web/tree/COPYING.md rel=license>COPYING.md</a>.
+	<p>This site is 100% <a href=https://git.starfall.systems/web>source-available</a>. © 2020-2023 Starfall. See <a href=https://git.starfall.systems/web/tree/COPYING.md rel=license>COPYING.md</a>.
 </section>
 <div style=text-align:center>⋁/⋀</div>
 </footer>
 
-<!-- temporary color picker
-	TODO: generate the color pickers automatically
-	TODO: effect on hover
-	TODO: try radio buttons
-	TODO: try buttons
-	TODO: screen reader accessibility
--->
-<style>
-.color-picker-container {
-	position: fixed;
-	left: 0;
-	top: 30%;
-}
-
-.color-picker {
-	width: 1rem;
-	height: 1rem;
-	border: 1px solid;
-	margin: 2px;
-	color: var(--fg);
-	background: var(--bg);
-}
-</style>
-<div class=color-picker-container>
-	<div class="green color-picker" onclick=set_theme('green')></div>
-	<div class="purple color-picker" onclick=set_theme('purple')></div>
-	<div class="cyan color-picker" onclick=set_theme('cyan')></div>
-</div>
+</body>
diff --git a/html/resources/index.html b/html/resources/index.html
index 8d21a33..18a1195 100755..100644
--- a/html/resources/index.html
+++ b/html/resources/index.html
@@ -1,42 +1,55 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang=en-US dir=ltr>
-<title>Starfall</title>
-<meta charset=UTF-8>
-<meta name=robots content="noindex, nofollow">
-<meta name=viewport content="width=device-width, initial-scale=1">
-<link rel=stylesheet href=/css/terminal.css>
-<script src=/js/theming.js></script>
+<head>
+	<title>~/resources</title>
+	<meta charset=UTF-8>
+	<meta name=robots content="noindex, nofollow">
+	<meta name=viewport content="width=device-width, initial-scale=1">
+	<link rel=stylesheet href=/css/terminal.css>
+	
+</head>
+
+<body>
+<!-- todo color picker -->
 
 <header>
 	<h1>~/resources</h1>
 	<nav aria-label=primary>
+		
 		<ul>
-			<li><a href=/>Home</a>
-			<li><a href=/resources class=active aria-current=page>Resources</a>
-			<li><a href=https://git.starfall.systems>Git</a>
+			<li>
+				<a href="/">Home</a>
+			</li>
+			<li>
+				<a href="/resources/" class="active" aria-current="page">Resources</a>
+			</li>
+			<li>
+				<a href="/blog/">Blog</a>
+			</li>
+			<li>
+				<a href="https://git.starfall.systems">Git</a>
+			</li>
 		</ul>
 	</nav>
 </header>
 
+<main>
 <section>
-	<ul>
-		<li><a href=/resources/mutant-standard>Mutant Standard emoji color reference</a>
-		<li>TBA: Plurality resources
-	<ul>
+<ul>
+<li><a href="mutant-standard">Mutant Standard emoji color reference</a></li>
+</ul>
 </section>
-
 <section>
-	<h2>Diablo II</h2>
-	<ul>
-		<li><a href=/files/diablo/D2Fileguide.pdf>Diablo II File Guide (pdf, 2.2 MiB)</a>
-		<li><a href=https://www.theamazonbasin.com/wiki/index.php/Diablo_II>Basin Wiki for Diablo II</a>
-		<li><a href=http://www.mannm.org/d2library/faqtoids/faqtoids_eng.html>Diablo II FAQtoids</a>
-	</ul>
+<h2>Diablo II</h2>
+<ul>
+<li><a href="/files/diablo/D2Fileguide.pdf">Diablo II File Guide (pdf, 2.2 MiB)</a></li>
+<li><a href="https://www.theamazonbasin.com/wiki/index.php/Diablo_II">Basin Wiki</a></li>
+<li><a href="http://www.mannm.org/d2library/faqtoids/faqtoides_eng.html">FAQtoids</a></li>
+</ul>
 </section>
-
 <section>
 	<h2>Battletech: Cluster Table Quickref</h2>
-	<p>For small packs (2-6), look up your 2d6 roll in the appropriate column and read the number of hits on the left. For large packs (7+), look up your 2d6 roll and read across for the number of hits.
+	<p>For small packs (2-6), look up your 2d6 roll in the appropriate column and read the number of hits on the left. F    or large packs (7+), look up your 2d6 roll and read across for the number of hits.
 	<div style="display:flex;flex-wrap:wrap;">
 		<table class=center-cells>
 			<tr><th>Hits <th>2  <th>3   <th>4    <th>5    <th>6
@@ -54,18 +67,22 @@
 			<tr><td>5-8  <td>4 <td>5 <td>6  <td>8  <td>9  <td>12 <td>18 <td>24
 			<tr><td>9-10 <td>6 <td>7 <td>8  <td>10 <td>12 <td>16 <td>24 <td>32
 			<tr><td>11+  <td>7 <td>9 <td>10 <td>12 <td>15 <td>24 <td>30 <td>40
-		</table>
-	</div>
+	</table>
+    </div>
 	<h3>Modifiers</h3>
-	Artemis IV: +2<br/>
-	Anti-Missile System: -4<br/>
-	Streak SRM: Treat as roll of 12 before AMS modifier<br/>
-	Hyper-Assault Gauss: -2 / 0 / +2 at short / medium / long range<br/>
+	<p>Artemis IV: +2<br>
+	Anti-Missile System: -4<br>
+	Streak SRM: Treat as roll of 12 (8 against AMS)<br>
+    Hyper-Assault Gauss: -2 / 0 / +2 at short / medium / long range</p>
 </section>
 
+</main>
+
 <footer>
 <section>
-	<p>This site is 100% hand-coded and <a href=https://git.starfall.systems/web>source-available</a>. © 2020-2023 Starfall. See <a href=https://git.starfall.systems/web/tree/COPYING.md rel=license>COPYING.md</a>.
+	<p>This site is 100% <a href=https://git.starfall.systems/web>source-available</a>. © 2020-2023 Starfall. See <a href=https://git.starfall.systems/web/tree/COPYING.md rel=license>COPYING.md</a>.
 </section>
 <div style=text-align:center>⋁/⋀</div>
 </footer>
+
+</body>
diff --git a/html/resources/mutant-standard/index.html b/html/resources/mutant-standard/index.html
new file mode 100644
index 0000000..1c55d0f
--- /dev/null
+++ b/html/resources/mutant-standard/index.html
@@ -0,0 +1,182 @@
+<!doctype html>
+<html lang=en-US dir=ltr>
+<head>
+	<title>Mutant Standard Shortcodes</title>
+	<meta charset=UTF-8>
+	<meta name=robots content="noindex, nofollow">
+	<meta name=viewport content="width=device-width, initial-scale=1">
+	<link rel=stylesheet href=/css/terminal.css>
+	
+</head>
+
+<body>
+<!-- todo color picker -->
+
+<header>
+	<h1>Mutant Standard Shortcodes</h1>
+	<nav aria-label=primary>
+		
+		<ul>
+			<li>
+				<a href="/">Home</a>
+			</li>
+			<li>
+				<a href="/resources/">Resources</a>
+			</li>
+			<li>
+				<a href="/blog/">Blog</a>
+			</li>
+			<li>
+				<a href="https://git.starfall.systems">Git</a>
+			</li>
+		</ul>
+	</nav>
+</header>
+
+<main>
+<style>
+	.emoji {
+		height: 1.25em;
+		vertical-align: middle;
+		margin: -.2ex .15em .2ex;
+	}
+	
+	table {
+		float: left;
+	}
+</style>
+
+<section id=mutant-standard class=clearfix>
+	<p>Mutant Standard has a lot of variations on emoji. Emoji which show people have 53 different skin/fur/scale colors for use. Hand emoji have "hmn", "paw", "clw", and "hoof" variants (not all hoof emoji are available yet), though 5 of the colors are only for human hands and 3 are only available for paws.
+	<p>On Plural Café and other instances with Mutant Standard emoji, the grey hand emoji like <img src=/img/ms/ms_hand_clw.png class=emoji alt> <code>:ms_hand_clw:</code> and person emoji like <img src=/img/ms/ms_mechanic.png class=emoji alt> <code>:ms_mechanic:</code> can be recolored by adding the color codes below. Read the letter(s) in the row and then the number in the column. For instance, lime green has the code <code>l2</code>, so the code for a lime green claw is <img src=/img/ms/ms_hand_clw_l2.png class=emoji alt> <code>:ms_hand_clw_l2:</code>.
+	
+	<table>
+		<tr> <td> 
+			<th>1
+			<th>2
+			<th>3
+			<th>mnemonic
+		<tr> <th>r
+			<td><img src=/img/ms/ms_hand_clw_r1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_r2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_r3.png class=emoji alt>
+			<td><strong>r</strong>ed
+		<tr> <th>d
+			<td><img src=/img/ms/ms_hand_clw_d1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_d2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_d3.png class=emoji alt>
+			<td><strong>d</strong>
+		<tr> <th>o
+			<td><img src=/img/ms/ms_hand_clw_o1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_o2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_o3.png class=emoji alt>
+			<td><strong>o</strong>range
+		<tr> <th>y
+			<td><img src=/img/ms/ms_hand_clw_y1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_y2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_y3.png class=emoji alt>
+			<td><strong>y</strong>ellow
+		<tr> <th>l
+			<td><img src=/img/ms/ms_hand_clw_l1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_l2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_l3.png class=emoji alt>
+			<td><strong>l</strong>ime
+		<tr> <th>g
+			<td><img src=/img/ms/ms_hand_clw_g1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_g2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_g3.png class=emoji alt>
+			<td><strong>g</strong>reen
+		<tr> <th>t
+			<td><img src=/img/ms/ms_hand_clw_t1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_t2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_t3.png class=emoji alt>
+			<td><strong>t</strong>eal
+		<tr> <th>c
+			<td><img src=/img/ms/ms_hand_clw_c1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_c2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_c3.png class=emoji alt>
+			<td><strong>c</strong>yan
+		<tr> <th>s
+			<td><img src=/img/ms/ms_hand_clw_s1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_s2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_s3.png class=emoji alt>
+			<td><strong>s</strong>ky
+		<tr> <th>b
+			<td><img src=/img/ms/ms_hand_clw_b1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_b2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_b3.png class=emoji alt>
+			<td><strong>b</strong>lue
+		<tr> <th>v
+			<td><img src=/img/ms/ms_hand_clw_v1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_v2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_v3.png class=emoji alt>
+			<td><strong>v</strong>iolet
+		<tr> <th>m
+			<td><img src=/img/ms/ms_hand_clw_m1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_m2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_m3.png class=emoji alt>
+			<td><strong>m</strong>agenta
+		<tr> <th>p
+			<td><img src=/img/ms/ms_hand_clw_p1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_p2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_p3.png class=emoji alt>
+			<td><strong>p</strong>ink
+		<tr> <th>e
+			<td><img src=/img/ms/ms_hand_clw_e1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_e2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_e3.png class=emoji alt>
+			<td><strong>e</strong>spresso
+		<tr> <th>k
+			<td><img src=/img/ms/ms_hand_clw_k1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_k2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_clw_k3.png class=emoji alt>
+			<td><strong>k</strong>ey
+	</table>
+	
+	<table>
+		<tr> <th> hmn-only
+			<th>1
+			<th>2
+			<th>3
+			<th>4
+			<th>5
+			<th>mnemonic
+		<tr> <th>h
+			<td><img src=/img/ms/ms_hand_hmn_h1.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_hmn_h2.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_hmn_h3.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_hmn_h4.png class=emoji alt>
+			<td><img src=/img/ms/ms_hand_hmn_h5.png class=emoji alt>
+			<td><strong>h</strong>uman
+	</table>
+	
+	<table>
+		<tr> <th>paw-only
+			<th>1
+			<th>mnemonic
+		<tr> <th>fe
+			<td><img src=/img/ms/ms_hand_paw_fe1.png class=emoji alt>
+			<td><strong>f</strong>ur <strong>e</strong>spresso
+		<tr> <th>fk
+			<td><img src=/img/ms/ms_hand_paw_fk1.png class=emoji alt>
+			<td><strong>f</strong>ur <strong>k</strong>ey
+		<tr> <th>ft
+			<td><img src=/img/ms/ms_hand_paw_ft1.png class=emoji alt>
+			<td><strong>f</strong>ur <strong>t</strong>an
+	</table>
+</section>
+
+<section id=license>
+	<p>This webpage uses <a href='https://mutant.tech'>Mutant Standard emoji</a>, which are licensed under a <a href='https://creativecommons.org/licenses/by-nc-sa/4.0/'>Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License</a>.
+</section>
+
+</main>
+
+<footer>
+<section>
+	<p>This site is 100% <a href=https://git.starfall.systems/web>source-available</a>. © 2020-2023 Starfall. See <a href=https://git.starfall.systems/web/tree/COPYING.md rel=license>COPYING.md</a>.
+</section>
+<div style=text-align:center>⋁/⋀</div>
+</footer>
+
+</body>