<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>PubHubs &amp;mdash; julian</title>
    <link>https://wrily.foad.me.uk/tag:PubHubs</link>
    <description>FOSS dev, self-hosting fan, Matrix, degoogling, small tech, indie tech, friendly tech for families and schools. Let&#39;s own our own identity &amp; data.</description>
    <pubDate>Sat, 25 Apr 2026 17:39:52 +0000</pubDate>
    <item>
      <title>PubHubs Moderation update 2024-04-29</title>
      <link>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-04-29</link>
      <description>&lt;![CDATA[Completing This Phase&#xA;&#xA;This is the last week of my funding on Moderator Tools for PubHubs. It has been a pleasure working with the PubHubs team. The time seems to go quickly.&#xA;&#xA;Over the last few weeks I have been documenting everything about the Moderator Tools for PubHubs project on my dedicated web site, https://www.ph.trax.im/.&#xA;&#xA;To summarise, these are the main work areas in this project, linking to their web site sections:&#xA;&#xA;Civilised Discourse&#xA;    Researching best practices to inform the longer term design of PubHubs moderation facilities.&#xA;&#xA;Disclosure of Identity Attributes&#xA;    Building a moderation tool specific to PubHubs&#39; special features.&#xA;&#xA;Draupnir for PubHubs&#xA;    Adapting the best existing moderation tool from the regular Matrix ecosystem (Draupnir), evaluating and extending it.&#xA;!--more--&#xA;&#xA;Looking Back&#xA;&#xA;How Did it Go? This is my own perspective.&#xA;&#xA;Draupnir for PubHubs (item 3) was the first task. At the beginning of the project, it seemed clear that a good way to start would be to integrate the best available Matrix moderation tool, Draupnir, into PubHubs. I made it work, but it turns out that at this time Draupnir is not a very good fit for PubHubs&#39;s needs. Read more in the Draupnir for PubHubs section.&#xA;&#xA;Disclosure of Identity Attributes (item 2) was undertaken next. This is about implementing a particular moderation feature, related to PubHubs&#39;s special identity system (IRMA/Yivi). Each participant is identified initially by a pseudonym. A moderator may ask a participant to disclose an attribute of their real identity, such as their registered home town), and the participant may provide a cryptographic proof (attestation) of the requested attribute, using Yivi. We now have a working implementation of this feature in PubHubs. There is a description, with screen-shots, in the Disclosure of Identity Attributes section.&#xA;&#xA;Civilised Discourse (item 1): We needed a higher level plan for how to address moderation needs in PubHubs. Research suggested that Discourse.org provides a good role model. The foundation of its successful pattern for civilised discourse is structured around the idea of &#34;Trust Levels&#34;, guiding each new user gradually through increasing power and responsibility, up to possibly becoming a community leader. The other key idea is that the best kind of moderation is more about giving positive signals guiding towards intended behaviour than it is about reacting to negative behaviours. We copy and adapt these ideas to PubHubs, suggesting how to build successive features around this concept. See the Civilised Discourse section.&#xA;&#xA;Each of these areas could be built on further. The Matrix moderation tool Draupnir turned out not to be such a useful building block as I had first assumed. However, we should keep an eye on upcoming developments from it and related projects from the wider Matrix world. Disclosure of Identity Attributes, with some work on a few aspects of its user experience, could be considered a complete feature. The Civilised Discourse concept has potential to guide the development of moderation-related features, in such a way as to promote desired behaviours as well as limiting undesired behaviours of a hub&#39;s community members.&#xA;&#xA;Looking Forward&#xA;&#xA;Where Next?&#xA;&#xA;This was a part-time assignment and the depth of exploration was limited. It would be satisfying to take this work further forward. I intend to stay in touch with PubHubs, at least as a volunteer. I might also submit another funding application. I would be glad to do further work on moderator tooling or perhaps in another area that would be useful to them.&#xA;&#xA;PubHubs is a great example of the kind of project I want to support. Software for the public good, built on freedom-respecting foundations of open standard protocols and free (libre) open source software (as listed on the Open Source page).&#xA;&#xA;Besides PubHubs I will be looking to work on other projects in the field, especially those based on Matrix which I see as having great potential as an open standard for many kinds of messaging. I am particularly interested in public-benefit and personal use cases, enabling organisations and individuals who want to take their private messaging away from the tech monopolies and into their own hands.&#xA;&#xA;---&#xA;&#xA;#PubHubs #matrix&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h2 id="completing-this-phase" id="completing-this-phase">Completing This Phase</h2>

<p>This is the last week of my funding on <a href="https://www.ph.trax.im/">Moderator Tools for PubHubs</a>. It has been a pleasure working with the PubHubs team. The time seems to go quickly.</p>

<p>Over the last few weeks I have been documenting everything about the Moderator Tools for PubHubs project on my dedicated web site, <a href="https://www.ph.trax.im/" title="Moderator Tools for PubHubs">https://www.ph.trax.im/</a>.</p>

<p>To summarise, these are the main work areas in this project, linking to their web site sections:</p>
<ol><li><p><a href="https://www.ph.trax.im/Moderation/civilised-discourse/"><strong>Civilised Discourse</strong></a></p>
<ul><li>Researching best practices to inform the longer term design of PubHubs moderation facilities.</li></ul></li>

<li><p><a href="https://www.ph.trax.im/Moderation/disclosure/"><strong>Disclosure of Identity Attributes</strong></a></p>
<ul><li>Building a moderation tool specific to PubHubs&#39; special features.</li></ul></li>

<li><p><a href="https://www.ph.trax.im/Moderation/Draupnir/draupnir-pubhubs/"><strong>Draupnir for PubHubs</strong></a></p>
<ul><li>Adapting the best existing moderation tool from the regular Matrix ecosystem (Draupnir), evaluating and extending it.
</li></ul></li></ol>

<h2 id="looking-back" id="looking-back">Looking Back</h2>

<p>How Did it Go? This is my own perspective.</p>

<p>Draupnir for PubHubs (item 3) was the first task. At the beginning of the project, it seemed clear that a good way to start would be to integrate the best available Matrix moderation tool, Draupnir, into PubHubs. I made it work, but it turns out that at this time Draupnir is not a very good fit for PubHubs&#39;s needs. Read more in the <a href="https://www.ph.trax.im/Moderation/Draupnir/draupnir-pubhubs/">Draupnir for PubHubs</a> section.</p>

<p>Disclosure of Identity Attributes (item 2) was undertaken next. This is about implementing a particular moderation feature, related to PubHubs&#39;s special identity system (IRMA/Yivi). Each participant is identified initially by a pseudonym. A moderator may ask a participant to disclose an attribute of their real identity, such as their registered home town), and the participant may provide a cryptographic proof (attestation) of the requested attribute, using Yivi. We now have a working implementation of this feature in PubHubs. There is a description, with screen-shots, in the <a href="https://www.ph.trax.im/Moderation/disclosure/">Disclosure of Identity Attributes</a> section.</p>

<p>Civilised Discourse (item 1): We needed a higher level plan for how to address moderation needs in PubHubs. Research suggested that Discourse.org provides a good role model. The foundation of its successful pattern for civilised discourse is structured around the idea of “Trust Levels”, guiding each new user gradually through increasing power and responsibility, up to possibly becoming a community leader. The other key idea is that the best kind of moderation is more about giving positive signals guiding towards intended behaviour than it is about reacting to negative behaviours. We copy and adapt these ideas to PubHubs, suggesting how to build successive features around this concept. See the <a href="https://www.ph.trax.im/Moderation/civilised-discourse/">Civilised Discourse</a> section.</p>

<p>Each of these areas could be built on further. The Matrix moderation tool Draupnir turned out not to be such a useful building block as I had first assumed. However, we should keep an eye on upcoming developments from it and related projects from the wider Matrix world. Disclosure of Identity Attributes, with some work on a few aspects of its user experience, could be considered a complete feature. The Civilised Discourse concept has potential to guide the development of moderation-related features, in such a way as to promote desired behaviours as well as limiting undesired behaviours of a hub&#39;s community members.</p>

<h2 id="looking-forward" id="looking-forward">Looking Forward</h2>

<p>Where Next?</p>

<p>This was a part-time assignment and the depth of exploration was limited. It would be satisfying to take this work further forward. I intend to stay in touch with <a href="https://pubhubs.net/en">PubHubs</a>, at least as a volunteer. I might also submit another funding application. I would be glad to do further work on moderator tooling or perhaps in another area that would be useful to them.</p>

<p>PubHubs is a great example of the kind of project I want to support. Software for the public good, built on freedom-respecting foundations of open standard protocols and free (libre) open source software (as listed on the <a href="https://www.ph.trax.im/About/open-source/" title="Moderator Tools for PubHubs - About - Open Source">Open Source</a> page).</p>

<p>Besides PubHubs I will be looking to work on other projects in the field, especially those based on Matrix which I see as having great potential as an open standard for many kinds of messaging. I am particularly interested in public-benefit and personal use cases, enabling organisations and individuals who want to take their private messaging away from the tech monopolies and into their own hands.</p>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-04-29</guid>
      <pubDate>Mon, 29 Apr 2024 13:28:09 +0000</pubDate>
    </item>
    <item>
      <title>POSSE: TWIM: Moderator Tools for PubHubs</title>
      <link>https://wrily.foad.me.uk/posse-twim-moderator-tools-for-pubhubs</link>
      <description>&lt;![CDATA[This is my POSSE copy of the announcement posted in This Week in Matrix (TWIM) 2024-03-29.&#xA;!--more--&#xA;----&#xA;&#xA;This Week in Matrix 2024-03-29&#xA;&#xA;Dept of Interesting Projects&#xA;&#xA;Moderator Tools for PubHubs&#xA;&#xA;JulianF announces&#xA;&#xA;  This week I have put up a web site documenting my work on Moderator Tools for PubHubs.&#xA;    PubHubs is a Dutch research project to enable citizen-facing organisations to provide online group communications, value-aligned with their real-world presence. It uses matrix protocol, combined with an interesting and different user identity model involving pseudonyms and selective cryptographic disclosure of identity attributes such as &#34;is over 18&#34; or &#34;is a member of organisation X&#34;. Each hub is built around a non-federating Synapse server, with their own identity plugins and custom client.&#xA;    I have been working on three aspects of introducing initial moderation tooling. Some of it crosses over with general matrix (this week&#39;s Pantalaimon role is a side product of the Draupnir part), while some is different (Attribute Disclosure), and the third part is general (research and planning for Civilised Discourse).&#xA;    My funded stint is coming to an end and I am looking for ways to continue in any related area of work -- please matrix me @julian:foad.me.uk!&#xA;&#xA;---&#xA;#PubHubs #matrix #POSSE&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><em>This is my <a href="https://indieweb.org/POSSE">POSSE</a> copy of the <a href="https://matrix.org/blog/2024/03/29/this-week-in-matrix-2024-03-29/#moderator-tools-for-pubhubs">announcement posted</a> in <a href="https://matrix.org/twim">This Week in Matrix (TWIM)</a> 2024-03-29.</em>
</p>

<hr>

<h1 id="this-week-in-matrix-2024-03-29" id="this-week-in-matrix-2024-03-29">This Week in Matrix 2024-03-29</h1>

<h2 id="dept-of-interesting-projects" id="dept-of-interesting-projects">Dept of Interesting Projects</h2>

<h3 id="moderator-tools-for-pubhubs" id="moderator-tools-for-pubhubs">Moderator Tools for PubHubs</h3>

<p>JulianF announces</p>

<blockquote><p>This week I have put up a web site documenting my work on <a href="https://www.ph.trax.im/">Moderator Tools for PubHubs</a>.</p>

<p>PubHubs is a Dutch research project to enable citizen-facing organisations to provide online group communications, value-aligned with their real-world presence. It uses matrix protocol, combined with an interesting and different user identity model involving pseudonyms and selective cryptographic disclosure of identity attributes such as “is over 18” or “is a member of organisation X”. Each hub is built around a non-federating Synapse server, with their own identity plugins and custom client.</p>

<p>I have been working on three aspects of introducing initial moderation tooling. Some of it crosses over with general matrix (this week&#39;s Pantalaimon role is a side product of the <a href="https://www.ph.trax.im/Moderation/Draupnir/draupnir-pubhubs/">Draupnir part</a>), while some is different (<a href="https://www.ph.trax.im/Moderation/disclosure/">Attribute Disclosure</a>), and the third part is general (research and planning for <a href="https://www.ph.trax.im/Moderation/civilised-discourse/">Civilised Discourse</a>).</p>

<p>My funded stint is coming to an end and I am looking for ways to continue in any related area of work — please matrix me <a href="https://matrix.to/#/@julian:foad.me.uk">@julian:foad.me.uk</a>!</p></blockquote>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a> <a href="https://wrily.foad.me.uk/tag:POSSE" class="hashtag"><span>#</span><span class="p-category">POSSE</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/posse-twim-moderator-tools-for-pubhubs</guid>
      <pubDate>Fri, 29 Mar 2024 19:30:00 +0000</pubDate>
    </item>
    <item>
      <title>POSSE: TWIM: Pantalaimon role for matrix-docker-ansible-deploy</title>
      <link>https://wrily.foad.me.uk/posse-twim-pantalaimon-role-for-matrix-docker-ansible-deploy</link>
      <description>&lt;![CDATA[This is my POSSE copy of the announcement posted in This Week in Matrix (TWIM) 2024-03-29.&#xA;!--more--&#xA;----&#xA;&#xA;This Week in Matrix 2024-03-29&#xA;&#xA;Dept of Ops 🛠&#xA;&#xA;matrix-docker-ansible-deploy (website)&#xA;&#xA;Slavi announces&#xA;&#xA;  Thanks to Julian Foad, matrix-docker-ansible-deploy can now install the Pantalaimon E2EE aware proxy daemon for you. It&#39;s already possible to integrate it with Draupnir to allow it to work in E2EE rooms - see our Draupnir docs for details.&#xA;    See our Setting up Pantalaimon documentation to get started.&#xA;&#xA;---&#xA;#PubHubs #matrix #POSSE&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p><em>This is my <a href="https://indieweb.org/POSSE">POSSE</a> copy of the <a href="https://matrix.org/blog/2024/03/29/this-week-in-matrix-2024-03-29/#matrix-docker-ansible-deploy-website">announcement posted</a> in <a href="https://matrix.org/twim">This Week in Matrix (TWIM)</a> 2024-03-29.</em>
</p>

<hr>

<h1 id="this-week-in-matrix-2024-03-29" id="this-week-in-matrix-2024-03-29">This Week in Matrix 2024-03-29</h1>

<h2 id="dept-of-ops" id="dept-of-ops">Dept of Ops 🛠</h2>

<h3 id="matrix-docker-ansible-deploy-website-https-github-com-spantaleev-matrix-docker-ansible-deploy" id="matrix-docker-ansible-deploy-website-https-github-com-spantaleev-matrix-docker-ansible-deploy">matrix-docker-ansible-deploy (<a href="https://github.com/spantaleev/matrix-docker-ansible-deploy">website</a>)</h3>

<p><a href="https://matrix.to/#/@slavi:devture.com">Slavi</a> announces</p>

<blockquote><p>Thanks to Julian Foad, <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy">matrix-docker-ansible-deploy</a> can now install the <a href="https://github.com/matrix-org/pantalaimon">Pantalaimon</a> E2EE aware proxy daemon for you. It&#39;s already possible to integrate it with <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook-bot-draupnir.md">Draupnir</a> to allow it to work in E2EE rooms – see our Draupnir docs for details.</p>

<p>See our <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook-pantalaimon.md">Setting up Pantalaimon</a> documentation to get started.</p></blockquote>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a> <a href="https://wrily.foad.me.uk/tag:POSSE" class="hashtag"><span>#</span><span class="p-category">POSSE</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/posse-twim-pantalaimon-role-for-matrix-docker-ansible-deploy</guid>
      <pubDate>Fri, 29 Mar 2024 19:00:00 +0000</pubDate>
    </item>
    <item>
      <title>PubHubs Moderation update 2024-03: A Web Site</title>
      <link>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-03-a-web-site</link>
      <description>&lt;![CDATA[I put up a web site with details of my PubHubs work:&#xA;&#xA;https://www.ph.trax.im&#xA;&#xA;Under Moderation, there are subsections for the main work areas of the project: Draupnir+Pantalaimon, Disclosure of Identity Attributes, and Civilised Discourse.&#xA;&#xA;That last area is the one I am currently working on.&#xA;&#xA;---&#xA;&#xA;#PubHubs #matrix #awesomeFOSS&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>I put up a web site with details of my PubHubs work:</p>

<p><a href="https://www.ph.trax.im">https://www.ph.trax.im</a></p>

<p>Under Moderation, there are subsections for the main work areas of the project: Draupnir+Pantalaimon, Disclosure of Identity Attributes, and Civilised Discourse.</p>

<p>That last area is the one I am currently working on.</p>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a> <a href="https://wrily.foad.me.uk/tag:awesomeFOSS" class="hashtag"><span>#</span><span class="p-category">awesomeFOSS</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-03-a-web-site</guid>
      <pubDate>Thu, 28 Mar 2024 18:43:57 +0000</pubDate>
    </item>
    <item>
      <title>PubHubs Moderation update 2024-02-02</title>
      <link>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-02-02</link>
      <description>&lt;![CDATA[Related docs: Disclosure of Identity Attributes page on Moderator Tools for PubHubs web site.&#xA;PubHubs-moderation live demo: central.ph.s.trax.im/client&#xA;  TODO: instructions; basically you need Yivi app with dev mode enabled and two sets of demo credentials (one as moderator, one as recipient)&#xA;disclosure UI live prototype: on qx.trax.im&#xA;&#xA;Disclosure Flow&#xA;&#xA;  A moderator asks someone to disclose an attribute of their real identity. The recipient provide the requested attribute, using Yivi to attach a cryptographic proof.&#xA;&#xA;In the last update I introduced a demo of attribute disclosure. I have since completed the main TODO there, making the disclosure flow happen on the recipient&#39;s account. (In the first demo the moderator&#39;s role and the recipient&#39;s role both took place in  the same login session in the same account.)&#xA;&#xA;This week I have been thinking about how we will need to improve the user experience, or flow, of this disclosure request and response.&#xA;&#xA;Writing the dialogue boxes and associated logic by hand was tedious and buggy. Rapid prototyping would be helpful. I decided it&#39;s time for me to learn a better way. Being new to UI design and fervently open-source principled, I searched for a FOSS solution and found Quant-UX.&#xA;!--more--&#xA;&#xA;Quant-UX&#xA;&#xA;Quant-UX seems well suited for this task. Unlike the better known PenPot, an open source tool for detailed visual design, Quant-UX focuses on dropping UI components into place and wiring them together for a live testable UI design, with facilities for collecting feedback from user testing. While Quant-UX is a bit rough around the edges compared to a polished commercial product like Figma, having minor bugs, inconsistencies and so on, it is nevertheless powerful and usable enough. And on the positive side, I understand it can do things that Figma can&#39;t.&#xA;&#xA;There is even a &#34;low-code&#34; sister project Luisa.cloud which promises to import a Quant-UX (or Figma) design into a real application and run it for real. I am interested to try that too, but that will have to wait.&#xA;&#xA;I set about self-hosting Quant-UX to be sure of owning my own data. Now it is running on my Trax domain, at qx.trax.im. (You can try it, but be aware I&#39;m providing it &#34;as-is&#34;, no guarantees at all, even if you create an account there (which I may or may not allow). Consider using the official site or hosting your own.)&#xA;&#xA;Live Prototype: Disclosure Flow&#xA;&#xA;I made a prototype, roughly representing the disclosure flow in the initial demo, and a wiki page about it with screen-shots and with links to the live prototype where you can click through and add comments to the screens.&#xA;&#xA;  ss-ask-disclosure-flow-overview-1b&#xA;    View, interact with and comment on the prototype&#xA;&#xA;Improvement Ideas&#xA;&#xA;Some initial ideas about improvements to the flow:&#xA;&#xA;The moderator could initiate the process by clicking an action button on a message from the intended recipient user in a hub room, or by clicking on the user&#39;s avatar or pseudonym in some list, and the relevant user would be pre-populated in the initial dialogue and not editable there.&#xA;&#xA;The recipient user should receive a more gentle notification than suddenly seeing a pop-up dialogue of any kind. Perhaps a notification consistent with other notifications, though perhaps indicating a greater &#34;urgency&#34;, from which they can then access the full details of the request when they are ready.&#xA;&#xA;I started adding some &#34;comment&#34; annotations on the UI prototype, mentioning some of these thoughts. You (dear reader) can do so too, either anonymously or after creating an account. (I have reported a bug whereby none of the existing comment annotations can be seen until you add a new comment, then they all appear.) If you add any comments there, please also contact me another way to let me know you&#39;re doing so, as I might not otherwise notice.&#xA;&#xA;---&#xA;&#xA;\[EDIT 2024-04-23: add links to Related Docs\]&#xA;&#xA;#PubHubs #matrix #QuantUX #awesomeFOSS&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<ul><li>Related docs: <a href="https://www.ph.trax.im/Moderation/disclosure/">Disclosure of Identity Attributes</a> page on <a href="https://www.ph.trax.im/">Moderator Tools for PubHubs</a> web site.</li>
<li>PubHubs-moderation live demo: <a href="https://central.ph.s.trax.im/client">central.ph.s.trax.im/client</a>
<ul><li><em>TODO: instructions; basically you need Yivi app with dev mode enabled and two sets of demo credentials (one as moderator, one as recipient)</em></li></ul></li>
<li>disclosure UI live prototype: <a href="https://qx.trax.im/#/share.html?h=a2aa10a2cRRlSMwsQ44dP4S1bZEByQzzkFvR5Zbc51ZBJGBJ3LuBU4cGS8Lu">on qx.trax.im</a></li></ul>

<h2 id="disclosure-flow" id="disclosure-flow">Disclosure Flow</h2>

<blockquote><p>A moderator asks someone to disclose an attribute of their real identity. The recipient provide the requested attribute, using Yivi to attach a cryptographic proof.</p></blockquote>

<p>In <a href="https://wrily.foad.me.uk/pubhubs-moderation-update-2024-01">the last update</a> I introduced a demo of attribute disclosure. I have since completed the main TODO there, making the disclosure flow happen on the recipient&#39;s account. (In the first demo the moderator&#39;s role and the recipient&#39;s role both took place in  the same login session in the same account.)</p>

<p>This week I have been thinking about how we will need to improve the user experience, or flow, of this disclosure request and response.</p>

<p>Writing the dialogue boxes and associated logic by hand was tedious and buggy. Rapid prototyping would be helpful. I decided it&#39;s time for me to learn a better way. Being new to UI design and fervently open-source principled, I searched for a FOSS solution and found <a href="https://quant-ux.com/">Quant-UX</a>.
</p>

<h2 id="quant-ux" id="quant-ux">Quant-UX</h2>

<p>Quant-UX seems well suited for this task. Unlike the better known <a href="https://penpot.app/self-host">PenPot</a>, an open source tool for detailed visual design, Quant-UX focuses on dropping UI components into place and wiring them together for a live testable UI design, with facilities for collecting feedback from user testing. While Quant-UX is a bit rough around the edges compared to a polished commercial product like Figma, having minor bugs, inconsistencies and so on, it is nevertheless powerful and usable enough. And on the positive side, I understand it can do things that Figma can&#39;t.</p>

<p>There is even a “low-code” sister project <a href="https://luisa.cloud/">Luisa.cloud</a> which promises to import a Quant-UX (or Figma) design into a real application and run it for real. I am interested to try that too, but that will have to wait.</p>

<p>I set about <a href="https://lab.trax.im/infra/quant-ux-docker-ansible">self-hosting Quant-UX</a> to be sure of owning my own data. Now it is running on my Trax domain, at <a href="https://qx.trax.im">qx.trax.im</a>. (You can try it, but be aware I&#39;m providing it “as-is”, no guarantees at all, even if you create an account there (which I may or may not allow). Consider using the official site or hosting your own.)</p>

<h2 id="live-prototype-disclosure-flow" id="live-prototype-disclosure-flow">Live Prototype: Disclosure Flow</h2>

<p>I made a prototype, roughly representing the disclosure flow in the initial demo, and <a href="https://lab.trax.im/PubHubs/pubhubs-moderation-designs/-/wikis/Disclosure-flow-1">a wiki page about it with screen-shots</a> and with links to <a href="https://qx.trax.im/#/share.html?h=a2aa10a2cRRlSMwsQ44dP4S1bZEByQzzkFvR5Zbc51ZBJGBJ3LuBU4cGS8Lu">the live prototype</a> where you can click through and add comments to the screens.</p>

<blockquote><p><a href="https://qx.trax.im/#/share.html?h=a2aa10a2cRRlSMwsQ44dP4S1bZEByQzzkFvR5Zbc51ZBJGBJ3LuBU4cGS8Lu"><img src="https://lab.trax.im/PubHubs/pubhubs-moderation-designs/-/wikis/uploads/134d14ce4df236825e045bd218688fca/ss-ask-disclosure-flow-overview-1b.png" alt="ss-ask-disclosure-flow-overview-1b"></a></p>

<p><a href="https://qx.trax.im/#/share.html?h=a2aa10a2cRRlSMwsQ44dP4S1bZEByQzzkFvR5Zbc51ZBJGBJ3LuBU4cGS8Lu">View, interact with and comment on the prototype</a></p></blockquote>

<h2 id="improvement-ideas" id="improvement-ideas">Improvement Ideas</h2>

<p>Some initial ideas about improvements to the flow:</p>
<ul><li><p>The moderator could initiate the process by clicking an action button on a message from the intended recipient user in a hub room, or by clicking on the user&#39;s avatar or pseudonym in some list, and the relevant user would be pre-populated in the initial dialogue and not editable there.</p></li>

<li><p>The recipient user should receive a more gentle notification than suddenly seeing a pop-up dialogue of any kind. Perhaps a notification consistent with other notifications, though perhaps indicating a greater “urgency”, from which they can then access the full details of the request when they are ready.</p></li></ul>

<p>I started adding some “comment” annotations on the UI prototype, mentioning some of these thoughts. You (dear reader) can do so too, either anonymously or after creating an account. (I have reported <a href="https://github.com/KlausSchaefers/quant-ux/issues/267">a bug</a> whereby none of the existing comment annotations can be seen until you add a new comment, then they all appear.) If you add any comments there, please also contact me another way to let me know you&#39;re doing so, as I might not otherwise notice.</p>

<hr>

<p><em>[EDIT 2024-04-23: add links to Related Docs]</em></p>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a> <a href="https://wrily.foad.me.uk/tag:QuantUX" class="hashtag"><span>#</span><span class="p-category">QuantUX</span></a> <a href="https://wrily.foad.me.uk/tag:awesomeFOSS" class="hashtag"><span>#</span><span class="p-category">awesomeFOSS</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-02-02</guid>
      <pubDate>Fri, 02 Feb 2024 12:16:45 +0000</pubDate>
    </item>
    <item>
      <title>PubHubs Moderation update 2024-01</title>
      <link>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-01</link>
      <description>&lt;![CDATA[This month I have been building a PubHubs-specific feature, the ability for a moderator to ask a someone to disclose an attribute of their real identity.&#xA;&#xA;Related docs: Disclosure of Identity Attributes page on Moderator Tools for PubHubs web site.&#xA;&#xA;When a person signs in to PubHubs hub through the Yivi verified credentials system, initially they are allocated a pseudonymous user identifier, for example @123-321:testhub.matrix.host. From this pseudonym, not even an operator or moderator of the hub can discover the user&#39;s real identity.&#xA;&#xA;A moderator may wish to ask a user to confirm their real identity, to some degree. Through Yivi it is possible to ask a user to reveal a cryptographic proof [1] of one or more of their identity attributes. Some common attributes are one&#39;s real name, physical address, or email address. An attribute could also be something like &#34;age is at least 18 years&#34;.&#xA;&#xA;First Demo Version&#xA;!--more--&#xA;&#xA;This demo may be seen and tested at https://testhub0.ph.s.trax.im (the hub-client alone) or https://central.ph.s.trax.im/client#/ (in the global-client). (This is a staging/testing deployment, not stable.)&#xA;&#xA;1a&#xA;&#xA;1b&#xA;&#xA;1c&#xA;&#xA;1d&#xA;1d2&#xA;&#xA;1e&#xA;&#xA;1f&#xA;&#xA;In this demo version:&#xA;&#xA;the moderator is concerned about a user (pseudonym &#39;bad-apple3&#39;), and starts the disclosure request&#xA;moderator chooses: a user, a message, a set of attributes&#xA;on submitting the form, a private room with the recipient is created or opened, and a request message is sent into that room&#xA;a Yivi signing session is started (DEMO: this signing session runs on the moderator&#39;s side; it should run on the recipient&#39;s side)&#xA;the recipient uses Yivi to provide the requested attributes, with which Yivi signs a (pre-filled) reply message&#xA;the reply, signed with the requested attributes, is received by the moderator in the private room&#xA;&#xA;TODO:&#xA;&#xA;The Yivi signing session must be initiated on the recipient&#39;s client, not the moderator&#39;s. \[DONE, 2024-01-30\]&#xA;&#xA;This version does not need or use Draupnir.&#xA;&#xA;---&#xA;&#xA;\[1\]: a id=&#34;1&#34;A proof that such an attribute has been attested by some mutually trusted authority./a&#xA;&#xA;\[EDIT 2024-04-23: add links to Related Docs\]&#xA;&#xA;#PubHubs #matrix&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>This month I have been building a PubHubs-specific feature, the ability for a moderator to ask a someone to disclose an attribute of their real identity.</p>
<ul><li>Related docs: <a href="https://www.ph.trax.im/Moderation/disclosure/">Disclosure of Identity Attributes</a> page on <a href="https://www.ph.trax.im/">Moderator Tools for PubHubs</a> web site.</li></ul>

<p>When a person signs in to PubHubs hub through the <a href="https://yivi.app/en/">Yivi</a> verified credentials system, initially they are allocated a pseudonymous user identifier, for example <code>@123-321:testhub.matrix.host</code>. From this pseudonym, not even an operator or moderator of the hub can discover the user&#39;s real identity.</p>

<p>A moderator may wish to ask a user to confirm their real identity, to some degree. Through Yivi it is possible to ask a user to reveal a cryptographic proof <a href="#1">[1]</a> of one or more of their identity attributes. Some common attributes are one&#39;s real name, physical address, or email address. An attribute could also be something like “age is at least 18 years”.</p>

<h2 id="first-demo-version" id="first-demo-version">First Demo Version</h2>



<p>This demo may be seen and tested at <a href="https://testhub0.ph.s.trax.im">https://testhub0.ph.s.trax.im</a> (the hub-client alone) or <a href="https://central.ph.s.trax.im/client#/">https://central.ph.s.trax.im/client#/</a> (in the global-client). (This is a staging/testing deployment, not stable.)</p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1a.png" alt="1a"></p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1b.png" alt="1b"></p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1c.png" alt="1c"></p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1d.png" alt="1d">
<img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1d2.png" alt="1d2"></p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1e.png" alt="1e"></p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2024/01/ss-ph-disclose-1f.png" alt="1f"></p>

<p>In this demo version:</p>
<ul><li>the moderator is concerned about a user (pseudonym &#39;bad-apple3&#39;), and starts the disclosure request</li>
<li>moderator chooses: a user, a message, a set of attributes</li>
<li>on submitting the form, a private room with the recipient is created or opened, and a request message is sent into that room</li>
<li>a Yivi signing session is started (DEMO: this signing session runs on the moderator&#39;s side; it should run on the recipient&#39;s side)</li>
<li>the recipient uses Yivi to provide the requested attributes, with which Yivi signs a (pre-filled) reply message</li>
<li>the reply, signed with the requested attributes, is received by the moderator in the private room</li></ul>

<p>TODO:</p>
<ul><li>The Yivi signing session must be initiated on the recipient&#39;s client, not the moderator&#39;s. <em>[DONE, 2024-01-30]</em></li></ul>

<p>This version does not need or use Draupnir.</p>

<hr>

<p>[1]: <a id="1" id="1">A proof that such an attribute has been attested by some mutually trusted authority.</a></p>

<p><em>[EDIT 2024-04-23: add links to Related Docs]</em></p>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/pubhubs-moderation-update-2024-01</guid>
      <pubDate>Tue, 23 Jan 2024 20:21:07 +0000</pubDate>
    </item>
    <item>
      <title>PubHubs Moderation update 2023-12</title>
      <link>https://wrily.foad.me.uk/pubhubs-moderation-update-2023-12</link>
      <description>&lt;![CDATA[Last week I began making this primitive Draupnir (moderation bot) UI, in my PubHubs work.&#xA;&#xA;!--more--&#xA;&#xA;The &#34;Moderation view&#34; column on the left is my new bit. The right hand side is a regular matrix timeline, showing some interaction in the Draupnir bot&#39;s management room.&#xA;&#xA;Draupnir is built to be operated by sending commands like !draupnir rooms in its management room, and reading its responses in the room timeline. That&#39;s a universal way of interacting with a bot, but it&#39;s not very friendly to a new moderator.&#xA;&#xA;So we want some sort of UI that&#39;s more friendly.&#xA;&#xA;This first attempt captures the various HTML response messages from the Draupnir status-getting commands. It shows the same displays as we can see in the timeline, only in a place where they don&#39;t scroll away and we can hide and reveal each one separately.&#xA;&#xA;Updating this view is inefficient of course. When it sees any message from the Draupnir bot in the management room, it updates the corresponding view section (based on text substring matches, ugh). If you click the &#34;refresh&#34; button, it sends all the status-getting commands, so that the responses will (soon) come back and update the view.&#xA;&#xA;Probably neither PubHubs nor Draupnir wants to continue it in this direction but anyway it&#39;s something where there was AFAIK nothing. Nevertheless, if anyone&#39;s interested, it&#39;s open-source.&#xA;&#xA;I&#39;m not sure what direction best to take the desire for a GUI. I&#39;m going to take a break from that until a better plan emerges.&#xA;&#xA;I think, more than the technical issues in getting such a view updated and displayed nicely, a bigger issue is it feels unfocused. Rather than a GUI that just has the ability to display all the possible info, it feels like we would want a GUI that focuses on specific scenarios, bringing together all the required info and control for, for example, managing a spam attack, or managing a user who violates CoC but has previously been in good standing.&#xA;&#xA;I don&#39;t have the UI design skills nor motivation nor funding to go into a big UX design, although I&#39;ll enquire into it a bit.&#xA;&#xA;What Next?&#xA;&#xA;Now I&#39;m going to build a PubHubs-specific feature, the ability to ask a user (who initially has a pseudonymous mxid) to reveal an attribute of their real identity, from the IRMA/Yivi verified credentials system, to the moderator. I don&#39;t yet know if or how much Draupnir might be involved in that.&#xA;&#xA;---&#xA;&#xA;#PubHubs #matrix&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Last week I began making this primitive Draupnir (moderation bot) UI, in my PubHubs work.</p>

<p><img src="https://blog.foad.me.uk/wp-content/uploads/2023/12/2023-12-13-Draupnir-primitive-UI-2.png" alt="">
</p>

<p>The “Moderation view” column on the left is my new bit. The right hand side is a regular matrix timeline, showing some interaction in the Draupnir bot&#39;s management room.</p>

<p>Draupnir is built to be operated by sending commands like <code>!draupnir rooms</code> in its management room, and reading its responses in the room timeline. That&#39;s a universal way of interacting with a bot, but it&#39;s not very friendly to a new moderator.</p>

<p>So we want some sort of UI that&#39;s more friendly.</p>

<p>This first attempt captures the various HTML response messages from the Draupnir status-getting commands. It shows the same displays as we can see in the timeline, only in a place where they don&#39;t scroll away and we can hide and reveal each one separately.</p>

<p>Updating this view is inefficient of course. When it sees any message from the Draupnir bot in the management room, it updates the corresponding view section (based on text substring matches, ugh). If you click the “refresh” button, it sends all the status-getting commands, so that the responses will (soon) come back and update the view.</p>

<p>Probably neither PubHubs nor Draupnir wants to continue it in this direction but anyway it&#39;s something where there was AFAIK nothing. Nevertheless, if anyone&#39;s interested, <a href="https://lab.trax.im/PubHubs/PubHubs/-/tree/jf-dev">it&#39;s open-source</a>.</p>

<p>I&#39;m not sure what direction best to take the desire for a GUI. I&#39;m going to take a break from that until a better plan emerges.</p>

<p>I think, more than the technical issues in getting such a view updated and displayed nicely, a bigger issue is it feels unfocused. Rather than a GUI that just has the ability to display all the possible info, it feels like we would want a GUI that focuses on specific scenarios, bringing together all the required info and control for, for example, managing a spam attack, or managing a user who violates CoC but has previously been in good standing.</p>

<p>I don&#39;t have the UI design skills nor motivation nor funding to go into a big UX design, although I&#39;ll enquire into it a bit.</p>

<h2 id="what-next" id="what-next">What Next?</h2>

<p>Now I&#39;m going to build a PubHubs-specific feature, the ability to ask a user (who initially has a pseudonymous mxid) to reveal an attribute of their real identity, from the IRMA/Yivi verified credentials system, to the moderator. I don&#39;t yet know if or how much Draupnir might be involved in that.</p>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/pubhubs-moderation-update-2023-12</guid>
      <pubDate>Wed, 13 Dec 2023 13:39:33 +0000</pubDate>
    </item>
    <item>
      <title>Deploying Pantalaimon on my Matrix Test Rig</title>
      <link>https://wrily.foad.me.uk/deploying-pantalaimon-on-my-matrix-test-rig</link>
      <description>&lt;![CDATA[Last week I was setting up Draupnir on my matrix test rig, in order to become familiar with Draupnir deployment before I integrate it with PubHubs.&#xA;&#xA;Now I need to address end-to-end-encryption (E2EE). PubHubs exclusively uses encrypted matrix rooms, and Draupnir doesn&#39;t yet have E2EE functionality built-in. (Why is that? Moderation in public rooms is Draupnir&#39;s main use case, and for several reasons public matrix rooms are usually not encrypted. However PubHubs is different.)&#xA;&#xA;There is a generic solution for adding E2EE to a matrix bot, and it&#39;s called Pantalaimon, an &#34;E2EE aware proxy daemon for matrix clients.&#34; So this week I&#39;m setting up Pantalaimon.&#xA;!--more--&#xA;&#xA;The handy matrix-docker-ansible-deploy has no Pantalaimon role ... yet. I may be able to contribute one, but no promises. First I will make a stand-alone Pantalaimon setup role, in my quest to automate, with Ansible, as much as possible of the set-up.&#xA;&#xA;Simple Ansible Role for Pantalaimon&#xA;&#xA;I have made and published a simple Ansible role to run Pantalaimon. It consists of:&#xA;&#xA;default variables, with (minimal) documentation&#xA;main, build, install tasks&#xA;a pantalaimon.conf template&#xA;&#xA;I use the role in my playbook like this:&#xA;&#xA;  name: &#34;pantalaimon&#34;&#xA;    includerole: name=traxim.matrixansible.pantalaimon&#xA;    vars:&#xA;      pantalaimondockerimage: &#34;{{ mydockerregistryhost }}/pantalaimon:latest&#34;&#xA;      pantalaimondockernetwork: &#34;{{ matrixdockernetwork }}&#34;&#xA;      pantalaimonbasepath: /srv/PubHubs/pantalaimon&#xA;      pantalaimonloglevel: Debug&#xA;      pantalaimonhomeservername: example&#xA;      pantalaimonhomeserverurl: &#34;https://matrix.example.org&#34;&#xA;&#xA;My intention is to run Pantalaimon in a container, managed by Docker (alternatives like Podman should work similarly), on the target machine where the matrix server runs. Note that, in general, to minimise exposure of encrypted data, Pantalaimon should be run &#34;close to&#34; the bot or client that uses it. At least the unencrypted connection between the bot or client and Pantalaimon should be secured.&#xA;&#xA;There is no Pantalaimon docker image published by its creators, so my role builds it, and pushes it to my private registry. (You could delegate the building to a different machine such as localhost; that&#39;s commented out in tasks/main.yml in v1.1.0. Or, building on the target machine, you could avoid using a registry if you set mydockerregistryhost to localhost, I think; you might need to disable the &#39;push&#39; option in the build task as well.)&#xA;&#xA;Connecting Draupnir to Pantalaimon&#xA;&#xA;To connect Draupnir to Pantalaimon, I am going to show a playbook task that invokes the existing draupnir role. (Usually to set up a regular matrix system I run the &#39;matrix-docker-ansible-deploy&#39; playbook as a whole. Invoking a role individually from another playbook is working towards using it with PubHubs rather than a regular matrix system.)&#xA;&#xA;The key part here is to override the Draupnir config&#39;s homeserverUrl to point to Pantalaimon, while leaving the Draupnir config&#39;s rawHomeserverUrl pointing to the matrix server&#39;s public client-server API, as documented in Draupnir&#39;s example config.&#xA;&#xA;  name: &#34;draupnir&#34; &#xA;    includerole: name=playbooks-from/matrix-docker-ansible-deploy/roles/custom/matrix-bot-draupnir &#xA;    vars: &#xA;      matrixbotdraupniraccesstoken: &#34;{{ matrixdraupnirbotaccesstoken }}&#34;  # using value generated by login step earlier; alternatively read it from a vault-var&#xA;      matrixbotdraupnirmanagementroom: &#34;{{ matrixdraupnirmanagementroomid }}&#34;  # using value generated by room-creation step earlier; alternatively read it from an inventory var&#xA;      matrixbotdraupnirconfigurationextensionyaml: | &#xA;        homeserverUrl: &#34;http://pantalaimon:8009&#34; &#xA;        pantalaimon: &#xA;          use: true &#xA;          username: &#34;bot.draupnir-admin&#34; &#xA;          password: &#34;{{ matrixdraupnirbotpassword }}&#34;  # using an inventory vault-var&#xA;        protectAllJoinedRooms: true  # my preference&#xA;        commands: &#xA;          allowNoPrefix: true  # my preference&#xA;      matrixbotdraupnirsystemdrequiredserviceslist: &#xA;        docker.service &#xA;        matrix-synapse.service &#xA;        matrix-pantalaimon.service &#xA;&#xA;These vars would better be placed in the inventory than here. To use the role stand-alone like this we also need to set a few other base variables from matrix-docker-ansible-deploy, which we can do like this:&#xA;&#xA;  varsfiles:  # defined at the playbook level&#xA;    playbooks-from/matrix-docker-ansible-deploy/roles/galaxy/com.devture.ansible.role.playbookhelp/defaults/main.yml&#xA;    playbooks-from/matrix-docker-ansible-deploy/roles/galaxy/com.devture.ansible.role.systemddockerbase/defaults/main.yml&#xA;    playbooks-from/matrix-docker-ansible-deploy/roles/custom/matrix-base/defaults/main.yml&#xA;&#xA;  vars:  # defined at the task or block level&#xA;    matrixuseruid: 991  # to match our existing matrix installation&#xA;    matrixusergid: 991&#xA;    matrixhomeserverurl: &#34;https://matrix.example&#34;&#xA;&#xA;We have looked at a simple stand-alone Pantalaimon role. Now to integrate it in matrix-docker-ansible-deploy.&#xA;&#xA;M-D-A-D Playbook Role for Pantalaimon&#xA;&#xA;The first draft of a suitable role is published on TraxLab: roles/matrixpantalaimon.&#xA;&#xA;2023-10-19] I prepared [a merge request to the m-d-a-d playbook:&#xA;&#xA;  Pantalaimon role is activated by matrixpantalaimonenabled and connects to the homeserver by default. No further config is needed. Integration with Draupnir is included, activated by matrixbotdraupniruse_pantalaimon. No integration with Mjolnir or anything else. Alternatively Pantalaimon can be configured alone, and then whatever component is meant to talk to it, in or out of the playbook, may be configured separately/manually.&#xA;&#xA;... and Slavi has responded to me with a bunch of good review comments which I need to address.&#xA;&#xA;UPDATE 2023-12-21: Addressed those review comments.&#xA;&#xA;UPDATE 2024-03-29: This is now accepted and included in matrix-docker-ansible-deploy.&#xA;&#xA;---&#xA;&#xA;#matrix #awesomeFOSS #Draupnir #PubHubs&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Last week I was setting up Draupnir on my matrix test rig, in order to become familiar with Draupnir deployment before I <a href="https://wrily.foad.me.uk/pubhubs-moderation-tools">integrate it with PubHubs</a>.</p>

<p>Now I need to address end-to-end-encryption (E2EE). PubHubs exclusively uses encrypted matrix rooms, and Draupnir doesn&#39;t yet have E2EE functionality built-in. (Why is that? Moderation in public rooms is Draupnir&#39;s main use case, and for several reasons public matrix rooms are usually not encrypted. However PubHubs is different.)</p>

<p>There is a generic solution for adding E2EE to a matrix bot, and it&#39;s called <a href="https://github.com/matrix-org/pantalaimon">Pantalaimon</a>, an “E2EE aware proxy daemon for matrix clients.” So this week I&#39;m setting up Pantalaimon.
</p>

<p>The handy <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/">matrix-docker-ansible-deploy</a> has no Pantalaimon role ... yet. I may be able to contribute one, but no promises. First I will make a stand-alone Pantalaimon setup role, in my quest to automate, with Ansible, as much as possible of the set-up.</p>

<h2 id="simple-ansible-role-for-pantalaimon" id="simple-ansible-role-for-pantalaimon">Simple Ansible Role for Pantalaimon</h2>

<p>I have made and <a href="https://lab.trax.im/matrix/matrix-ansible/">published</a> a simple Ansible role to run Pantalaimon. It consists of:</p>
<ul><li><a href="https://lab.trax.im/matrix/matrix-ansible/-/blob/main/roles/pantalaimon/defaults/main.yml">default variables</a>, with (minimal) documentation</li>
<li><a href="https://lab.trax.im/matrix/matrix-ansible/-/blob/main/roles/pantalaimon/tasks/main.yml">main</a>, <a href="https://lab.trax.im/matrix/matrix-ansible/-/blob/main/roles/pantalaimon/tasks/build-pantalaimon.yml">build</a>, <a href="https://lab.trax.im/matrix/matrix-ansible/-/blob/main/roles/pantalaimon/tasks/install-pantalaimon.yml">install</a> tasks</li>
<li><a href="https://lab.trax.im/matrix/matrix-ansible/-/blob/main/roles/pantalaimon/templates/pantalaimon.conf.j2">a pantalaimon.conf template</a></li></ul>

<p>I use the role in my playbook like this:</p>

<pre><code class="language-yaml">  - name: &#34;pantalaimon&#34;
    include_role: name=trax_im.matrix_ansible.pantalaimon
    vars:
      pantalaimon_docker_image: &#34;{{ my_docker_registry_host }}/pantalaimon:latest&#34;
      pantalaimon_docker_network: &#34;{{ matrix_docker_network }}&#34;
      pantalaimon_base_path: /srv/PubHubs/pantalaimon
      pantalaimon_log_level: Debug
      pantalaimon_homeserver_name: example
      pantalaimon_homeserver_url: &#34;https://matrix.example.org&#34;
</code></pre>

<p>My intention is to run Pantalaimon in a container, managed by Docker (alternatives like Podman should work similarly), on the target machine where the matrix server runs. <em>Note that, in general, to minimise exposure of encrypted data, Pantalaimon should be run “close to” the bot or client that uses it. At least the unencrypted connection between the bot or client and Pantalaimon should be secured.</em></p>

<p>There is no Pantalaimon docker image published by its creators, so my role builds it, and pushes it to my private registry. (You could delegate the building to a different machine such as <code>localhost</code>; that&#39;s commented out in <code>tasks/main.yml</code> in v1.1.0. Or, building on the target machine, you could avoid using a registry if you set <code>my_docker_registry_host</code> to <code>localhost</code>, I think; you might need to disable the &#39;push&#39; option in the build task as well.)</p>

<h2 id="connecting-draupnir-to-pantalaimon" id="connecting-draupnir-to-pantalaimon">Connecting Draupnir to Pantalaimon</h2>

<p>To connect Draupnir to Pantalaimon, I am going to show a playbook task that invokes the existing draupnir role. (Usually to set up a regular matrix system I run the &#39;matrix-docker-ansible-deploy&#39; playbook as a whole. Invoking a role individually from another playbook is working towards using it with PubHubs rather than a regular matrix system.)</p>

<p>The key part here is to override the Draupnir config&#39;s <code>homeserverUrl</code> to point to Pantalaimon, while leaving the Draupnir config&#39;s <code>rawHomeserverUrl</code> pointing to the matrix server&#39;s public client-server API, as documented in <a href="https://github.com/the-draupnir-project/Draupnir/blob/main/config/default.yaml">Draupnir&#39;s example config</a>.</p>

<pre><code class="language-yaml">  - name: &#34;draupnir&#34; 
    include_role: name=playbooks-from/matrix-docker-ansible-deploy/roles/custom/matrix-bot-draupnir 
    vars: 
      matrix_bot_draupnir_access_token: &#34;{{ matrix_draupnir_bot_access_token }}&#34;  # using value generated by login step earlier; alternatively read it from a vault-var
      matrix_bot_draupnir_management_room: &#34;{{ matrix_draupnir_management_room_id }}&#34;  # using value generated by room-creation step earlier; alternatively read it from an inventory var
      matrix_bot_draupnir_configuration_extension_yaml: | 
        homeserverUrl: &#34;http://pantalaimon:8009&#34; 
        pantalaimon: 
          use: true 
          username: &#34;bot.draupnir-admin&#34; 
          password: &#34;{{ matrix_draupnir_bot_password }}&#34;  # using an inventory vault-var
        protectAllJoinedRooms: true  # my preference
        commands: 
          allowNoPrefix: true  # my preference
      matrix_bot_draupnir_systemd_required_services_list: 
        - docker.service 
        - matrix-synapse.service 
        - matrix-pantalaimon.service 
</code></pre>

<p>These vars would better be placed in the inventory than here. To use the role stand-alone like this we also need to set a few other base variables from matrix-docker-ansible-deploy, which we can do like this:</p>

<pre><code class="language-yaml">  vars_files:  # defined at the playbook level
    - playbooks-from/matrix-docker-ansible-deploy/roles/galaxy/com.devture.ansible.role.playbook_help/defaults/main.yml
    - playbooks-from/matrix-docker-ansible-deploy/roles/galaxy/com.devture.ansible.role.systemd_docker_base/defaults/main.yml
    - playbooks-from/matrix-docker-ansible-deploy/roles/custom/matrix-base/defaults/main.yml

  vars:  # defined at the task or block level
    matrix_user_uid: 991  # to match our existing matrix installation
    matrix_user_gid: 991
    matrix_homeserver_url: &#34;https://matrix.example&#34;
</code></pre>

<p>We have looked at a simple stand-alone Pantalaimon role. Now to integrate it in <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/">matrix-docker-ansible-deploy</a>.</p>

<h2 id="m-d-a-d-playbook-role-for-pantalaimon" id="m-d-a-d-playbook-role-for-pantalaimon">M-D-A-D Playbook Role for Pantalaimon</h2>

<p>The first draft of a suitable role is published on TraxLab: <a href="https://lab.trax.im/matrix/matrix-ansible/-/tree/main/roles/matrix_pantalaimon">roles/matrix_pantalaimon</a>.</p>

<p><em>[2023-10-19]</em> I prepared <a href="https://lab.trax.im/matrix/matrix-docker-ansible-deploy/-/merge_requests/1">a merge request</a> to the m-d-a-d playbook:</p>

<blockquote><p>Pantalaimon role is activated by <code>matrix_pantalaimon_enabled</code> and connects to the homeserver by default. No further config is needed. Integration with Draupnir is included, activated by <code>matrix_bot_draupnir_use_pantalaimon</code>. No integration with Mjolnir or anything else. Alternatively Pantalaimon can be configured alone, and then whatever component is meant to talk to it, in or out of the playbook, may be configured separately/manually.</p></blockquote>

<p>... and Slavi has responded to me with a bunch of good review comments which I need to address.</p>

<p><em>UPDATE 2023-12-21: Addressed those review comments.</em></p>

<p><em>UPDATE 2024-03-29: This is now <a href="https://matrix.org/blog/2024/03/29/this-week-in-matrix-2024-03-29/#matrix-docker-ansible-deploy-website">accepted</a> and <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook-pantalaimon.md">included in matrix-docker-ansible-deploy</a>.</em></p>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a> <a href="https://wrily.foad.me.uk/tag:awesomeFOSS" class="hashtag"><span>#</span><span class="p-category">awesomeFOSS</span></a> <a href="https://wrily.foad.me.uk/tag:Draupnir" class="hashtag"><span>#</span><span class="p-category">Draupnir</span></a> <a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/deploying-pantalaimon-on-my-matrix-test-rig</guid>
      <pubDate>Thu, 28 Sep 2023 11:46:25 +0000</pubDate>
    </item>
    <item>
      <title>Deploying Draupnir on my Matrix Test Rig</title>
      <link>https://wrily.foad.me.uk/deploying-draupnir-on-my-matrix-test-rig</link>
      <description>&lt;![CDATA[This week I&#39;m setting up Draupnir on my matrix test rig, in order to become familiar with Draupnir deployment before I integrate it with PubHubs.&#xA;&#xA;Very glad to be able to use matrix-docker-ansible-deploy&#39;s Draupnir setup to automate the majority of the Draupnir deployment.&#xA;&#xA;I also want to automate, with Ansible, as much as possible of the set-up that is required before running that playbook. I aim to document here what I have done and open questions about it. The numbered steps here correspond to the manual instructions in that documentation linked above.&#xA;!--more--&#xA;&#xA;1. Register the bot account&#xA;&#xA;I register a matrix account for the bot, using a little Ansible role I wrote, calling it like this in my Ansible playbook (personal one, specific to this installation).&#xA;&#xA;  includerole: name=matrix-synapse-register-user&#xA;    vars:&#xA;      matrixsynapseuser:&#xA;        name:  &#34;{{ matrixdraupnirbotusername }}&#34;&#xA;        pw:    &#34;{{ matrixdraupnirbotpassword }}&#34;&#xA;        admin: &#34;{{ matrixdraupnirbotadmin }}&#34;&#xA;&#xA;defining those vars in my inventory file inventories/prod/hostvars/host/matrix-draupnir.yml:&#xA;&#xA;matrixdraupnirbotusername: &#34;bot.draupnir&#34;&#xA;matrixdraupnirbotpassword: !vault [... I use vault encoded values here ...]&#xA;matrixdraupnirbotadmin: false&#xA;&#xA;I published my matrix-synapse-register-user role. I thought I should, if there isn&#39;t already a more widely available alternative. It looks like this, in tasks/main.yml:&#xA;&#xA;---&#xA;name: &#34;register a matrix synapse user&#34;&#xA;  command:&#xA;    argv: &#34;{{ (cmdcheck if ansiblecheckmode else cmdreal) + args }}&#34;&#xA;  vars:&#xA;    cmdreal:&#xA;      /matrix/synapse/bin/register-user&#xA;    cmdcheck:&#xA;      echo&#xA;      &#34;Would run: /matrix/synapse/bin/register-user&#34;&#xA;    args:&#xA;      &#34;{{ matrixsynapseuser.name }}&#34;&#xA;      &#34;{{ matrixsynapseuser.pw }}&#34;&#xA;      &#34;{{ &#39;1&#39; if matrixsynapseuser.admin|default(false) else &#39;0&#39; }}&#34;&#xA;  checkmode: false&#xA;  register: result&#xA;  changedwhen: result.rc == 0&#xA;  failedwhen: result.rc != 0 and &#39;User ID already taken.&#39; not in result.stdout&#xA;  # if already registered, errors with (on stdout):&#xA;  #   Sending registration request...&#xA;  #   ERROR! Received 400 Bad Request&#xA;  #   User ID already taken.&#xA;&#xA;2. Get an access token&#xA;&#xA;Manually get an access token. OK I know how to do that. First question, though: as that&#39;s a speed bump in the road, and seems fragile, has anyone shown interest in making either Draupnir itself or the playbook do a login automatically? Can&#39;t see any issue filed about &#34;token&#34; or &#34;login&#34;.&#xA;&#xA;Basically these days I know I&#39;m going to have to repeat my steps on a different rig later, tear things down and build them up again, so I always look to automate the whole procedure. (Aware it&#39;s sometimes more efficient to go manually at first and automate only when worth the effort. And aware I&#39;m at risk of volunteering myself to contribute.)&#xA;&#xA;Well, I asked about this. The kind folks let me know their thoughts. There are several issues.&#xA;&#xA;When I said &#34;fragile&#34; I meant I wouldn&#39;t expect an access token to remain valid forever. At the time this was designed, access tokens were considered permanent until explicitly revoked (&#34;logged out&#34;). Putting an access token into a bot&#39;s config was taken for granted, and perhaps still is. However, nowadays the client authentication spec is more complex and tokens may need refreshing. That seems to me to suggest that&#39;s no longer good practice. It can still work if we take care that the token is not invalidated.&#xA;&#xA;In one sense using an access token is considered more secure than knowing an account&#39;s password. That&#39;s the sense in which many systems allow getting an API access token and giving it to an external service that will call the API. However, I think this argument applies to accessing other accounts, not for the bot&#39;s own account.&#xA;&#xA;Also, if Draupnir connects through Pantalaimon to get E2EE (as makes sense when it&#39;s being run by someone other than the server operator), then Pantalaimon needs the account password to create an E2EE device.&#xA;&#xA;Currently I&#39;m feeling the bot should know its password and we should automate its login. As a lesser step, I will do this in Ansible.&#xA;&#xA;  includerole: name=matrix-login-password&#xA;    vars:&#xA;      matrixlogin:&#xA;        hscsapi: &#34;{{ matrixdraupnirhscsapi }}&#34;&#xA;        user: &#34;{{ matrixdraupnirbotuserid }}&#34;&#xA;        password: &#34;{{ matrixdraupnirbotpassword }}&#34;&#xA;    # output: matrixloginresult&#xA;  setfact:&#xA;      matrixdraupnirbotaccesstoken: &#34;{{ matrixloginresult.accesstoken }}&#34;&#xA;&#xA;with additional inventory vars:&#xA;&#xA;matrixdraupnirhscsapi: &#34;https://matrix.example.net&#34;&#xA;matrixdraupnirbotuserid: &#34;@bot.draupnir:example.net&#34;&#xA;&#xA;My matrix-login-password role has this in its tasks/main.yml:&#xA;&#xA;name: &#34;log in to matrix&#34;&#xA;  uri:&#xA;    method: POST&#xA;    url: &#34;{{ matrixlogin.hscsapi }}/matrix/client/r0/login&#34;&#xA;    body:&#xA;      type: &#34;m.login.password&#34;&#xA;      identifier:&#xA;        type: &#34;m.id.user&#34;&#xA;        user: &#34;{{ matrixlogin.user }}&#34;&#xA;      password: &#34;{{ matrixlogin.password }}&#34;&#xA;    bodyformat: json&#xA;  register: result&#xA;  changedwhen: result.json.accesstoken&#xA;&#xA;setfact:&#xA;    matrixloginresult: &#34;{{ result.json }}&#34;&#xA;  when: not ansiblecheckmode&#xA;&#xA;matrixloginresult contains at least: accesstoken, deviceid, userid&#xA;# see e.g.: https://spec.matrix.org/v1.8/client-server-api/#login and older versions&#xA;&#xA;Update: now [published too.] (I hesitated because I thought I saw about a year ago someone had already published a set of ansible roles for matrix admin tasks like this. Maybe. Can&#39;t find it now.)&#xA;&#xA;3. Make sure the account is free from rate limiting&#xA;&#xA;Same for this &#39;overrideratelimit&#39; step of course. Would be nice to automate.&#xA;&#xA;One way to change this permission is through some other admin account. In that case, &#34;know an access token&#34; is an appropriate way to use that other admin account.&#xA;&#xA;In the case where the bot account itself is configured to be a (matrix) server admin account, then in Synapse&#39;s case at least it would already have sufficient permission to use Synapse&#39;s admin API to override its own rate limit.&#xA;&#xA;Now about admin APIs. Unfortunately matrix admin APIs are not standardised. Synapse has its admin API, Dendrite has another, and Conduit I gather doesn&#39;t have a REST admin API. On Dendrite, &#34;the username has to be specified in dendrite.yaml to disable rate limiting, and personally i hate when anything other than the sysadmins write to configs&#34; said boneswashere. The playbook, if instructed to install Dendrite, controls that config file, but Draupnir would (or should) not be able to do that by itself unlike with Synapse.&#xA;&#xA;So, there are lots of cases. Different homeservers, and the playbook being used to install Draupnir with or without also its homeserver, and choice of whether the playbook or Draupnir itself performs this configuration.&#xA;&#xA;Currently I&#39;m think I will automate it for the Synapse admin set-ratelimit API only, as that&#39;s the server we use in PubHubs.&#xA;&#xA;  name: &#34;disable rate limiting for Draupnir bot&#34;&#xA;    uri:&#xA;      method: POST&#xA;      url: &#34;{{ matrixdraupnirhscsapi }}/synapse/admin/v1/users/{{ matrixdraupnirbotuserid }}/overrideratelimit&#34;&#xA;      headers:&#xA;        # access token must be for a user with synapse admin access;&#xA;        # can be the bot&#39;s if it is an admin, else of another account.&#xA;        Authorization: &#34;Bearer {{ matrixdraupnirbotaccesstoken if matrixdraupnirbotadmin else matrixdraupnirsomesynapseadminaccountaccesstoken }}&#34;&#xA;      bodyformat: json&#xA;      body:&#xA;        messagespersecond: 0&#xA;        burstcount: 0&#xA;&#xA;4. Create a management room&#xA;&#xA;I&#39;m on a roll now. I&#39;ll just check the matrix spec for room creation, take a guess at which parameters make most sense for my case, and write it out in Ansible language.&#xA;&#xA;  name: &#34;create a management room for Draupnir bot&#34; &#xA;    uri: &#xA;      method: POST &#xA;      url: &#34;{{ matrixdraupnirhscsapi }}/matrix/client/v3/createRoom&#34; &#xA;      headers: &#xA;        Authorization: &#34;Bearer {{ matrixdraupnirbotaccesstoken }}&#34; &#xA;      body: &#xA;        name: &#34;{{ matrixdraupnirmanagementroomname }}&#34; &#xA;        creationcontent: &#xA;          m.federate: false &#xA;        visibility: private &#xA;        preset: trustedprivatechat &#xA;        invite: &#34;{{ matrixdraupniroperatoruserids }}&#34; &#xA;      bodyformat: json &#xA;    register: result &#xA;    when: matrixdraupnirmanagementroomid is undefined &#xA;    # output: result.json.roomid &#xA;  setfact: &#xA;      matrixdraupnirmanagementroomid: &#34;{{ result.json.roomid }}&#34; &#xA;    when: matrixdraupnirmanagementroomid is undefined &#xA;&#xA;with inventory vars:&#xA;&#xA;the management room (bot and its operators); create if roomid undefined&#xA;matrixdraupnirmanagementroomname: &#34;Draupnir management&#34;&#xA;matrixdraupnirmanagementroomid: &#39;!xxxxxxxxxxxx:example.net&#39;&#xA;&#xA;Starting Up&#xA;&#xA;After running my playbook with the above set-up, and pasting the resulting access token and room id into the corresponding inventory vars (TODO: join the two parts together in a better way than cut-n-paste), here we go with matrix-docker-ansible-deploy:&#xA;&#xA;ansible-playbook .../matrix-docker-ansible-deploy/setup.yml -l example.net --tags=setup-bot-draupnir,start -Dv&#xA;&#xA;In the logs, journalctl -n100 -fu matrix-bot-draupnir.service:&#xA;&#xA;Starting Matrix Draupnir bot...&#xA;Started Matrix Draupnir bot.&#xA;[INFO] [index] Starting bot...&#xA;[INFO] [index] Resolving management room...&#xA;[INFO] [index] Mjolnir is starting up. Use !mjolnir to query status.&#xA;[INFO] [ProtectedRoomsConfig] Resolving protected rooms...&#xA;[WARN] [ProtectedRoomsConfig] Couldn&#39;t find any explicitly protected rooms from Mjolnir&#39;s account data, assuming first start. MatrixError: Error during MatrixClient request GET /matrix/client/v3/user/%40bot.draupnir%3Aexample.net/accountdata/org.matrix.mjolnir.protectedrooms: 404 Not Found -- {&#34;errcode&#34;:&#34;MNOTFOUND&#34;,&#34;error&#34;:&#34;Account data not found&#34;}&#xA;[... three of these &#39;Account data not found&#39; errors ...]&#xA;[INFO] [Mjolnir@startup] Checking permissions...&#xA;[INFO] [Mjolnir@startup] Syncing lists...&#xA;[INFO] [Mjolnir@startup] Startup complete. Now monitoring rooms.&#xA;&#xA;And then I found and joined the management room. I used a Hydrogen web client.&#xA;&#xA;@bot.draupnir:example.net joined the room&#xA;bot.draupnir named the room &#34;Draupnir management&#34;&#xA;admin1 was invited to the room by bot.draupnir&#xA;&#xA;bot.draupnir:&#xA;Mjolnir is starting up. Use !mjolnir to query status.&#xA;Checking permissions...&#xA;All permissions look OK.&#xA;Syncing lists...&#xA;Done updating rooms - no errors&#xA;Startup complete. Now monitoring rooms.&#xA;&#xA;admin1 joined the room&#xA;&#xA;It&#39;s alive! Perhaps a little confused about its new name. Responds to both !mjolnir and !draupnir, either way replying:&#xA;&#xA;Old Commands:&#xA;!mjolnir        - Print status information&#xA;!mjolnir status - Print status information&#xA;[...]&#xA;&#xA;mjolnir commands:ban entity list [...reason] - Bans an entity from the policy list.Parameters:&#xA;entity - no description&#xA;list - no description&#xA;[...]&#xA;&#xA;Well, there we are. The bot&#39;s alive. Next it&#39;s time for me to learn its commands and put it to work.&#xA;&#xA;Update: All these Ansible roles are now published.&#xA;TODO: contribute some of this to matrix-docker-ansible-deploy?&#xA;TODO: re-implement these roles as Ansible modules instead, using a matrix python API such as synadm or mautrix-python?&#xA;&#xA;---&#xA;&#xA;#matrix #awesomeFOSS #Draupnir #PubHubs&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>This week I&#39;m setting up Draupnir on my matrix test rig, in order to become familiar with Draupnir deployment before I <a href="https://wrily.foad.me.uk/pubhubs-moderation-tools">integrate it with PubHubs</a>.</p>

<p>Very glad to be able to use <a href="https://github.com/spantaleev/matrix-docker-ansible-deploy/blob/master/docs/configuring-playbook-bot-draupnir.md">matrix-docker-ansible-deploy&#39;s Draupnir setup</a> to automate the majority of the Draupnir deployment.</p>

<p>I also want to automate, with Ansible, as much as possible of the set-up that is required before running that playbook. I aim to document here what I have done and open questions about it. The numbered steps here correspond to the manual instructions in that documentation linked above.
</p>

<h2 id="1-register-the-bot-account" id="1-register-the-bot-account">1. Register the bot account</h2>

<p>I register a matrix account for the bot, using a little Ansible role I wrote, calling it like this in my Ansible playbook (personal one, specific to this installation).</p>

<pre><code class="language-yaml">  - include_role: name=matrix-synapse-register-user
    vars:
      matrix_synapse_user:
        name:  &#34;{{ matrix_draupnir_bot_username }}&#34;
        pw:    &#34;{{ matrix_draupnir_bot_password }}&#34;
        admin: &#34;{{ matrix_draupnir_bot_admin }}&#34;
</code></pre>

<p>defining those vars in my inventory file <code>inventories/prod/host_vars/&lt;host&gt;/matrix-draupnir.yml</code>:</p>

<pre><code class="language-yaml">matrix_draupnir_bot_username: &#34;bot.draupnir&#34;
matrix_draupnir_bot_password: !vault [... I use vault encoded values here ...]
matrix_draupnir_bot_admin: false
</code></pre>

<p>I <a href="https://lab.trax.im/matrix/matrix-ansible">published</a> my <code>matrix-synapse-register-user</code> role. I thought I should, if there isn&#39;t already a more widely available alternative. It looks like this, in <code>tasks/main.yml</code>:</p>

<pre><code class="language-yaml">---
- name: &#34;register a matrix synapse user&#34;
  command:
    argv: &#34;{{ (cmd_check if ansible_check_mode else cmd_real) + args }}&#34;
  vars:
    cmd_real:
      - /matrix/synapse/bin/register-user
    cmd_check:
      - echo
      - &#34;Would run: /matrix/synapse/bin/register-user&#34;
    args:
      - &#34;{{ matrix_synapse_user.name }}&#34;
      - &#34;{{ matrix_synapse_user.pw }}&#34;
      - &#34;{{ &#39;1&#39; if matrix_synapse_user.admin|default(false) else &#39;0&#39; }}&#34;
  check_mode: false
  register: result
  changed_when: result.rc == 0
  failed_when: result.rc != 0 and &#39;User ID already taken.&#39; not in result.stdout
  # if already registered, errors with (on stdout):
  # &gt; Sending registration request...
  # &gt; ERROR! Received 400 Bad Request
  # &gt; User ID already taken.
</code></pre>

<h2 id="2-get-an-access-token" id="2-get-an-access-token">2. Get an access token</h2>

<p>Manually get an access token. OK I know how to do that. First question, though: as that&#39;s a speed bump in the road, and seems fragile, has anyone shown interest in making either Draupnir itself or the playbook do a login automatically? Can&#39;t see any issue filed <a href="https://github.com/the-draupnir-project/Draupnir/issues?q=is%3Aissue+token">about “token”</a> <a href="https://github.com/the-draupnir-project/Draupnir/issues?q=is%3Aissue+login">or “login”</a>.</p>

<p>Basically these days I know I&#39;m going to have to repeat my steps on a different rig later, tear things down and build them up again, so I always look to automate the whole procedure. (Aware it&#39;s sometimes more efficient to go manually at first and automate only when worth the effort. And aware I&#39;m at risk of volunteering myself to contribute.)</p>

<p>Well, <a href="https://matrix.to/#/%23draupnir%3Amatrix.org/%247nnDZYBb0qidW-CZpQDmU0j98go7rNhqLqjS2QbxktU?via=foad.me.uk&amp;via=matrix.org&amp;via=maclemon.at&amp;via=catvibers.me">I asked</a> about this. The kind folks let me know their thoughts. There are several issues.</p>

<p>When I said “fragile” I meant I wouldn&#39;t expect an access token to remain valid forever. At the time this was designed, access tokens were considered permanent until explicitly revoked (“logged out”). Putting an access token into a bot&#39;s config was taken for granted, and perhaps still is. However, nowadays <a href="https://spec.matrix.org/v1.8/client-server-api/#client-authentication">the client authentication spec</a> is more complex and tokens may need refreshing. That seems to me to suggest that&#39;s no longer good practice. It can still work if we take care that the token is not invalidated.</p>

<p>In one sense using an access token is considered more secure than knowing an account&#39;s password. That&#39;s the sense in which many systems allow getting an API access token and giving it to an external service that will call the API. However, I think this argument applies to accessing other accounts, not for the bot&#39;s own account.</p>

<p>Also, if Draupnir connects through Pantalaimon to get E2EE (as makes sense when it&#39;s being run by someone other than the server operator), then Pantalaimon needs the account password to create an E2EE device.</p>

<p>Currently I&#39;m feeling the bot should know its password and we should automate its login. As a lesser step, I will do this in Ansible.</p>

<pre><code class="language-yaml">  - include_role: name=matrix-login-password
    vars:
      matrix_login:
        hs_cs_api: &#34;{{ matrix_draupnir_hs_cs_api }}&#34;
        user: &#34;{{ matrix_draupnir_bot_user_id }}&#34;
        password: &#34;{{ matrix_draupnir_bot_password }}&#34;
    # output: matrix_login_result
  - set_fact:
      matrix_draupnir_bot_access_token: &#34;{{ matrix_login_result.access_token }}&#34;
</code></pre>

<p>with additional inventory vars:</p>

<pre><code class="language-yaml">matrix_draupnir_hs_cs_api: &#34;https://matrix.example.net&#34;
matrix_draupnir_bot_user_id: &#34;@bot.draupnir:example.net&#34;
</code></pre>

<p>My <code>matrix-login-password</code> role has this in its <code>tasks/main.yml</code>:</p>

<pre><code class="language-yaml">- name: &#34;log in to matrix&#34;
  uri:
    method: POST
    url: &#34;{{ matrix_login.hs_cs_api }}/_matrix/client/r0/login&#34;
    body:
      type: &#34;m.login.password&#34;
      identifier:
        type: &#34;m.id.user&#34;
        user: &#34;{{ matrix_login.user }}&#34;
      password: &#34;{{ matrix_login.password }}&#34;
    body_format: json
  register: _result
  changed_when: _result.json.access_token

- set_fact:
    matrix_login_result: &#34;{{ _result.json }}&#34;
  when: not ansible_check_mode

# matrix_login_result contains at least: access_token, device_id, user_id
# see e.g.: https://spec.matrix.org/v1.8/client-server-api/#login and older versions
</code></pre>

<p>[Update: now <a href="https://lab.trax.im/matrix/matrix-ansible">published</a> too.] (I hesitated because I thought I saw about a year ago someone had already published a set of ansible roles for matrix admin tasks like this. Maybe. Can&#39;t find it now.)</p>

<h2 id="3-make-sure-the-account-is-free-from-rate-limiting" id="3-make-sure-the-account-is-free-from-rate-limiting">3. Make sure the account is free from rate limiting</h2>

<p>Same for this &#39;override_ratelimit&#39; step of course. Would be nice to automate.</p>

<p>One way to change this permission is through some other admin account. In that case, “know an access token” is an appropriate way to use that other admin account.</p>

<p>In the case where the bot account itself is configured to be a (matrix) server admin account, then in Synapse&#39;s case at least it would already have sufficient permission to use Synapse&#39;s admin API to override its own rate limit.</p>

<p>Now about admin APIs. Unfortunately matrix admin APIs are not standardised. Synapse has <a href="https://matrix-org.github.io/synapse/latest/usage/administration/admin_api/">its admin API</a>, Dendrite has <a href="https://matrix-org.github.io/dendrite/administration/adminapi">another</a>, and Conduit I gather doesn&#39;t have a REST admin API. On Dendrite, “the username has to be specified in dendrite.yaml to disable rate limiting, and personally i hate when anything other than the sysadmins write to configs” said <code>bones_was_here</code>. The playbook, if instructed to install Dendrite, controls that config file, but Draupnir would (or should) not be able to do that by itself unlike with Synapse.</p>

<p>So, there are lots of cases. Different homeservers, and the playbook being used to install Draupnir with or without also its homeserver, and choice of whether the playbook or Draupnir itself performs this configuration.</p>

<p>Currently I&#39;m think I will automate it for <a href="https://matrix-org.github.io/synapse/latest/admin_api/user_admin_api.html#set-ratelimit">the Synapse admin set-ratelimit API</a> only, as that&#39;s the server we use in PubHubs.</p>

<pre><code class="language-yaml">  - name: &#34;disable rate limiting for Draupnir bot&#34;
    uri:
      method: POST
      url: &#34;{{ matrix_draupnir_hs_cs_api }}/_synapse/admin/v1/users/{{ matrix_draupnir_bot_user_id }}/override_ratelimit&#34;
      headers:
        # access token must be for a user with synapse admin access;
        # can be the bot&#39;s if it is an admin, else of another account.
        Authorization: &#34;Bearer {{ matrix_draupnir_bot_access_token if matrix_draupnir_bot_admin else matrix_draupnir_some_synapse_admin_account_access_token }}&#34;
      body_format: json
      body:
        messages_per_second: 0
        burst_count: 0
</code></pre>

<h2 id="4-create-a-management-room" id="4-create-a-management-room">4. Create a management room</h2>

<p>I&#39;m on a roll now. I&#39;ll just check the <a href="https://spec.matrix.org/v1.8/client-server-api/#creation">matrix spec for room creation</a>, take a guess at which parameters make most sense for my case, and write it out in Ansible language.</p>

<pre><code class="language-yaml">  - name: &#34;create a management room for Draupnir bot&#34; 
    uri: 
      method: POST 
      url: &#34;{{ matrix_draupnir_hs_cs_api }}/_matrix/client/v3/createRoom&#34; 
      headers: 
        Authorization: &#34;Bearer {{ matrix_draupnir_bot_access_token }}&#34; 
      body: 
        name: &#34;{{ matrix_draupnir_management_room_name }}&#34; 
        creation_content: 
          m.federate: false 
        visibility: private 
        preset: trusted_private_chat 
        invite: &#34;{{ matrix_draupnir_operator_user_ids }}&#34; 
      body_format: json 
    register: _result 
    when: matrix_draupnir_management_room_id is undefined 
    # output: _result.json.room_id 
  - set_fact: 
      matrix_draupnir_management_room_id: &#34;{{ _result.json.room_id }}&#34; 
    when: matrix_draupnir_management_room_id is undefined 
</code></pre>

<p>with inventory vars:</p>

<pre><code class="language-yaml"># the management room (bot and its operators); create if room_id undefined
matrix_draupnir_management_room_name: &#34;Draupnir management&#34;
matrix_draupnir_management_room_id: &#39;!xxxxxxxxxxxx:example.net&#39;
</code></pre>

<h2 id="starting-up" id="starting-up">Starting Up</h2>

<p>After running my playbook with the above set-up, and pasting the resulting access token and room id into the corresponding inventory vars (<em>TODO: join the two parts together in a better way than cut-n-paste</em>), here we go with matrix-docker-ansible-deploy:</p>

<pre><code>ansible-playbook .../matrix-docker-ansible-deploy/setup.yml -l example.net --tags=setup-bot-draupnir,start -Dv
</code></pre>

<p>In the logs, <code>journalctl -n100 -fu matrix-bot-draupnir.service</code>:</p>

<pre><code>Starting Matrix Draupnir bot...
Started Matrix Draupnir bot.
[INFO] [index] Starting bot...
[INFO] [index] Resolving management room...
[INFO] [index] Mjolnir is starting up. Use !mjolnir to query status.
[INFO] [ProtectedRoomsConfig] Resolving protected rooms...
[WARN] [ProtectedRoomsConfig] Couldn&#39;t find any explicitly protected rooms from Mjolnir&#39;s account data, assuming first start. MatrixError: Error during MatrixClient request GET /_matrix/client/v3/user/%40bot.draupnir%3Aexample.net/account_data/org.matrix.mjolnir.protected_rooms: 404 Not Found -- {&#34;errcode&#34;:&#34;M_NOT_FOUND&#34;,&#34;error&#34;:&#34;Account data not found&#34;}
[... three of these &#39;Account data not found&#39; errors ...]
[INFO] [Mjolnir@startup] Checking permissions...
[INFO] [Mjolnir@startup] Syncing lists...
[INFO] [Mjolnir@startup] Startup complete. Now monitoring rooms.
</code></pre>

<p>And then I found and joined the management room. I used a Hydrogen web client.</p>

<pre><code class="language-markdown">_@bot.draupnir:example.net joined the room_
_bot.draupnir named the room &#34;Draupnir management&#34;_
_admin1 was invited to the room by bot.draupnir_

**bot.draupnir:**
Mjolnir is starting up. Use !mjolnir to query status.
Checking permissions...
All permissions look OK.
Syncing lists...
Done updating rooms - no errors
Startup complete. Now monitoring rooms.

_admin1 joined the room_
</code></pre>

<p>It&#39;s alive! Perhaps a little confused about its new name. Responds to both <code>!mjolnir</code> and <code>!draupnir</code>, either way replying:</p>

<pre><code class="language-markdown">Old Commands:
`!mjolnir        - Print status information`
`!mjolnir status - Print status information`
[...]

mjolnir commands:`ban &lt;entity&gt; &lt;list&gt; [...reason]` - Bans an entity from the policy list.Parameters:
entity - no description
list - no description
[...]
</code></pre>

<p>Well, there we are. The bot&#39;s alive. Next it&#39;s time for me to learn its commands and put it to work.</p>

<p><em>Update: All these Ansible roles are now <a href="https://lab.trax.im/matrix/matrix-ansible">published</a>.</em>
<em>TODO: contribute some of this to matrix-docker-ansible-deploy?</em>
<em>TODO: re-implement these roles as Ansible modules instead, using a matrix python API such as <a href="https://synadm.readthedocs.io/en/latest/synadm.module.html">synadm</a> or <a href="https://docs.mau.fi/python/">mautrix-python</a>?</em></p>

<hr>

<p><a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a> <a href="https://wrily.foad.me.uk/tag:awesomeFOSS" class="hashtag"><span>#</span><span class="p-category">awesomeFOSS</span></a> <a href="https://wrily.foad.me.uk/tag:Draupnir" class="hashtag"><span>#</span><span class="p-category">Draupnir</span></a> <a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/deploying-draupnir-on-my-matrix-test-rig</guid>
      <pubDate>Wed, 20 Sep 2023 17:00:00 +0000</pubDate>
    </item>
    <item>
      <title>2023-09-18 Update: PubHubs Moderation Tools</title>
      <link>https://wrily.foad.me.uk/2023-09-18-update-pubhubs-moderation-tools</link>
      <description>&lt;![CDATA[Last week&#xA;&#xA;I officially received confirmation of funding. (Thank you, PubHubs team and Dutch government open-source funding team.)&#xA;I re-joined the project team after a summer break, having previously joined them as a volunteer, and joined a general meeting and a technical meeting.&#xA;I posted a short announcement/introduction on my blog.&#xA;I updated and re-started my own test-bed installation of Pubhubs components.&#xA;I made some progress on my Ansible installation scripting of Pubhubs components.&#xA;I joined the new pubhubs-hosted project discussion room, in a &#34;stable test hub&#34;, which we would like to use instead of Slack, both for reasons of living our values and to &#34;eat our own dog food&#34;.&#xA;In our pubhubs dev room, we discussed implementing email notifications using Synapse&#39;s built-in support, which would be very useful for us maintining a long-term conversation in the room; and we discussed briefly some privacy implications if we wanted to offer follow-up notifications by email, or in other ways, to users who would like to remain pseudonymous.&#xA;&#xA;This Week&#xA;&#xA;Get some part of my Ansible deployment tested and published?&#xA;Start self-hosting Draupnir (on a normal matrix server) to get experience of deploying and using it.&#xA;&#xA;Tech note: Dependency Updates&#xA;&#xA;Updates needed, since around June/July.&#xA;&#xA;dependencies: NodeJS and NPM: update to later than Node 12 (which was installed via Debian 11 packages). I now install via Ansible role geerlingguy.nodejs, which in turn uses the nodesource.com APT repo, and currently defaults to Node 16.&#xA;dependencies: add package libssl-dev, required by Cargo openssl-sys package dependency (error was failed to run custom build command for openssl-sys v0.9.60).&#xA;&#xA;---&#xA;&#xA;PubHubs icon&#xA;&#xA;#PubHubs #matrix&#xA;&#xA;!--more--&#xD;&#xA;----&#xD;&#xA;Follow/Feedback/Contact: RSS feed · Fedi follow this blog: @julian&amp;ZeroWidthSpace;@wrily.foad.me.uk · matrix me · Fedi follow me · email me · julian.foad.me.uk&#xD;&#xA;Donate: via Liberapay&#xD;&#xA;All posts &amp;copy; Julian Foad and licensed CC-BY-ND except quotes, translations, or where stated otherwise&#xD;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="last-week" id="last-week">Last week</h3>
<ul><li>I officially received confirmation of funding. (Thank you, PubHubs team and Dutch government open-source funding team.)</li>
<li>I re-joined the project team after a summer break, having previously joined them as a volunteer, and joined a general meeting and a technical meeting.</li>
<li>I posted a short <a href="https://wrily.foad.me.uk/pubhubs-moderation-tools">announcement/introduction</a> on my blog.</li>
<li>I updated and re-started my own test-bed installation of Pubhubs components.</li>
<li>I made some progress on my Ansible installation scripting of Pubhubs components.</li>
<li>I joined the new pubhubs-hosted project discussion room, in a “stable test hub”, which we would like to use instead of Slack, both for reasons of living our values and to “eat our own dog food”.</li>
<li>In our pubhubs dev room, we discussed implementing email notifications using Synapse&#39;s built-in support, which would be very useful for us maintining a long-term conversation in the room; and we discussed briefly some privacy implications if we wanted to offer follow-up notifications by email, or in other ways, to users who would like to remain pseudonymous.</li></ul>

<h3 id="this-week" id="this-week">This Week</h3>
<ul><li>Get some part of my Ansible deployment tested and published?</li>
<li>Start self-hosting Draupnir (on a normal matrix server) to get experience of deploying and using it.</li></ul>

<h3 id="tech-note-dependency-updates" id="tech-note-dependency-updates">Tech note: Dependency Updates</h3>

<p>Updates needed, since around June/July.</p>
<ul><li>dependencies: NodeJS and NPM: update to later than Node 12 (which was installed via Debian 11 packages). I now install via Ansible role <code>geerlingguy.nodejs</code>, which in turn uses the <code>nodesource.com</code> APT repo, and currently defaults to Node 16.</li>
<li>dependencies: add package <code>libssl-dev</code>, required by Cargo <code>openssl-sys</code> package dependency (error was <a href="https://stackoverflow.com/questions/65553557/why-rust-is-failing-to-build-command-for-openssl-sys-v0-9-60-even-after-local-in"><code>failed to run custom build command for openssl-sys v0.9.60</code></a>).</li></ul>

<hr>

<p><a href="https://pubhubs.net/en/"><img src="https://blog.foad.me.uk/wp-content/uploads/2023/09/pubhubs-logo.png" alt="PubHubs icon"></a></p>

<p><a href="https://wrily.foad.me.uk/tag:PubHubs" class="hashtag"><span>#</span><span class="p-category">PubHubs</span></a> <a href="https://wrily.foad.me.uk/tag:matrix" class="hashtag"><span>#</span><span class="p-category">matrix</span></a></p>



<hr>

<p><em>Follow/Feedback/Contact:</em> <a href="https://wrily.foad.me.uk/feed/"><em>RSS feed</em></a> · <em>Fedi follow this blog: @julian​@wrily.foad.me.uk</em> · <a href="https://matrix.to/#/@julian:foad.me.uk" title="matrix Julian"><em>matrix me</em></a> · <a href="https://fed.foad.me.uk/%40julian%40fed.foad.me.uk" title="follow Julian"><em>Fedi follow me</em></a> · <a href="mailto:julian@foad.me.uk?subject=Wrily" title="email Julian"><em>email me</em></a> · <a href="https://julian.foad.me.uk/"><em>julian.foad.me.uk</em></a>
<em>Donate:</em> <a href="https://liberapay.com/julianfoad" title="Donate to Julian using Liberapay"><em>via Liberapay</em></a>
<em>All posts © Julian Foad and licensed <a href="https://creativecommons.org/licenses/by-nd/4.0/">CC-BY-ND</a> except quotes, translations, or where stated otherwise</em></p>
]]></content:encoded>
      <guid>https://wrily.foad.me.uk/2023-09-18-update-pubhubs-moderation-tools</guid>
      <pubDate>Mon, 18 Sep 2023 19:19:52 +0000</pubDate>
    </item>
  </channel>
</rss>