<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>standards &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/standards/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Sat, 28 Mar 2026 06:34:47 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>standards &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Alpha launch - .well-known/avatar - feedback wanted]]></title>
		<link>https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/</link>
					<comments>https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 25 Oct 2025 11:34:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[IETF]]></category>
		<category><![CDATA[ReDeCentralize]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=64078</guid>

					<description><![CDATA[I&#039;ve gotten sufficiently annoyed with a trivial problem that I&#039;m preparing to write an IETF RFC. Yeah. That&#039;s how ticked off I am!  Every site that I sign up for asks me to upload an avatar to represent myself. Whenever I change my photo, I have to log in to a hundred sites and change it there.  Perhaps they could all use Gravatar - but that&#039;s a centralised service and doesn&#039;t work with wildcard…]]></description>
										<content:encoded><![CDATA[<p>I've gotten sufficiently annoyed with a trivial problem that I'm preparing to write an IETF RFC. Yeah. That's how ticked off I am!</p>

<p>Every site that I sign up for asks me to upload an avatar to represent myself. Whenever I change my photo, I have to log in to a hundred sites and change it there<sup id="fnref:ok"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#fn:ok" class="footnote-ref" title="OK, I don't have to. But I want to. I dislike having last year's photo cluttering some half-remembered social network." role="doc-noteref">0</a></sup>.</p>

<p>Perhaps they could all use <a href="https://gravatar.com/">Gravatar</a> - but that's a centralised service<sup id="fnref:boo"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#fn:boo" class="footnote-ref" title="We live in the redecentralised future now!" role="doc-noteref">1</a></sup> and doesn't work with wildcard email addresses. <a href="https://libravatar.org/">Libravatar</a> also relies on email addresses and requires implementers to set up new DNS entries.</p>

<p>So I'm proposing <code>.well-known/avatar</code>. Here's how it works (for now). I'd like your feedback before going further<sup id="fnref:slow"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#fn:slow" class="footnote-ref" title="I wrote about this in 2004 and in 2020. It takes me time, but I get there eventually!" role="doc-noteref">2</a></sup>.</p>

<p>I sign up to a service and use the email address <code>whatever@shkspr.mobi</code>.</p>

<p>The service looks up my avatar using a well-known path. For example, request <a href="https://shkspr.mobi/.well-known/avatar?resource=acct:whatever@shkspr.mobi">https://shkspr.mobi/.well-known/avatar?resource=acct:whatever@shkspr.mobi</a> and you'll get back this JSON:</p>

<pre><code class="language-json">{
    "subject": "acct:whatever@shkspr.mobi",
    "links": [
        {
              "rel": "http:\/\/webfinger.net\/rel\/avatar",
             "type": "image\/webp",
             "href": "https:\/\/shkspr.mobi\/.well-known\/avatar\/avatar-1024.webp",
            "sizes": "1024x1024"
        },
        {
              "rel": "http:\/\/webfinger.net\/rel\/avatar",
             "type": "image\/jpeg",
             "href": "https:\/\/shkspr.mobi\/.well-known\/avatar\/avatar-512.jpg",
            "sizes": "512x512"
        }
    ]
}
</code></pre>

<p>That's a slightly enhanced <a href="https://webfinger.net/rel/#avatar">https://webfinger.net/rel/#avatar</a> which adds <a href="https://html.spec.whatwg.org/multipage/semantics.html#attr-link-sizes">a <code>sizes</code> parameter</a>.  The service can then pick the appropriate MIME and size.</p>

<p>Alternatively, you can request the same URl but with a header of <code>Accept: image/gif</code> and receive the default sized avatar in that specific format.</p>

<p>Try it by running:</p>

<pre><code class="language-bash">curl -H "Accept: image/avif" https://shkspr.mobi/.well-known/avatar/ --output "test.avif"
</code></pre>

<p>You should receive an auto-converted version of my avatar.</p>

<h2 id="some-thoughts"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#some-thoughts">Some Thoughts</a></h2>

<p>Please add your thoughts to the comments box. Here's some feedback I've received so far.</p>

<p>Perhaps this is too complicated? What's wrong with just serving up an image when the URl is requested? That would make it easier for static sites.</p>

<div class="activitypub-embed u-in-reply-to h-cite"> <div class="activitypub-embed-header p-author h-card"> <img class="u-photo" src="https://cdn.fosstodon.org/accounts/avatars/000/061/904/original/5e6ac0188b3ab021.png" alt=""> <div class="activitypub-embed-header-text"> <h2 class="p-name" id="simon-josefsson"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#simon-josefsson">Simon Josefsson</a></h2> <a href="https://fosstodon.org/users/jas" class="ap-account u-url">@jas@fosstodon.org</a> </div> </div> <div class="activitypub-embed-content"> <div class="ap-subtitle p-summary e-content"><p><span class="h-card"><a href="https://mastodon.social/@Edent" class="u-url mention">@<span>Edent</span></a></span> Thinking about this, while I like content negotiation as a clever hack, I wonder if maybe it isn’t too clever. The nice thing with WKD is that you can deploy it with any normal static HTTP file without any special magic. Maybe the protocol could be dumbed down to simply rely on WKD-style URLs? I’m not sure how to configure my web server (Apache) for your avatar well known URL with negotiation magic.</p></div> </div> <div class="activitypub-embed-meta"> <a href="https://fosstodon.org/users/jas/statuses/115424507307729006" class="ap-stat ap-date dt-published u-in-reply-to">2025-10-23, 16:50</a> <span class="ap-stat"> <strong>0</strong> boosts </span> <span class="ap-stat"> <strong>1</strong> favorites </span> </div> </div>

<style>/** * ActivityPub embed styles. */ .activitypub-embed { background: #fff; border: 1px solid #e6e6e6; border-radius: 12px; padding: 0; max-width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .activitypub-reply-block .activitypub-embed { margin: 1em 0; } .activitypub-embed-header { padding: 15px; display: flex; align-items: center; gap: 10px; } .activitypub-embed-header img { width: 48px; height: 48px; border-radius: 50%; } .activitypub-embed-header-text { flex-grow: 1; } .activitypub-embed-header-text h2 { color: #000; font-size: 15px; font-weight: 600; margin: 0; padding: 0; } .activitypub-embed-header-text .ap-account { color: #687684; font-size: 14px; text-decoration: none; } .activitypub-embed-content { padding: 0 15px 15px; } .activitypub-embed-content .ap-title { font-size: 23px; font-weight: 600; margin: 0 0 10px; padding: 0; color: #000; } .activitypub-embed-content .ap-subtitle { font-size: 15px; color: #000; margin: 0 0 15px; } .activitypub-embed-content .ap-preview { border: 1px solid #e6e6e6; border-radius: 8px; overflow: hidden; } .activitypub-embed-content .ap-preview img { width: 100%; height: auto; display: block; } .activitypub-embed-content .ap-preview { border-radius: 8px; box-sizing: border-box; display: grid; gap: 2px; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; margin: 1em 0 0; min-height: 64px; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview.layout-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; } .activitypub-embed-content .ap-preview.layout-2 { aspect-ratio: auto; grid-template-rows: 1fr; height: auto; } .activitypub-embed-content .ap-preview.layout-3 > img:first-child { grid-row: span 2; } .activitypub-embed-content .ap-preview img { border: 0; box-sizing: border-box; display: inline-block; height: 100%; object-fit: cover; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview video, .activitypub-embed-content .ap-preview audio { max-width: 100%; display: block; grid-column: 1 / span 2; } .activitypub-embed-content .ap-preview audio { width: 100%; } .activitypub-embed-content .ap-preview-text { padding: 15px; } .activitypub-embed-meta { padding: 15px; border-top: 1px solid #e6e6e6; color: #687684; font-size: 13px; display: flex; gap: 15px; } .activitypub-embed-meta .ap-stat { display: flex; align-items: center; gap: 5px; } @media only screen and (max-width: 399px) { .activitypub-embed-meta span.ap-stat { display: none !important; } } .activitypub-embed-meta a.ap-stat { color: inherit; text-decoration: none; } .activitypub-embed-meta strong { font-weight: 600; color: #000; } .activitypub-embed-meta .ap-stat-label { color: #687684; } </style>

<p>What about a size parameter?</p>

<div class="activitypub-embed u-in-reply-to h-cite"> <div class="activitypub-embed-header p-author h-card"> <img class="u-photo" src="https://mastocdn.talking.dev/accounts/avatars/106/551/937/719/290/584/original/733b34a017037146.jpg" alt=""> <div class="activitypub-embed-header-text"> <h2 class="p-name" id="chip"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#chip">Chip</a></h2> <a href="https://talking.dev/users/chip" class="ap-account u-url">@chip@talking.dev</a> </div> </div> <div class="activitypub-embed-content"> <div class="ap-subtitle p-summary e-content"><p><span class="h-card"><a href="https://mastodon.social/@Edent" class="u-url mention">@<span>Edent</span></a></span> It'd be nice if the query could limit the size of the avatar being returned. If only there were `Accept-Max-Size`, but maybe a query param? I wouldn't want my performance taking a dive if Alice has a 35M avatar that my client starts downloading. If my client had requested with `max_size=3072` I'd rather not see the avatar than degrade performance/pull excess data</p></div> </div> <div class="activitypub-embed-meta"> <a href="https://talking.dev/users/chip/statuses/115424082361331622" class="ap-stat ap-date dt-published u-in-reply-to">2025-10-23, 15:02</a> <span class="ap-stat"> <strong>0</strong> boosts </span> <span class="ap-stat"> <strong>1</strong> favorites </span> </div> </div>

<style>/** * ActivityPub embed styles. */ .activitypub-embed { background: #fff; border: 1px solid #e6e6e6; border-radius: 12px; padding: 0; max-width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .activitypub-reply-block .activitypub-embed { margin: 1em 0; } .activitypub-embed-header { padding: 15px; display: flex; align-items: center; gap: 10px; } .activitypub-embed-header img { width: 48px; height: 48px; border-radius: 50%; } .activitypub-embed-header-text { flex-grow: 1; } .activitypub-embed-header-text h2 { color: #000; font-size: 15px; font-weight: 600; margin: 0; padding: 0; } .activitypub-embed-header-text .ap-account { color: #687684; font-size: 14px; text-decoration: none; } .activitypub-embed-content { padding: 0 15px 15px; } .activitypub-embed-content .ap-title { font-size: 23px; font-weight: 600; margin: 0 0 10px; padding: 0; color: #000; } .activitypub-embed-content .ap-subtitle { font-size: 15px; color: #000; margin: 0 0 15px; } .activitypub-embed-content .ap-preview { border: 1px solid #e6e6e6; border-radius: 8px; overflow: hidden; } .activitypub-embed-content .ap-preview img { width: 100%; height: auto; display: block; } .activitypub-embed-content .ap-preview { border-radius: 8px; box-sizing: border-box; display: grid; gap: 2px; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; margin: 1em 0 0; min-height: 64px; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview.layout-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; } .activitypub-embed-content .ap-preview.layout-2 { aspect-ratio: auto; grid-template-rows: 1fr; height: auto; } .activitypub-embed-content .ap-preview.layout-3 > img:first-child { grid-row: span 2; } .activitypub-embed-content .ap-preview img { border: 0; box-sizing: border-box; display: inline-block; height: 100%; object-fit: cover; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview video, .activitypub-embed-content .ap-preview audio { max-width: 100%; display: block; grid-column: 1 / span 2; } .activitypub-embed-content .ap-preview audio { width: 100%; } .activitypub-embed-content .ap-preview-text { padding: 15px; } .activitypub-embed-meta { padding: 15px; border-top: 1px solid #e6e6e6; color: #687684; font-size: 13px; display: flex; gap: 15px; } .activitypub-embed-meta .ap-stat { display: flex; align-items: center; gap: 5px; } @media only screen and (max-width: 399px) { .activitypub-embed-meta span.ap-stat { display: none !important; } } .activitypub-embed-meta a.ap-stat { color: inherit; text-decoration: none; } .activitypub-embed-meta strong { font-weight: 600; color: #000; } .activitypub-embed-meta .ap-stat-label { color: #687684; } </style>

<p>Will anyone actually use it?</p>

<div class="activitypub-embed u-in-reply-to h-cite"> <div class="activitypub-embed-header p-author h-card"> <img class="u-photo" src="https://fedi.splitbrain.org/fileserver/013DGS4XRNRZTWPDP5Q2MKSHZR/attachment/original/01JNBFPHNR06RXDG36V0VM7D3V.jpeg" alt=""> <div class="activitypub-embed-header-text"> <h2 class="p-name" id="andreas-gohr"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#andreas-gohr">Andreas Gohr</a></h2> <a href="https://fedi.splitbrain.org/users/splitbrain" class="ap-account u-url">@splitbrain@fedi.splitbrain.org</a> </div> </div> <div class="activitypub-embed-content"> <div class="ap-subtitle p-summary e-content"><p><span class="h-card"><a href="https://mastodon.social/@Edent" class="u-url mention" rel="nofollow noreferrer noopener" target="_blank">@<span>Edent</span></a></span> good luck with getting the hundreds of services to implement it. I mean it. it would be awesome and you might be well connected enough to make it happen.</p></div> </div> <div class="activitypub-embed-meta"> <a href="https://fedi.splitbrain.org/users/splitbrain/statuses/01K88SH504PEK5X8C6MSXRY0YH" class="ap-stat ap-date dt-published u-in-reply-to">2025-10-23, 15:03</a> </div> </div>

<style>/** * ActivityPub embed styles. */ .activitypub-embed { background: #fff; border: 1px solid #e6e6e6; border-radius: 12px; padding: 0; max-width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .activitypub-reply-block .activitypub-embed { margin: 1em 0; } .activitypub-embed-header { padding: 15px; display: flex; align-items: center; gap: 10px; } .activitypub-embed-header img { width: 48px; height: 48px; border-radius: 50%; } .activitypub-embed-header-text { flex-grow: 1; } .activitypub-embed-header-text h2 { color: #000; font-size: 15px; font-weight: 600; margin: 0; padding: 0; } .activitypub-embed-header-text .ap-account { color: #687684; font-size: 14px; text-decoration: none; } .activitypub-embed-content { padding: 0 15px 15px; } .activitypub-embed-content .ap-title { font-size: 23px; font-weight: 600; margin: 0 0 10px; padding: 0; color: #000; } .activitypub-embed-content .ap-subtitle { font-size: 15px; color: #000; margin: 0 0 15px; } .activitypub-embed-content .ap-preview { border: 1px solid #e6e6e6; border-radius: 8px; overflow: hidden; } .activitypub-embed-content .ap-preview img { width: 100%; height: auto; display: block; } .activitypub-embed-content .ap-preview { border-radius: 8px; box-sizing: border-box; display: grid; gap: 2px; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; margin: 1em 0 0; min-height: 64px; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview.layout-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; } .activitypub-embed-content .ap-preview.layout-2 { aspect-ratio: auto; grid-template-rows: 1fr; height: auto; } .activitypub-embed-content .ap-preview.layout-3 > img:first-child { grid-row: span 2; } .activitypub-embed-content .ap-preview img { border: 0; box-sizing: border-box; display: inline-block; height: 100%; object-fit: cover; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview video, .activitypub-embed-content .ap-preview audio { max-width: 100%; display: block; grid-column: 1 / span 2; } .activitypub-embed-content .ap-preview audio { width: 100%; } .activitypub-embed-content .ap-preview-text { padding: 15px; } .activitypub-embed-meta { padding: 15px; border-top: 1px solid #e6e6e6; color: #687684; font-size: 13px; display: flex; gap: 15px; } .activitypub-embed-meta .ap-stat { display: flex; align-items: center; gap: 5px; } @media only screen and (max-width: 399px) { .activitypub-embed-meta span.ap-stat { display: none !important; } } .activitypub-embed-meta a.ap-stat { color: inherit; text-decoration: none; } .activitypub-embed-meta strong { font-weight: 600; color: #000; } .activitypub-embed-meta .ap-stat-label { color: #687684; } </style>

<p>What about hashing the email?</p>

<div class="activitypub-embed u-in-reply-to h-cite"> <div class="activitypub-embed-header p-author h-card"> <img class="u-photo" src="https://media.social.lol/accounts/avatars/111/559/923/870/165/558/original/5c1a92fdf91205a8.png" alt=""> <div class="activitypub-embed-header-text"> <h2 class="p-name" id="david-bushell-%f0%9f%8e%ae"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#david-bushell-%f0%9f%8e%ae">David Bushell 🎮</a></h2> <a href="https://social.lol/users/db" class="ap-account u-url">@db@social.lol</a> </div> </div> <div class="activitypub-embed-content"> <div class="ap-subtitle p-summary e-content"><p><span class="h-card"><a href="https://mastodon.social/@Edent" class="u-url mention">@<span>Edent</span></a></span> would using a hash of the email address in its place improve privacy? 🤔</p></div> </div> <div class="activitypub-embed-meta"> <a href="https://social.lol/users/db/statuses/115434663342778931" class="ap-stat ap-date dt-published u-in-reply-to">2025-10-25, 11:52</a> <span class="ap-stat"> <strong>0</strong> boosts </span> <span class="ap-stat"> <strong>0</strong> favorites </span> </div> </div>

<style>/** * ActivityPub embed styles. */ .activitypub-embed { background: #fff; border: 1px solid #e6e6e6; border-radius: 12px; padding: 0; max-width: 100%; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } .activitypub-reply-block .activitypub-embed { margin: 1em 0; } .activitypub-embed-header { padding: 15px; display: flex; align-items: center; gap: 10px; } .activitypub-embed-header img { width: 48px; height: 48px; border-radius: 50%; } .activitypub-embed-header-text { flex-grow: 1; } .activitypub-embed-header-text h2 { color: #000; font-size: 15px; font-weight: 600; margin: 0; padding: 0; } .activitypub-embed-header-text .ap-account { color: #687684; font-size: 14px; text-decoration: none; } .activitypub-embed-content { padding: 0 15px 15px; } .activitypub-embed-content .ap-title { font-size: 23px; font-weight: 600; margin: 0 0 10px; padding: 0; color: #000; } .activitypub-embed-content .ap-subtitle { font-size: 15px; color: #000; margin: 0 0 15px; } .activitypub-embed-content .ap-preview { border: 1px solid #e6e6e6; border-radius: 8px; overflow: hidden; } .activitypub-embed-content .ap-preview img { width: 100%; height: auto; display: block; } .activitypub-embed-content .ap-preview { border-radius: 8px; box-sizing: border-box; display: grid; gap: 2px; grid-template-columns: 1fr 1fr; grid-template-rows: 1fr 1fr; margin: 1em 0 0; min-height: 64px; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview.layout-1 { grid-template-columns: 1fr; grid-template-rows: 1fr; } .activitypub-embed-content .ap-preview.layout-2 { aspect-ratio: auto; grid-template-rows: 1fr; height: auto; } .activitypub-embed-content .ap-preview.layout-3 > img:first-child { grid-row: span 2; } .activitypub-embed-content .ap-preview img { border: 0; box-sizing: border-box; display: inline-block; height: 100%; object-fit: cover; overflow: hidden; position: relative; width: 100%; } .activitypub-embed-content .ap-preview video, .activitypub-embed-content .ap-preview audio { max-width: 100%; display: block; grid-column: 1 / span 2; } .activitypub-embed-content .ap-preview audio { width: 100%; } .activitypub-embed-content .ap-preview-text { padding: 15px; } .activitypub-embed-meta { padding: 15px; border-top: 1px solid #e6e6e6; color: #687684; font-size: 13px; display: flex; gap: 15px; } .activitypub-embed-meta .ap-stat { display: flex; align-items: center; gap: 5px; } @media only screen and (max-width: 399px) { .activitypub-embed-meta span.ap-stat { display: none !important; } } .activitypub-embed-meta a.ap-stat { color: inherit; text-decoration: none; } .activitypub-embed-meta strong { font-weight: 600; color: #000; } .activitypub-embed-meta .ap-stat-label { color: #687684; } </style>

<p>You've already given the service your email address, and your domain already knows your account name - so there's no privacy leak here. Obviously, a service shouldn't hotlink to your avatar image.</p>

<p>How about DNS?</p>

<blockquote class="bluesky-embed" data-bluesky-uri="at://did:plc:en7czkhogfoggztn3newgk3u/app.bsky.feed.post/3m3zdjv7vcs2v" data-bluesky-cid="bafyreibp7hypzhpjiwairnihopr47fdifwasluludaxobybpnna3jcupzu"><p lang="en">I like it. Is there an argument that service / endpoint should be specifiable at the DNS level?As others in your comments pointed out, if your site is currently just static, some users might prefer to run an entirely separate dedicated avatar service.</p>— <a href="https://bsky.app/profile/did:plc:en7czkhogfoggztn3newgk3u?ref_src=embed">Emily Shepherd (@emi.ly)</a> <a href="https://bsky.app/profile/did:plc:en7czkhogfoggztn3newgk3u/post/3m3zdjv7vcs2v?ref_src=embed">2025-10-25T11:57:43.456Z</a></blockquote>

<script async="" src="https://embed.bsky.app/static/embed.js" charset="utf-8"></script>

<p>Personally, I think that's a bit complicated, but I'm happy to be convinced.</p>

<blockquote><p><a href="https://bsky.app/profile/ox.ca/post/3m3zkrun4j22b">Is this restricted to email?</a></p></blockquote>

<p>No! For example, if you know my GitHub username then you should be able to get the avatar from <code>https://github.com/.well-known/avatar?resource=acct:edent</code></p>

<blockquote><p><a href="https://mechadarwin.com/2025/10/25/well-known-avatar-location/">How can a service tell if the avatar has been updated</a>?</p></blockquote>

<p>Perhaps a hash, timestamp, or something else?</p>

<blockquote><p><a href="https://mastodon.bsd.cafe/@gumnos/115436604786371047">Can requests for multiple accounts be sent at once?</a></p></blockquote>

<p>I'm not sure how / if WebFinger handles this. I suppose there ought to be some limit to avoid overwhelming a server.</p>

<h2 id="proposal"><a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#proposal">Proposal</a></h2>

<p>I think the default should be to return an image.</p>

<p>If an accept of <code>image/…</code> is requested, the server should try to return an image in that format.</p>

<p>If an accept of <code>application/json</code> or similar is requested, the server should return a JSON document listing the available avatars.</p>

<p>I don't think a <code>?size=</code> GET parameter is necessary; services can resize once they've downloaded, or use the JSON document to get the right size.</p>

<p>A limited amount of alt text could be added using <a href="https://www.rfc-editor.org/rfc/rfc7033#section-4.4.4.4">the title attribute</a> in the JSON.</p>

<p>Before I start writing up anything formal - I'd love your constructive criticism on this.</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:ok">
<p>OK, I don't <em>have</em> to. But I <em>want</em> to. I dislike having last year's photo cluttering some half-remembered social network.&nbsp;<a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#fnref:ok" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:boo">
<p>We live in the redecentralised future now!&nbsp;<a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#fnref:boo" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:slow">
<p>I wrote about this in <a href="https://shkspr.mobi/blog/2024/03/well-known-avatar/">2004</a> and in <a href="https://shkspr.mobi/blog/2020/03/one-avatar-to-rule-them-all/">2020</a>. It takes me time, but I get there eventually!&nbsp;<a href="https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/#fnref:slow" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=64078&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/10/alpha-launch-well-known-avatar-feedback-wanted/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What about using rel="share-url" to expose sharing intents?]]></title>
		<link>https://shkspr.mobi/blog/2025/08/what-about-using-relshare-url-to-expose-sharing-intents/</link>
					<comments>https://shkspr.mobi/blog/2025/08/what-about-using-relshare-url-to-expose-sharing-intents/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 22 Aug 2025 11:34:06 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[webdev]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=62488</guid>

					<description><![CDATA[Let&#039;s say that you&#039;ve visited a website and want to share it with your friends.  At the bottom of the article is a list of popular sharing destinations - Facebook, BlueSky, LinkedIn, Telegram, Reddit, HackerNews etc.    You click the relevant icon and get taken to the site with the sharing details pre-filled.    The problem is, every different site has a different intent for sharing links and…]]></description>
										<content:encoded><![CDATA[<p>Let's say that you've visited a website and want to share it with your friends.  At the bottom of the article is a list of popular sharing destinations - Facebook, BlueSky, LinkedIn, Telegram, Reddit, HackerNews etc.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/08/share-on.webp" alt="Screenshot. &quot;Share this page on&quot; followed by colourful icons for popular social networks." width="824" height="452" class="aligncenter size-full wp-image-62491">

<p>You click the relevant icon and get taken to the site with the sharing details pre-filled.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/08/telegram.webp" alt="Screenshot of the Telegram sharing page." width="600" height="561" class="aligncenter size-full wp-image-62492">

<p>The problem is, every different site has a different intent for sharing links and text.  For example:</p>

<ul>
<li><code>https://www.facebook.com/sharer.php?u=…&amp;t=…</code></li>
<li><code>https://www.linkedin.com/sharing/share-offsite/?url=…</code></li>
<li><code>https://bsky.app/intent/compose?text=…</code></li>
<li><code>https://www.threads.net/intent/post?url=…&amp;text=…</code></li>
<li><code>https://www.reddit.com/submit?url=…&amp;title=…</code></li>
</ul>

<p>As you can see, some only allow a URL, some text and a URL, and some just a plain text which could contain the URl. A bit of a mess! It's probably impossible to get every site to agree on a standard for their sharing intent. But there <em>could</em> be a standard for exposing their existing sharing mechanism.</p>

<p>That's the proposal from <a href="https://about.werd.io/">Ben Werdmuller</a> with "<a href="https://shareopenly.org/integrate/">Share Openly</a>".</p>

<blockquote><p>ShareOpenly knows about most major social networks, as well as decentralized platforms like Mastodon, Bluesky, and Known.</p>

<p>However, if ShareOpenly is having trouble sharing to your platform, and if your platform supports a share intent, you can add the following metatag to your page headers:</p>

<p><code>&lt;link rel="share-url" href="https://your-site/share/intent?text={text}"&gt;</code></p>

<p>Where <code>https://your-site/share/intent?text=</code> is the URL of your share intent.</p>

<p>The special keyword <code>{text}</code> will be replaced with the URL and share text.</p></blockquote>

<p>I think that's a pretty nifty solution.</p>

<p>For sites which take a URl and an (optional) title, the meta element looks like:</p>

<pre><code class="language-html">&lt;link rel="share-url" href="https://www.facebook.com/sharer.php?u={url}&amp;t={text}"&gt;
&lt;link rel="share-url" href="https://lemmy.world/create_post?url={url}&amp;title={text}"&gt;
</code></pre>

<p>For those which only take URl, it looks like:</p>

<pre><code class="language-html">&lt;link rel="share-url" href="https://www.linkedin.com/sharing/share-offsite/?url={url}"&gt;
</code></pre>

<p>It's slightly trickier for sites like Mastodon and BlueSky which only have a text sharing field and no separate URl.  The current proposal is just to use the text. For example</p>

<pre><code class="language-html">&lt;link rel="share-url" href="https://bsky.app/intent/compose?text={text}"&gt;
</code></pre>

<p>But it could be something like</p>

<pre><code class="language-html">&lt;link rel="share-url" href="https://mastodon.social/share?text={text}%0A{url}"&gt;
</code></pre>

<h2 id="what-next"><a href="https://shkspr.mobi/blog/2025/08/what-about-using-relshare-url-to-expose-sharing-intents/#what-next">What Next?</a></h2>

<p>The HTML specification has this to say <a href="https://html.spec.whatwg.org/multipage/links.html#other-link-types">about adding new link types</a>:</p>

<blockquote><p>Extensions to the predefined set of link types may be registered on the <a href="https://microformats.org/wiki/existing-rel-values#HTML5_link_type_extensions">microformats page for existing rel values</a>.</p></blockquote>

<p>Adding to that page merely requires a formal specification to be written up. After that, some light lobbying might be needed to get social networks to adopt it.</p>

<p>So, I have three questions for you:</p>

<ol>
<li>Do you think <code>&lt;link rel="share-url"</code> is a good idea for a new standard?</li>
<li>What changes, if any, would you make to the above proposal?</li>
<li>Would you be interested in using it - either as a sharer or sharing destination?</li>
</ol>

<p>Please leave a comment in the box - and remember to hit those sharing buttons!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=62488&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/08/what-about-using-relshare-url-to-expose-sharing-intents/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How to prevent Payment Pointer fraud]]></title>
		<link>https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/</link>
					<comments>https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 29 Mar 2025 12:34:31 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[dns]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[WebMonetization]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=59172</guid>

					<description><![CDATA[There&#039;s a new Web Standard in town! Meet WebMonetization - it aims to be a low effort way to help users passively pay website owners.  The pitch is simple.  A website owner places a single new line in their HTML&#039;s &#60;head&#62; - something like this:  &#60;link rel=&#34;monetization&#34; href=&#34;https://wallet.example.com/edent&#34; /&#62;   That address is a &#34;Payment Pointer&#34;.  As a user browses the web, their browser takes …]]></description>
										<content:encoded><![CDATA[<p>There's a new Web Standard in town! Meet <a href="https://webmonetization.org">WebMonetization</a> - it aims to be a low effort way to help users passively pay website owners.</p>

<p>The pitch is simple.  A website owner places a single new line in their HTML's <code>&lt;head&gt;</code> - something like this:</p>

<pre><code class="language-html">&lt;link rel="monetization" href="https://wallet.example.com/edent" /&gt;
</code></pre>

<p>That address is a "<a href="https://paymentpointers.org/">Payment Pointer</a>".  As a user browses the web, their browser takes note of all the sites they've visited. At the end of the month, the funds in the user's digital wallet are split proportionally between the sites which have enabled WebMonetization. The user's budget is under their control and there are various technical measures to stop websites hijacking funds.</p>

<p>This could be revolutionary<sup id="fnref:coil"><a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#fn:coil" class="footnote-ref" title="To be fair, Coil tried this in 2020 and it didn't take off. But the new standard has a lot less cryptocurrency bollocks, so maybe it'll work this time?" role="doc-noteref">0</a></sup>.</p>

<p>But there are some interesting fraud angles to consider.  Let me give you a couple of examples.</p>

<h2 id="pointer-hijacking"><a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#pointer-hijacking">Pointer Hijacking</a></h2>

<p>Suppose I hacked into a popular site like BBC.co.uk and surreptitiously included my link in their HTML. Even if I was successful for just a few minutes, I could syphon off a significant amount of money.</p>

<p>At the moment, the WebMonetization plugin <em>only</em> looks at the page's HTML to find payment pointers.  There's no way to say "This site doesn't use WebMonetization" or an out-of-band way to signal which Payment Pointer is correct. Obviously there are lots of ways to profit from hacking a website - but most of them are ostentatious or require the user to interact.  This is subtle and silent.</p>

<p>How long would it take you to notice that a single meta element had snuck into some complex markup? When you discover it, what can you do? Money sent to that wallet can be transferred out in an instant. You might be able to get the wallet provider to freeze the funds or suspend the account, but that may not get you any money back.</p>

<p>Similarly, a <a href="https://lifehacker.com/tech/honey-influencer-scam-explained">Web Extension like Honey</a> could re-write the page's source code to remove or change an existing payment pointer.</p>

<h3 id="possible-solutions"><a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#possible-solutions">Possible Solutions</a></h3>

<p>Perhaps the username associated with a Payment Pointer should be that of the website it uses?  something like <code>href="https://wallet.example.com/shkspr.mobi"</code></p>

<p>That's superficially attractive, but comes with issues.  I might have several domains - do I want to create a pointer for each of them?</p>

<p>There's also a legitimate use-case for having my pointer on someone else's site. Suppose I write a guest article for someone - their website might contain:</p>

<pre><code class="language-html">&lt;link rel="monetization" href="https://wallet.example.com/edent" /&gt;
&lt;link rel="monetization" href="https://wallet.coin_base.biz/BigSite" /&gt;
</code></pre>

<p>Which would allow us to split the revenue.</p>

<p>Similarly, a site like GitHub might let me use my Payment Pointer when people are visiting my specific page.</p>

<p>So, perhaps site owners should add a <a href="https://en.wikipedia.org/wiki/Well-known_URI">.well-known directive</a> which lists acceptable Pointers? Well, if I have the ability to add arbitrary HTML to a site, I might also be able to upload files. So it isn't particularly robust protection.</p>

<p>Alright, what are other ways typically used to prove the legitimacy of data? DNS maybe? As <a href="https://knowyourmeme.com/memes/one-more-lane-bro-one-more-lane-will-fix-it">the popular meme goes</a>:</p>

<blockquote class="social-embed" id="social-embed-114213713873874536" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://infosec.exchange/@atax1a" class="social-embed-user" itemprop="url"><img class="social-embed-avatar" src="https://media.infosec.exchange/infosec.exchange/accounts/avatars/109/323/500/710/698/443/original/20fd7265ad1541f5.png" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">@atax1a@infosec.exchange</p>mx alex tax1a - 2020 (5)</div></a><img class="social-embed-logo" alt="Mastodon" src="data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' aria-label='Mastodon' role='img' viewBox='0 0 512 512' fill='%23fff'%3E%3Cpath d='m0 0H512V512H0'/%3E%3ClinearGradient id='a' y2='1'%3E%3Cstop offset='0' stop-color='%236364ff'/%3E%3Cstop offset='1' stop-color='%23563acc'/%3E%3C/linearGradient%3E%3Cpath fill='url(%23a)' d='M317 381q-124 28-123-39 69 15 149 2 67-13 72-80 3-101-3-116-19-49-72-58-98-10-162 0-56 10-75 58-12 31-3 147 3 32 9 53 13 46 70 69 83 23 138-9'/%3E%3Cpath d='M360 293h-36v-93q-1-26-29-23-20 3-20 34v47h-36v-47q0-31-20-34-30-3-30 28v88h-36v-91q1-51 44-60 33-5 51 21l9 15 9-15q16-26 51-21 43 9 43 60'/%3E%3C/svg%3E"></header><section class="social-embed-text" itemprop="articleBody"><p><span class="h-card" translate="no"><a href="https://mastodon.social/@jwz" class="u-url mention" rel="nofollow noopener" target="_blank">@<span>jwz</span></a></span> <span class="h-card" translate="no"><a href="https://toad.social/@grumpybozo" class="u-url mention" rel="nofollow noopener" target="_blank">@<span>grumpybozo</span></a></span> just one more public key in a TXT record, that'll fix email, just gotta add one more TXT record bro</p><div class="social-embed-media-grid"></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://infosec.exchange/@atax1a/114213713873874536"><span aria-label="198 likes" class="social-embed-meta">❤️ 198</span><span aria-label="5 replies" class="social-embed-meta">💬 5</span><span aria-label="85 reposts" class="social-embed-meta">🔁 85</span><time datetime="2025-03-23T20:49:28.047Z" itemprop="datePublished">20:49 - Sun 23 March 2025</time></a></footer></blockquote>

<p>Someone with the ability to publish on a website is <em>less</em> likely to have access to DNS records. So having (yet another) DNS record could provide some protection. But DNS is tricky to get right, annoying to update, and a pain to repeatedly configure if you're constantly adding and removing legitimate users.</p>

<h2 id="reputation-hijacking"><a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#reputation-hijacking">Reputation Hijacking</a></h2>

<p>Suppose the propaganda experts in The People's Republic of Blefuscu decide to launch a fake site for your favourite political cause. It contains all sorts of horrible lies about a political candidate and tarnishes the reputation of something you hold dear.  The sneaky tricksters put in a Payment Pointer which is the same as the legitimate site.</p>

<p>"This must be an official site," people say. "Look! It even funnels money to the same wallet as the other official sites!"</p>

<p>There's no way to disclaim money sent to you.  Perhaps a political opponent operates an illegal Bonsai Kitten farm - but puts your Payment Pointer on it.</p>

<p>"I don't squash kittens into jars!" You cry as they drag you away. The police are unconvinced "Then why are you profiting from it?"</p>

<h3 id="possible-solutions"><a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#possible-solutions">Possible Solutions</a></h3>

<p>A wallet provider needs to be able to list which sites are <em>your</em> sites.</p>

<p>You log in to your wallet provider and fill in a list of websites you want your Payment Pointer to work on. Add your blog, your recipe site, your homemade video forum etc.  When a user browses a website, they see the Payment Pointer and ask it for a list of valid sites. If "BonsaiKitten.biz" isn't on there, no payment is sent.</p>

<p>Much like OAuth, there is an administrative hassle to this. You may need to regularly update the sites you use, and hope that your forgetfulness doesn't cost you in lost income.</p>

<h2 id="final-thoughts"><a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#final-thoughts">Final Thoughts</a></h2>

<p>I'm moderately excited about WebMonetization. If it lives up to its promises, it could unleash a new wave of sustainable creativity across the web. If it is easier to make micropayments or donations to sites you like, without being subject to the invasive tracking of adverts, that would be brilliant.</p>

<p>The problems I've identified above are (I hope) minor. Someone sending you money without your consent may be concerning, but there's not much of an economic incentive to enrich your foes.</p>

<p>Think I'm wrong? Reckon you've found another fraudulent avenue? Want to argue about whether this is a likely problem? Stick a comment in the box.</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:coil">
<p>To be fair, <a href="https://shkspr.mobi/blog/2020/10/adding-web-monetization-to-your-site-using-coil/">Coil tried this in 2020</a> and it didn't take off. But the new standard has a lot less cryptocurrency bollocks, so maybe it'll work this time?&nbsp;<a href="https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/#fnref:coil" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=59172&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/03/how-to-prevent-payment-pointer-fraud/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[The least secure TOTP code possible]]></title>
		<link>https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/</link>
					<comments>https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 24 Feb 2025 12:34:05 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[rant]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=58360</guid>

					<description><![CDATA[If you use Multi-Factor Authentication, you&#039;ll be well used to scanning in QR codes which allow you to share a secret code with a website. These are known as Time-based One Time Passwords (TOTP).  As I&#039;ve moaned about before, TOTP has never been properly standardised. It&#039;s a mish-mash of half-finished proposals with no active development, no test suite, and no-one looking after it. Which is…]]></description>
										<content:encoded><![CDATA[<p>If you use Multi-Factor Authentication, you'll be well used to scanning in QR codes which allow you to share a secret code with a website. These are known as Time-based One Time Passwords (TOTP<sup id="fnref:pop"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#fn:pop" class="footnote-ref" title="Yes! Just like Top of The Pops! The famous British TV show! Wow! I bet you're the first person in history to make that joke! Have a biscuit." role="doc-noteref">0</a></sup>).</p>

<p>As I've moaned about before, <a href="https://shkspr.mobi/blog/2022/05/why-is-there-no-formal-specification-for-otpauth-urls/">TOTP has never been properly standardised</a>. It's a mish-mash of half-finished proposals with no active development, no test suite, and no-one looking after it. Which is <em>exactly</em> what you want from a security specification, right?!</p>

<p>So let's try to find some edge-cases and see where things break down.</p>

<h2 id="one-punch-man"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#one-punch-man">One Punch Man</a></h2>

<p>This is possibly the <em>least</em> secure TOTP code I could create. Scan it and see whether your app will accept it.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/02/ultra.png" alt="QR code." width="350" height="350" class="aligncenter size-full wp-image-58361">

<p>What makes it so crap?  There are three things which protect you when using TOTP.</p>

<ol>
<li>The shared secret. In this case, it is <code>abcdefghijklmno</code> - OK, that's not the easiest thing to guess, but it isn't exactly complex.</li>
<li>The amount time the code is valid for before changing. Most TOTP codes last 30 seconds, this lasts 120.</li>
<li>The length of the code. Most codes are 6 digits long. In theory, the spec allows 8 digits. This is 1. Yup. A single digit.</li>
</ol>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/02/totp-bitwarden-fs8.png" alt="BitWarden showing a single digit for 119 seconds." width="504" height="378" class="aligncenter size-full wp-image-58380">

<p>If you were thick enough to use this<sup id="fnref:noooooo"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#fn:noooooo" class="footnote-ref" title="Please don't!" role="doc-noteref">1</a></sup>, an attacker would have a 1/10 chance of simply <em>guessing</em> your MFA code. If they saw you type it in, they'd have a couple of minutes in which to reuse it.</p>

<p>Can modern TOTP apps add this code? I <a href="https://mastodon.social/@Edent/114032994415288253">crowdsourced the answers</a>.</p>

<p>Surprisingly, a few apps accept it! Aegis, 1password, and BitWarden will happily store it and show you a 1 digit code for 120 seconds.</p>

<p>A few reject it. Authy, Google Authenticator, and OpenOTP claim the code is broken and won't add it.</p>

<p>But, weirdly, a few <em>interpret it incorrectly!</em> The native iOS app, Microsoft Authenticator, and KeepassXC store the code, but treat it as a 6 digit, 30 second code.</p>

<h2 id="do-the-right-thing"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#do-the-right-thing">Do The Right Thing</a></h2>

<p>What is the right thing to do in this case? The code is outside the (very loosely defined) specification. <a href="https://lawsofux.com/postels-law/">Postel's Law</a> tells us that we should try our best to interpret malformed data - which is what Aegis and BitWarden do.</p>

<p>But, in a security context, that could be dangerous. Perhaps rejecting a dodgy code makes more sense?</p>

<p>What is absolutely daft<sup id="fnref:stronger"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#fn:stronger" class="footnote-ref" title="I wanted to use the words &quot;utterly fucking stupid&quot; but I felt it was unprofessional." role="doc-noteref">2</a></sup> is ignoring the bits of the code you don't like and substituting your own data! Luckily, in a normal TOTP enrolment, the user has to enter a code to prove they've saved it correctly. Entering in a 6 digit code where only 1 is expected is likely to fail.</p>

<h2 id="were-only-human"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#were-only-human">We're Only Human</a></h2>

<p>A one-digit code is ridiculous. But what about the other extreme? Would a 128-digit code be acceptable? For a human, no; it would be impossible to type in correctly. For a machine with a shared secret, it possibly makes sense.</p>

<p>On a high-latency connection or with users who may have mobility difficulties, a multi-minute timeframe could be sensible. For something of extremely high security, sub-30 seconds may be necessary.</p>

<p>But, again, the specification hasn't evolved to meet user needs. It is stagnant and decaying.</p>

<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#whats-next">What's Next?</a></h2>

<p>There's an <a href="https://www.ietf.org/archive/id/draft-linuxgemini-otpauth-uri-00.html">draft proposal to tighten up to TOTP spec</a> which has expired.</p>

<p>It would be nice if the major security players came together to work out a <em>formal</em> and <em>complete</em> specification for this vital piece of security architecture. But I bet it won't ever happen.</p>

<ul>
<li><a href="https://github.com/google/google-authenticator/wiki/Key-Uri-Format">Google have archived their work on authentication standards</a>.</li>
<li><a href="https://developer.apple.com/documentation/authenticationservices/securing-logins-with-icloud-keychain-verification-codes#3795996">Apple points to Google's outdated spec</a>.</li>
<li><a href="https://docs.yubico.com/yesdk/users-manual/application-oath/uri-string-format.html">YubiCo's incompatible spec hasn't been updated in 4 years</a>.</li>
<li>The <a href="https://www.iana.org/assignments/uri-schemes/prov/otpauth">otpauth registration</a> lists a consortium called <a href="https://openauthentication.org">https://openauthentication.org</a> who don't appear to published anything in a decade.</li>
<li>Microsoft don't have any documentation whatsoever.</li>
</ul>

<p>So there you have it. We're told to rely on TOTP for our MFA - yet the major apps all disagree on how the standard should be implemented. This is a recipe for an eventual security disaster.</p>

<p>How do we fix it?</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:pop">
<p>Yes! Just like Top of The Pops! The famous British TV show! Wow! I bet you're the first person in history to make that joke! Have a biscuit.&nbsp;<a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#fnref:pop" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:noooooo">
<p>Please don't!&nbsp;<a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#fnref:noooooo" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:stronger">
<p>I wanted to use the words "utterly fucking stupid" but I felt it was unprofessional.&nbsp;<a href="https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/#fnref:stronger" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=58360&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/02/the-least-secure-totp-code-possible/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Can time-travellers use TOTP codes?]]></title>
		<link>https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/</link>
					<comments>https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 04 Jul 2024 11:34:57 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Computer Science]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[totp]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=51034</guid>

					<description><![CDATA[Imagine, just for a moment, you and your friends decide to travel in time. In order to make sure you can authenticate your communications with each other, you set up a shared Time-based One Time Password (TOTP).  The TOTP algorithm uses a Hash-based Message Authentication Code (HMAC). The hash is calculated from a shared key and a time-based component.  The key is a short string of characters.…]]></description>
										<content:encoded><![CDATA[<p>Imagine, just for a moment, you and your friends decide to travel in time. In order to make sure you can authenticate your communications with each other, you set up a shared Time-based One Time Password (<a href="https://en.wikipedia.org/wiki/Time-based_one-time_password">TOTP</a>).</p>

<p>The TOTP algorithm uses a Hash-based Message Authentication Code (<a href="https://en.wikipedia.org/wiki/HMAC">HMAC</a>). The hash is calculated from a shared key <em>and</em> a time-based component.</p>

<p>The key is a short string of characters. The time-based component is calculated as the number of seconds between now and the Unix Epoch. When is the Unix Epoch? 00:00:00 UTC on Thursday, 1 January 1970<sup id="fnref:uk"><a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fn:uk" class="footnote-ref" title="As an aside, in 1970, the UK was on BST - British Standard Time rather than GMT / UTC." role="doc-noteref">0</a></sup>. It has been roughly 1.7 billion seconds since then. 64 bit computer systems can count up for another 290 billion <em>years</em><sup id="fnref:2038"><a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fn:2038" class="footnote-ref" title="Or, if you're stuck using 32 bit time, until the year 2038." role="doc-noteref">1</a></sup>. So chrononauts journeying to the future should be fine.</p>

<p>But what about people travelling <em>backwards</em>?  You and your friends want to go and see The Beatles perform in 1966.  That's before 1970.  So the time-based component will be a <strong>negative</strong> number.</p>

<p>I've tried a bunch of different TOTP generators and fed them a variety of negative numbers. They all crashed.</p>

<p>So, no. TOTP doesn't work for anyone travelling backwards in the 4th dimension. Pity.</p>

<p>Is there a serious point to this?  Well, sort of.</p>

<p>Negative time is an unexpected input and leads to unusual behaviours.  Could a crash in HMAC generation lead to an exploit?</p>

<p>Standards get used in all sorts of places - including retrospectively. Should standards writers specifically account for inputs which occur in the past?</p>

<p>How should computers deal with <a href="https://mastodon.social/@tubetime/110811949233318077">"preposterous" times</a>?</p>

<p>What other common security tools fail if they're subjected to time-travel?</p>

<p>Which Beatles concert would you go to in 1966?</p>

<div id="footnotes" role="doc-endnotes">
<hr>
<ol start="0">

<li id="fn:uk">
<p>As an aside, in 1970, the UK was on BST - <a href="https://en.wikipedia.org/wiki/British_Summer_Time#Periods_of_deviation">British <em>Standard</em> Time</a> rather than GMT / UTC.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fnref:uk" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:2038">
<p>Or, if you're stuck using 32 bit time, <a href="https://en.wikipedia.org/wiki/Year_2038_problem">until the year 2038</a>.&nbsp;<a href="https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/#fnref:2038" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=51034&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/07/can-time-travellers-use-totp-codes/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[.well-known/avatar]]></title>
		<link>https://shkspr.mobi/blog/2024/03/well-known-avatar/</link>
					<comments>https://shkspr.mobi/blog/2024/03/well-known-avatar/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 17 Mar 2024 12:34:47 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[avatar]]></category>
		<category><![CDATA[IETF]]></category>
		<category><![CDATA[open standards]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=49907</guid>

					<description><![CDATA[Hot on the heels of a post I wrote 4 years ago, wouldn&#039;t it be useful to have a well-known URl for user avatar images?  When I sign up to a web service, I don&#039;t want to faff around uploading an image to use as my avatar. I want that service to look at my email address or social-sign-in and automatically pick up my preferred graphic.  Here&#039;s how I see it working.   A user signs in to a service…]]></description>
										<content:encoded><![CDATA[<p>Hot on the heels of <a href="https://shkspr.mobi/blog/2020/03/one-avatar-to-rule-them-all/">a post I wrote 4 years ago</a>, wouldn't it be useful to have a <a href="https://en.wikipedia.org/wiki/Well-known_URI">well-known URl</a> for user avatar images?</p>

<p>When I sign up to a web service, I don't want to faff around uploading an image to use as my avatar. I want that service to look at my email address or social-sign-in and automatically pick up my preferred graphic.</p>

<p>Here's how I see it working.</p>

<ol>
<li>A user signs in to a service with the email address <code>username@example.com</code></li>
<li>In a similar way to <a href="https://www.rfc-editor.org/rfc/rfc7033">WebFinger</a>, the service makes a request to:

<ul>
<li><code>example.com/.well-known/avatar?resource=acct:username@example.com</code></li>
</ul></li>
<li>If the request's <code>Accept</code> header has a MIME type of <code>image/*</code>, then the server immediately returns an image.</li>
<li>If the request's <code>Accept</code> header has a MIME type of <code>application/json</code>, then the server can return a WebFinger-style document with <code>"rel":"http://webfinger.net/rel/avatar"</code> and, perhaps, a list of different images, formats, and sizes.</li>
</ol>

<p>This makes it incredibly simple for people to use the same avatar <em>everywhere</em>.</p>

<p>It also means that if you're designing a service which publicly shows usernames, you can make avatars available without an expensive API call. For example, Twitter could make user's avatars available at:
<code>twitter.com/.well-known/avatars?resource=acct:edent</code></p>

<h2 id="but-what-about"><a href="https://shkspr.mobi/blog/2024/03/well-known-avatar/#but-what-about">But what about...?</a></h2>

<p>This is a sketch of an idea. I'd like to know if people think it is useful before I take it any further.</p>

<p>I don't think it breaches privacy - a user's image is public on all services anyway.</p>

<p>Users should still be given the option of changing their avatar if they want.</p>

<p>A service shouldn't expose the user's email address - they should proxy the image.</p>

<p>Anything else I should have thought of?</p>

<p><ins datetime="2024-03-18T15:05:30+00:00">Updates</ins></p>

<p>To stave off some common points raised.</p>

<ul>
<li>No this isn't like <a href="https://shkspr.mobi/blog/2020/03/one-avatar-to-rule-them-all/">Gravatar</a>. That works by being a 3rd party service and using the MD5 of your email address.</li>
<li>No this isn't like <a href="https://www.libravatar.org/">Libravatar</a>. See above.</li>
<li>No this isn't like WebFinger. That only returns JSON.</li>
<li>No this isn't like h-card. That requires a server to parse HTML in order to find an image.</li>
<li>No this isn't like <a href="https://shkspr.mobi/blog/2022/08/dns-esoterica-bimi-svg-in-dns-txt-wtf/">BIMI</a>. That's expensive and only supports SVG.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=49907&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/03/well-known-avatar/feed/</wfw:commentRss>
			<slash:comments>31</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Is Open Graph Protocol dead?]]></title>
		<link>https://shkspr.mobi/blog/2022/11/is-open-graph-protocol-dead/</link>
					<comments>https://shkspr.mobi/blog/2022/11/is-open-graph-protocol-dead/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 06 Nov 2022 12:34:49 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[facebook]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[metadata]]></category>
		<category><![CDATA[ogp]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=43622</guid>

					<description><![CDATA[Facebook Meta - like many other tech titans - has institutional Shiny Object Syndrome.   It goes something like this:   Launch a product to great fanfare Spend a few years hyping it as ✨the future✨ Stop answering emails and pull requests If you&#039;re lucky, announce that the product is abandoned but, more likely, just forget about it.   Open Graph Protocol (OGP) is one of those products. The val…]]></description>
										<content:encoded><![CDATA[<p><del>Facebook</del> Meta - like many other tech titans - has institutional <a href="https://en.wikipedia.org/wiki/Shiny_object_syndrome">Shiny Object Syndrome</a>.   It goes something like this:</p>

<ol>
<li>Launch a product to great fanfare</li>
<li>Spend a few years hyping it as ✨the future✨</li>
<li>Stop answering emails and pull requests</li>
<li>If you're lucky, announce that the product is abandoned but, more likely, just forget about it.</li>
</ol>

<p>Open Graph Protocol (OGP) is one of those products. The value-proposition is simple.</p>

<ul>
<li>It's <em>hard</em> for computers to pick out the main headline, image, and other data from a complex web page.</li>
<li>Therefore, let's encourage websites to include metadata which tells our services what they should look at!</li>
</ul>

<p>OGP works pretty well! When you share a link on Facebook, or Twitter, or Telegram - those services load the website in the background, look for OGP metadata, and display a friendly snippet.</p>

<p><del>Facebook</del> Meta were the driving force behind OGP - and have now left it to fester.</p>

<ul>
<li>The website - <a href="https://ogp.me/"></a><a href="https://ogp.me/">https://ogp.me/</a> - still works.</li>
<li>But the <a href="https://www.facebook.com/groups/opengraph/">Facebook OGP  Discussion Group</a> is now full of spam.</li>
<li>The <a href="https://groups.google.com/g/open-graph-protocol?pli=1">Developer Mailing List</a> is broken.</li>
<li>The <a href="https://developers.google.com/+/web/+1button/#plus-snippet">Google Documentation</a> links to a dead Google+ page.</li>
<li>And the <a href="https://github.com/facebookarchive/open-graph-protocol">GitHub Page</a> has been archived.</li>
</ul>

<h2 id="is-ogp-finished"><a href="https://shkspr.mobi/blog/2022/11/is-open-graph-protocol-dead/#is-ogp-finished">Is OGP finished?</a></h2>

<p>And, that might be fine. <del>Facebook</del> Meta are a small company with limited resources. They can't afford to fund standards work indefinitely. And, anyway, OGP is complete, right? It has all the tags that anyone could ever possibly want. Why does it need any improving?</p>

<p>Well, that's not the case. We know, for example, that Twitter have created <a href="https://developer.twitter.com/en/docs/twitter-for-websites/cards/overview/markup">their own proprietary OGP-like meta tags</a>. Similarly, <a href="https://help.pinterest.com/en-gb/business/article/rich-pins">Pinterest have their own as well</a>. And even <a href="https://search.google.com/test/rich-results">Google are going their own way with Rich Snippets</a>.</p>

<p>This is annoying for developers. Now we have to write <em>multiple</em> different bits of metadata if we want our links to be supported on all platforms.</p>

<p>Standards work is never "finished". Developers <em>want</em> to add new features. Users <em>want</em> to interact with new forms of content.</p>

<p>Tomorrow someone is going to invent a way to share smells over the Internet. How does that get represented in an Open Graph Protocol compliant manner?</p>

<p><code>&lt;meta property="twitter:olfactory" content="C₃H₆S"&gt;</code> or
<code>&lt;meta property="facebook:nose"     content="InChIKey/MWOOGOJBHIARFG-UHFFFAOYSA-N"&gt;</code> or
<code>&lt;meta property="og:smell"          content="pumpkin spice"&gt;</code> or...</p>

<p>We know from bitter experience that having several mutually incompatible ways to implement something is a nightmare for developers and provides a poor user-experience.</p>

<p>So we create standards bodies. They're not perfect, but a group of interested folks can do the hard work to try and satisfy oppositional stakeholders.</p>

<p>This is my plea to <del>Facebook</del> Meta. If you're no longer interested in improving OGP, OK. You do you. But hand it over to people who want to keep this going. Maybe it's the <a href="https://www.w3.org/">W3C</a>, or <a href="https://indieweb.org/The-Open-Graph-protocol">IndieWeb</a>, or <a href="https://schema.org">Schema.org</a> or <em>someone</em>.  Hell, I'm not busy, I'll take it on.</p>

<p>Remember, if you love something, let it go.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=43622&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/11/is-open-graph-protocol-dead/feed/</wfw:commentRss>
			<slash:comments>7</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Star Wars and Standards]]></title>
		<link>https://shkspr.mobi/blog/2021/12/star-wars-and-standards/</link>
					<comments>https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 13 Dec 2021 12:34:49 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[Star Wars]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=41221</guid>

					<description><![CDATA[I recently read Future Law - a book of essays about using popular culture to explain technological and legal concepts. One essay looks looks at GDPR issues experienced by Disney® Princesses. I thought I&#039;d try my hand at something similar! So here&#039;s my (brief and incomplete) guide to Technical Standards in Star Wars!  Where do we see compatibility - and incompatibility - within the Star Wars …]]></description>
										<content:encoded><![CDATA[<p>I recently read <a href="https://shkspr.mobi/blog/2021/12/book-review-future-law-emerging-technology-regulation-and-ethics/">Future Law</a> - a book of essays about using popular culture to explain technological and legal concepts. One essay looks looks at GDPR issues experienced by Disney® Princesses. I thought I'd try my hand at something similar! So here's my (brief and incomplete) guide to Technical Standards in Star Wars!</p>

<p>Where do we see compatibility - and incompatibility - within the Star Wars universe? How might the lives and fates of our protagonists have been changed by better standardisation?</p>

<h2 id="data-tapes"><a href="https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#data-tapes">Data Tapes</a></h2>

<blockquote><p>Admiral Motti: Don't try to frighten us with your sorcerer's ways, Lord Vader. Your sad devotion to that ancient religion has not helped you conjure up the stolen data-tapes.</p></blockquote>

<p>At the very end of Rogue One, an unnamed soldier downloads the Death Star plans onto a "data tape" - and pulls it from the Tantive IV's mainframe.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Rogue-One-Data-Tape.jpg" alt="Still from Rogue One. A human hand pulls a  Data Tape from a computer." width="1024" height="576" class="aligncenter size-full wp-image-41236"></p>

<p>The tape makes its way to Princess Leia, who inserts it into R2-D2 - an astromech droid.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Disk-into-R2D2.jpg" alt="Still from A New Hope. Leia inserts the disk into R2-D2." width="834" height="376" class="aligncenter size-full wp-image-41237">

<p>This tells us a few interesting things about the Star Wars universe.  Firstly, the physical format of data tapes are standardised. A computer from one part of the galaxy can exchange physical media with a droid from somewhere else.  Data tapes are common enough for their drives to be built into droids.  The physical size - and formats - of tapes has obviously remained relatively consistent.</p>

<p>Imagine Leia trying to squeeze a CD-RW into a Zip Drive slot. Or even a Mac formatted floppy into a DOS drive!</p>

<p>Without the mutual compatibility of this exchange format, there would be no escape for the Rebels!</p>

<h2 id="computer-terminals"><a href="https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#computer-terminals">Computer Terminals</a></h2>

<p>When the gang of heroes arrive on the Death Star, R2-D2 immediately inserts his probe (no, seriously, <a href="https://starwars.fandom.com/wiki/Data_probe">that's what it is called</a>) into a computer terminal, and starts interrogating the system:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/R2D2-interface-Death-Star-1.jpg" alt="R2-D2 inserting his probe into a port." width="834" height="376" class="aligncenter size-full wp-image-41239">

<p>He does the same thing on a different level of the Death Star as his chums are running around:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/R2D2-interface-Death-Star-2.jpg" alt="R2D2 interfaceing with the Death Star." width="834" height="376" class="aligncenter size-full wp-image-41238">

<p>This shows us that these ports have a standard physical interface - at least for R2 units or droids of a similar height. Despite the Death Star's modernity, they retain a standard way of accessing information with older computers.</p>

<p>The lack of standards shows up when Artoo visits the Cloud City of Bespin. His friend, C-3PO, asks him to interface with the computer to override the security systems - with <em>disastrous</em> consequences:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/R2D2-Cloud-City.jpg" alt="R2-D2 getting zapped with electricity." width="1023" height="432" class="aligncenter size-full wp-image-41241">

<p>Poor Artoo! But, also, poor planning from a standards' perspective. C-3PO's non-apology shows the problem.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/C-3PO-power-socket-confusion.jpg" alt="C-3PO complaining that he can't know the difference between a power socket and a computer terminal." width="1024" height="432" class="aligncenter size-full wp-image-41242">

<p>Look at that image. The power socket is at the same height as a computer terminal and uses a physically similar connector. A good standard would have made the sockets mutually incompatible - you shouldn't be able to shove a USB plug into an electrical socket and vice-versa.</p>

<p>A few moments later, the droid opens one of the doors on Cloud City:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/R2D2-Cloud-City-opening-doors.jpg" alt="R2D2 plugged into a Cloud City data port." width="1023" height="432" class="aligncenter size-full wp-image-41243">

<p>Can you immediately tell the difference between the data socket and the power socket? There are no labels, no warnings, and few physical differences.</p>

<p>Standards Save Lives!</p>

<h2 id="ships"><a href="https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#ships">Ships</a></h2>

<p>Astromech droids, like R2, are handy, diverse, and <em>standardised</em>.</p>

<p>The Phantom Menace shows them interfacing with N-1 star fighters</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/N-1.jpg" alt="Row of star fighters with droids in them." width="848" height="364" class="aligncenter size-full wp-image-41244">

<p>Attack of the Clones shows them in other ships:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Delta-7-Aethersprite.jpg" alt="Delta-7 Aethersprite." width="1023" height="434" class="aligncenter size-full wp-image-41246"></p>

<p>Yet more in Revenge of the Sith:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Jedi-Interceptor.jpg" alt="Jedi Interceptor." width="1023" height="432" class="aligncenter size-full wp-image-41245"></p>

<p>And, A New Hope also shows a variety of Atromechs in a bunch of different ships:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Green-droid-being-lowered-into-a-spaceship.jpg" alt="Green droid being lowered into a spaceship." width="834" height="376" class="aligncenter size-full wp-image-41247"></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/R2-in-an-X-Wing.jpg" alt="R2 in an X-Wing saying &quot;beep beep&quot;." width="1024" height="432" class="aligncenter size-full wp-image-41248">

<p>What I'm getting at is that standardisation is the secret to success. You can take any Astromech droid and plonk it in any small spaceship at it'll <em>just work!</em>  That means standard physical sizes for the robots, standard interfaces, standard protocols, standards everywhere!</p>

<p>Imagine the palaver if R2-D2 had to have a conversion kit when swapped between a Jedi Interceptor and an X-Wing - what chaos! Bought a brand new Y-Wing? Sorry pal, you'll need to replace all your little robots.  What a waste!</p>

<h2 id="lets-go-fly-a-kite-spaceship"><a href="https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#lets-go-fly-a-kite-spaceship">Let's Go Fly A <del>Kite</del> Spaceship</a></h2>

<p>I particularly like this sideways look at Star Wars:</p>

<blockquote class="social-embed" id="social-embed-1332768515909160967" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/LilahSturges" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRggCAABXRUJQVlA4IPwBAADQCgCdASowADAAPrVUpk4nJKOiI4oA4BaJZAC419TdsFyY5k8YUyun/fK4GLz0vmR964FpI1eHtLI/sZGo83ELMwTVnmAL3v2NKwOF4pVgNWmyqt/q0aJIgv+4JRTZ3AD+36FmRDREG4fn5qaDRN7cAugFnjc6++hSdkHYKxj23VlBv/8REbd/MR1/VKv1P8/22/emcT9ZY+Mq+n84SMRhdBPU+1AsmLPdBWUvIwZ/OS/7CMr0NJ0oKG/0Nrj7wxBKlQALBcb/P/MoOr8umtx7vvDIiMgZRQgoy6/5GoxBXg90/kSEZzP6eFJuBIbfJaukK6uD35Dga4L/cFWzLBLznqbGqnQryenwCPmKiCVWbCZVcc1dHT5T4pTewBr5hgt/WCk/SLFN+pV9GjdUNO4kNysUFeQgtNAWwlPZFUh4MYQ3iBn7QVHSneStTDyoNeD+XpmJz6vJgQ1E3Qkv4g750t770hZl9fO1/SxSoLBi70zMV8bktxeU7zjYSDznMtuUKATA+/r92BpGXfHgecvGc/KhrP3E1DVgd3A3YCCwzr3xAu4gyZZUTzgPr1Dad5hdPyXAVsRGtfYzDK236V6bymnb6CO3mWVxbOaGtEvKMgIUu87/7+jc/WCiACvJReFxqYjGTIutkO0hvTN4+MO0GEMRT36O8K1hrwAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Lilah Sturges (Inactive)</p>@LilahSturges</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Rebel: who are you?<br>Luke: I’m a farmer who accidentally got a message intended for Leia and got captured attempting to deliver it. But I rescued her!<br>Leia: I mostly rescued myself.<br>Luke: so can I fly one of these fighters?<br>Rebel: have you ever flown one?<br>Luke: NOPE<br>Rebel: ok cool</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/LilahSturges/status/1332768515909160967"><span aria-label="1443 likes" class="social-embed-meta">❤️ 1,443</span><span aria-label="21 replies" class="social-embed-meta">💬 21</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2020-11-28T19:29:10.000Z" itemprop="datePublished">19:29 - Sat 28 November 2020</time></a></footer></blockquote>

<p>The whole thread is brilliant - and I recommend it. But it makes a small error. Luke is proficient at flying a T-16. So why shouldn't he be able to fly an X-Wing?</p>

<p>In most countries, if you have a basic driving licence, you are allowed to drive any make and model of car. The accelerator, brake, and clutch pedals are all in the same location. The gears are in the same order on the stick.  Mirrors adjust in much the same way. Lights, indicators, and wipers are all clearly marked. If you're a competent driver - standards means that you can hop from one car to another with ease.</p>

<p>We see the same thing in The Force Awakens. Poe has never flown a TIE Fighter:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Ive-always-wanted-to-fly-one-of-these-things.jpg" alt="Poe saying &quot;I've always wanted to fly one of these things.&quot;" width="1024" height="427" class="aligncenter size-full wp-image-41251"></p>

<p>Same with Rey after flying the Millennium Falcon:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Ive-flown-some-ships-but-never-left-the-planet.jpg" alt="Rey saying &quot;I've flown some ships, but never left the planet.&quot;" width="1024" height="427" class="aligncenter size-full wp-image-41250"></p>

<p>Standards make it easy to go from one craft to the next. Does Poe know what every switch does in the cockpit? No - but he eventually works out how to release the docking tether.</p>

<p>I'm not sure how easy it is for, say, a MiG-21 pilot to fly an F-35. I'm sure some of the basics are the same, right? There are standards for how joysticks work, at the very least, I assume.</p>

<p>Imagine if Poe had to take 30 week course before jumping into a TIE Fighter. What if Luke needed to get a thousand flight-hours in on a simulator before they let him near an X-Wing? Standardised technologies make it easier for people to use new equipment.</p>

<h2 id="6-million-forms-of-communication"><a href="https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#6-million-forms-of-communication">6 Million Forms of Communication</a></h2>

<p>We all know Threepio's famous boast:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/C-3PO-fluent.jpg" alt="C-3PO saying he is fluent in over 6 million forms of communication." width="1024" height="432" class="aligncenter size-full wp-image-41252">
But what does he mean by that?  The full quote is:</p>

<blockquote><p>Sir, I am fluent in six million forms of communication.  This signal is not used by the Alliance.  It could be an Imperial code.</p></blockquote>

<p>By "forms of communication" - Threepio means codes and other protocols.  Remember how he introduces himself to Own Lars?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2021/12/Vaporators.jpg" alt="C-3PO talking about vaporators." width="1024" height="432" class="aligncenter size-full wp-image-41253">

<blockquote><p>OWEN: What I really need is a droid that understands the binary language of moisture vaporators.
THREEPIO: Vaporators! Sir, my first job was programming binary load lifters... very similar to your vaporators in most respects.</p></blockquote>

<p>C-3PO can't speak 6 million languages. But he does have 6 million printer drivers installed!</p>

<h2 id="and-on-it-goes"><a href="https://shkspr.mobi/blog/2021/12/star-wars-and-standards/#and-on-it-goes">And on it goes</a></h2>

<p>There are dozens of other standards hidden away in the Star Wars universe. Radio comms just work across a menagerie of different space-ships. Restraining bolts are standardised no matter the droid. Clones are the very apotheosis of standardisation!</p>

<p>This isn't intended to be an exhaustive list of standards. And it only covers the movies - rather than the endless comics, cartoons, books, and games you played with your toys.</p>

<p>Speaking of which... one last thing. When I was a lad, my original Star Wars toys (which would be worth a fortune if I hadn't played with them) all had a standardised feature.  Can you guess what it was?</p>

<p>5 points if you remembered that all the original toys had the same size hole in the soles of their feet for <em>foot pegs!</em></p>

<p>You can read more about them in "<a href="https://issuu.com/steveverberckmoes/docs/krause_publications_-_the_ultimate_guide_to_vintag">The Ultimate Guide to Vintage Star Wars Action Figures 1977-1985</a>". The standard allowed Kenner - the manufacturer - to create playsets of all shapes and sizes, and to have their action figures clip in nicely to them.  If you wanted Darth Vader in your Millennium Falcon, or Lando Calrissian in the Mos Eisley cantina - standards helped you have fun.</p>

<p>I hope, in my small way, I've shown you why standards are important throughout the galaxy.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=41221&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/12/star-wars-and-standards/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[I have resigned from the Google AMP Advisory Committee]]></title>
		<link>https://shkspr.mobi/blog/2020/12/i-have-resigned-from-the-google-amp-advisory-committee/</link>
					<comments>https://shkspr.mobi/blog/2020/12/i-have-resigned-from-the-google-amp-advisory-committee/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 18 Dec 2020 12:02:49 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[amp]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37603</guid>

					<description><![CDATA[As per the AMP AC charter, I have resigned with immediate effect. As I was a non-corporate representative, I will not be nominating a replacement.  I have loved working with the AC. They are a team of brilliant individuals who are all committed to trying to make AMP better, and I&#039;m sorry to leave them. I&#039;ve been a member of the AC for a little over two years and now is the time to step away and…]]></description>
										<content:encoded><![CDATA[<p>As per the <a href="https://github.com/ampproject/meta-ac/blob/master/WORKING_MODE.md#resignation">AMP AC charter</a>, I have resigned with immediate effect. As I was a non-corporate representative, I will not be nominating a replacement.</p>

<p>I have loved working with the AC. They are a team of brilliant individuals who are all committed to trying to make AMP better, and I'm sorry to leave them. <a href="https://shkspr.mobi/blog/2018/09/snarking-on-the-internet/">I've been a member of the AC for a little over two years</a> and now is the time to step away and let a wider variety of people work on the committee.</p>

<p>As I mentioned in a previous blog post, <a href="https://shkspr.mobi/blog/2020/11/new-years-resolution-start-an-msc/">I am starting an MSc in January</a> so I'm trying to cut back on my extracurricular activities.</p>

<p>The stated goal of the AMP AC is to "<a href="https://github.com/ampproject/meta-ac/blob/master/WORKING_MODE.md#goal-of-the-ac">make AMP a great web citizen</a>."</p>

<p>I am concerned that - despite the hard work of the AC - Google has limited interest in that goal.</p>

<p>When I joined, I wondered whether I could make a difference. I hope that I have been a critical friend. The AC has encouraged AMP to think more about user needs - rather than Google's needs. And changes to the search carousel were also a concern of the committee which have been partly addressed.</p>

<p>Google's thesis is that the mobile-web is dying and people prefer to use apps - therefore making the web faster and more app-like will retain users. <a href="https://github.com/ampproject/meta-ac/issues/32">Google don't publish data about this</a>, so I can't directly criticise their motives. But I do not think AMP, in its current implementation, helps make the web better.</p>

<p>I remain convinced that AMP is poorly implemented, hostile to the interests of both users and publishers, and a proprietary &amp; unnecessary incursion into the open web.</p>

<p>I am glad that I tried to make it better, but I'm sad to have failed.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37603&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/12/i-have-resigned-from-the-google-amp-advisory-committee/feed/</wfw:commentRss>
			<slash:comments>16</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[How do you raise a software bug with a book publisher?]]></title>
		<link>https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/</link>
					<comments>https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 23 Nov 2020 12:26:12 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[bug]]></category>
		<category><![CDATA[ebook]]></category>
		<category><![CDATA[epub]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[publishing]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37325</guid>

					<description><![CDATA[Recently, I bought an eBook which has a bug. I&#039;d like to explain what the bug is, why it is a problem, and how I&#039;m trying to get it corrected.  Amazon sells eBooks in KF8 format. That is an ePub with some proprietary extras. ePub is a standard based off HTML5. You can read the ePub 3 specification but, basically, it is a .zip of HTML files.  If you unzip an eBook, you can read the source code…]]></description>
										<content:encoded><![CDATA[<p>Recently, I bought an eBook which has a bug. I'd like to explain what the bug is, why it is a problem, and how I'm trying to get it corrected.</p>

<p>Amazon sells eBooks in <a href="https://wiki.mobileread.com/wiki/KF8">KF8 format</a>. That is an ePub with some proprietary extras. ePub is a standard based off HTML5. You can <a href="https://www.w3.org/publishing/epub3/epub-overview.html">read the ePub 3 specification</a> but, basically, it is a .zip of HTML files.  If you unzip an eBook, you can read the source code behind it.</p>

<p>When trying to read a Kindle book on a non-Kindle device, I noticed a bug. Some words were not displaying.  I took a look at the underlying source code, and found this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Screenshot-from-2020-11-19-09-20-27.png" alt="HTML code - a span wraps the first letter of a word." width="931" height="65" class="aligncenter size-full wp-image-37328">

<img src="https://shkspr.mobi/blog/wp-content/uploads/2020/11/Screenshot-from-2020-11-19-09-19-56.png" alt="HTML code - a span wraps the first word of a sentence.." width="680" height="65" class="aligncenter size-full wp-image-37329">

<p>Sometimes words and letters were wrapped with a <code>pagebreak</code> span like this:</p>

<pre><code class="language-html">&lt;span id="pg5" epub:type="pagebreak"&gt;‘But&lt;/span&gt; of course!’
</code></pre>

<p>When I tried to read the book using <a href="https://koreader.rocks/">KOReader</a> the word "‘But" didn't appear. Why?  Let's take a look at the <a href="https://idpf.github.io/epub-vocabs/structure/#pagination">ePub3 specification concerning page breaks</a>:</p>

<blockquote> <strong>pagebreak</strong>
<ul><li>  A separator denoting the position before which a break occurs between two contiguous pages in a statically paginated version of the content.
</li><li>  HTML usage context: phrasing and flow content, where the value of the carrying elements title attribute takes precedence over element content for the purposes of representing the pagebreak value</li></ul></blockquote>

<p>Here's the problem - eBooks can have page numbers. Despite "<a href="https://shkspr.mobi/blog/2011/02/quoting-page-numbers-from-ebooks-considered-harmful/">Page Numbers in eBooks Considered Harmful</a>" lots of publishers still use them. I guess it is <em>kind of</em> useful if you want to refer to something on a printed page - but eReaders allow you to change font size and line spacing, so the concept of a page is somewhat nebulous.</p>

<p>The way the spec is written, means that you can write something like:</p>

<pre><code class="language-html">&lt;span epub:type="pagebreak" id="page_123_a" title="123"&gt;123&lt;/span&gt;
</code></pre>

<p>You use the <code>id</code> for internal linking and the <code>title</code> attribute for the value.</p>

<p>Because of this, most eReaders do not display the physical page number inside the span. It has no semantic content for the reader, and breaks flow. If they did display it, you might end up reading text like this:</p>

<blockquote><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean vel</p>

<p>9</p>

<p>risus at metus molestie tincidunt. Donec aliquet aliquam lorem, ...</p></blockquote>

<p>So KOReader <em>deliberately</em> ignores any text which is wrapped with <code>epub:type="pagebreak"</code>.</p>

<p>If you look at <a href="https://github.com/IDPF/epub3-samples/search?l=HTML&amp;q=pagebreak">the example ePubs provided by the International Digital Publishing Forum</a>, you'll see that the majority of their spans are self-closing.</p>

<pre><code class="language-html">&lt;span epub:type="pagebreak" id="p123-a" title="123"/&gt;
</code></pre>

<p>Very occasionally, you see something which has just a page number in it:</p>

<p><a href="https://github.com/IDPF/epub3-samples/blob/68ba020fe5c99625d45dd50a94c4b202c5f220e1/30/childrens-literature/EPUB/s04.xhtml#L11"><code>&lt;span epub:type="pagebreak" title="169" id="Page_169"&gt;169&lt;/span&gt;</code></a></p>

<p>I checked with <a href="https://github.com/koreader/koreader/issues/6894">KOReader</a> and they confirmed that they were following the spec. I agree with them. There's no reason to wrap readable content in a metadata span like that.</p>

<p>I've checked several other books from different publishers. None of them abuse <code>pagebreaks</code> this way.  I think Penguin Random House are doing it wrong and I would like to correct them.</p>

<h2 id="reporting-it"><a href="https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#reporting-it">Reporting it</a></h2>

<p>I've previously <a href="https://shkspr.mobi/blog/2011/03/how-do-you-upgrade-an-ebook/">reported buggy ebooks to vendors</a>. But because the Kindle app doesn't exhibit this problem, I thought it was futile going via Amazon. So I thought I'd try going directly to the publisher.</p>

<p>Sadly, <a href="https://github.com/puk">Penguin UK's GitHub repo is dead</a>. Their dedicated digital publishing team <a href="https://mobile.twitter.com/PRHDigital">haven't tweeted in 2 years</a>.</p>

<p>Their <a href="https://www.penguin.co.uk/company/about-us/notices/faqs.html">contact page</a> has a suggestion for what to do if there is an error in an eBook:</p>

<blockquote><p>It is best if you return the book to the original bookshop from which it was purchased; they should be happy to exchange it for a perfect copy. If you have any difficulty with this then please return the cover and title page of the book to us.</p></blockquote>

<p>Hmmm....</p>

<p>I dropped them an email, and got back this very reasonable reply:</p>

<blockquote><p>Thank you for reaching out and bringing this to our attention. The distinction you’ve made is already a part of our specification; this was an oversight which we’re looking into as a result of your input—it bypassed checks both because it validates and also passes visual checks on all the major platforms we screen for. This isn’t reflective of our entire library and should be limited to specific titles which we’re currently investigating.</p></blockquote>

<p>That's fair enough. The rendering quirk is specification compliant - but hard to spot because of the Kindle monoculture.</p>

<h2 id="change-the-spec-change-the-world"><a href="https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#change-the-spec-change-the-world">Change the spec, change the world</a></h2>

<p>I've made <a href="https://github.com/w3c/epub-specs/issues/1437">a suggestion on GitHub that the spec should be clarified</a>. I don't think it's particularly obvious that content in a <code>pagebreak</code> may not be displayed.</p>

<p>Most resources agree that the content of a <code>pagebreak</code> should either be blank, or be the page number.</p>

<blockquote><p>If you include the page numbers as text content within a <code>span</code> or <code>div</code>, the pages will be more easily accessible to both sighted users and users using assistive technologies. This method has been employed in previous DAISY standards. The potential downside, however, is that mainstream user agents will not provide equivalent functionality to turn off unwanted content, forcing users to hear and view the page numbers.</p>

<p><a href="https://kb.daisy.org/publishing/docs/navigation/pagelist.html#faq">Digital Accessible Information System (DAISY)</a></p></blockquote>

<h2 id="whose-fault-is-it-anyway"><a href="https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/#whose-fault-is-it-anyway">Whose fault is it anyway?</a></h2>

<p>This is a tricky one. I think Penguin have undoubtedly made a mistake with the way they publish ePubs. But, so far, KOReader is the only rendering engine I've found which suppresses the content of <code>pagebreak</code>s by default.</p>

<p>Generally speaking, a user wouldn't want to display page numbers on an eBook. Software could have a user defined toggle to switch them on or off. Luckily, KOReader has a variety of style-sheets for rendering eBooks - so I picked one which displayed <code>pagebreak</code> content.</p>

<p>Software is hard.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37325&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/11/how-do-you-raise-a-software-bug-with-a-book-publisher/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Should panoramic images be part of the HTML5 specification?]]></title>
		<link>https://shkspr.mobi/blog/2020/03/should-panoramic-images-be-part-of-the-html5-specification/</link>
					<comments>https://shkspr.mobi/blog/2020/03/should-panoramic-images-be-part-of-the-html5-specification/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 09 Mar 2020 12:23:26 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[images]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=34279</guid>

					<description><![CDATA[Noodling thoughts.  The humble &#60;img&#62; element is one of the oldest parts of HTML. It allows you to put a static image in a document. Later revisions allowed for animated images - like GIFs. And the &#60;map&#62; element made parts of the image clickable.  But what about interactive images?  Like panoramas and photospeheres?  Here&#039;s a 360° image. You can drag it to see all around.    That uses the …]]></description>
										<content:encoded><![CDATA[<p>Noodling thoughts.  The humble <code>&lt;img&gt;</code> element is one of the oldest parts of HTML. It allows you to put a static image in a document. Later revisions allowed for animated images - like GIFs. And the <code>&lt;map&gt;</code> element made parts of the image clickable.</p>

<p>But what about interactive images?  Like panoramas and photospeheres?</p>

<p>Here's a 360° image. You can drag it to see all around.</p>

<iframe style="border-style:none;" width="1024" height="400" allowfullscreen="" src="https://shkspr.mobi/pannellum/pannellum.htm#panorama=/blog/wp-content/uploads/2019/11/20190912_194621.jpg&amp;autoRotate=2&amp;autoLoad=false&amp;title=Interior"></iframe>

<p>That uses the fantastic <a href="https://pannellum.org/">Pannellum JavaScript Library</a>. At the moment, there's no native way to represent that in HTML. If you use an <code>&lt;img&gt;</code> you'll get a flat, equirectangular image like this:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/11/20190912_194621.jpg" alt="360 view of the inside of the concert hall." width="5660" height="2830" class="aligncenter size-full wp-image-32852"></p>

<p>Here's two possible ways I've just thought of...</p>

<p>(These are just sketches of ideas - think of them as a starting point for user research, rather than a completed product.)</p>

<h2 id="extend-to-be-like"><a href="https://shkspr.mobi/blog/2020/03/should-panoramic-images-be-part-of-the-html5-specification/#extend-to-be-like">Extend <code>&lt;img&gt;</code> to be like <code>&lt;video&gt;</code></a></h2>

<p>An HTML5 video element looks something like this:</p>

<pre><code class="language-html">&amp;lt;video controls=false autoplay=true&amp;gt;
</code></pre>

<p>That tells the browser to start playing the video, but not to show any playback controls in the UI. Panoramic images could use something like:</p>

<pre><code class="language-html">&amp;lt;img panorama=true photosphere=false xdegress=270 src=&amp;quot;...&amp;quot;&amp;gt;
</code></pre>

<p>That is, this image is a panorama - but not a sphere - with 270 degrees of movement on the horizontal axis.</p>

<p>Or</p>

<pre><code class="language-html">&amp;lt;img panorama=true photosphere=true startx=120 starty=330 src=&amp;quot;...&amp;quot;&amp;gt;
</code></pre>

<p>Display a photosphere, make the initial view start at the following co-ordinates.</p>

<h2 id="use"><a href="https://shkspr.mobi/blog/2020/03/should-panoramic-images-be-part-of-the-html5-specification/#use">Use <code>&lt;picture&gt;</code></a></h2>

<p>As I've said before, <a href="https://shkspr.mobi/blog/2015/11/a-polite-way-to-say-ridiculously-complicated/">I'm no fan of the <code>&lt;picture&gt;</code> element</a>. I think it is inconsistently designed compared to other parts of HTML5.</p>

<p>Perhaps we could use it like this:</p>

<pre><code class="language-html">&amp;lt;picture&amp;gt;
  &amp;lt;source type=&amp;quot;image/jpeg;panorama=true&amp;quot; srcset=&amp;quot;pano.jpg&amp;quot;&amp;gt;
  &amp;lt;img src=&amp;quot;flat.png&amp;quot; alt=&amp;quot;your browser doesn&amp;#039;t support panoramics&amp;quot;&amp;gt;
&amp;lt;/picture&amp;gt;
</code></pre>

<p>That gives the MIME type of the image an extra parameter. Obviously, you'd need to put in other configuration options something.</p>

<h2 id="what-next"><a href="https://shkspr.mobi/blog/2020/03/should-panoramic-images-be-part-of-the-html5-specification/#what-next">What next?</a></h2>

<p>A quick search didn't show anyone working on this as a proposal. That normally means either I'm not looking in the right places, or no one else is interested.</p>

<p>If you think this could be developed into a future standard, please let me know!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=34279&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2020/03/should-panoramic-images-be-part-of-the-html5-specification/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Introducing the new HTML element - welcome <clippy>!]]></title>
		<link>https://shkspr.mobi/blog/2019/06/introducing-the-new-html-element-welcome/</link>
					<comments>https://shkspr.mobi/blog/2019/06/introducing-the-new-html-element-welcome/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 13 Jun 2019 11:09:20 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=32278</guid>

					<description><![CDATA[Hello! It looks like you&#039;re writing a blog post - would you like help with that? chuckles    Me and my colleagues at Microsoft have decided that the world needs more Clippy - the adorable animated paperclip. To help with that, we&#039;re bringing a new feature to Edge 6.0.  Web Developers can now use &#60;clippy&#62; to call up an animated virtual assistant.  I&#039;ve spoken to several people in Microsoft, and we …]]></description>
										<content:encoded><![CDATA[<p>Hello! It looks like you're writing a blog post - would you like help with that? <em>chuckles</em></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/06/giphy.gif" class="wp-image-32279 alignnone size-full" width="220" height="206" animated-media="animated-media" alt="An animated paperclip wiggling its eyebrows. " data-temp-aztec-id="02c06c3a-54c5-49be-b9ff-042a337f0f18">

<p>Me and my colleagues at Microsoft have decided that the world needs more Clippy - the <em>adorable</em> animated paperclip. To help with that, we're bringing a new feature to Edge 6.0.</p>

<p>Web Developers can now use <code>&lt;clippy&gt;</code> to call up an animated virtual assistant.</p>

<p>I've spoken to several people in Microsoft, and we all agree it is a good idea.</p>

<p>We looked through a number of great software projects (mostly from Microsoft) and found lots of inconsistencies in the way Clippy is presented and invoked.</p>

<p>So I've written a spec for how I think it should work. I've not actually spoken to many other developers about what their user needs are. I'm pretty sure I'm representative of the majority viewpoint.</p>

<p>Because users keep buying and using our products, I'm going to assume they all love Clippy as much as I do. The little rascal! So, no need to waste time worrying about how users actually feel.</p>

<p>You can start using Clippy on your websites <strong>right now!</strong></p>

<hr>

<p>Fear not my friends! I don't work for MS and this isn't a real proposal. The above is a satirical look at the current state of web "standards" development.</p>

<blockquote class="social-embed" id="social-embed-1139001078953971714" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/fantasai" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRnYBAABXRUJQVlA4IGoBAADwCQCdASowADAAPrVMoE0nI6MiJzgMkOAWiWkADol2WyruDOnMuvlgRiAnNb702jXtJeaTuW4vmclcsoSH+hm69zcWM+PG5ZpzE4PkeJD3ZChJh8aDJ6AAAP7+YDuIC96lgyQxEn/IRYnFw9v8ffV1RjwT2Myy2b/B5GcbQJOpN3ejRvBPAQCDpVLJibYVIOhtD3nmsx2nnrT+ZVzy7rdHenuOQZQO0iQie239gFmx1MU6frdxVNDaNfqWwfyd5Fbxdj5T9KtL86UuGqpE3Y+R1Wf3GddWmUqLWTjpyr2Y5xVf+O/7f9NtLnNNqpdxICK9aiqRLK/op0aWKook23oQWT9TsSwgBHzKWm+8gvnUfSTuzUyRSsc31dd6GR/hQlIYVJQteEuykyAwI+ePouDguDj3HqoQUL43Gtey4tYdnvFCsh5/SftaR5yAiMFch6J2x0RGTFZJ28MyNpq7mX9SUMZ171K4uAAAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">fantasai</p>@fantasai</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Web standardization according to Google? "Nobody outside my team has reviewed or approved of the explainer in my private repo, but if we implement and encourage devs to use it, surely our competitors will agree to implement it [because our market dominance determines compat]".</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/fantasai/status/1139001078953971714"><span aria-label="126 likes" class="social-embed-meta">❤️ 126</span><span aria-label="4 replies" class="social-embed-meta">💬 4</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-06-13T02:46:33.000Z" itemprop="datePublished">02:46 - Thu 13 June 2019</time></a></footer></blockquote>

<p>Google have decided the world needs a <code>&lt;toast&gt;</code> element. For the record - I think that's probably a great idea.</p>

<p>But my views don't matter much. They shouldn't matter much. I'm not the average user. I'm not representative of all developers.</p>

<p>The way Google has gone about this seems to be…</p>

<ol>
    <li>Ooh! I have a cool idea!</li>
    <li>Other people in Google agree with me!</li>
    <li>Other Google projects could benefit from this?</li>
    <li>Let's stick it in Chrome!</li>
    <li>Oh, guess we should tell the community what we're doing.</li>
</ol>

<p>(I'm deliberately simplifying and probably being a bit rude to the people behind this.)</p>

<p>Here's (my) idealised version of how a new element should be introduced:</p>

<ol>
    <li>Have a cool idea</li>
    <li>Speak to real users and see if it meets a user need</li>
    <li>Publish the (vague) user research and start discussing with peers around the world</li>
    <li>Design and iterate based on feedback</li>
    <li>Test with users. Pass/Fail based on beta testing</li>
    <li>Publish test results</li>
    <li>Work with community to improve things</li>
    <li>Etc.</li>
</ol>

<p>Look, I get the "Move fast! Break things!" attitude. And I think it is exactly right that Google should experiment with the web. We all should! And, again, I think that <code>&lt;toast&gt;</code> is probably a useful addition to HTML.</p>

<p>But the way Google has gone about introducing it to the world betrays a huge lack of empathy for the poor sods who have review standards, for other browsers, for users, and for the broader Web community.</p>

<p>It feels like a Google-designed, Google-approved, Google-benefiting idea which has been dumped onto the Web without any consideration for others.</p>

<p>I <em>know</em> that isn't the case. And I know how many dedicated people have worked hard on this proposal.</p>

<p>For old fart like me, this feels like the Microsoft Internet Explorer days. MS dumping features onto the web and everyone had to do what they say because they're the biggest kid in the playground.</p>

<p>I think the chaps at Google probably think they're the good guys. That they're doing the web a favour. That users love them.</p>

<p>They genuinely don't see that people feel they have to give in to Google's demands or face irrelevance.</p>

<p>To reiterate - I think <code>&lt;toast&gt;</code> is a good idea. But Google have presented it in such an arrogant way - and with no user research - that I'm getting afraid of what they'll do next.</p>

<p>It looks like you've finished writing this blog post. Would you like help publishing it?</p>

<p>(And, a special note for Geeks like me. All analogies break down eventually. They are a rhetorical device used to illustrate a problem space - not to fully map it out. Please don't let the inconsistencies of the analogy be the focus of your comments.)</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=32278&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/06/introducing-the-new-html-element-welcome/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Adding Sign Language to HTML5 video]]></title>
		<link>https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/</link>
					<comments>https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 20 May 2019 11:31:41 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[video]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=32106</guid>

					<description><![CDATA[I watched this video from my colleagues in NHS England - it&#039;s the first time I&#039;ve seen a Sign Language overlay on a Twitter video.  NHS@NHSukNeed help fast, but not sure what to do? Go straight to 111.nhs.uk . To find out more about NHS 111 including how to use the NHS 111 BSL interpreter service visit nhs.uk/111  #NHS111 pic.x.com/tk18uvm2vy❤️ 16💬 1🔁 016:00 - Sat 18 May 2019  Is it possible to ha…]]></description>
										<content:encoded><![CDATA[<p>I watched this video from my colleagues in NHS England - it's the first time I've seen a Sign Language overlay on a Twitter video.</p>

<blockquote class="social-embed" id="social-embed-1129778677087166464" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/NHSuk" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-square" src="data:image/webp;base64,UklGRn4BAABXRUJQVlA4IHIBAABwCACdASowADAAPrVOnkunJCKhqrVdUOAWiWQAzWlTvmegD/zTEsa4F8N3TusDF39FAihHrVS6OAjLjouVtVjNonla8VgJKS9PGNaAAP76TMdEcuQ49xKkWnmeoJm5REt2GRhoakL0w+HXgtOC0NKE4OzvpoKZmWaZUfsm3NQOYyWhYbpfdvtRTwceZxH1t3QV4U8dmFjBgxziMBGEO/KQjAROCZ51L5rOkSjql6nu7xzizTLPXnCb5sxJlfD65kw/WnnEG/278po/YCH3h+APLk0PcNKd+ArFaZbDgfWaELfSKNjxMNHKn2R8A/UJxpVShFl1VvXdb1kML/xyyCJtr6Kekxh10CTNwtMN6Q3KzdfydDClLHg2p/SuT1yJvVymTgLNyR9crecN7272d7kuJQ3uc67GzS0v1EfbzpelhdvW2bYWr+qItS5PL2FcInUHJhNjtQ7gV+rJhi3vIdKys5gn/tQAjTM3/3JxFG8RZAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">NHS</p>@NHSuk</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Need help fast, but not sure what to do? Go straight to <a href="http://111.nhs.uk">111.nhs.uk</a> . <br>To find out more about NHS 111 including how to use the NHS 111 BSL interpreter service visit <a href="http://nhs.uk/111">nhs.uk/111</a>  <a href="https://twitter.com/hashtag/NHS111">#NHS111</a> <a href="https://twitter.com/NHSuk/status/1129778677087166464/video/1">pic.x.com/tk18uvm2vy</a><div class="social-embed-media-grid"><video class="social-embed-video" controls="" src="https://video.twimg.com/amplify_video/1127900756332425216/vid/1280x720/Ad_VD01kjTZwb1QG.mp4?tag=12" poster="data:image/webp;base64,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" width="550"></video></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/NHSuk/status/1129778677087166464"><span aria-label="16 likes" class="social-embed-meta">❤️ 16</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-05-18T16:00:01.000Z" itemprop="datePublished">16:00 - Sat 18 May 2019</time></a></footer></blockquote>

<p>Is it possible to have <em>multiple</em> Sign Languages available to a video?</p>

<p>What you may not know is that <a href="https://www.theguardian.com/notesandqueries/query/0,5753,-24011,00.html">British Sign Language and American Sign Language are completely different languages</a>. Not like written English and American English with the occasional difference in spelling, but mutually incomprehensible.</p>

<iframe title="American and British Sign Language are different so an ASL user can't understand a BSL user" width="620" height="465" src="https://www.youtube.com/embed/32vc8sHmWTo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Wouldn't it be nice if users could flip between different Sign Languages as easily as different subtitles?</p>

<p>HTML5 gives us the power to add multiple subtitles to a video. For example:</p>

<pre><code class="language-html">&lt;video&gt;
   &lt;source src="example.mp4" type="video/mp4"&gt;
   &lt;track label="English" kind="subtitles" srclang="en" src="en.vtt" default&gt;
   &lt;track label="Español" kind="subtitles" srclang="es" src="es.vtt"&gt;
&lt;/video&gt;
</code></pre>

<p>How could we do the same for Sign Language?</p>

<aside>(I haven't actually asked anyone who uses Sign Language if this would be useful. It's just me noodling around with web technology.)</aside>

<h2 id="overlays"><a href="https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/#overlays">Overlays</a></h2>

<p>The aim is to overlay one video on top of another. That is, have the main video in the background and the the person signing in front.</p>

<p>Here's a simple way to do it in HTML.  Two videos, in a <code>&lt;div&gt;</code>.</p>

<pre><code class="language-html">&lt;div class="video-container"&gt;
   &lt;video class="main" autoplay&gt;
      &lt;source src="video.mp4" type="video/mp4"&gt;
   &lt;/video&gt;
   &lt;video class="sign" autoplay&gt;
      &lt;source src="bsl.mp4"   type="video/mp4"&gt;
   &lt;/video&gt;
&lt;/div&gt;
</code></pre>

<p>Then some CSS to layer one on top of the other:</p>

<pre><code class="language-css">.video-container {
  position:relative;
  width:400px;
}
.main {
    height: 200px;
    width: 400px;
    float: left;
    position: absolute; 
}
.sign {
    width: 100px;
    position: absolute;
    bottom:-200px;
    right:0px;
}
</code></pre>

<p>That gives you this effect:</p>

<div style="position:relative;width:640px;height:400px;max-width:100%;">
   <video class="mainVideo" autoplay="" loop="" style="height: 360px;
    width: 640px;
    float: left;
    position: absolute;">
      <source src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/greet.webm" type="video/webm">
   </video>
   <video class="signVideo" autoplay="" loop="" style="
    width: 35%;
    position: absolute;
    bottom:50px;
    right:15px;">
      <source src="https://shkspr.mobi/blog/wp-content/uploads/2019/05/sign.webm" type="video/webm">
   </video>
</div>

<p>There's deliberately no audio, and the Signing is not related to the main video. This is just an experiment. My CSS may break in unusual ways!</p>

<p><small>Source videos Creative Commons - <a href="https://www.youtube.com/watch?v=ZlO8Si2OkKk">How to greet someone in English</a> and <a href="https://www.youtube.com/watch?v=-2O_ymoCIR0">Learn Basic Greetings in British Sign Language</a>.</small></p>

<p>Three points to note:</p>

<ol>
<li>There's no synchronisation - both are set to autoplay, but some JS magic will be needed to keep them both in sync, or to pause at the same time.</li>
<li>No way to switch between different Sign Languages. Again, will need some JS to do that.</li>
<li>No transparency.</li>
</ol>

<p>The last one is very annoying.</p>

<h2 id="alpha-video"><a href="https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/#alpha-video">Alpha Video</a></h2>

<p>Most Signers are usually "green screened" - that is, the background image is transparent and they are seamlessly overlayed onto the video.</p>

<p>HTML5 videos don't have an "alpha" channel. That is, no transparency. <a href="https://developers.google.com/web/updates/2013/07/Alpha-transparency-in-Chrome-video">Chrome had an experimental alpha flag</a> - but that doesn't seem to have gone very far.</p>

<p>There are <a href="https://github.com/m90/seeThru">some hacky open source plugins</a>, and a few <a href="https://jakearchibald.com/scratch/alphavid/">experiments using canvas</a> - but nothing mainstream.</p>

<h2 id="separate-video-tracks"><a href="https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/#separate-video-tracks">Separate Video Tracks</a></h2>

<p>The final alternative is to produce multiple videos, each with a different Sign Language superimposed. In which case, you'd need a small user interface asking the user which video they want to see.</p>

<h2 id="standards"><a href="https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/#standards">Standards</a></h2>

<p><a href="https://shkspr.mobi/blog/2018/02/updating-all-the-examples-in-the-html5-spec/">I do some work on web standards</a> - but I'm ignorant about this area.  It looks like there <a href="https://gingertech.net/2011/05/01/html5-multi-track-audio-or-video/">was some attempts at standardising having multiple video tracks</a>, or <a href="https://www.w3.org/WAI/PF/HTML/wiki/Media_Multitrack_Change_Proposals_Summary">improving the accessibility of web video</a> - but they don't seem to have got much further.</p>

<p>I suppose what I'm looking for is:</p>

<pre><code class="language-html">&lt;video controls&gt;
  &lt;source src="video.mp4" type="video/mp4"&gt;
  &lt;video label="British Sign Language" kind="overlay" srclang="sgn-GB" src="bsl.mp4"&gt;
  &lt;track label="English" kind="subtitles"  srclang="en" src="en.vtt" default&gt;
  &lt;audio label="English" kind="Commentary" srclang="en" src="en.mp3" default&gt;
&lt;/video&gt;
</code></pre>

<p>Would that be useful, I wonder?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=32106&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/05/adding-sign-language-to-html5-video/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		<enclosure url="https://video.twimg.com/amplify_video/1127900756332425216/vid/1280x720/Ad_VD01kjTZwb1QG.mp4?tag=12" length="3000978" type="video/mp4" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2019/05/greet.webm" length="756368" type="video/webm" />
<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2019/05/sign.webm" length="824620" type="video/webm" />

			</item>
		<item>
		<title><![CDATA[A report from the AMP Advisory Committee Meeting]]></title>
		<link>https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/</link>
					<comments>https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 14 May 2019 11:05:04 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[amp]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31858</guid>

					<description><![CDATA[I don&#039;t like AMP.  I think that Google&#039;s Accelerated Mobile Pages are a bad idea, poorly executed, and almost-certainly anti-competitive.  So, I decided to join the AC (Advisory Committee) for AMP. I don&#039;t want them surrounded with sycophants and yes-men.  A few weeks ago, a bunch of the AC met in London for our first physical meeting after several exploratory video calls.  These are my…]]></description>
										<content:encoded><![CDATA[<p><a href="https://shkspr.mobi/blog/2016/11/removing-your-site-from-amp/">I don't like AMP</a>.  I think that Google's Accelerated Mobile Pages are a bad idea, poorly executed, and almost-certainly anti-competitive.</p>

<p>So, <a href="https://shkspr.mobi/blog/2018/09/snarking-on-the-internet/">I decided to join the AC</a> (Advisory Committee) for AMP. I don't want them surrounded with sycophants and yes-men.  A few weeks ago, a bunch of the AC met in London for our first physical meeting after several exploratory video calls.</p>

<p>These are my impressions and highlights of the meeting. You should also <a href="https://github.com/ampproject/meta-ac/blob/master/meetings/2019-03-f2f.md">read the official minutes</a> to get a more rounded view of the issues.</p>

<p>I am not representing my employer while working on the AC. I do not get paid for being a member - although our host (Akamai) provided refreshments, and another member paid for lunch. These views are mine and mine alone. I will be respecting <a href="https://www.chathamhouse.org/about/chatham-house-rule">the Chatham House Rule</a>.</p>

<h2 id="amp-isnt-loved-by-publishers"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#amp-isnt-loved-by-publishers">AMP isn't loved by publishers</a></h2>

<p>We heard, several times, that publishers don't like AMP.  They feel forced to use it because otherwise they don't get into Google's news carousel - right at the top of the search results.</p>

<p>Some people felt aggrieved that all the hard work they'd done to speed up their sites was for nothing. They felt that they had a competitive advantage against slower publishers. That was destroyed by AMP.</p>

<p>My recommendation is that Google stop <em>requiring</em> that organisations use Google's proprietary mark-up in order to benefit from Google's promotion.</p>

<h2 id="amp-is-not-accessible"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#amp-is-not-accessible">AMP is not accessible</a></h2>

<p>There has not been a thorough accessibility review of AMP. Many of the components are not accessible.</p>

<p>This is legally and morally troubling. AMP need to do much better at testing accessibility. I also think that their validator should refuse to pass a page if it doesn't meet a threshold of automatic accessibility testing.</p>

<h2 id="no-user-research"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#no-user-research">No user research</a></h2>

<p>AMP claims to be doing the best for the user. But they have published no user research about what users want, how they interact with components, or what they have difficulty with.
The launch of AMP Email highlights this. It is impossible for a publisher to use without understanding the user needs it attempts to solve.</p>

<p>I don't want AMP to publish videos of users, or other identifiable information. We need to see the same sort of publication as you'd deliver to your CEO.</p>

<p>Without user research support, there's no acceptable route to creating new AMP components.</p>

<h2 id="amp-spreads-fake-news"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#amp-spreads-fake-news">AMP spreads fake news</a></h2>

<p>When you visit an AMP page, your URL bar shows <code>google.com/amp/....</code> - that has led to lots of extremely dubious content being shared by people who think they're looking at an "authoritative" Google Page.</p>

<p>Removing the URL bar is not the answer. Users need to be able to see who is <em>actually</em> responsible for publishing the content they are reading.  Obfuscating it damages the web ecosystem.</p>

<p>Perhaps Signed Exchanges are the answer?</p>

<h2 id="signed-exchanges-are-not-the-answer"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#signed-exchanges-are-not-the-answer">Signed Exchanges are not the answer</a></h2>

<p>Yet another Google product to solve the mess created by a different Google product!
<a href="https://wicg.github.io/webpackage/draft-yasskin-http-origin-signed-responses.html">Signed Exchanges</a> are complicated.  Basically, a website packages up a page and cryptographically signs it. An <em>entirely different</em> site can then serve the bundle but <strong>the browser shows the URL of the original site!</strong></p>

<p>That is, I download a page from Google, but my browser says "example.com".</p>

<p>It looks like Firefox and Safari won't support this. Content Delivery Networks are worried about how much traffic it will take from them. Security experts worry about the holes in the scheme. And publishers fear losing analytics.</p>

<p>It's a clever idea - and possibly really useful for a fully distributed network. But the current implementation looks like Google trying to keep users within its walled garden with no hope of escape.</p>

<h2 id="browser-compatibility"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#browser-compatibility">Browser compatibility</a></h2>

<p>When a user uses Chrome for Android to search Google, they get AMP results. When a user tries the same search in Firefox, they only get regular results. We found the same thing occurring with several other mobile browsers.</p>

<p>Google has effectively said "You have to use our browser on our search engine to get the fastest content written in our langauge."</p>

<p>That strikes me as possibly being anti-competitive and certainly antithetical to the idea of an open and neutral web.</p>

<h2 id="my-top-recommendations"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#my-top-recommendations">My top recommendations</a></h2>

<ul>
<li>Publish all user research

<ul>
<li>Don't allow new components to be created without a clear user story and research to support them.</li>
</ul></li>
<li>Accessibly audit

<ul>
<li>Don't validate pages which can't pass an automated a11y test</li>
</ul></li>
<li>Stop the forced bundling

<ul>
<li>Let users opt-out of seeing AMP pages</li>
<li>Don't require AMP for prominent placement</li>
<li>Stop discriminating against non-Google browsers</li>
</ul></li>
<li>Reconsider AMP4Email

<ul>
<li>Lots of concerns from smaller email providers</li>
<li>Security and archiving concerns</li>
</ul></li>
<li>Work with the ecosystem rather than imposing</li>
</ul>

<h2 id="conclusions"><a href="https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/#conclusions">Conclusions</a></h2>

<p>The meeting was good natured. While there were some robust discussions, the AC seemed fairly unified that Google had to seriously rework parts of the AMP project.</p>

<p>As I said in the meeting - if it were up to me, I'd go "Well, AMP was an interesting experiment. Now it is time to shut it down and take the lessons learned back through a proper standards process."</p>

<p>I suspect that is unlikely to happen. Google shows no sign of dropping AMP. Mind you, I thought that about Google+ and Inbox, so who knows!</p>

<p>My personal view as advisory committee member - if AMP is to continue then it needs to become a <em>much</em> better citizen of the open web.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31858&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/05/a-report-from-the-amp-advisory-committee-meeting/feed/</wfw:commentRss>
			<slash:comments>14</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Why bother with What Three Words?]]></title>
		<link>https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/</link>
					<comments>https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 28 Mar 2019 12:26:58 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[open standards]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[what3words]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31803</guid>

					<description><![CDATA[I&#039;ll be wording this post carefully as What 3 Words (W3W) have a tenacious PR team and, probably, have a lot more lawyers than I do.  W3W is a closed product. It is a for-profit company masquerading as an open standard. And that annoys me.  A brief primer.   The world is a sphere. We can reference any point on the surface of Earth using two co-ordinates, Longitude and Latitude. Long/Lat are…]]></description>
										<content:encoded><![CDATA[<p>I'll be wording this post carefully as <a href="https://what3words.com/">What 3 Words</a> (W3W) have a tenacious PR team and, probably, have a lot more lawyers than I do.</p>

<p>W3W is a closed product. It is a for-profit company masquerading as an open standard. And that annoys me.</p>

<p>A brief primer.</p>

<ul>
<li>The world is a <a href="https://simple.wikipedia.org/wiki/Oblate_spheroid">sphere</a>.</li>
<li>We can reference any point on the surface of Earth using two co-ordinates, Longitude and Latitude.</li>
<li>Long/Lat are numbers. They can be as precise or as vague as needed.</li>
<li>Humans can't remember long strings of numbers, and reading them out is difficult.</li>
</ul>

<p>W3W aims to solve this. It splits the world into a grid, and gives every square a unique three-word phrase.</p>

<p>So the location <code>51.50799,-0.12803</code> becomes <code>///mile.crazy.shade</code></p>

<p>Brilliant, right?</p>

<p>No.</p>

<p>Here's all the problems I have with W3W.</p>

<h2 id="it-isnt-open"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#it-isnt-open">It isn't open</a></h2>

<p>The algorithm used to generate the words is proprietary. You are not allowed to see it. You cannot find out your location without asking W3W for permission.</p>

<p>If you want permission, you have to agree to some pretty <a href="https://what3words.com/terms/">long terms and conditions</a>. And understand their <a href="https://what3words.com/privacy/">privacy policy</a>. Oh, and an <a href="https://what3words.com/api-licence-agreement">API agreement</a>.  And then make sure you <a href="https://web.archive.org/web/20190401024948/https://what3words.com/patents/">don't infringe their patents</a>.</p>

<p>You cannot store locations. You have to let them analyse the locations you look up. Want to use more than 10,000 addresses? Contact them for prices!</p>

<p>It is the antithesis of open.</p>

<h2 id="cost"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#cost">Cost</a></h2>

<p>W3W refuses to publish their prices. You have to contact their sales team if you want to know what it will cost your organisation.</p>

<p>Open standards are free to use.</p>

<h2 id="earthquakes"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#earthquakes">Earthquakes</a></h2>

<p>When an earthquake struck Japan, street addresses didn't change <em>but</em> that <a href="https://slate.com/news-and-politics/2011/03/japanese-earthquake-when-tectonic-plates-shift-does-gps-still-work.html">their physical location did</a>.</p>

<p>That is, a street address is <em>still</em> 42 Acacia Avenue - but the Longitude and Latitude has changed.</p>

<p>Perhaps you think this is an edge case? It isn't. <a href="https://www.nationalgeographic.com/science/article/australia-moves-gps-coordinates-adjusted-continental-drift">Australia is drifting so fast that GPS can't keep up</a>.</p>

<p>How does W3W deal with this? Their grid is static, so <a href="https://web.archive.org/web/20191213153136/https://support.what3words.com/en/articles/2212848-how-does-what3words-handle-continental-drift">any tectonic activity means your W3W changes</a>.</p>

<h2 id="internationalisation"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#internationalisation">Internationalisation</a></h2>

<p>Numbers are <em>fairly</em> universal. Lots of countries use 0-9. English words are <em>not</em> universal.  How does W3W deal with this?</p>

<p>Is "cat.dog.goose" straight translated into French? No! Each language has its own word list.</p>

<p>There is no way to translate between languages. You have to beg W3W for permission for access to their API.  They do not publish their word lists or the mappings between them.</p>

<p>So, if I want to tell a French speaker where <code>///mile.crazy.shade</code> is, I have to use <code>///embouchure.adjuger.saladier</code></p>

<p>Loosely translated back as <code>///mouth.award.bowl</code> an <a href="https://map.what3words.com/mouth.award.bowl">entirely different location</a>!</p>

<p>You're not allowed to know what word lists W3W use. They take a <a href="https://web.archive.org/web/20190401095946/https://support.what3words.com/hc/en-us/articles/203105521-Is-a-3-word-address-in-French-or-any-other-language-a-translation-of-the-same-3-words-in-English-">paternalistic attitude</a> to creating their lists - they know best. You cannot propose changes.</p>

<p>Anecdotally, their <a href="https://news.ycombinator.com/item?id=17423421">non-English word lists are confusing even for native speakers</a>.</p>

<h2 id="cultural-respect"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#cultural-respect">Cultural Respect</a></h2>

<p>Numbers are (mostly) culturally neutral. Words are not.  Is "mile.crazy.shade" a respectful name for a war memorial?  How about <a href="https://map.what3words.com/tribes.hurt.stumpy"><code>///tribes.hurt.stumpy</code></a> for a temple?</p>

<p>How do you feel about <a href="https://map.what3words.com/weepy.lulls.emerge"><code>///weepy.lulls.emerge</code></a> and <a href="https://map.what3words.com/grouchy.hormone.elevating"><code>///grouchy.hormone.elevating</code></a> both being at Auschwitz?  Or <a href="https://map.what3words.com/klartext.bestückt.vermuten"><code>///klartext.bestückt.vermuten</code></a> - "cleartext stocked suspect"?</p>

<p>This is a classic computer science problem. Every sufficiently long word list can eventually be recombined into a potentially offensive phrase.</p>

<h2 id="open-washing"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#open-washing">Open Washing</a></h2>

<p>W3W know that <a href="https://wiki.openstreetmap.org/wiki/What3words">the majority of technical people are not fooled</a> by their attempts to lock down addressing.</p>

<p>They include this paragraph to attempt to prove their openness:</p>

<blockquote><p>If we, what3words ltd, are ever unable to maintain the what3words technology or make arrangements for it to be maintained by a third-party (with that third-party being willing to make this same commitment), then we will release our source code into the public domain. We will do this in such a way and with suitable licences and documentation to ensure that any and all users of what3words, whether they are individuals, businesses, charitable organisations, aid agencies, governments or anyone else can continue to rely on the what3words system.</p></blockquote>

<p>I don't know how they propose to bind a successor organisation. They don't say <em>what</em> licences they will use. If they go bust, there's no guarantee they'll be legally able to release this code, nor may they have the time to do so.</p>

<p>There's nothing stopping W3W from releasing their algorithms now, subjecting them to scrutiny by the standards community.  They could build up a community of experts to help improve the system, they could work with existing mapping efforts, they could help build a useful and open standard.</p>

<p>But they don't. They guard their secrets and actively promote their proprietary product in the hope it will become widely accepted and then they can engage in rent-seeking behaviour.</p>

<h2 id="this-is-not-a-new-argument"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#this-is-not-a-new-argument">This is not a new argument</a></h2>

<p>My mate <a href="https://blog.ldodds.com/2016/06/14/what-3-words-jog-on-mate/">Leigh wrote about this three years ago</a>. <a href="https://knowwhereconsulting.co.uk/blog/location-grid-not-an-address/">Lots</a> <a href="https://medium.com/@piesse/open-location-code-what3words-74a3f810c18d">of</a> <a href="https://news.ycombinator.com/item?id=18646650">people</a> <a href="https://www.quora.com/What-is-your-review-of-what3words">have</a> <a href="https://stiobhart.net/2016-01-15-stupidest-idea-ever/">criticised</a> <a href="https://web.archive.org/web/20160323130517/https://blog.telemapics.com/?p=589">W3W</a>.</p>

<blockquote class="social-embed" id="social-embed-753653845859962880" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/gravitystorm" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRioCAABXRUJQVlA4IB4CAACQCwCdASowADAAPrVQoUunJKMhqqlY4BaJYwC9kcDbBRl9I9aJ1IulQrnBezYKZA7Tb4F4ZSvtPKxRN6Z9ut3m56tnhSx5femtVzw7zKLNrLf//NlDDtpGA/9Dc6aOWHcNsLa2wAD8/+1/lM6uvsc1ZQBbzfK2qc9ZZWPliCiCKdQsdhd13xbCLrYUVbL5TnDdmbN0jdjoqdczdEqUytIrvmJ9wEGNOoRAKC/uwxBFrWxjS707IimDPJ/UFMZ5UC/fMeYTGR3ZjFWzo4x73XOSL55x8PCWixzOT2PsZ2c/hn6pikKCb8lNVjMWVq7S233TASgprafVCgBqqGZD7PhbVTsNVhBhufNKHIb6BSoe8T0WOTxzbjudoGb50CMcuW4uYTYRUeZpGFJops8sP1KN6I351Z1t94AqHSAetcx/8sgvN8Tnj+0FsB8LizAzpzXyP63bPi3U7D3RbiftgDZnNIfgxZC5Yp54VXZ0h8XJBB0yOCcdQ3RdHFwfMzQCofRIZORGYSIZK5CEBZWMRxXgrrOS9NSBD3u4qp7OX3spOqdUCojLAe/uRThuRit6AfDOjAQGFHNj7JC6cPLPBYXMHoMT/GVqlsHzX71XNGddPjgwJ27mT4JNlQ4BooVtLds+Y8EkC9rH0n2iamEpq4tqXN8YjIZOzMYiMEpMLpiqyka/VvijX4gdLB0GIBy3sTwFetxLSNPpoyPjUxYAAA==" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Andy Allan @gravitystorm@gravitystorm.co.uk</p>@gravitystorm</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">.<a href="https://twitter.com/what3words">@what3words</a> is bad technical idea, and ethically terrible too. But all VCs like patented economic rents so the juggernaut rolls on. <a href="https://twitter.com/hashtag/geomob">#geomob</a></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/gravitystorm/status/753653845859962880"><span aria-label="29 likes" class="social-embed-meta">❤️ 29</span><span aria-label="6 replies" class="social-embed-meta">💬 6</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2016-07-14T18:14:13.000Z" itemprop="datePublished">18:14 - Thu 14 July 2016</time></a></footer></blockquote>

<p>But W3W have a great PR team - pushing press releases which are then reported as <a href="https://www.bbc.co.uk/news/technology-40935774">uncritical</a> <a href="https://www.bbc.co.uk/news/technology-47705912">news</a>.</p>

<p>The most recent press release contains a <em>ludicrous</em> example:</p>

<ul>
<li>Person dials the emergency services</li>
<li>Person doesn't know their location</li>
<li>Emergency services sends the person a link</li>
<li>Person clicks on link, opens web page</li>
<li>Web page geolocates user and displays their W3W location</li>
<li>Person reads out their W3W phrase to the emergency services</li>
</ul>

<p>Here's the thing... If the person's phone has a data connection - the web page can just send the geolocation directly back to the emergency services! No need to get a human to read it out, then another human to listen and type it in to a different system.</p>

<p>There is literally no need for W3W in this scenario. If you have a data connection, you can send your precise location without an intermediary.</p>

<h2 id="what-next"><a href="https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/#what-next">What Next?</a></h2>

<p>W3W succeeds because it has a superficially simple solution to a complex problems. It is a brilliant lesson in how marketing and PR can help a technologically inferior project look like it is a global open solution.</p>

<p>I'm not joking. Their <a href="https://web.archive.org/web/20190401075718/https://www.edelman.co.uk/work/what3words/">branding firm says</a>:</p>

<blockquote><p>Edelman helped what3words frame their story to be compelling by tapping into human emotion.
We also created a story for CEO Chris Sheldrick about how having an address can drive social transformation and business efficiency, securing profiling and speaker opportunities.
Through paid social campaigns we re-targeted these stories, getting through to the decision makers that mattered most.
We articulated their purpose narrative and refined their strategy to engage investors and excite the media.</p></blockquote>

<p>It takes <a href="https://twitter.com/ziobrando/status/289635060758507521">too much time to refute all their claims</a> - but we must. Whenever you see people mentioning What3Words, politely remind them that it is not an open standard and should be avoided.</p>

<blockquote class="social-embed" id="social-embed-1110606981142925313" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Your periodic reminder that W3W is a closed and proprietary system, with opaque licencing, hefty pricing, and poor internationalisation.<br>It does have a very good PR team though.<blockquote class="social-embed" id="social-embed-1110589231913730048" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/BBCTech" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRhoCAABXRUJQVlA4IA4CAAAQCwCdASowADAAPrVIoEqnJCMhpzgO2OAWiWgAvgAwR6Yku8lf72gBbKsYMjesB0KeJP6j6wN3B5s/Qzzlag/SAPxEmFq+8wcewp4+scMbFcvsSkLeYOvPmIv669qRwRSgAP72gLISoUlr9Gubns/9T266/90eTO654nmf/sHf/6Dv/9B39zeqetfJ9bvnbpn49iyTKm6dkY464QJP/SpTzf+p7kbM0/cnucJhluCY+WG/yZioSiyPDUikPlla9soDUMk4lSkoz8GFwrCj6tPI3qvDvEu36Sjm2z9qT6r16pNDr1jj5OQRhHn2dgzCYjDpu3bf/mu8ibv8XJHhkaqpv4GMPWghU/OzOY2OMfMOQT1X6e+NkY6zK+Ti8VwlFGj+q4yQoAqyyJM2oJmWF41WU6IiXxCL2kFe16bciVA6b8TllGPSAOUzvXe8eLvipls+3l+utHFTwl+qe8kBVTo1KwD687WExY7gz04YnFxRQWP/a7Tc0p4OdJTaKbUDAZtB67lZm6+1zEBoCnbgaDaftx9CBTeKCfP+OctvGFp2uGlR/8JNCZQyRTuq3ATPPkbCHqyahUpd0cOHXgDvSqdfsGKEny2Z1bX08/v/d+qcdFpg2RGCho0B2j7afEbyhBa3Wfsav4S5l4vGYrEZw1AEMnYZQ6qv4ZQz+7Z68XrDz5RTtfa/vLJvZKKrRcAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">BBC News Technology</p>@BBCTech</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Three-unique-words 'map' used to rescue mother and child <a href="https://bbc.in/2FBnJ5O">bbc.in/2FBnJ5O</a></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/BBCTech/status/1110589231913730048"><span aria-label="63 likes" class="social-embed-meta">❤️ 63</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="33 reposts" class="social-embed-meta">🔁 33</span><time datetime="2019-03-26T17:08:01.000Z" itemprop="datePublished">17:08 - Tue 26 March 2019</time></a></footer></blockquote></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1110606981142925313"><span aria-label="152 likes" class="social-embed-meta">❤️ 152</span><span aria-label="7 replies" class="social-embed-meta">💬 7</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-03-26T18:18:33.000Z" itemprop="datePublished">18:18 - Tue 26 March 2019</time></a></footer></blockquote>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31803&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/03/why-bother-with-what-three-words/feed/</wfw:commentRss>
			<slash:comments>158</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Plot twist!]]></title>
		<link>https://shkspr.mobi/blog/2019/01/plot-twist/</link>
					<comments>https://shkspr.mobi/blog/2019/01/plot-twist/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 07 Jan 2019 12:53:34 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[meta]]></category>
		<category><![CDATA[nhs]]></category>
		<category><![CDATA[open standards]]></category>
		<category><![CDATA[regeneration]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[work]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30936</guid>

					<description><![CDATA[A mysterious woman, with a non-London accent and blonde hair, reached out her hand. She asked me a simple, yet terrifying, question - &#34;Do you want to come on an adventure?&#34;    Sadly, Hadley Beeman does not have a TARDIS (Well, as far as any of us can tell...). What she does have is an interesting new job for me. Take a deep breath, because it&#039;s a heck of a long title:  Senior Technology Advisor…]]></description>
										<content:encoded><![CDATA[<p>A mysterious woman, with a non-London accent and blonde hair, reached out her hand. She asked me a simple, yet terrifying, question - "Do you want to come on an adventure?"</p>

<div style="width:100%;height:0;padding-bottom:41%;position:relative;"><iframe src="https://giphy.com/embed/3vAkYOKkAKHq5wNG55" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>

<p>Sadly, <a href="https://twitter.com/hadleybeeman">Hadley Beeman</a> does not have a TARDIS (<small>Well, as far as any of us can tell...)</small>. What she <em>does</em> have is an interesting new job for me. Take a deep breath, because it's a heck of a long title:</p>

<p><code>Senior Technology Advisor to the Chief Technology Advisor to the Secretary of State for Health and Social Care</code></p>

<p>Sweet! So, what does a STAttCTAttSoSfHaSC do?  Apart from <a href="https://shkspr.mobi/blog/2008/01/im-a-former-scrable-champion/">scoring 25 points in Scrabble</a>, obviously?</p>

<p>I'm going to help improve the health and social care system - within and beyond the NHS. Not all of it, and not necessarily the bits that you'll see, but some of the deep magick which runs the technology behind it.</p>

<p>My job will be to keep saying "Hey! Let's use internationally recognised, free and open standards. Y'know, rather than handing a single company a life-long monopoly."</p>

<p>I'll also occasionally point my Sonic Screwdriver at a bit of kit and say "If we reverse the polarity of the neutron flow, we may be able to replace this with Open Source Software."</p>

<p>This is akin to redesigning and replacing the engine of a plane, while it is in flight.  Without losing altitude or causing the passengers any discomfort.  While under attack from Weeping Angels.</p>

<p>If I'm lucky, the team will help set the course for the future of NHS technology.  I'm not talking AI-powered iPhone apps to show you your polyps in virtual reality - I'm talking about your consultant being able to share data with your GP <a href="https://www.theguardian.com/technology/2017/jul/05/doctors-using-snapchat-to-send-patient-scans-to-each-other-panel-finds">without resorting to SnapChat</a>. Or fax.</p>

<p>Can we put user needs at the heart of technology standards decisions? Can we give <a href="https://en.wikipedia.org/wiki/Clinical_commissioning_group">Clinical Commissioning Groups</a> the tools and frameworks they need to make smarter decisions about technology?  Can we make things open and make things better?</p>

<p>There's only one way to find out...!</p>

<div style="width:100%;height:0;padding-bottom:41%;position:relative;"><iframe src="https://giphy.com/embed/YjvsFlt6uwQRq7sC95" width="100%" height="100%" style="position:absolute" frameborder="0" class="giphy-embed" allowfullscreen=""></iframe></div>

<p>This is a temporary secondment.  I'm grateful to the whole team at GDS for letting me go on this adventure.  Much like the <a href="http://tardis.wikia.com/wiki/Meta-Crisis_Tenth_Doctor">Meta-Crisis 10th Doctor</a> (do keep up), this role has a limited lifespan.  Looks like the 2019 season of "The Terence Eden Adventures" is going to be <em>epic!</em></p>

<p>Allons-y, Alonso!</p>

<iframe title="Allons-y Alonso" width="620" height="349" src="https://www.youtube.com/embed/F6XqulU8Sfs?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30936&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/01/plot-twist/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Limitations of HTML's title element]]></title>
		<link>https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/</link>
					<comments>https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 19 Jun 2018 16:35:19 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[HTML]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[web]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=29708</guid>

					<description><![CDATA[How much do you know about the humble &#60;title&#62; tag?  It has been there since the earliest HTML specification.  The 1995 spec says:  There may only be one title in any document. It should identify the content of the document in a fairly wide context. It may not contain anchors, paragraph marks, or highlighting.  Remarkably little has changed in the intervening decades.  The modern HTML5 spec…]]></description>
										<content:encoded><![CDATA[<p>How much do you know about the humble <code>&lt;title&gt;</code> tag?  It has been there since the earliest HTML specification.  The <a href="https://www.w3.org/MarkUp/1995-archive/html-spec.html">1995 spec</a> says:</p>

<blockquote><p>There may only be one title in any document. It should identify the content of the document in a fairly wide context.
It may not contain anchors, paragraph marks, or highlighting.</p></blockquote>

<p>Remarkably little has changed in the intervening decades.  The <a href="https://www.w3.org/TR/html52/document-metadata.html#the-title-element">modern HTML5 spec</a> defines it as <a href="https://www.w3.org/TR/html52/dom.html#text-content">only containing text</a>.  That means you can't nest tags inside it.  For example, this is invalid:
 <code>&lt;title&gt;I love &lt;em&gt;you&lt;/em&gt;!&lt;/title&gt;</code>
Try it - you won't get emphasised text.</p>

<p>This is a problem for internationalisation and accessibility - and one the <a href="https://github.com/w3c/html/issues/1292">HTML5 editors have been wrestling with</a>.</p>

<p>(Usual disclaimer, I'm HMG's representative on the W3C's Advisory Committee and I'm an editor on HTML5 - these are my personal views.)</p>

<p>Let's imagine this potential page title which includes <em>multiple</em> languages:</p>

<pre><code class="language-html">&lt;html lang="en-gb"&gt;
&lt;head&gt;
   &lt;title&gt;A review of La vie en rose&lt;/title&gt;
   ...
</code></pre>

<p>At the moment a screen reader would assume the whole title, including "la vie en rose", is in British English (the document's language).  Hearing a computerised voice reading French in a British accent is akin to hearing Vogon poetry read in <a href="https://www.thetimes.co.uk/article/all-right-guv-my-accent-in-mary-poppins-was-cobblers-dick-van-dyke-admits-k39snnvxl">Dick Van Dyke's "cockornay"</a>. Unpleasant for all involved.</p>

<p>What we <em>want</em> to write is something like:</p>

<pre><code class="language-html">&lt;html lang="en-gb"&gt;
&lt;head&gt;
   &lt;title&gt;
      &lt;span lang="en"&gt;A review of&lt;/span&gt; &lt;span lang="fr"&gt;La vie en rose&lt;/span&gt;
   &lt;/title&gt;
   ...
</code></pre>

<p>This is invalid HTML - in most browsers it will display like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/06/Broken-title-tab.png" alt="The raw HTML displays in the tab." width="328" height="102" class="aligncenter size-full wp-image-29714">

<p>Incidentally, <a href="https://meiert.com/en/blog/html-semantics-of-title-element-content/">this is a long known limitation</a>.  How can we fix it?</p>

<h2 id="possible-solutions"><a href="https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/#possible-solutions">Possible Solutions</a></h2>

<ol>
<li>Change the element</li>
<li>Make a new meta element</li>
<li>Something else</li>
</ol>

<h3 id="changing-the-element"><a href="https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/#changing-the-element">Changing the element</a></h3>

<p>This is impossible if we want to maintain backwards compatibility.  Either we accept that older browsers will see garbled titles, or that newer browsers may get confused by older pages.</p>

<p>Any page with a title like <code>&lt;title&gt;This page is about the &lt;span&gt; element&lt;/title&gt;</code> is going to require a work-around for new browsers.</p>

<h3 id="new-meta-element"><a href="https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/#new-meta-element">New meta element</a></h3>

<p>How about a new element like <code>&lt;title-multilang&gt;</code></p>

<p>Nope! If a browser doesn't recognise an element in the <code>&lt;head&gt;</code> it will print it in the body.</p>

<h3 id="something-else"><a href="https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/#something-else">Something else</a></h3>

<p>Here are two existing things which could be repurposed.</p>

<p>The accessibility attribute <a href="https://www.w3.org/TR/html-longdesc/"><code>longdesc</code></a> lets an author place a "long description" elsewhere in the page. It is currently only valid on the <code>&lt;img&gt;</code> element. But let's imagine it used elsewhere:</p>

<pre><code class="language-html">&lt;title longdesc="#desc"&gt;A review of La vie en rose&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
   &lt;h1 id="desc"&gt;&lt;span lang="en"&gt;A review of&lt;/span&gt; &lt;span lang="fr"&gt;La vie en rose&lt;/span&gt;&lt;/h1&gt;
   ...
</code></pre>

<p>That might help screen readers - but it doesn't improve the semantics of the page.</p>

<p>Here's some <a href="https://schema.org/alternativeHeadline">Schema.org MicroData</a>:</p>

<pre><code class="language-html">&lt;html lang="en-gb"&gt;
&lt;head itemscope itemtype="https://schema.org/WebPage"&gt;
    &lt;meta itemprop="alternativeHeadline" content="A review of &lt;span lang='fr'&gt;La vie en rose&lt;/span&gt;"/&gt;
    &lt;title&gt;...
</code></pre>

<p>That might be better for semantics, but would require screen readers to support it.</p>

<p>We could also hope that AI improves sufficiently that it can immediately recognise individual words within a sentence are from a different language.  A task which befuddles most humans.</p>

<h2 id="next-steps"><a href="https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/#next-steps">Next steps</a></h2>

<p>What should be done? If you're interested in working on this - come <a href="https://github.com/w3c/html/issues/1292">join in with the HTML5 development process at the W3C</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=29708&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/06/limitations-of-htmls-title-element/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Is HTTP 451 suitable for GDPR blocking?]]></title>
		<link>https://shkspr.mobi/blog/2018/06/is-http-451-suitable-for-gdpr-blocking/</link>
					<comments>https://shkspr.mobi/blog/2018/06/is-http-451-suitable-for-gdpr-blocking/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 10 Jun 2018 14:18:40 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[451]]></category>
		<category><![CDATA[gdpr]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=29678</guid>

					<description><![CDATA[Hello, it&#039;s me - the idiot who helped inspire the HTTP 451 status code. I graciously allowed Tim Bray to do the hard work of getting it through the IETF process, and now it is an official RFC.  Recently, I&#039;ve seen lots of people getting het up about its &#34;misuse&#34; - so I want to clarify a few things.  The GDPR (General Data Protection Regulation) gives people in the EU strong data protection…]]></description>
										<content:encoded><![CDATA[<p>Hello, it's me - the idiot who <a href="https://shkspr.mobi/blog/2012/06/there-is-no-http-code-for-censorship-but-perhaps-there-should-be/">helped inspire the HTTP 451 status code</a>.
I graciously allowed <a href="https://www.tbray.org/ongoing/">Tim Bray</a> to do the hard work of getting it through the IETF process, and now it is <a href="https://shkspr.mobi/blog/2016/03/im-in-an-rfc/">an official RFC</a>.</p>

<p>Recently, I've seen lots of people getting het up about its "misuse" - so I want to clarify a few things.</p>

<p>The GDPR (<a href="https://ico.org.uk/for-organisations/guide-to-the-general-data-protection-regulation-gdpr/">General Data Protection Regulation</a>) gives people in the EU strong data protection rights.</p>

<p>Some companies do not wish to comply with these laws.  Those companies block content to people within the EU.</p>

<p>Here's the kicker - they use HTTP 451 "Unavailable for Legal Reasons".</p>

<blockquote class="social-embed" id="social-embed-1005478829018746886" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/joepie91" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRlwBAABXRUJQVlA4IFABAACQCACdASowADAAPrVIoEwnI6MiKrqqqOAWiWoAqSd2urC3B8OZT3QxGPmmOwIt15xqnwCaDhBv0fiyzFhaz7tvpbk5R7XSECHMKPxvAAD++9lEnJAHVjounfqRoeGKB6NJDDqVndaH/1Bn/qDP/UGeOFWBXvbODEv/SkKwc+56LyI/VJvYvWBP4bWHsWUTo2Cr3ncRZWep3ojqCVZdWPlWPJ+ucySg8zP/vDXJRvL0NGC7fhekZ7YwOHREzamVjtuwjxwzWr9wyBOIDoImzMvXfxKGshmQlQoXaQxuO0BsVJfMwbWxRY9J4yyP9CmWfaLpjzN1hMJxc7VwT9YS71UJjsTPRl+sQP0mrFIPbV21gft4dEYltEKoPuX+OTY2OaQkSJsa6zYi7/fWvCG/iVQu1OEKIV9bpRdRiSnJraC5AFKFgyy0FkDSEaKmgisdMAA=" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Sven Slootweg 🏳️‍🌈 (@joepie91@pixie.town)</p>@joepie91</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Well, this is the first time I've seen a website use the "451: Unavailable For Legal Reasons" HTTP status code. Who would've thought that it would be a result of the GDPR... <a href="https://twitter.com/joepie91/status/1005478829018746886/photo/1">pic.x.com/nzv7obo9a0</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/DfQtVYwX4AAL_DU.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/joepie91/status/1005478829018746886"><span aria-label="7 likes" class="social-embed-meta">❤️ 7</span><span aria-label="0 replies" class="social-embed-meta">💬 0</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2018-06-09T15:56:48.000Z" itemprop="datePublished">15:56 - Sat 09 June 2018</time></a></footer></blockquote>

<p>Is this the correct use of the status code?  Some people are quite sure that it is not right.</p>

<p>I've had extended discussion with people on social media who are convinced that 451 should <em>only</em> be used in the case of government censorship.  Those people are wrong.</p>

<h2 id="heres-what-i-reckon"><a href="https://shkspr.mobi/blog/2018/06/is-http-451-suitable-for-gdpr-blocking/#heres-what-i-reckon">Here's what I reckon</a></h2>

<p>The <a href="https://tools.ietf.org/html/rfc7725">RFC which specifies HTTP 451</a> does not mention censorship <em>once</em>.  Similarly, there are no mentions of governments whatsoever.</p>

<p>From the introduction:</p>

<blockquote><p>This document specifies a Hypertext Transfer Protocol (HTTP) status code for use when a server operator has received a legal demand to deny access to a resource or to a set of resources that includes the requested resource.</p></blockquote>

<p>What is a legal demand? And what does it mean to receive one? (I don't want this to go all "<a href="https://www.youtube.com/watch?v=g31o9ILbmlY">It depends upon what the meaning of the word 'is' is</a>" - but I think this is important).</p>

<p>If a court orders you to remove an illicit photo of me wearing a mankini, you would have received a legal demand. 451 would be appropriate.</p>

<p>What about if my lawyer sends you an email which says "Take down that photo of Terence wearing a mankini or we'll sue you for a million quid"?  I think 451 would be appropriate.</p>

<p>Let's read further. The actual specification is (emphasis added):</p>

<blockquote><p>This status code indicates that the server is denying access to the resource as a <strong>consequence</strong> of a legal demand.</p></blockquote>

<ul>
<li>One does not have to have specifically received a demand. I've never personally been instructed by the courts not to deface money - it's just <a href="https://www.tomscott.com/law/">what UK law demands</a>.</li>
<li>The specification says nothing about the validity of the demand.  Perhaps the demand is mistaken, or wrong, or legally deficient - you can still use 451 while attempting to clarify.</li>
<li>The RFC doesn't mention specificity.  Perhaps the law bans a single page on your site - using 451 on the whole site may make sense for you.</li>
</ul>

<p>These companies have seen a legal demand from EU countries that their citizens' rights must be protected. If they want to continue to abuse their users' privacy without legal consequence, they should block users who could successfully sue them.  451 is appropriate.</p>

<p>If the only way to access a resource would involve serving content which breaks the law, then 451 is appropriate.</p>

<p>We can take another theoretical example.  UK law bans the sale of pistols and some other weaponry. A US site may choose to use 451 to refuse service to users in the UK - even if the site believes in the right to arm bears.  They may not have specifically received a legal demand, but UK law <em>does</em> demand that they don't sell to people in its territory.</p>

<p>The easiest fix would be for these companies to comply with the law and respect their users' privacy. That's what the law demands of them.</p>

<h2 id="media-comprehension"><a href="https://shkspr.mobi/blog/2018/06/is-http-451-suitable-for-gdpr-blocking/#media-comprehension">Media comprehension</a></h2>

<p>I suspect that lots of people get hung up on the number 451 being a direct reference to Ray Bradbury's famous novel about censorship.  Except, like in this case, <a href="https://www.laweekly.com/ray-bradbury-fahrenheit-451-misinterpreted/">Fahrenheit 451 is <em>not</em> about censorship</a>.</p>

<p>Luckily, the Internet works due to <a href="https://www.wired.com/1995/10/ietf/">rough consensus and running code</a>. No one gets damaged if an http code is used incorrectly. And if the majority of sites use 451 to protect users from endless data mining, well that's just fine with me.</p>

<p>Anyway, that's what I reckon. Feel free to disagree with me - I promise I won't sue you.
<small>This does not confer any legally binding protection against lawsuits brought by me. All rights reserved. See back of packet for full terms and conditions. Errors and Omissions Excluded. Not valid in the state of Kentucky. Nil illegitimi carborundum.</small></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=29678&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/06/is-http-451-suitable-for-gdpr-blocking/feed/</wfw:commentRss>
			<slash:comments>13</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[únicode is hard]]></title>
		<link>https://shkspr.mobi/blog/2017/05/unicode-is-hard/</link>
					<comments>https://shkspr.mobi/blog/2017/05/unicode-is-hard/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 29 May 2017 10:17:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[standards]]></category>
		<category><![CDATA[unicode]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=25248</guid>

					<description><![CDATA[In the last couple of months, I&#039;ve been seeing the ú symbol on British receipts. Why?    1963 - ASCII  In the beginning* was ASCII. A standard way for computers to exchange text.  ASCII was originally designed with 7 bits - that means 128 possible symbols. That ought to be enough for everyone, right?  Wrong! ASCII is the American Code for Information Interchange.  It contains a $ symbol, but …]]></description>
										<content:encoded><![CDATA[<p>In the last couple of months, I've been seeing the ú symbol on British receipts. Why?</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/05/Receipts-with-a-missing-pound-sign.jpg" alt="Receipts with a missing pound sign" width="1024" height="401" class="aligncenter size-full wp-image-25251">

<h2 id="1963-ascii"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#1963-ascii">1963 - ASCII</a></h2>

<p>In the beginning* was <a href="https://en.wikipedia.org/wiki/ASCII">ASCII</a>. A standard way for computers to exchange text.  ASCII was originally designed with 7 bits - that means 128 possible symbols. That ought to be enough for everyone, right?</p>

<p>Wrong! ASCII is the <em><strong>A</strong>merican</em> <strong>C</strong>ode for <strong>I</strong>nformation <strong>I</strong>nterchange.  It contains a <code>$</code> symbol, but nothing for other currencies.  That's a problem because we don't all speak American.</p>

<p><small>*ASCII has its origins in the telegraph codes of the early 20th Century. They derive from <a href="https://cs.stanford.edu/people/eroberts/courses/soco/projects/2008-09/colossus/baudot.html">Baudot codes</a> from the 19th Century.</small></p>

<h2 id="1981-extended-ascii"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#1981-extended-ascii">1981 - Extended ASCII</a></h2>

<p>So ASCII gradually morphed into an 8 bit language - and that's where the problems began.  Symbols 0-127 had already been standardised and accepted. What about symbols 128 - 255?</p>

<p>Because of the vast range of symbols needed for worldwide communication - and only 256 symbols available in an 8 bit language - computers began to rely on "<a href="https://en.wikipedia.org/wiki/Code_page">code pages</a>".  The idea is simple, the start of a file contains a code to say what language the document is written in. The computer uses that to determine which set of symbols to use.</p>

<p>In 1981, <a href="https://en.wikipedia.org/wiki/IBM_Personal_Computer#Character_set">IBM released their first Personal Computer</a>.  It used <a href="https://en.wikipedia.org/wiki/Code_page_437">code page 437</a> for English.</p>

<p>Each human script / alphabet needed its own code page. For example Greek uses 737 and Cyrillic uses 855.  This means that the same code can be rendered multiple different ways depending on which encoding is used.</p>

<p>Here's how symbols 162, 163, and 164 are rendered in various code pages.</p>

<table>
<thead>
<tr>
  <th></th>
  <th align="center">162</th>
  <th align="center">163</th>
  <th align="center">164</th>
</tr>
</thead>
<tbody>
<tr>
  <td>Code Page 437 (Latin US)</td>
  <td align="center">ó</td>
  <td align="center">ú</td>
  <td align="center">ñ</td>
</tr>
<tr>
  <td>Code Page 737 (Greek)</td>
  <td align="center">λ</td>
  <td align="center">μ</td>
  <td align="center">ν</td>
</tr>
<tr>
  <td>Code Page 855 (Cyrillic)</td>
  <td align="center">б</td>
  <td align="center">Б</td>
  <td align="center">ц</td>
</tr>
<tr>
  <td>Code Page 667 (Polish)</td>
  <td align="center">ó</td>
  <td align="center">Ó</td>
  <td align="center">ñ</td>
</tr>
<tr>
  <td>Code Page 720 (Arabic)</td>
  <td align="center">ت</td>
  <td align="center">ث</td>
  <td align="center">ج</td>
</tr>
<tr>
  <td>Code Page 863 (French)</td>
  <td align="center">ó</td>
  <td align="center">ú</td>
  <td align="center">¨</td>
</tr>
</tbody>
</table>

<p>As you can see, characters are displayed depending on which encoding you use.  If the computer gets the encoding wrong, your text will become incomprehensible mix of various languages.</p>

<p>This made everyone who worked with computers very angry.</p>

<h2 id="1983-dec"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#1983-dec">1983 - DEC</a></h2>

<p>This is silly! You can't have the same code representing different symbols. That's too confusing. So, in 1983, DEC introduced <em>yet another</em> encoding standard - the <a href="http://www.columbia.edu/kermit/dec-mcs.html">Multinational Character Set</a>.</p>

<p>On the DEC VT100, the <a href="https://vt100.net/docs/vt220-rm/chapter2.html#T2-5">British Keyboard Selection</a> has the <code>£</code> symbol in position 35 of extended ASCII (35 + 128 = 163).  This becomes important later.</p>

<p>Of course, if you sent text from a DEC to an IBM, it would still get garbled unless you knew exactly what encoding was being used.</p>

<p>People got even angrier.</p>

<h2 id="1987"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#1987">1987</a></h2>

<p>Eventually, ISO published <a href="https://en.wikipedia.org/wiki/ISO/IEC_8859-1">8859-1</a> - commonly known as Latin-1.</p>

<p>It takes most of the previous standards and juggles them around a bit, to put them in a somewhat logical order.  Here's a snippet of how it compares to code page 437.</p>

<table>
<thead>
<tr>
  <th></th>
  <th align="center">162</th>
  <th align="center">163</th>
  <th align="center">164</th>
</tr>
</thead>
<tbody>
<tr>
  <td>Code Page 437 (Latin US)</td>
  <td align="center">ó</td>
  <td align="center">ú</td>
  <td align="center">ñ</td>
</tr>
<tr>
  <td>ISO-8859-1 (Latin-1)</td>
  <td align="center">¢</td>
  <td align="center">£</td>
  <td align="center">¤</td>
</tr>
</tbody>
</table>

<p>8859-1 defines the first 256 symbols and declares that there shall be <strong>no</strong> deviation from that.  Microsoft then immediately deviates with their <a href="http://www.i18nqa.com/debug/table-iso8859-1-vs-windows-1252.html">Windows 1252</a> encoding.</p>

<p>Everyone hates Microsoft.</p>

<h2 id="1991-unicode"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#1991-unicode">1991 - Unicode!</a></h2>

<p>In the early 1990s, Unicode was born out of the earlier <a href="http://www.open-std.org/CEN/TC304/guidecharactersets/guideannexb.html">Universal Coded Character Set</a>.  It attempts to create a standard way to encode all human text.  In order to maintain backwards compatibility with existing documents, the first 256 characters of Unicode are <em>identical</em> to ISO 8859-1 (Latin 1).</p>

<p>A new era of peace and prosperity was ushered in.  Everyone now uses Unicode. Nation shall speak peace unto Nation!</p>

<h2 id="2017-why-hasnt-this-been-sorted-out-yet"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#2017-why-hasnt-this-been-sorted-out-yet">2017 - Why hasn't this been sorted out yet?</a></h2>

<p>Here's what's happening. I think.</p>

<ul>
<li>The restaurateur uses their till and types up the price list.  </li>
<li>The till uses Unicode and the <code>£</code> symbol is stored as number <code>163</code>.</li>
<li>The till connects to a printer.</li>
<li>The till sends text to the printer as a series of 8 bit codes.</li>
<li>The printer doesn't know which code page to use, so makes a best guess.</li>
<li>The printer's manufacturer decided to fall back to the lowest common denominator - code page 437.</li>
<li><code>163</code> is translated to <code>ú</code>.</li>
<li>The customer gets confused and writes a blog post.</li>
</ul>

<p>Over 30 years later and a modern receipt printer is <em>still</em> using IBM's code page 437!  <a href="http://horstmann.com/unblog/2016-05-06/index.html">It just refuses to die</a>!</p>

<p>Even today, on modern windows machines, typing <code>alt+163</code> will default to 437 and print <code>ú</code>.</p>

<p>As I tap my modern Android phone on the contactless credit card reader, and as bits fly through the air like færies doing my bidding, the whole of our modern world is still underpinned by an ancient and decrepit standard which occasionally pokes its head out of the woodwork just to let us know it is still lurking.</p>

<p>It's turtles all the way down!</p>

<blockquote><p>ASK Italian last week
<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/05/DA_wsPwWAAE5wRH.jpg" alt="Receipt with a unicode error on it." width="600" height="450" class="aligncenter size-full wp-image-52629">
<a href="https://web.archive.org/web/20200924202834/https://twitter.com/MrPJEvans/status/869177922204172289?ref_src=twsrc%5Etfw">PJ Evans</a></p></blockquote>

<p>&nbsp;</p>

<blockquote><p>I went to see a film today. I thought @edent might appreciate what I saw when buying my ticket.
<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/05/DBgpi3YXYAEGi-C.jpg" alt="LED display on a till with the Unicode error on it." width="600" class="aligncenter size-full wp-image-52630">
<a href="https://web.archive.org/web/20200924202829/https://twitter.com/helloiamskylar/status/871492214836391936?ref_src=twsrc%5Etfw">Skylar</a></p></blockquote>

<h2 id="or-is-it"><a href="https://shkspr.mobi/blog/2017/05/unicode-is-hard/#or-is-it">Or is it?</a></h2>

<p>Of course, when we look at the full receipt, we notice something weird.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/05/Receipt-with-both-pound-signs-and-u-symbols.jpg" alt="Receipt with both pound signs and u symbols" width="1024" height="576" class="aligncenter size-full wp-image-25250">

<p>The <code>£</code> is printed just fine on some parts of the receipt!</p>

<p>⨈Һ?ʈ ╤ћᘓ ?ᵁʗꗪ❓</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=25248&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/05/unicode-is-hard/feed/</wfw:commentRss>
			<slash:comments>15</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Whatever happened to URI Schemes?]]></title>
		<link>https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/</link>
					<comments>https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 19 Apr 2017 11:07:59 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[chat]]></category>
		<category><![CDATA[standards]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=25036</guid>

					<description><![CDATA[A few days ago, I ranted about how chat apps have poor support for URI schemes.  By &#34;Chat Apps&#34;, I&#039;m talking about the new wave of messengers - WhatsApp, WeChat, Telegram, Wire, and the like.  What do I mean by &#34;URI Scheme&#34;?  You&#039;re probably familiar with:   https://example.com   The &#34;scheme&#34; is https - it tells the computer &#34;Open the web browser and load the specified resource.&#34;  You may also be …]]></description>
										<content:encoded><![CDATA[<p>A few days ago, <a href="https://twitter.com/edent/status/851156962641313792">I ranted about how chat apps have poor support for URI schemes</a>.</p>

<p>By "Chat Apps", I'm talking about the new wave of messengers - WhatsApp, WeChat, Telegram, Wire, and the like.</p>

<p>What do I mean by "URI Scheme"?  You're probably familiar with:</p>

<ul>
<li><code>https://example.com</code></li>
</ul>

<p>The "<a href="https://en.wikipedia.org/wiki/Uniform_Resource_Identifier#Syntax">scheme</a>" is <code>https</code> - it tells the computer "Open the web browser and load the specified resource."</p>

<p>You may also be aware of:</p>

<ul>
<li><code>mailto:me@example.com</code></li>
</ul>

<p>This tells the computer to open the email app and fill in "me@example.com" as the destination address.</p>

<p>Also fairly common are:</p>

<ul>
<li><code>tel:+447700900123</code> open the phone dialler and prepare to dial this number.</li>
<li><code>sms:+447700900123</code> open the text message app and use this number.</li>
<li><code>skype:terence.eden</code> open the Skype app and contact the specified user.</li>
</ul>

<p>There are <a href="https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml">hundreds of URI schemes</a> in use.  <a href="http://stackoverflow.com/questions/8464632/what-are-the-uri-url-schemes-for-most-im-networks">Older chat apps like ICQ and AIM made use of schemes</a> - yet <em>modern</em> chat apps mostly ignore them. Why?</p>

<p>At the moment, there's is literally no way I can send you a link which says "This is my account on Wire, chat to me using the app."</p>

<h2 id="uri-support"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#uri-support">URI Support</a></h2>

<p>Firstly, it's not all bad news!  There are a few apps which <em>do</em> have rudimentary URI support.</p>

<h3 id="whatsapp"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#whatsapp">WhatsApp</a></h3>

<p>There is an <em>undocumented</em> URI Scheme:</p>

<ul>
<li><code>whatsapp://send/?phone=447700900123</code></li>
</ul>

<p>In repeated testing with friends, it performed inconsistently. Sometimes it would open a chat window, other times it gave an error.</p>

<h3 id="telegram"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#telegram">Telegram</a></h3>

<p>Again, an <em>undocumented</em> URI Scheme. This is how to look up users by username:</p>

<ul>
<li><code>tg://resolve?domain=edent</code></li>
</ul>

<p>In tests it worked reliably across all platforms.</p>

<h3 id="wechat"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#wechat">WeChat</a></h3>

<p>The popular Chinese messenger has the bare minimum of a scheme:</p>

<ul>
<li><code>weixin://</code></li>
</ul>

<p>That will launch the app, if installed. That's it. There's no way to target a specific user.</p>

<h2 id="when-it-all-goes-wrong"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#when-it-all-goes-wrong">When it all goes wrong</a></h2>

<p>We take it for granted that everyone who clicks on a link has a web browser and email client installed. If they're on mobile, they probably have the ability to make phone calls and send SMS.</p>

<p>So what happens if you don't have a chat app installed?  This hot mess:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/04/tg.png" alt="A web browser showing an error message that it didn't understand a protocol" width="366" height="431" class="aligncenter size-full wp-image-25045">

<p>It's pretty much the same on Android or iPhone - the user is sent to an unhelpful error page.</p>

<h2 id="why-not-use-an-http-resolver"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#why-not-use-an-http-resolver">Why not use an HTTP resolver?</a></h2>

<p>Both Telegram &amp; WhatsApp let you look up a user on their website and then redirect you to the app.</p>

<ul>
<li><a href="https://t.me/edent"><code>https://t.me/edent</code></a></li>
<li><a href="https://api.whatsapp.com/send?phone=447700900123"><code>https://api.whatsapp.com/send?phone=447700900123</code></a></li>
</ul>

<p>If you open that in your browser, it will take you to the provider's site and they will then redirect you to their app.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/04/telegram-fs8.png" alt="The telgram website attempts to redirect the user to the app" width="320" height="320" class="aligncenter size-full wp-image-25047">

<p>This introduces a number of problems.</p>

<ul>
<li>An extra step which adds latency.

<ul>
<li>It forces everything through the browser - so you have to wait for that to load, resolve, and close before you can chat.</li>
</ul></li>
<li>Leaks metadata.

<ul>
<li>Your ISP now knows that you're doing a lookup.</li>
</ul></li>
<li>Increases vendor lock in.

<ul>
<li>What if Telegram decides that it will only allow lookups from registered users?</li>
</ul></li>
<li>Security

<ul>
<li>What if Telegram lies about the resolved account?</li>
</ul></li>
<li>It doesn't actually work

<ul>
<li>There's no way for a website to tell if the user has an app installed.</li>
<li>The user is often redirected to a URI they can't open.</li>
</ul></li>
</ul>

<p>For now, it seems that using an HTTP resolver is the least worst option. It can easily be shared and understood by users - and it doesn't tie the receiver in to a specific technology like Android Intents.</p>

<p>But, for the future - perhaps there's a better way?</p>

<h2 id="federation"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#federation">Federation</a></h2>

<p>Given that WhatsApp, Wire, Allo, Facebook and many others <a href="https://en.wikipedia.org/wiki/Signal_Protocol">all use the Open Whisper Systems protocol</a>, it seem bizarre to me that they can't communicate with each other.  Imagine if your iPhone couldn't make calls to your friend's Nokia - unacceptable!</p>

<p>Similarly, all the major voice/video calling apps are converging on WebRTC to pipe your call around the world.  The app is <em>merely</em> the user interface.  You may prefer to use OutLook, I prefer Gmail - but they both use email as the underlying communications platform.</p>

<p>I've explained before why <a href="https://shkspr.mobi/blog/2017/02/can-i-own-my-identity-on-the-internet/">using a mobile phone number is a poor choice of identifier</a> (mostly because the user doesn't own it and can't transfer it overseas) - but given that's what most people use now, it makes sense to include it as an option.</p>

<h2 id="problem-statement"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#problem-statement">Problem Statement</a></h2>

<p>I want to share a link with someone so they can talk to me on my preferred chat app.</p>

<h2 id="solution"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#solution">Solution</a></h2>

<p>Let's create a new URI scheme - <code>chat:</code></p>

<p>It is short and it doesn't tie itself to a specific action (<code>videocall:</code>, <code>text:</code>, <code>voice:</code>), or to a specific protocol (Signal, WebRTC).</p>

<p>When clicking on a <code>chat:</code> link, your device will either:</p>

<ul>
<li>Open up your chat client.</li>
<li>If you have several installed, give you a choice of chat client.</li>
</ul>

<p>Let's take a look at some examples:</p>

<h3 id="just-a-phone-number"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#just-a-phone-number">Just a phone number</a></h3>

<p><code>chat:+447700900123</code></p>

<ul>
<li>An internationally formatted <a href="https://en.wikipedia.org/wiki/E.164">E.164</a> phone number.</li>
<li>The <code>+CountryCode</code> at the start is mandatory.</li>
<li>This is to disambiguate between users with similar numbers but provided by different countries.</li>
</ul>

<p>This assumes that both parties are on the same chat app.</p>

<p>If I'm on WhatsApp and my friend only has WeChat installed - what happens?  Well, part of Federation means that you can talk <em>across</em> different chat apps.</p>

<h3 id="named-account-at-a-provider"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#named-account-at-a-provider">Named account at a provider</a></h3>

<p><code>chat:me@example.com</code></p>

<ul>
<li>This will open the "example.com" chat app.</li>
<li>Possible confusion with an email address (see later)?</li>
<li>Might be more sensible to use <code>account@com.example</code>? But users are unlikely to understand that.</li>
<li>It could be <code>chat:@shkspr.mobi</code> and let my domain manage where I want the chat to be directed.</li>
<li>Could just use "me@whatsapp" - does a hierarchy need to be imposed?</li>
</ul>

<h3 id="a-name-can-also-be-a-number"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#a-name-can-also-be-a-number">A name can also be a number</a></h3>

<p><code>chat:+447700900123@whatsapp</code></p>

<h3 id="with-specific-actions"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#with-specific-actions">With specific actions</a></h3>

<p><code>chat:me@example.com?body=URL%20Encoded%20String</code></p>

<ul>
<li>This pre-fills a message to be sent to the specific user.</li>
<li>Identical syntax to email's <code>mailto:</code></li>
<li>Could also include base64 encoded data for images and other attachments.</li>
</ul>

<h3 id="with-multiple-participants"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#with-multiple-participants">With multiple participants</a></h3>

<p><code>chat:me@example.com,+447700900123,alice@example.org</code></p>

<ul>
<li>Start a chat with several participants.</li>
<li>Again, identical to email's <code>mailto</code> syntax.</li>
<li>Could also be combined with the <code>?body=</code> above.</li>
</ul>

<h3 id="ephemeral-support"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#ephemeral-support">Ephemeral Support</a></h3>

<p><code>chat:me@example.com?timeout=60&amp;body=This message will self destruct</code></p>

<ul>
<li>Requests that the receiving client will discard the message after a <code>timeout</code> specified in seconds.</li>
<li>It is up to the receiver to comply with this request.</li>
</ul>

<h2 id="and-then"><a href="https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/#and-then">And Then...</a></h2>

<p>Are URI Schemes the future once more? I think they have to be.  Messaging app providers will shut down (MySpace), people will migrate away from platforms (ICQ), phone numbers and email addresses will change - but people will still want to chat with the minimum of fuss.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=25036&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/04/whatever-happened-to-uri-schemes/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
