<?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=planning" 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>2025-01-05T19:25:49-08:00</updated>

    
    <entry>
        <title>Publ + Pushl releases and a bunch of plans</title>
        <link href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans" rel="alternate" type="text/html" />
        <published>2025-01-05T19:25:49-08:00</published>
        <updated>2025-01-05T19:25:49-08:00</updated>
        <id>urn:uuid:448a6793-87ae-5753-bf62-2ac50f10867e</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>There&rsquo;s been a few releases of both Publ (now on 0.7.35) and Pushl (now on 0.4.0). A pretty decent amount has changed!</p><p>Publ changes since 0.7.31:</p>
<ul>
<li>Fix some error handling issues causing an ISE</li>
<li>Add support for HTTP <code>Accept:</code>, properly allowing multiple templates with the same name and providing <a href="http://publ.beesbuzz.biz/manual/324-Templating-Guide#template-mapping">reasonable fallback behavior</a></li>
<li>Improve the <code>Content-Type</code> handling in general</li>
<li>Fix some markup-safe handling bugs</li>
</ul>
<p>Note that in order to upgrade to 0.7.35 you&rsquo;ll also need to restrict your Python environment to use a Python version &lt; 3.13; more on that in a bit.</p><p>Pushl changes since v0.3.5:</p>
<ul>
<li>Tidy up some code rot</li>
<li>Actually send an <code>Accept:</code> header</li>
<li>Removed lxml + Pingback support, which has never actually been useful</li>
</ul>
<p>So, let&rsquo;s talk about these projects and some other related stuff.</p>

<h3 id="930_h3_1_Tech-debt"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h3_1_Tech-debt"></a>Tech debt</h3><p>Publ has quite a lot of tech debt.</p><p>Most of the testing is done in an ad-hoc smoke-testing manner, and this has sometimes made it difficult for me to work on new features. (Of course I also am the only person working on these features, so I only prioritize things that I personally need.)</p><h4 id="930_h4_2_Pony"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h4_2_Pony"></a>Pony</h4><p>One particular issue is that it relies heavily on <a href="https://ponyorm.com">Pony</a>. Pony is a great ORM for doing quick application prototyping stuff, but unfortunately it&rsquo;s been a problem for quite some time:</p>
<ul>
<li>It makes proper unit testing significantly more difficult (it&rsquo;s actually the main reason the testing is in such a sorry state right now)</li>
<li>New Python versions usually end up breaking its clever code generator (which is why Publ 0.7.35 requires you to restrict your Python version)</li>
<li>It never gained support for schema migrations (which, thankfully, Publ was designed to not need to begin with, but this hampers some of my other plans)</li>
<li>General community support just never really materialized</li>
</ul>
<p>To address many of these problems, I&rsquo;ve been wanting to move to another database abstraction; I will most likely use <a href="https://www.sqlalchemy.org/">SQLAlchemy</a>. Whether I use its ORM or not is something I&rsquo;m still trying to decide.</p><h4 id="930_h4_3_Whoosh"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h4_3_Whoosh"></a>Whoosh</h4><p>Similarly, full-text search uses <a href="https://pypi.org/project/Whoosh/">whoosh</a>, which has been more or less abandoned. I have updated to use <a href="https://pypi.org/project/Whoosh-Reloaded/">whoosh-reloaded</a>, a community fork that has fixed most of the more egregious issues, but there are still a lot of issues with it:</p>
<ul>
<li>Its locking behavior is difficult to work with (and can cause a lot of operational difficulty)</li>
<li>Its ingest is slow and not easily threadable</li>
<li>Updating the index can be difficult and fragile</li>
<li>It stores the index on the local filesystem which can be a problem for many deployment scenarios</li>
<li>It puts <em>way</em> too much structured into its structured queries, and is overkill for the kinds of query representation Publ needs</li>
</ul>
<p>Unfortunately there aren&rsquo;t as many existing full-text search implementations for Python. My expectation for now is that I&rsquo;ll roll my own using the algorithms described in <a href="https://bart.degoe.de/building-a-full-text-search-engine-150-lines-of-code/">Bart de Goede&rsquo;s article</a>, although this doesn&rsquo;t feel like a great way to do things either.</p><h4 id="930_h4_4_Misaka"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h4_4_Misaka"></a>Misaka</h4><p>Finally, the Markdown engine currently used by Publ has been abandoned and is unlikely to continue to working in the long term. It&rsquo;s always been a bit of an operational problem, as well, because it relies on Hoedown (which has been abandoned for ages and never even got updated with HTML 5 support) and requires being able to either retrieve architecture-specific binaries or being able to build them yourself. The build process has been <em>mostly</em> easy for most users, but it&rsquo;s still not ideal.</p><p>Fortunately, I&rsquo;ve been playing with other Markdown implementations on other projects, and I&rsquo;m fairly certain that I&rsquo;ll be happy with <a href="https://github.com/lepture/mistune">Mistune</a> instead. Switching to that will require reimplementing a bunch of stuff in Publ, but it&rsquo;s all stuff I&rsquo;d been wanting to fix anyway.</p><p>In particular, I&rsquo;ve been wanting to figure out a way to templatize footnotes (for example, letting people make use of <a href="https://edwardtufte.github.io/tufte-css/">Tufte sidenotes</a> or putting a <code>&lt;details&gt;</code> reveal inline or after the current paragraph or the like), and there&rsquo;s a lot that could be better about how image sets are currently handled, and ideally I&rsquo;d be able to templatize those as well.</p><h3 id="930_h3_5_Comments"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h3_5_Comments"></a>Comments</h3><p>The main ways that I&rsquo;ve handled comments on Publ-based sites is either:</p>
<ul>
<li><a href="https://webmention.io/">webmention.io</a> + <a href="https://github.com/PlaidWeb/webmention.js">webmention.js</a></li>
<li><a href="https://isso-comments.de">isso</a></li>
</ul>
<p>Both of these are Fine™ for simple usage but they run into a bunch of issues on larger sites, and also the UX just isn&rsquo;t really where I&rsquo;d like it to be.</p><p>I wrote a <a href="https://beesbuzz.biz/blog/7457-Some-thoughts-on-comments">much more detailed blog post</a> on my main site, but the short version is that I&rsquo;d like to make a comment system that works more closely with Publ (or any other publishing framework) that stores things locally and supports both local posts <em>and</em> webmention (both sending and receiving), and which would also accept user data from the publishing stack.</p><p>I&rsquo;m thinking it would take the form of a Python library that you can embed into an app (with easy hooks for Flask), but would also offer its own Flask frontend for hosting it as an embeddable app instance that can be used from non-Python things.</p><h3 id="930_h3_6_ActivityPub"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h3_6_ActivityPub"></a>ActivityPub</h3><p>Native ActivityPub support has been at the back of my mind for a while. Having its own built-in webmention endpoint would also make for a nice spot to start adding in ActivityPub, since ActivityPub verbs aren&rsquo;t fundamentally different from Webmention verbs.</p><p>The main thing this would bring to the table is being able to set up various outboxes for different views (for example, <code>@blog@example.com</code> for just blog posts or <code>@all@example.com</code> for everything), and then also being able to make use of the user permissions to send private entries as DMs to the authorized subscribers, reducing the need for private entry stubs (which are bad UX all around and which I only adopted as a compromise because <a href="http://publ.beesbuzz.biz/blog/1266-Why-Publ-won-t-support-magic-auth-links">magic links have problems</a> and feed readers <em>still</em> don&rsquo;t support bearer tokens or <a href="https://indieweb.org/Ticketing_for_IndieAuth">Ticket Auth</a>).</p><h3 id="930_h3_7_Documentation"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h3_7_Documentation"></a>Documentation</h3><p>Also, having had to actually consult the docs while building a new Publ-based website, I&rsquo;ve come to realize just how bad a disaster the <a href="http://publ.beesbuzz.biz/manual/">manual</a> currently is. It could really do with some reorganization at the very least.</p><h3 id="930_h3_8_In-conclusion"><a href="http://publ.beesbuzz.biz/blog/930-Publ-Pushl-releases-and-a-bunch-of-plans#930_h3_8_In-conclusion"></a>In conclusion</h3><p>I have a lot of stuff I want to work on and hopefully I get somewhere with some of these things this year. If you&rsquo;d like to help out, you can make code contributions, or you can make financial contributions via <a href="https://ko-fi.com/fluffycritter">Ko-Fi</a>, <a href="https://patreon.com/fluffy">Patreon</a>, or <a href="https://github.com/sponsors/fluffy-critter">GitHub Sponsors</a>. But no pressure.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Publ 0.6.8, Authl 0.4.3</title>
        <link href="http://publ.beesbuzz.biz/blog/317-Publ-0.6.8-Authl-0.4.3" rel="alternate" type="text/html" />
        <published>2020-08-02T02:37:43-07:00</published>
        <updated>2020-08-02T02:37:43-07:00</updated>
        <id>urn:uuid:c21a4c34-babe-5c35-9b98-aa8db67fc8e4</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Some pretty big new features added. First, in Authl:</p>
<ul>
<li>Major <a href="https://authl.readthedocs.io">documentation</a> improvements</li>
<li>Bug fixes with Fediverse instance caching</li>
<li>All providers now normalize to the same profile format</li>
<li>Some basic spam prevention for the email provider</li>
<li>100% unit test coverage on the Fediverse provider (which is now using <a href="https://github.com/halcy/Mastodon.py">mastodon.py</a> instead of a hand-rolled OAuth client)</li>
</ul>
<p>And in Publ:</p>
<ul>
<li>Fenced code now uses <code>&lt;figure&gt;</code> and <code>&lt;figcaption&gt;</code> instead of ad-hoc <code>&lt;div&gt;</code>s for its layout, and the overall HTML semantic has been greatly improved</li>
<li>Individual code blocks are now configurable with respect to highlighting and line numbering</li>
<li>The <a href="http://publ.beesbuzz.biz/api/user">user object</a> now provides a user profile and separates the identity URL from the familiar name</li>
</ul>


<p>Currently I am getting quite frustrated with the state of this documentation site. I am working towards making Publ itself more amenable to documentation via pydoc/readthedocs, and transitioning this site only to be for demos and usage examples. I&rsquo;m not sure how to make the templating guide and markdown extensions fit in with RTD, though.</p><p>I&rsquo;ve <a href="https://github.com/PlaidWeb/Publ/issues/58">long wanted</a> to do some sort of automated documentation generation, though, and as the various mechanisms in Publ get more complicated this starts to feel way more important. This is definitely something I could use some help on, for anyone who&rsquo;s interested.</p><p>It&rsquo;s also becoming more and more apparent that there needs to be some sort of online post editor, and I really ought to get around to building the simple one I&rsquo;ve had in mind for a while. This is long-overdue.</p><p>Anyway. This update is a lot of fun. See <a href="https://beesbuzz.biz/11695">some of the stuff you can do with it</a>!</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Publ 0.6.6, Authl 0.4.0</title>
        <link href="http://publ.beesbuzz.biz/blog/85-Publ-0.6.6-Authl-0.4.0" rel="alternate" type="text/html" />
        <published>2020-05-31T03:32:50-07:00</published>
        <updated>2020-05-31T03:32:50-07:00</updated>
        <id>urn:uuid:d31d1c24-6e50-5491-8b27-d9515e0db01a</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>I&rsquo;ve just released new versions of Publ and Authl.</p><p>Publ v0.6.6 changes:</p>
<ul>
<li>Fixed a regression that made it impossible to log out</li>
<li>Fixed a problem where <code>WWW-Authenticate</code> headers weren&rsquo;t being cached properly</li>
<li>Improve the changed-file cache-busting methodology</li>
<li>Add object pooling to Entry, Category, and View (for a potentially big memory and performance improvement)</li>
</ul>
<p>Authl v0.4.0 changes:</p>
<ul>
<li>Finally started to add unit tests</li>
<li>Removed some legacy WebFinger code that was no longer relevant or ever touched</li>
<li>Added a mechanism to allow providers to go directly to login, as appropriate</li>
<li>Added friendly visual icons for providers which support them (a so-called &ldquo;<a href="https://indieweb.org/NASCAR_problem">NASCAR interface</a>&rdquo;)</li>
</ul>


<h2 id="85_h2_1_Publ-0.6.6"><a href="http://publ.beesbuzz.biz/blog/85-Publ-0.6.6-Authl-0.4.0#85_h2_1_Publ-0.6.6"></a>Publ 0.6.6</h2><p>The main reason for this update is just that the embarrassing logout bug was rearing its head and I wanted to fix it on my site without monkeypatching it or temporarily moving to git head or whatever. The <code>WWW-Authenticate</code> fix is nice, though, as it&rsquo;s related to some work I&rsquo;m doing on Pushl (namely adding the ability to retrieve bearer tokens from an external helper program).</p><p>It&rsquo;s difficult to estimate what a performance change will be like based on testing on a developer desktop vs. a production VPS. In particular, the various I/O performance characteristics can vary a lot, and Publ is primarily I/O bound. In my desktop-side testing I found that the object pooling increased performance by 15%, which is already pretty great, but that&rsquo;s also on a machine with a lot of memory, a huge file cache, and no disk virtualization. I&rsquo;ve only deployed Publ 0.6.6 on my personal website around half an hour ago, but already my site monitoring is showing a <em>rather impressive</em> performance improvement. For example, the Atom feed used to take around 30 seconds to render on a cache miss. Right now it seems to take 2.5 seconds.</p><p>So, yeah, it takes only 10% of the time to run now &ndash; that&rsquo;s around a <em>900% performance improvement</em> in a typical deployment scenario. So, that&rsquo;s pretty great.</p><p>Right now the largest remaining performance bottleneck seems to be in PonyORM, which is unfortunate. I haven&rsquo;t yet figured out if it&rsquo;s with PonyORM itself, or with its interface to sqlite. From what I can tell, the way that trace profiling works in Python means that things with a lot of function calls become quite a lot slower than long-running things within a single function, so things that do a lot of abstraction and dependency injection (like, say, PonyORM) get unfairly impacted in trace profiling. A sample-based profiling approach would be much more fair and realistic, but I haven&rsquo;t found any sample-based Python profilers (and I don&rsquo;t know enough about Python&rsquo;s internals to know if that&rsquo;s even a possibility).</p><p>My short-term goals for Publ are otherwise unchanged since the <a href="http://publ.beesbuzz.biz/blog/467-Publ-v0.6.5">last release announcement</a>.</p><h2 id="85_h2_2_Authl-0.4.0"><a href="http://publ.beesbuzz.biz/blog/85-Publ-0.6.6-Authl-0.4.0#85_h2_2_Authl-0.4.0"></a>Authl 0.4.0</h2><p>I hadn&rsquo;t worked on Authl in quite some time, but I felt like it needed some attention.</p><p>These Authl changes are basically for some UX improvements that had been bugging me for a while; there was an awful lot of text to read and that was possibly scary to newcomers. Now there&rsquo;s still just as much text to read but there&rsquo;s friendly icons for a bunch of the supported services, and silo services such as Twitter can now go straight to the login flow without implying that the username is necessary.</p><p>Here&rsquo;s a before and after on the default Flask template:</p><p><a href="http://publ.beesbuzz.biz/blog/85-Publ-0.6.6-Authl-0.4.0"><img src="http://publ.beesbuzz.biz/static/_img/7b/2a08/authl-0.3.6_08775e7819_320x153.png" width="320" height="153" srcset="http://publ.beesbuzz.biz/static/_img/7b/2a08/authl-0.3.6_08775e7819_320x153.png 1x, http://publ.beesbuzz.biz/static/_img/7b/2a08/authl-0.3.6_08775e7819_640x306.png 2x" loading="lazy" alt="authl-0.3.6.png" title="v0.3.6"></a><a href="http://publ.beesbuzz.biz/blog/85-Publ-0.6.6-Authl-0.4.0"><img src="http://publ.beesbuzz.biz/static/_img/b1/3d85/authl-0.4.0_5c04af48c1_320x160.png" width="320" height="160" srcset="http://publ.beesbuzz.biz/static/_img/b1/3d85/authl-0.4.0_5c04af48c1_320x160.png 1x, http://publ.beesbuzz.biz/static/_img/b1/3d85/authl-0.4.0_5c04af48c1_640x320.png 2x" loading="lazy" alt="authl-0.4.0.png" title="v0.4.0"></a></p><p>The next thing I want to work on for Authl is finally adding actual support for user profiles. This would also probably go along with things like adding more providers, particularly Facebook, Tumblr, and maybe even OpenID 1.x (i.e. Dreamwidth). Better profile support means having a friendlier greeting than just the canonical identity URL, among other things that people might want in their own federated login use cases.</p><h2 id="85_h2_3_Some-other-thoughts-of-things-th"><a href="http://publ.beesbuzz.biz/blog/85-Publ-0.6.6-Authl-0.4.0#85_h2_3_Some-other-thoughts-of-things-th"></a>Some other thoughts of things that would be neat</h2><p>Now that Publ supports <a href="http://publ.beesbuzz.biz/blog/738-Publ-v0.6.4-now-with-attachments">entry attachments</a>, it might be reasonable to add native server-side webmentions; rather than fetching the mentions from webmention.io on every page view, have a webhook on update that triggers a script that fetches and formats the mentions as an attachment that can then be rendered and cached, as well as getting all of the benefits of SEO that it would bring. For some sites, having the comments be indexed by the search engines makes a <em>huge</em> difference to page ranking, since the conversation about an article can add in some useful keywords that weren&rsquo;t in the actual article. (Not to mention it improves the page&rsquo;s &ldquo;freshness&rdquo; as far as the search engine is concerned.)</p><p>Another thought I&rsquo;ve had about attachments is they could be used to implement a server-side comment system, although that would require a <em>lot</em> more work than webmention rendering (UI, moderation/spam-filtering, migrating stuff <em>again</em>) and after all the work I put into my <a href="https://posativ.org/isso/">Isso</a> setup I&rsquo;m not quite ready to think about how to actually do that. I&rsquo;d probably want to do it in the form of having a mechanism to pre-render the Isso comment thread and form into an HTML attachment rather than having every part of it handled via Publ entry attachments.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>Publ v0.6.5</title>
        <link href="http://publ.beesbuzz.biz/blog/467-Publ-v0.6.5" rel="alternate" type="text/html" />
        <published>2020-05-28T15:45:21-07:00</published>
        <updated>2020-05-28T15:45:21-07:00</updated>
        <id>urn:uuid:e4cab3c9-8f5a-588b-862e-c403a17aa8ea</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Publ v0.6.5 is now out. Has the following changes:</p>
<ul>
<li>Upgrading Publ will now invalidate the cache</li>
<li>Fixes the missing database session around the authentication log viewer</li>
<li>Fixes the way that the indexer works when an entry changes ID</li>
<li>Fixes a bug where draft entries&#39; temporary IDs were overriding the permanent/assigned IDs of visible entries</li>
<li>Added some <a href="http://publ.beesbuzz.biz/manual/238-Command-Line-Interface">useful commandline tools</a></li>
</ul>
<p>The next things I want to work on:</p>
<ul>
<li><a href="https://indieweb.org/Micropub">Micropub</a> endpoint (done as a separate component that you can optionally add)</li>
<li>Adding more unit tests</li>
<li>Maybe an actual (very basic) CMS UI? I dunno</li>
</ul>


]]>
        </content>
    </entry>
    
    <entry>
        <title>Publ 0.4.6, Authl 0.1.5</title>
        <link href="http://publ.beesbuzz.biz/blog/1381-Publ-0.4.6-Authl-0.1.5" rel="alternate" type="text/html" />
        <published>2019-07-26T00:36:14-07:00</published>
        <updated>2019-07-26T00:36:14-07:00</updated>
        <id>urn:uuid:9ffe2e4a-ddaa-5fc6-96e4-5822c483a3ee</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Updated some packages.</p><p>Main things with Publ since the last release:</p>
<ul>
<li>Internal cleanups to how caching happens</li>
<li>Stop spuriously-caching a bunch of stuff; in particular login/logout endpoint URLs no longer get cached</li>
<li>Various cleanups</li>
<li>Improve the way that built-in templates are managed</li>
<li>Initial cruddy implementation of an admin authentication dashboard (although this isn&rsquo;t quite ready for prime time)</li>
</ul>
<p>The only Authl change is that email identities are now given as a full <code>mailto:</code> URL; going forward all identity strings will be full URLs. This simplifies the UX for admin dashboards, in particular, and removes some ambiguity.</p>

<p>This initial release of the admin dashboard is incredibly slow, both because there&rsquo;s a bunch of stuff that isn&rsquo;t being cached that could be, and because it just shows the entire log. Which turns out to be <em>massive</em> in a lot of cases. Or at least it is on my site.</p><p>To that end, since releasing this (and discovering how horribly it runs on my own site), I&rsquo;ve made the queries a lot faster, enabled pagination on the auth log, and also changed the auth log to <em>not</em> record actions on non-logged-in users, because that turns out to not actually be useful. The point of the auth log is really to see which known users are actively trying to access entries and whether they were successful or not &ndash; meaning, do permissions need to be adjusted. The only time it&rsquo;s useful to know about anonymous logins is on entries whose <a href="http://publ.beesbuzz.biz/manual/formats/322-Entry-files#auth">auth header</a> is set to <code>!*</code> and that seems of limited use.</p><p>In the future I may go even further and limit it to only tracking the most recent access for a given user on an entry. The purpose of this is for verifying access control, not for performing analytics or being creepy/narcissistic.</p><p>Anyway! Milestone v0.5.0 is almost met! I just have <a href="https://github.com/PlaidWeb/Publ/milestone/5">a few tasks remaining</a>, after which I can start on <a href="https://github.com/PlaidWeb/Publ/milestone/6">the next milestone</a> which is mostly about <a href="http://beesbuzz.biz/blog/5234-Thoughts-on-quality-engineering">testing and quality</a>; Publ is very much lacking in the automation department, particularly for testing and for building the documentation.</p><p>I&rsquo;d also like to finally make this site into a useful demo of Publ&rsquo;s capabilities. Demonstrating its image handling, template flexibility, and authentication support is really important to me, since those are the reasons I decided to build Publ, after all.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>v0.4.0 released! Let&#39;s talk future!</title>
        <link href="http://publ.beesbuzz.biz/blog/604-v0.4.0-released-Let-s-talk-future" rel="alternate" type="text/html" />
        <published>2019-05-13T23:11:41-07:00</published>
        <updated>2019-05-13T23:11:41-07:00</updated>
        <id>urn:uuid:62546caf-79d9-5c81-95c3-bde352bb9003</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>Oh wow, I finally closed out the <a href="https://github.com/PlaidWeb/Publ/milestone/2">Publ 0.4.0 milestone</a>. So, wow, this is a pretty big deal for me.</p><p>Changes since 0.3.23:</p>
<ul>
<li>Fixed a bug with <a href="https://github.com/PlaidWeb/Publ/pull/202">absolute paths in asset links</a></li>
<li>Added a <a href="https://github.com/PlaidWeb/Publ/pull/203">default error handler</a> if there&rsquo;s no global error template configured</li>
<li>Finally added the ability to <a href="https://github.com/PlaidWeb/Publ/pull/204">configure the Markdown processor</a>, both at the global and per-template level</li>
</ul>
<p>So that closes out the last three issues before I was ready to consider this usable by a wider audience. Neat.</p><p>There&rsquo;s <a href="https://github.com/PlaidWeb/Publ/milestone/3">a lot of stuff I want to do for 1.0</a> of course, but also more importantly I need to vastly improve the documentation on this site, as well as collect things to make it easier for people to get started with Publ. I would absolutely invite people to make suggestions; have you looked into Publ, and been confused about what exactly to do? Please let me know!</p><p>The best ways to do so are to either hop onto <a href="https://beesbuzz.biz/discord">my Discord channel</a> or to open issues against <a href="https://github.com/PlaidWeb/publ-site/issues">the documentation site</a>.</p>

<p>Also, Publ itself is built to be a tool, and not a complete standalone thing. I will absolutely talk your ear off about how I think a more user-friendly publishing frontend could be built, as well as easier ways of actually installing/deploying this places.</p><p>One of the things I am considering doing is running some minimal Publ-oriented hosting for folks, where I&rsquo;d set up a private git repository and a minimal site and make it hopefully easier for people to actually do their thing, and maybe charge a marginal amount for it (say, $X/month for X GB of storage, and include SSL and basic site assistance and whatever). If you&rsquo;d be interested in that sort of thing, again, please let me know!</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>v0.3.19, now with extra tagging goodness!</title>
        <link href="http://publ.beesbuzz.biz/blog/232-v0.3.19-now-with-extra-tagging-goodness" rel="alternate" type="text/html" />
        <published>2019-03-04T15:47:43-08:00</published>
        <updated>2019-03-05T01:36:55+00:00</updated>
        <id>urn:uuid:65a7908e-6d8a-5dea-b1b4-d2961d4d4024</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>I&rsquo;ve released Publ v0.3.19, which now finally has a tagging system, which is only <a href="http://publ.beesbuzz.biz/issue/22">one of the oldest issues that was still open</a>.</p><p>Here&rsquo;s a list of what&rsquo;s been added or changed since 0.3.18:</p>
<ul>
<li>The test site is now part of the Publ repository itself (as <a href="http://publ.beesbuzz.biz/blog/332-Tests-removed-from-main-site">mentioned previously</a>)</li>
<li>Added <code>crop</code> and <code>fullsize_crop</code> to <a href="http://publ.beesbuzz.biz/manual/335-Image-renditions">image renditions</a> (although I&rsquo;ve already decided the <a href="http://publ.beesbuzz.biz/issue/179">format should be different</a> after using this for a day)</li>
<li>Made <code>Path-Alias</code> <a href="http://publ.beesbuzz.biz/issue/166">less annoying</a></li>
<li>Fixed an issue with <a href="http://publ.beesbuzz.biz/issue/175">unpaged archive links getting filtered</a></li>
<li>Prune <a href="http://publ.beesbuzz.biz/issue/101">missing files from the index</a></li>
</ul>
<h3 id="232_h3_1_Credits"><a href="http://publ.beesbuzz.biz/blog/232-v0.3.19-now-with-extra-tagging-goodness#232_h3_1_Credits"></a>Credits</h3><p>I want to thank <a href="https://github.com/karinassuni">Karina Antonio</a> for <a href="https://github.com/PlaidWeb/Publ/pull/169">implementing image cropping</a>.</p>

<h3 id="232_h3_2_On-image-cropping"><a href="http://publ.beesbuzz.biz/blog/232-v0.3.19-now-with-extra-tagging-goodness#232_h3_2_On-image-cropping"></a>On image cropping</h3><p>Originally I would have implemented cropping the way Karina did, but I got it stuck in my head that it would be much more efficient to compute the source rectangle and only do a single crop operation when it came to building the rendition. My four reasons for this were:</p>
<ul>
<li>Performance (only crop once if possible)</li>
<li>Something to do with better image quality (i.e. an intuitive thing that was stuck in my brain but had nothing to do with reality)</li>
<li>Wanting to match the cropping rectangle&rsquo;s aspect to the output aspect</li>
<li>Wanting the rendition filename to only reflect the input box</li>
</ul>
<p>Performance is a non-issue; even if it did make a measurable difference, renditions are cached as long as they&rsquo;re being used, and thus don&rsquo;t actually need to be recomputed every time.</p><p>Image quality was just something stuck in my head from when I was working on the Amazon image rendering service, because of some less-than-optimal things it did internally. It&rsquo;s not an issue for how Pillow works though.</p><p>Aspect matching is still a thing I kind of wanted to do, but then that leads to a few things like, what gravity should be used when &ldquo;uncropping&rdquo; the rectangle, and what about honoring the intent of the crop for excluding stuff outside of the box, and so on? Anyway those are a lot of questions that had fiddly answers and the reality is that it&rsquo;s easier to just leave it up to the user to match the aspect as appropriate, and use <code>resize=&quot;fill&quot;</code> vs. <code>resize=&quot;fit&quot;</code> as appropriate.</p><p>And the rendition filename? Who heckin&#39; cares, the point to rendition filenames is that they&rsquo;re unique, idempotent, and debuggable, not pretty. The basic tenet of humane URLs doesn&rsquo;t apply to them.</p><p>Anyway, as mentioned above the cut I do want to make a change to how cropping works in that right now it uses Pillow&rsquo;s rectangle specification of <code>(left,top,right,bottom)</code> but after using it for a day I&rsquo;m finding that really annoying and basically all imaging software uses <code>(x,y,width,height)</code> with respect to the top-left corner, and it makes no sense to have <code>right &lt; left</code> or <code>bottom &lt; top</code> anyway. So, on the off chance you&rsquo;re using Publ for your site and trimming thumbnails of your images, I&rsquo;d recommend holding off until the next version.</p><p><mark>Update:</mark> And then about an hour later I realized that there was actually a <a href="https://github.com/PlaidWeb/Publ/compare/v0.3.19..1b404926d916541f82e81fb314feea17130c9422">really easy way</a> to make scale-cropping work correctly here and I&rsquo;m feeling silly for not noticing it before. So this actually satisfies all of my original reasons except for the cropping rectangle aspect!  Also while testing this I found a case where the <code>(x,y,w,h)</code> tuple syntax confuses the Markdown parser, so it now also accepts an <code>&#39;x,y,w,h&#39;</code> string as well.</p><h3 id="232_h3_3_The-road-to-v0.4.0"><a href="http://publ.beesbuzz.biz/blog/232-v0.3.19-now-with-extra-tagging-goodness#232_h3_3_The-road-to-v0.4.0"></a>The road to v0.4.0</h3><p>A lot has changed in Publ since v0.3.0, and I feel like a v0.4.0 release is overdue. If I were doing proper <a href="https://semver.org">semantic versioning</a> we&rsquo;d be on, like, v2.29.0 by now, but I feel like Publ is more of a stream-of-updates thing than a scheduled-release thing. So the versioning scheme is pretty ad-hoc and more represents where I feel like Publ is in terms of being a Real Professional Publishing System vs. being a toy I made for myself.</p><p>So, I have two planned version milestones, <a href="https://github.com/PlaidWeb/Publ/milestone/2">v0.4</a> and <a href="https://github.com/PlaidWeb/Publ/milestone/3">v1.0</a>. v0.4 is roughly where I feel like it should be stable enough for use by people who are into having a stable system to work with and don&rsquo;t want to deal with fiddly stuff that&rsquo;s an artifact of things being developed ad-hoc, and v1.0 is more like, hey, let&rsquo;s get all of the Big Features done and also get it incredibly polished for large-scale adoption.</p><p>So, v0.4 is almost ready for release, I think, but v1.0 is going to be much further out, since it also involves much larger feature work (such as authenticated/private content), and likely I&rsquo;ll end up establishing a closer milestone for major feature work like that but for now I&rsquo;m just using 1.0 as a bucket for &ldquo;everything that makes this a compelling blogging platform&rdquo; (i.e. stuff to get people out of silos like LiveJournal or Facebook).</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>v0.3.18, now with better asset management!</title>
        <link href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management" rel="alternate" type="text/html" />
        <published>2019-02-27T21:38:41-08:00</published>
        <updated>2019-02-27T21:38:41-08:00</updated>
        <id>urn:uuid:43c58b8f-3bb5-5a52-b08f-2259e4455216</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>I&rsquo;ve just released v0.3.18, with the following changes:</p>
<ul>
<li>Add date grouping properties to <a href="http://publ.beesbuzz.biz/api/entry#date_grouper">entry</a></li>
<li>Add a <a href="http://publ.beesbuzz.biz/api/view#all_pages"><code>pages</code> property</a> to <code>view</code></li>
<li>Provide the current <code>category</code> object to the error handler</li>
<li>Support linking to non-image/non-entry local files</li>
<li>Added, then removed, some performance micro-optimizations that only caused problems</li>
</ul>
<p>More details about the major changes below!</p><p><mark>Update:</mark> I released a hotfix as 0.3.18.1 because there was a last-minute bug that snuck in while I was trying to silence a new pylint error. Oops.</p>

<h3 id="1253_h3_1_Local-file-links"><a href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#1253_h3_1_Local-file-links"></a>Local file links</h3><p>So, as I <a href="http://publ.beesbuzz.biz/blog/478-v0.3.15-Released-finally">mentioned previously</a>, right now a lot of my work on Publ is with the purpose of updating the website of the research lab I currently work at. There&rsquo;s a <em>lot</em> of content on the site and most of it isn&rsquo;t particularly well-structured. Much of the site involves collecting publications that lab members have been involved in, and also providing the supplemental materials thereof or even the full papers in some cases.</p><p>This means there&rsquo;s a lot of assets to manage, and they aren&rsquo;t all systematically-named. Or tracked. Or easy to track down.</p><p>One of the things I&rsquo;ve wanted to do <a href="http://publ.beesbuzz.biz/issue/141">for a while</a> is to support posting images which aren&rsquo;t necessarily images that PIL can handle (such as SVGs or the like), and with a lot of the refactoring I&rsquo;d done over link handling I realized that there isn&rsquo;t really anything fundamentally different about SVGs than, say, all sorts of file types &ndash; PDFs, Javascript, source code, and so on. So, I extended the model&rsquo;s <code>Image</code> type a bit to allow for &ldquo;images&rdquo; that aren&rsquo;t actually images. (Really I should rename the class to <code>Asset</code>, which maybe I&rsquo;ll do later on.)</p><p>So, after a bunch more refactoring of how links and images are handled, link resolution is much simpler and also supports <a href="http://publ.beesbuzz.biz/_file/3f815/9/boxes.svg">any file that&rsquo;s not covered by the index</a>. But it does it in a safe way! Rather than index every possible file, it only indexes files which are pointed to by an entry, and if that file isn&rsquo;t an image, it gets assigned a fictional filename which is (essentially) unguessable but humane, and then there&rsquo;s an asset-retrieval endpoint which retrieves the file.</p><p>The end result of this is that only links to files which have been linked to on the site are available via the <code>_file</code> endpoint &ndash; it shouldn&rsquo;t be possible for people to guess at file paths and get at internal data!</p><p>Anyway, now static assets which belong to an entry can just live along with that entry!</p><p>(Assets which belong to a template should still live in the <code>static/</code> directory, though. That&rsquo;s what it&rsquo;s for, after all.)</p><h3 id="1253_h3_2_entry.date_year-et-al"><a href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#1253_h3_2_entry.date_year-et-al"></a><code>entry.date_year</code> et al</h3><p>This is also a thing I added for the lab&rsquo;s site; I needed a convenient way to group publications by year, and realized that there are other use cases which call for this as well, such as structured archive pages on a blog or the like. I wasn&rsquo;t terribly happy with adding purpose-specific properties for this but I couldn&rsquo;t find a way to make Jinja group by the result of a callable, so this was a convenient compromise.</p><h3 id="1253_h3_3_view.pages"><a href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#1253_h3_3_view.pages"></a><code>view.pages</code></h3><p>This was an artifact of the first way I tried implementing year grouping &ndash; I thought, hey, maybe I&rsquo;ll just paginate by year and then iterate over the pages. This turned out to be <em>very</em> slow, however.</p><p>It might be a useful thing for someone, though, so I left it in. I don&rsquo;t recommend using it.</p><h3 id="1253_h3_4_Future-priorities"><a href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#1253_h3_4_Future-priorities"></a>Future priorities!</h3><p>A thing which keeps on coming up is the ability to add tags to entries, and specifically a way of <a href="http://publ.beesbuzz.biz/issue/22" title="wow that one's been open a while">filtering by tag</a>. I put in what I hope is a short-term hack on the applicable templates on the lab site which looks something like:</p><figure class="blockcode"><pre class="highlight" data-language="jinja2" data-line-numbers><span class="line" id="e1253cb1L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb1L1"></a><span class="line-content">{% for entry in view.entries %}</span></span>
<span class="line" id="e1253cb1L2"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb1L2"></a><span class="line-content">{% if my_tag in(entry.get_all(&#39;Tag&#39;)) %}</span></span>
<span class="line" id="e1253cb1L3"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb1L3"></a><span class="line-content">{{entry.body}}</span></span>
<span class="line" id="e1253cb1L4"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb1L4"></a><span class="line-content">{% endif %}</span></span>
<span class="line" id="e1253cb1L5"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb1L5"></a><span class="line-content">{% endfor %}</span></span>
</pre></figure><p>but I&rsquo;d really like to be able to do something like:</p><figure class="blockcode"><pre class="highlight" data-language="jinja2" data-line-numbers><span class="line" id="e1253cb2L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb2L1"></a><span class="line-content">{% for entry in view(tag=my_tag).entries %}</span></span>
<span class="line" id="e1253cb2L2"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb2L2"></a><span class="line-content">{{entry.body}}</span></span>
<span class="line" id="e1253cb2L3"><a class="line-number" href="http://publ.beesbuzz.biz/blog/1253-v0.3.18-now-with-better-asset-management#e1253cb2L3"></a><span class="line-content">{% endfor %}</span></span>
</pre></figure><p>i.e. make the database do the work. This also enables a bunch of other useful stuff like being able to finally implement tag navigation for blogs and feeds and whatever.</p><p>I don&rsquo;t think it would be that hard to implement, but I just haven&rsquo;t gotten around to it, despite having a bunch of tags on my own blog entries already. It&rsquo;s not, like, urgently needed, but now I have an impetus to actually do it.</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>v0.3.11</title>
        <link href="http://publ.beesbuzz.biz/blog/392-v0.3.11" rel="alternate" type="text/html" />
        <published>2018-12-15T01:08:43-08:00</published>
        <updated>2018-12-15T01:08:43-08:00</updated>
        <id>urn:uuid:50e6e4d7-9db1-5365-a9df-97453bc559d7</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>v0.3.11 is now released, with the following changes:</p>
<ul>
<li>A more complete fix for how to handle image sets and inline images with respect to paragraphs</li>
<li>Better cleanup for spurious empty paragraphs</li>
<li>Improved internal entry link handling</li>
</ul>
<p>Detailed descriptions of the changes are below.</p>

<h2 id="392_h2_1_Improved-entry-link-handling"><a href="http://publ.beesbuzz.biz/blog/392-v0.3.11#392_h2_1_Improved-entry-link-handling"></a>Improved entry link handling</h2><p>Entry links used to just be pretty simplistic; for example,</p><p>previously an entry link like</p><figure class="blockcode"><pre class="highlight" data-language="markdown" data-line-numbers><span class="line" id="e392cb1L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb1L1"></a><span class="line-content">[<span class="nt">foo</span>](<span class="na">123</span>)</span></span>
</pre></figure><p>would just generate</p><figure class="blockcode"><pre class="highlight" data-language="html" data-line-numbers><span class="line" id="e392cb2L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb2L1"></a><span class="line-content"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;123&quot;</span><span class="p">&gt;</span>foo<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span>
</pre></figure><p>which would require at least a redirect to the entry from the path resolver, and also required external feed readers to be savvy enough to rewrite URLs (which is technically a violation of the Atom spec although most feed readers do the rewriting even though they&rsquo;re not supposed to). Now it will generate a link like:</p><figure class="blockcode"><pre class="highlight" data-language="html" data-line-numbers><span class="line" id="e392cb3L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb3L1"></a><span class="line-content"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;/example/123-some-foo&quot;</span><span class="p">&gt;</span>foo<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span>
</pre></figure><p>or, in an absolute context (e.g. a feed),</p><figure class="blockcode"><pre class="highlight" data-language="html" data-line-numbers><span class="line" id="e392cb4L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb4L1"></a><span class="line-content"><span class="p">&lt;</span><span class="nt">a</span> <span class="na">href</span><span class="o">=</span><span class="s">&quot;http://example.com/example/123-some-foo&quot;</span><span class="p">&gt;</span>foo<span class="p">&lt;/</span><span class="nt">a</span><span class="p">&gt;</span></span></span>
</pre></figure><p>But the primary improvement here is that it will also resolve links to entries by filename; for example, all of the below should work:</p><figure class="blockcode"><pre class="highlight" data-language="markdown" data-line-numbers><span class="line" id="e392cb5L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb5L1"></a><span class="line-content">[<span class="nt">some other entry</span>](<span class="na">other-entry.md</span>)</span></span>
<span class="line" id="e392cb5L2"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb5L2"></a><span class="line-content">[<span class="nt">in a parent directory</span>](<span class="na">../other-entry.md</span>)</span></span>
<span class="line" id="e392cb5L3"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb5L3"></a><span class="line-content">[<span class="nt">relative to content root</span>](<span class="na">/blog/other-entry.md</span>)</span></span>
</pre></figure><p>You can see <del><a href="http://publ.beesbuzz.biz/_tests/relative entry links.md">some tests of this</a></del> (UPDATE: tests have been <a href="http://publ.beesbuzz.biz/blog/332-Tests-removed-from-main-site">removed from this repo</a>). This link was, of course, generated with <code>[some tests of this](/_tests/relative entry links.md)</code> (but using <a href="http://publ.beesbuzz.biz/blog/189">the entry ID</a> should still work as well).</p><p>This of course means that any Publ site will automatically get much better links for existing entries too, with no work needed on the publisher&rsquo;s end.</p><h2 id="392_h2_2_Thoughs-about-future-functionali"><a href="http://publ.beesbuzz.biz/blog/392-v0.3.11#392_h2_2_Thoughs-about-future-functionali"></a>Thoughs about future functionality</h2><p>One of the things I&rsquo;ve been wanting to add since the very beginning is private content; I&rsquo;ve rambled quite a lot about how I might support that in Atom <a href="https://beesbuzz.biz/blog/4594-The-authenticated-Atom-musings-continue">over on my personal blog</a>. But I haven&rsquo;t really talked about how this will go into Publ itself.</p><p>The changes to URL resolution got me thinking a lot about the whole &ldquo;public links to private entries&rdquo; issue and thinking about how I want to deal with data hiding/sanitization in Publ itself, and I came to realize that a lot of the groundwork for the fiddly bits is already there in Publ. For example, the <a href="http://publ.beesbuzz.biz/blog/135-v0.3.10-released">changes to caching</a> already make it so that I don&rsquo;t have to worry about serving up private content due to a spurious cache hit (or serving up a public view to an authenticated viewer, for that matter), as the authenticated user will be part of the cache memoization already.</p><p>And I think that the data privacy model can be that the <code>Entry</code> object itself knows about auth &ndash; for example, it will know who the logged-in user is and whether they have access to the entry &ndash; and will only provide the data that should be visible. Which means that out of the box, private entries will at worst show up as placeholders with no data (or displaying shim content, anyway), and even things like link generation will be subject to these rules; the link resolver will be able to just see whether the viewer is authorized to see the title, and if not, it will just produce an old-style <code>/id</code> link, so no information about it leaks through that either.</p><p>There will of course be a couple of APIs to add in order to improve the view for unauthorized content, though; I&rsquo;ll probably add a property to <code>Entry</code> to indicate whether the entry is unauthorized (so the template can show a &ldquo;please log in&rdquo; thing or whatever), and then <code>view.entries</code>, <code>entry.next</code>, and <code>entry.previous</code> will gain an <code>unauthorized</code> parameter to decide whether unauthorized content should be shown in the first place. So in fact the placeholder entries wouldn&rsquo;t even appear by default. Also it should get some way of determining if any auth is needed at all, so that e.g. Disqus threads can be configured appropriately (like having two separate communities, one for public posts that allows discovery and one for private posts which doesn&rsquo;t).</p><p><code>View</code> will also probably get a <code>needs_auth</code> property, which will return <code>True</code> if the user isn&rsquo;t identified <em>and</em> there&rsquo;s private content that would appear in the view. That way, if someone isn&rsquo;t identified, a category template can show whatever is appropriate to request auth from the client (e.g. an HTML fragment directing the viewer to the login page, or an Atom fragment with <code>&lt;link rel=&quot;auth&quot;&gt;</code> or whatever).</p><p>Authentication itself, by the way, will absolutely be handled via <a href="https://indieweb.org/IndieAuth">IndieAuth</a> and <a href="https://indieweb.org/AutoAuth">AutoAuth</a>.</p><p>From a publisher&rsquo;s perspective I see it working like this:</p><p>First, there will be a metadata file in some as-yet-undetermined format (probably YAML or JSON) that has mappings like e.g.:</p><figure class="blockcode"><pre class="highlight" data-language="yaml" data-line-numbers><span class="line" id="e392cb6L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L1"></a><span class="line-content"><span class="nt">http://beesbuzz.biz/</span><span class="p">:</span><span class="w"> </span><span class="c1"># that&#39;s me!</span></span></span>
<span class="line" id="e392cb6L2"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L2"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">_admin</span></span></span>
<span class="line" id="e392cb6L3"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L3"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">friends</span></span></span>
<span class="line" id="e392cb6L4"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L4"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">private</span></span></span>
<span class="line" id="e392cb6L5"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L5"></a><span class="line-content"><span class="nt">http://example.com/larry</span><span class="p">:</span><span class="w"> </span><span class="c1"># Larry from high school</span></span></span>
<span class="line" id="e392cb6L6"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L6"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">enemies</span></span></span>
<span class="line" id="e392cb6L7"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L7"></a><span class="line-content"><span class="nt">http://example.com/alice</span><span class="p">:</span><span class="w"> </span><span class="c1"># Alistair</span></span></span>
<span class="line" id="e392cb6L8"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L8"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">private</span></span></span>
<span class="line" id="e392cb6L9"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L9"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">enemies</span><span class="w">  </span><span class="c1"># I&#39;m not talking to them right now...</span></span></span>
<span class="line" id="e392cb6L10"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L10"></a><span class="line-content"><span class="nt">http://example.com/nancy</span><span class="p">:</span></span></span>
<span class="line" id="e392cb6L11"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb6L11"></a><span class="line-content"><span class="w">    </span><span class="l l-Scalar l-Scalar-Plain">private</span></span></span>
</pre></figure><p>Next, private entries will get a header that indicates which identities or groups have (or don&rsquo;t have) access; for an over-complicated example:</p><figure class="blockcode"><pre class="highlight" data-language="email" data-line-numbers><span class="line" id="e392cb7L1"><a class="line-number" href="http://publ.beesbuzz.biz/blog/392-v0.3.11#e392cb7L1"></a><span class="line-content"><span class="nt">Private:</span><span class="w"> </span>private<span class="w"> </span>!enemies<span class="w"> </span>http://<span class="nf">example.com</span>/fred<span class="w"> </span>!http://<span class="nf">example.com</span>/nancy</span></span>
</pre></figure><p>which means that people in the &ldquo;private&rdquo; group can see it, unless they&rsquo;re in the &ldquo;enemies&rdquo; group, and also let Fred (who isn&rsquo;t in a group) to this entry, but don&rsquo;t allow Nancy to see it even though she&rsquo;s in the private group. (I would also probably have a special token <code>*</code> which matches anyone who has a known identity, whether they&rsquo;re in a group or not, mostly for the purpose of showing a login/logout widget on the sidebar or whatever.)</p><p>Finally, if someone accesses the site and authenticates, this information will in some way be floated to the publisher, so they know whether to add the person to the friends list or whatever. (Perhaps there can be a daily digest of newly-visible folks, as well as a panel that is restricted to specific identities (like in the special <code>_admin</code> group) that shows all of the information about recent access. Most likely the user table will simply have a <code>last_seen</code> column.)</p><p>Open questions:</p>
<ul>
<li>Would it be useful to assign access groups on a per-category basis, or does that just needlessly overcomplicate things?</li>
<li>What about access at the category level itself? (also probably overcomplicated)</li>
<li><p>Are there any IndieAuth endpoints out there which let people log in directly with particular OAuth identities?</p><p>Like, it&rsquo;s really annoying to require people to authenticate with a profile page that has a bidirectional <code>rel=&quot;me&quot;</code> relationship to one of the common OAuth providers (GitHub, Twitter, etc.), but none of the endpoints I&rsquo;ve seen let you just provide that provider <em>as</em> your profile link in the first place. And this presents a big barrier to entry, IMO.</p><p>It&rsquo;d also be great if these endpoints were to widen their net; so far I only see support for GitHub and Twitter, but there&rsquo;s a <em>ton</em> of folks using Mastodon now, for example.</p></li>
<li><p>How the heck am I going to test IndieAuth login while I&rsquo;m working on it? I guess I could spin up another Publ instance on my server, ugh&hellip;</p></li>
</ul>
<p>Anyway, I am pretty excited about how having proper private blogging feels like it&rsquo;s actually within my grasp!</p>

]]>
        </content>
    </entry>
    
    <entry>
        <title>v0.1.19: creeping ever closer to beta status</title>
        <link href="http://publ.beesbuzz.biz/blog/618-v0.1.19-creeping-ever-closer-to-beta-status" rel="alternate" type="text/html" />
        <published>2018-05-27T17:22:23-07:00</published>
        <updated>2018-05-27T17:22:23-07:00</updated>
        <id>urn:uuid:82350ae3-a269-4b13-be31-dd5cb2dbe2bb</id>
        <author><name>fluffy</name></author>
        <content type="html">
<![CDATA[
<p>The amount of stuff I&rsquo;m having to fix in Publ to support <a href="https://beesbuzz.biz/">beesbuzz.biz</a> is diminishing rapidly! Here&rsquo;s what&rsquo;s happened since 0.1.18:</p>
<ul>
<li>Improved the Path-Alias redirection logic; now it will do a <code>301 Permanently Moved</code> for inbound <code>Path-Alias</code>ed requests, and if a <code>Path-Alias</code> points to an entry with a <code>Redirect-To</code> it will redirect directly to that URL instead (and it will be a 302, same as the old <code>Redirect-To</code> behavior)</li>
<li>Pagination can now be weekly; you can use <code>entry.archive(paging=&#39;week&#39;)</code>, and a <code>?date=</code> view parameter ending in <code>_w</code> will provide a weekly view instead.</li>
<li>Better default formatting for <code>view.range</code>, and an addition of a <code>week</code> format parameter there</li>
</ul>


<p>What&rsquo;s left to do before I&rsquo;m happy releasing this as beta?</p><h3 id="618_h3_1_Release-blockers"><a href="http://publ.beesbuzz.biz/blog/618-v0.1.19-creeping-ever-closer-to-beta-status#618_h3_1_Release-blockers"></a>Release blockers</h3>
<ul>
<li><a href="https://github.com/fluffy-critter/Publ/issues/84">Cache should be disabled while index is taking place</a></li>
<li><a href="https://github.com/fluffy-critter/Publ/issues/106">Async image renditions don&rsquo;t respect <code>absolute</code> parameter</a></li>
</ul>
<h3 id="618_h3_2_Nice-to-haves"><a href="http://publ.beesbuzz.biz/blog/618-v0.1.19-creeping-ever-closer-to-beta-status#618_h3_2_Nice-to-haves"></a>Nice-to-haves</h3>
<ul>
<li><a href="https://github.com/fluffy-critter/Publ/issues/11">Enhanced path-alias</a></li>
<li><a href="https://github.com/fluffy-critter/Publ/issues/77">Add image cropping function</a></li>
</ul>
<h3 id="618_h3_3_Already-done"><a href="http://publ.beesbuzz.biz/blog/618-v0.1.19-creeping-ever-closer-to-beta-status#618_h3_3_Already-done"></a>Already done</h3><p>A change I made right after cutting v0.1.19 was to restore the index scan at startup, but only when running in production (since the deferred scan was to fix a bug that only manifests in debug mode).</p>

]]>
        </content>
    </entry>
    

    
</feed>