<?xml version="1.0" encoding="utf-8"?>



<feed xmlns="http://www.w3.org/2005/Atom"
    xmlns:fh="http://purl.org/syndication/history/1.0"
    xmlns:at="http://purl.org/atompub/tombstones/1.0">

    <title>Publ: Development Blog</title>
    <subtitle>A personal publishing system for the modern web</subtitle>
    <link href="http://publ.beesbuzz.biz/blog/feed?tag=indieweb" rel="self" />
    <link href="http://publ.beesbuzz.biz/blog/feed" rel="current" />
    <link href="https://busybee.superfeedr.com" rel="hub" />
    
    
    <link href="http://publ.beesbuzz.biz/blog/" />
    <fh:archive />
    <id>tag:publ.beesbuzz.biz,2020-01-07:blog</id>
    <updated>2021-07-08T20:56:02-07:00</updated>

    
    <entry>
        <title>Publ v0.7.2, Authl v0.5.0</title>
        <link href="http://publ.beesbuzz.biz/blog/848-Publ-v0.7.2-Authl-v0.5.0" rel="alternate" type="text/html" />
        <published>2021-07-08T20:56:02-07:00</published>
        <updated>2021-07-08T20:56:02-07:00</updated>
        <id>urn:uuid:f65b4f50-56a2-5494-8ed9-a3f6e0d15558</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Big new releases for Publ and Authl!</p><p>Publ changes:</p>
<ul>
<li>Added support for <a href="https://indieweb.org/IndieAuth_Ticket_Auth">IndieAuth Ticket Auth</a>, allowing aware readers to automatically log in on your behalf and get private entries</li>
<li>Added support for <a href="http://publ.beesbuzz.biz/manual/335-Image-renditions#image_loading">HTML 5 lazy image loading</a>; all images are now lazy-loaded by default</li>
</ul>
<p>Authl changes:</p>
<ul>
<li>Improve the meta robots rules on the login form</li>
<li>Add IndieWeb endpoint discovery to the profile</li>
</ul>


<p>Ticket Auth is a pretty cool protocol which I have a lot of optimism for. You know how one of the big problems with self-hosted blogging is that there&rsquo;s no way to share private posts on your feed without revealing that you have private posts and requiring people to log in to actually read them? Ticket Auth is a <em>huge</em> solution for that.</p><p>There&rsquo;s a few things that need to happen before it actually gets used, though. The main thing is that feed readers need to get support for Ticket Auth, and there also needs to be a way to associate your user profile with the Ticket Auth endpoint. In an IndieWeb context this is pretty straightforward; on your profile page you&rsquo;d have something like:</p><figure class="blockcode"><pre><span class="line"><span class="line-content">&lt;link rel=&quot;ticket_endpoint&quot; href=&quot;https://feed-reader.example/tickets&quot;&gt;</span></span>
</pre></figure><p>and when you sign in, Publ sees that you have that ticket endpoint and initiates the flow to it. Then the feed reader has a bearer token that it can use to fetch the secure feed on your behalf.</p><p>However, outside of IndieAuth it gets a little trickier. There&rsquo;s <em>technically</em> no requirement that someone uses the IndieAuth login flow to get a ticket, but the protocol relies pretty heavily on there being a tight coupling between the identity provider and the feed reader. The most <em>straightforward</em> way to support this in non-IndieWeb feed readers is to simply have feed readers grow IndieAuth support, though, and then use that to sign in to the IndieWeb sites you&rsquo;re following.</p><p>There&rsquo;s probably some other mechanism that could be used to provide matching third-party identity between a feed reader and, say, a Twitter identity, but that&rsquo;s getting so far off into the weeds.</p><p>My recommendation to anyone implementing a new feed reader in this day and age: integrate with existing IndieAuth login flows, and/or allow folks to identify themselves with a public IndieWeb profile when they log in with a username and password. Then you can provide them a public profile page that also has the Ticket Auth endpoint, and then we can finally break free of walled-garden social media.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Publ 0.5.8, Authl 0.3.1, and IndieAuth security</title>
        <link href="http://publ.beesbuzz.biz/blog/491-Publ-0.5.8-Authl-0.3.1-and-IndieAuth-security" rel="alternate" type="text/html" />
        <published>2019-10-30T19:11:50-07:00</published>
        <updated>2019-10-30T19:11:50-07:00</updated>
        <id>urn:uuid:3019140c-3dc7-5b8f-98e5-ffa0c9fda3c4</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>So, both Publ and Authl had a pretty naïve issue with the identity verification step of the IndieAuth flow; it simply accepted whatever the authorization endpoint said the user&rsquo;s identity was. This made it very simple to spoof one&rsquo;s identity and log in as anyone on any Publ or Authl site.</p><p>Authl 0.3.1 fixes the problem with the IndieAuth login flow, and Publ 0.5.8 fixes the problem with the Bearer token flow.</p>

<p>If you don&rsquo;t understand what any of that means, the short form is: please update your package versions. You might also want to change your secret key while you&rsquo;re at it; even if you don&rsquo;t have any private content <em>yet</em>, someone could possibly have used this hole to log in as you in case you ever do post private content.</p><p>It&rsquo;s incredibly unlikely, of course! As far as I know I&rsquo;m the only active user of Publ (aside from my old day job where they are definitely not using the authentication stuff at all). But I felt that full disclosure is a good idea anyway.</p><p>Also, if you have your own IndieAuth implementation that you want to check for proper identity sanitization, the <a href="https://github.com/PlaidWeb/Authl">Authl GitHub repository</a> has an <a href="https://github.com/PlaidWeb/Authl/blob/master/test/rogue_indieauth.py">identity tester</a> that should be easy to deploy. It&rsquo;s worth testing against that to make sure that your identity verification is working correctly!</p><p>To use it, run it somewhere that&rsquo;s visible to your IndieAuth login flow; for example, if you&rsquo;re testing locally, you can do something like:</p><figure class="blockcode"><pre class="highlight" data-language="bash-session" data-line-numbers><span class="line" id="e491cb1L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/491-Publ-0.5.8-Authl-0.3.1-and-IndieAuth-security#e491cb1L1"></a><span class="line-content">$ FLASK_APP=Authl/test/rogue-indieauth.py flask run -p 6789</span></span>
</pre></figure><p>and then you can use <code>http://localhost:6789</code> as your identity; you can also add arbitrary path elements (e.g. <code>http://localhost:6789/alice</code>). Then when you try to log in as IndieAuth it&rsquo;ll prompt you for what you want your canonical identity to look like (for example, <code>http://example.com/</code> or <code>http://localhost:6789/bob</code>), and then see how your login flow deals with it.</p><p>At some point I&rsquo;ll probably spin up a public instance of this, as well.</p><p>There&rsquo;s also a deficiency in the IndieAuth spec regarding how to verify the path part of an identity URL; see <a href="https://github.com/indieweb/indieauth/issues/35">this open issue</a> if you want to see more and/or participate in the discussion.</p><p>Authl and Publ currently follow my proposal for the path validation, where for example <code>http://example.com/alice</code> can identify as <code>http://example.com/alice/</code> or <code>http://example.com/alice/blog/</code> but not as <code>http://example.com/bob</code> or <code>http://example.com/alice_is_bob</code>. This makes it technically stricter than the current public specification, but it&rsquo;s also a lot safer especially for multi-user websites such as <a href="https://tilde.club">tilde.club</a> or any random WordPress installation or whatever.</p><p>Anyway. This is just my long-winded way of saying, oops, I hecked up, but I fixed it, and maybe other people hecked up too and it&rsquo;s worth testing.</p><p><mark>EDIT:</mark> Oh I also forgot to mention that no, AutoAuth isn&rsquo;t actually supported yet. But I&rsquo;m working on it!</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Why Publ won&#39;t support magic auth links</title>
        <link href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links" rel="alternate" type="text/html" />
        <published>2019-10-25T17:36:11-07:00</published>
        <updated>2019-10-25T17:36:11-07:00</updated>
        <id>urn:uuid:6695ff51-4390-5f69-affd-544a44f80f8a</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Since adding user authentication to Publ, I&rsquo;ve been thinking of ways of allowing people to subscribe to sites from feed readers while getting their own native authorization, so that people can see entries directly in their readers rather than needing the clumsy mechanisms of unauthorized placeholder entries.</p><p>Out of the box, Publ authentication does support a shared cookie jar; if you can provide your cookies to your feed reader in some way, then things will Just Work. Unfortunately, I don&rsquo;t know of any feed readers that actually support this, at least not easily. (Back when most browsers had a feed reader built-in this was a lot simpler. But time marches on.)</p><p>The two mechanisms which seemed most promising are <a href="https://indieweb.org/AutoAuth">AutoAuth</a> and &ldquo;magic links,&rdquo; where users get signed URLs that come pre-authenticated and show the full authorized content for that user. AutoAuth is still in a draft phase that&rsquo;s stuck in a chicken-and-egg situation (and also requires a lot of buy-in to IndieWeb protocols, which is still a pill too large to swallow for most of the folks who follow my blog), so magic feed links seemed like the best path forward.</p><p>I even got so far as to <a href="https://github.com/PlaidWeb/Publ/issues/282">draft out an implementation</a>, but there&rsquo;s a few bad issues with it which just made me opt not to.</p>

<h2 id="1266_h2_1_Feed-discovery"><a href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#1266_h2_1_Feed-discovery"></a>Feed discovery</h2><p>Right now, when people want to subscribe to a feed, they usually point their feed reader at the URL for the website, and then let the reader software discover the feed. Usually there will be a <code>&lt;link&gt;</code> tag that provides the feed URL, like:</p><figure class="blockcode"><pre class="highlight" data-language="html" data-line-numbers><span class="line" id="e1266cb1L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb1L1"></a><span class="line-content"><span class="p">&lt;</span><span class="nt">link</span> <span class="na">rel</span><span class="o">=</span><span class="s">&quot;alternate&quot;</span> <span class="na">type</span><span class="o">=</span><span class="s">&quot;application/atom+xml&quot;</span> <span class="na">title</span><span class="o">=</span><span class="s">&quot;Atom feed&quot;</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;feed&quot;</span> <span class="p">/&gt;</span></span></span>
</pre></figure><p>Sometimes there may be more than one of these <code>&lt;link&gt;</code> tags for different styles of feed; for example, it might have both RSS and Atom versions, or there might be a choice between full-content and summary, or a comments feed, and so on. Some feed readers will show a list and allow the user to select which feed to use, while others will simply use the first one.</p><p>In the case of a magic link, however, these links are only provided to the person who is logged in. An external feed reader won&rsquo;t be logged in, and therefore won&rsquo;t see the magic link.</p><p>So, an alternate discovery mechanism must be provided; usually this will take the form of a widget in the corner of the page where clicking on it will expand a text box you can select the (possibly really long) feed link from and then paste <em>that</em> into your feed reader. There is no standard approach to doing this, and is confusing and weird.</p><h2 id="1266_h2_2_Item-sharing"><a href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#1266_h2_2_Item-sharing"></a>Item sharing</h2><p>The bigger problem, however, and the reason I decided to abandon the project entirely, is that the way that Atom specifies item sharing makes this incredibly dangerous.</p><p>Atom provides a way of sharing items; <a href="https://github.com/fluffy-critter/Feed-on-Feeds">Feed on Feeds</a> implements this, for example. If you share an item, its Atom entry looks like this:</p><figure class="blockcode"><pre class="highlight" data-language="xml" data-line-numbers><span class="line" id="e1266cb2L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L1"></a><span class="line-content"><span class="nt">&lt;entry&gt;</span></span></span>
<span class="line" id="e1266cb2L2"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L2"></a><span class="line-content"><span class="nt">&lt;id&gt;</span>urn:uuid:dacd7607-380e-526d-b688-60d8d334bde7<span class="nt">&lt;/id&gt;</span></span></span>
<span class="line" id="e1266cb2L3"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L3"></a><span class="line-content"><span class="nt">&lt;link</span><span class="w"> </span><span class="na">href=</span><span class="s">&quot;https://beesbuzz.biz/comics/journal/3675-ADDitive&quot;</span><span class="w"> </span><span class="na">rel=</span><span class="s">&quot;alternate&quot;</span><span class="w"> </span><span class="na">type=</span><span class="s">&quot;text/html&quot;</span><span class="nt">/&gt;</span></span></span>
<span class="line" id="e1266cb2L4"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L4"></a><span class="line-content"><span class="nt">&lt;title</span><span class="w"> </span><span class="na">type=</span><span class="s">&quot;html&quot;</span><span class="nt">&gt;</span>Journal:<span class="w"> </span>ADDitive<span class="nt">&lt;/title&gt;</span></span></span>
<span class="line" id="e1266cb2L5"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L5"></a><span class="line-content"><span class="nt">&lt;summary</span><span class="w"> </span><span class="na">type=</span><span class="s">&quot;html&quot;</span><span class="nt">&gt;</span></span></span>
<span class="line" id="e1266cb2L6"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L6"></a><span class="line-content"><span class="cm">&lt;!-- actual item content goes here --&gt;</span></span></span>
<span class="line" id="e1266cb2L7"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L7"></a><span class="line-content"><span class="nt">&lt;/summary&gt;</span></span></span>
<span class="line" id="e1266cb2L8"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L8"></a><span class="line-content"><span class="nt">&lt;updated&gt;</span>2019-10-15T23:14:52Z<span class="nt">&lt;/updated&gt;</span></span></span>
<span class="line" id="e1266cb2L9"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L9"></a><span class="line-content"><span class="nt">&lt;source&gt;</span></span></span>
<span class="line" id="e1266cb2L10"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L10"></a><span class="line-content"><span class="w">  </span><span class="nt">&lt;id&gt;</span>https://beesbuzz.biz/<span class="nt">&lt;/id&gt;</span></span></span>
<span class="line" id="e1266cb2L11"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L11"></a><span class="line-content"><span class="w">  </span><span class="nt">&lt;link</span><span class="w"> </span><span class="na">href=</span><span class="s">&quot;https://beesbuzz.biz/&quot;</span><span class="w"> </span><span class="na">rel=</span><span class="s">&quot;alternate&quot;</span><span class="w"> </span><span class="na">type=</span><span class="s">&quot;text/html&quot;</span><span class="nt">/&gt;</span></span></span>
<span class="line" id="e1266cb2L12"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L12"></a><span class="line-content"><span class="w">  </span><span class="nt">&lt;link</span><span class="w"> </span><span class="na">href=</span><span class="s">&quot;https://beesbuzz.biz/feed&quot;</span><span class="w"> </span><span class="na">rel=</span><span class="s">&quot;self&quot;</span><span class="w"> </span><span class="na">type=</span><span class="s">&quot;application/atom+xml&quot;</span><span class="nt">/&gt;</span></span></span>
<span class="line" id="e1266cb2L13"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L13"></a><span class="line-content"><span class="w">  </span><span class="nt">&lt;title&gt;</span>busybee<span class="nt">&lt;/title&gt;</span></span></span>
<span class="line" id="e1266cb2L14"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L14"></a><span class="line-content"><span class="nt">&lt;/source&gt;</span></span></span>
<span class="line" id="e1266cb2L15"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#e1266cb2L15"></a><span class="line-content"><span class="nt">&lt;/entry&gt;</span></span></span>
</pre></figure><p>That <code>&lt;source&gt;</code> block is what to look at; namely, the <code>rel=&quot;self&quot;</code>. It provides a link back to the original feed. This means that if someone were to share an item from an authenticated feed &ndash; regardless of the privacy of the item itself &ndash; it would also share the authenticated feed URL. This can be <em>very, very bad.</em></p><h2 id="1266_h2_3_So-what-are-the-alternatives"><a href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#1266_h2_3_So-what-are-the-alternatives"></a>So what are the alternatives?</h2><p>As stated in the preamble, the two major alternatives are shared cookies, and AutoAuth. Neither is a perfect solution.</p><p>Shared cookies are great if you can synchronize your session cookies between your browser and your feed reader. (This is especially feasible if your feed reader is hosted in your browser.) Most feed readers don&rsquo;t work that way. So, you could export your cookies to be used by the feed reader (which hopefully uses the presence of a cookie to avoid deduping subscriptions! I&rsquo;m pretty sure Feed On Feeds doesn&rsquo;t!), but if cookies have an expiration date on them (which Publ cookies absolutely do) this means having to re-export periodically.</p><p>Some sort of feed metadata indicating that there is a login/auth mechanism available might be workable; something like <code>&lt;link rel=&quot;authenticate&quot;&gt;</code> which prompts the browser to pop up some sort of proxy popup so that it can intercept the login cookie, for example. This might be a nice middle ground to AutoAuth without requiring every user to buy in fully to the IndieWeb experience.</p><p>(And, of course, supporting AutoAuth would be ideal for those who <em>do</em>.)</p><p>I think having some sort of &ldquo;hey, please log in&rdquo; metadata in the feed is also helpful if only because it gives a cue to a subscriber that there&rsquo;s something to authenticate against in the first place. But this purpose is already served by having empty &ldquo;private post&rdquo; stub entries&hellip;</p><h2 id="1266_h2_4_Other-things-to-consider"><a href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#1266_h2_4_Other-things-to-consider"></a>Other things to consider</h2><p>While I&rsquo;m ramble-thinking about this stuff, I&rsquo;d also like to see a better mechanism for dealing with authentication around <a href="https://indieweb.org/WebSub">WebSub</a>. As far as I&rsquo;ve seen, there are three kinds of WebSub push:</p>
<ol>
<li>Full-feed &ldquo;fat ping&rdquo; (i.e. the push notification contains the entire feed content)</li>
<li>Update-only &ldquo;fat ping&rdquo; (i.e. it only contains the new/changed items)</li>
<li>Notification-only &ldquo;thin ping&rdquo; (it only sends a notification of the update and then the recipient needs to do a pull of the content, once notified)</li>
</ol>
<p>The WebSub model doesn&rsquo;t really have any provisions for determining authentication/authorization status, as there&rsquo;s no mechanism for associating authentication stuff with the subscription topic. In case 3 it doesn&rsquo;t really matter &ndash; the client will just provide its normal content-pull credentials &ndash; but in cases 1 and 2 it matters quite a lot, as the content needs to be pre-filtered through the authentication layer.</p><p>For what it&rsquo;s worth, on all of my sites I use <a href="http://superfeedr.com/">SuperFeedr</a> as my WebSub hub, which does case 2 (actually a particularly annoying version of it where it only pushes <em>new</em> items, rather than including changed items). It definitely doesn&rsquo;t provide the extensibility required for authenticated WebSub, and I doubt that this is anything they ever would add even if a standard were to be adopted. So, I think for the non-thin push case, it would become necessary to have a different hub. <a href="https://switchboard.p3k.io/">Switchboard</a> appears to do a full-content push (case 1 above) and doesn&rsquo;t currently support AutoAuth; however, given the author, I would expect it to add that functionality when it becomes more commonplace.</p><p>In the meantime, I think I&rsquo;ll continue on with my unauthorized stub entries; they&rsquo;re annoying to unauthorized users and they leak the fact I&rsquo;m posting private entries to the world, but at least they prompt people to sign in and notify folks that there might be something for them to read. And for better or worse it also works with my <a href="https://indieweb.org/POSSE">POSSE</a> setup.</p><h2 id="1266_h2_5_Conclusion"><a href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links#1266_h2_5_Conclusion"></a>Conclusion</h2><p>Software is hard.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Authl v0.1.7, now with IndieAuth support!</title>
        <link href="http://publ.beesbuzz.biz/blog/1311-Authl-v0.1.7-now-with-IndieAuth-support" rel="alternate" type="text/html" />
        <published>2019-08-12T01:41:30-07:00</published>
        <updated>2019-08-12T01:41:30-07:00</updated>
        <id>urn:uuid:98238635-ded2-5277-b4c4-6f94b8d1f113</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>I&rsquo;ve released Authl v0.1.7, which now adds direct support for IndieAuth (rather than requiring <a href="https://indielogin.com">IndieLogin.com</a> as a broker). This means that now folks who have an IndieAuth identity can log in using that; previously I was expecting IndieLogin.com to eventually open up client registrations to make that a useful authentication path, but for various reasons Aaron hasn&rsquo;t opened it up to the general public.</p><p>Part of this update was to also refactor how OAuth is handled, so it&rsquo;ll be a lot easier for me to add more OAuth-based providers in the future; hopefully I&rsquo;ll have direct support for Twitter, GitHub, and maybe even Facebook in the near-ish future. But for now, between Mastodon, email, and IndieAuth, I think I have all of my own personal needs taken care of.</p><p>Feel free to make suggestions for other identity providers in the <a href="https://github.com/PlaidWeb/Authl/issues">Authl issue tracker</a>, though!</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Embedding webmention.io pings on your site</title>
        <link href="http://publ.beesbuzz.biz/blog/1048-Embedding-webmention.io-pings-on-your-site" rel="alternate" type="text/html" />
        <published>2018-12-20T23:14:47-08:00</published>
        <updated>2018-12-20T23:14:47-08:00</updated>
        <id>urn:uuid:66ca748a-4597-5381-a0c9-fcf41f7fb75e</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Are you using <a href="https://webmention.io">webmention.io</a> as your webmention endpoint? Want to get your incoming webmentions displayed on your website?</p><p>Well you&rsquo;re in luck, I wrote <a href="http://publ.beesbuzz.biz/static/webmention.js">a simple-ish script for that</a>. (You&rsquo;ll probably also want to see <a href="http://publ.beesbuzz.biz/static/webmentions.css">the accompanying stylesheet</a> too.) And it doesn&rsquo;t even require that you use Publ &ndash; it should work with any CMS, static or dynamic. The only requirement is that you use either webmention.io or something that has a similar enough retrieval API.</p><p>I wrote more about it on <a href="https://beesbuzz.biz/blog/3743-More-fun-with-Webmentions">my blog</a>, where you can also see it in use. For now, I&rsquo;m just going to use the <a href="http://publ.beesbuzz.biz/github-site">sample site repository</a> to manage it (and issues against it).</p><p>It&rsquo;s MIT-licensed, so feel free to use it wherever and however you want and to modify it for your needs. I might improve it down the road but for now it&rsquo;s mostly just a quick itch-scratching hack that does things the way I want it to.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Pushl v0.1.3, and a FeedOnFeeds update!</title>
        <link href="http://publ.beesbuzz.biz/blog/500-Pushl-v0.1.3-and-a-FeedOnFeeds-update" rel="alternate" type="text/html" />
        <published>2018-11-28T01:18:45-08:00</published>
        <updated>2018-11-28T01:18:45-08:00</updated>
        <id>urn:uuid:434c7d03-d656-5e30-b7fc-e01e1d2e3dbd</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>I just released Pushl v0.1.3, which adds some minor performance optimizations and a bug fix.</p><p>Originally I was hoping to have a <em>major</em> performance optimization, in the form of having rewritten Pushl from thread-per-connection to async operation, but unfortunately I ran into a bunch of problems with it. Mostly that I was running into a &ldquo;too many open files&rdquo; error and I couldn&rsquo;t figure out what was causing a descriptor leak. I have the <a href="https://github.com/PlaidWeb/Pushl/tree/aiohttp">work-in-progress branch</a> online if anyone wants to take a look at it.</p><p>Anyway, the reason I went down <em>this</em> route is because I added WebSub subscriber support to <a href="http://github.com/fluffy-critter/Feed-On-Feeds">my fork of Feed-On-Feeds</a>, which makes it so that WebSub-enabled RSS and Atom feeds will push their updates to your reader instead of having to wait for a polling interval.</p><p>You can read more about some of my other thoughts on a <a href="http://beesbuzz.biz/8139">blog entry that quickly devolves into a rant</a>, if you&rsquo;re so inclined.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Pushl 0.0.1 released</title>
        <link href="http://publ.beesbuzz.biz/blog/805-Pushl-0.0.1-released" rel="alternate" type="text/html" />
        <published>2018-10-08T23:53:33-07:00</published>
        <updated>2018-10-08T23:53:33-07:00</updated>
        <id>urn:uuid:37b73f42-4cbf-5dfc-ae59-7c481c9b9954</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>I finally got around to releasing a very rough prototype of <a href="http://github.com/PlaidWeb/Pushl">Pushl</a> to pypi. It only sends out WebSub notifications for now (does anyone even use those?), but I&rsquo;ll work on actually implementing WebMention soon.</p><p>Also, recently someone pointed out to me <a href="https://fed.brid.gy">fed.brid.gy</a> which makes it easy to turn a static site into an ActivityPub source. At some point I&rsquo;ll experiment with setting up Publ for this; it looks like it&rsquo;s just a matter of adding a couple of additional route rules to Publ, so that will probably go into an advanced configuration guide if I ever get around to making such a thing. (Or it could actually be added to Publ directly but there isn&rsquo;t much of a reason for that, IMO.)</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Some thoughts on WebMention</title>
        <link href="http://publ.beesbuzz.biz/blog/113-Some-thoughts-on-WebMention" rel="alternate" type="text/html" />
        <published>2018-09-29T21:00:00-07:00</published>
        <updated>2018-09-29T21:00:00-07:00</updated>
        <id>urn:uuid:1030017a-6302-5f07-9b58-74defffe7906</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>So, for the last couple of days I&rsquo;ve been playing with some of the <a href="http://indieweb.org">IndieWeb</a> concepts, in particular <a href="https://indieweb.org/Webmention">Webmention</a>. Spurred on by a <a href="https://queer.party/@fluffy/100800119621478938">helpful thread with Kevin Marks</a>, I took some time to actually do a <a href="https://github.com/fluffy-critter/Publ/tree/feature/128-webmention">rough implementation of outgoing Webmentions</a>, and also did some of the work to set up the <a href="http://microformats.org/wiki/h-card"><code>h-card</code></a> and <a href="http://microformats.org/wiki/h-entry"><code>h-entry</code></a> microformats on <a href="http://beesbuzz.biz">my main site</a>.</p><p>As far as I can tell, it works great, but I&rsquo;m also not going to actually merge this to master or push it to production. Read on to see why!</p>

<p>When I started Publ, it was with the very specific goal of providing the publishing mechanism for a content store. Given content files and templates, format them into reasonable web-friendly HTML and Atom and whatever else the templates do, in a basically-stateless manner, and do a great job of providing high-quality image renditions and generated CSS and so on, while also supporting things like legacy URL mapping and automatic redirection and so on.</p><p>Basically, be like a static publishing system, but dynamic.</p><p>I want Publ to be the publishing and formatting part of an open, dynamic, independent web. I do truly believe in the IndieWeb mission, and absolutely want to see it become successful! However, I feel like Publ&rsquo;s role is best served as one of many interlocking parts to make this work.</p><p>Supporting Webmention correctly means having the following:</p>
<ul>
<li>Automatically send out Webmention pings based on content changing</li>
<li>Automatically receive and handle Webmention pings as they come in</li>
<li>Provide structured metadata about the page content so that pings get credibly formatted on the receipient&rsquo;s end</li>
</ul>
<p>It also has a few other fun implications, like:</p>
<ul>
<li>Have a canonical URL for the content, generated by the publishing system itself, regardless of how the incoming traffic is routed to it</li>
<li>Send updates as often as things change, but no more often than that</li>
<li>Keep track of updates being sent (rather than just spamming everyone else with spurious updates)</li>
<li>Generally, be stateful</li>
</ul>
<p>And being stateful is a thing that flies in the face of the overall Publ design.</p><p>(So is the canonical URL thing, for reasons not worth getting into here, but briefly, things like staging/local/debug instances vs. the final production endpoint with any number of domain name normalizations and selections of protocol and so on. It&rsquo;s messy and not something that&rsquo;s easy to configure, and is impossible to detect in a way that&rsquo;s consistent with what the outside world sees.)</p><p>The way I see it, this stuff is better left to external tools. Publ is for managing and formatting content. There are plenty of other tools that can be integrated <em>into Publ templates</em> to provide IndieWeb functionality in the way that seems most fitting to the person running the site.</p><p>For receiving WebMentions you can use <a href="https://webmention.io">webmention.io</a> or <a href="http://brid.gy">brid.gy</a> or <a href="http://webmention.herokuapp.com">this Disqus-like webmention endpoint thingamajig that&rsquo;s currently in early alpha</a>. For sending WebMentions you can use <a href="https://telegraph.p3k.io">Telegraph</a> or <a href="https://github.com/vrypan/webmention-tools">webmention-tools</a> or <a href="https://github.com/bear/ronkyuu">ronkyuu</a> or any number of other tools for sending mentions out. All of the configuration for the inbound webmentions, and for your semantic markup on your templates and so on, belongs in <em>your templates</em>, for what you think makes the most sense for <em>your setup</em>. There is no reason for it to actually be integrated into Publ.</p><p>A similar story exists for <a href="https://www.w3.org/TR/websub/">WebSub</a>. Publ doesn&rsquo;t know &ndash; nor should it have to know &ndash; what templates correspond to RSS or Atom feeds. It doesn&rsquo;t know (or want to know) which of those feeds are affected by which category posts. It shouldn&rsquo;t have to be configured with any mappings for which categories trigger which templates&#39; updates, or which hub(s) those updates should be published to.</p><p>These are all better served by external tools that you, the publisher, configures to work the way you want them to.</p><p>So my proposal for supporting this stuff:</p>
<ul>
<li>Have a cron job that checks your feeds to see if they&rsquo;ve updated</li>
<li>When they do, run the appropriate tools to do the job of sending out notifications</li>
</ul>
<p>To this end, I might start a separate project that lets you set up these mappings yourself, to be run as a sort of controller thing. It wouldn&rsquo;t be at all integrated into Publ; indeed, it would work with any CMS that exports a feed or whatever. It would be configured with the following:</p>
<ul>
<li>One or more feeds to check</li>
<li>Various plugins/actions to perform on those feeds</li>
</ul>
<p>For example, a site&rsquo;s master feed would have a WebMention task which would go through every entry in the feed, and does the following:</p>
<ol>
<li>Fetch every referenced item</li>
<li>If the item has changed, parse it for all <code>&lt;a href&gt;</code> elements and send WebMentions</li>
</ol>
<p>And they could also have a WebSub task which would simply:</p>
<ol>
<li>See if the feed has changed</li>
<li>If so, send a WebSub notification to the hub of your choice</li>
</ol>
<p>These tools can be <em>simple</em> and <em>elegant</em> and work universally across all of your sites, not just Publ ones! Got a Wordpress site? This will work with it! Got a Tumblr site? This will work with it! Got a YouTube channel? <em>This will work with it.</em></p><p>And in the Publ case this also settles the canonical URL issue because it&rsquo;s based on what the external tool sees, which is what the rest of the Internet should see &ndash; not based on whatever whimsical, fragile, momentary state might be the case due to it running on <code>localhost:5000</code> or your private firewalled staging/preflight instance or whatever.</p><p>And this also gets along perfectly with another notion I had going into this &ndash; having services to syndicate content into a Publ site by reformatting an external Atom feed into an entry, for example. Want to automatically post all your Flickr items to a gallery on your Publ site? Use their <a href="https://www.flickr.com/services/feeds/">Atom API</a>. And the very same kind of simple tool can, for example, re-post your itch.io devlogs or your Tumblr reblogs or your YouTube videos or <em>whatever</em>.</p><p>I am entirely a fan of small tools doing simple things, and composing tools together. The world of CMSes already has too many <a href="https://amzn.to/2pKzIoK">Swiss army knives</a>. Let&rsquo;s keep our tools simple, doing a few things well, and have them work together with other tools.</p><p>I will absolutely have Publ support Webmention and WebSub and so on, in <em>the best way possible</em> &ndash; by doing nothing, and not getting in the way of other tools that can do it better.</p><p>Publ is a puzzle piece, not a complete solution.</p>

]]>
        </content>
    </entry>
    

    
</feed>