<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="rss.xsl"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>polyproto Blog</title>
        <link>https://polyproto.org/ca/blog</link>
        <description>polyproto Blog</description>
        <lastBuildDate>Tue, 25 Aug 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ca</language>
        <item>
            <title><![CDATA[Continuity; what *is* that?]]></title>
            <link>https://polyproto.org/ca/blog/2026/08/25/continuity-intro</link>
            <guid>https://polyproto.org/ca/blog/2026/08/25/continuity-intro</guid>
            <pubDate>Tue, 25 Aug 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Hi. It's me. I haven't written one of these in a long while, huh? Yeowch.]]></description>
            <content:encoded><![CDATA[<p>Hi. It's me. I haven't written one of these in a long while, huh? Yeowch.</p>
<p>Anyway! Mei is a beautiful being who has successfully motivated me to sit down, start a 15 minute
timer, and just spew out my thoughts on the topic of "continuity" in a blogpost. This <em>will</em> be
extremely unstructured. Here we go!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-is-continuity">What is "Continuity"?<a href="https://polyproto.org/ca/blog/2026/08/25/continuity-intro#what-is-continuity" class="hash-link" aria-label="Direct link to What is &quot;Continuity&quot;?" title="Direct link to What is &quot;Continuity&quot;?" translate="no">​</a></h2>
<p>So, first of all: While I do think I am quite good at naming things, I also often really don't take
the time to sit down and come up with a good name for something. "Continuity" is just the first
thing that came to mind when I scraped my brain for "a term that describes the ability of an actor
to continue using 3rd party services, even though their home server is currently down". And that's
what continuity is: It's the ability of an actor to continue using 3rd party services, even though
their home server is currently down.</p>
<p>A couple of days ago, I noticed that for all the time I've been saying</p>
<blockquote>
<p>"by the way, in polyproto, you can keep using 3rd party services, even when your home server is
down"</p>
</blockquote>
<p>I... have never specified this formally. And that just can't be! So I sat down and tried to think
about how this should actually work, for realsies. As the time on that 15min timer approaches zero,
I realize it's likely best if you just read the spec about this. But what I can do is give a good
bit of meta-commentary about my thought process and stuff like that.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-do-i-want-this-to-do">What do I want this to do?<a href="https://polyproto.org/ca/blog/2026/08/25/continuity-intro#what-do-i-want-this-to-do" class="hash-link" aria-label="Direct link to What do I want this to do?" title="Direct link to What do I want this to do?" translate="no">​</a></h2>
<p>Okay, sure. "You can keep using 3rd party services, even when your home server is down" is already
quite a to-the-point description of what the thing is supposed to do. But it's never really this
easy.</p>
<p>If we boil it down, what currently stops someone from just doing "continuity" without it being
defined further, is certificate caching, and certificate cache information in particular. I have
decided that, to distribute load across the network more evenly, you don't usually go asking home
server A to give you the certificate of an actor on that home server. Instead, you ask the home
server of the server you are currently talking on. This way, the home server actually responsible
for the load is the home server that also has to handle that load.</p>
<p>But you can't just take that home server B's word for it when it gives you the certificate of an
actor on home server A. The certificate you received could have long been revoked already, and the
home server is currently doing some nasty impersonation stuff, exploiting this property, and the
fact that your client doesn't yet know that the certificate was revoked.</p>
<p>Cache information is what prevents this: Home server A hands out a thing saying</p>
<blockquote>
<p>"here's the ID-Cert for that actor you asked for, but this information is only valid for 60mins
from now, so for messages after that, you'll have to come to me again and ask for another cache
item!"</p>
</blockquote>
<p>Home server B accepts that piece of information and distributes it to actors connected to it. The
actors only need to contact home server A once, to get the home servers' public key. And since that
is long-lived (in the order of magnitude of <em>years</em>), there's very little sustained load for home
server A. This makes a small, low-resource home server deployment much more viable!</p>
<p>But it also introduces this continuity-problem. If home server A goes down, then you have a maximum
of about 60 min in which you could keep using other services. And an outage can last for a day, or
even a week maybe. And to make it a bit more complicated: we need to make sure that these messages
are marked as not fully trusted, and that, when the home server is back online, it gets to either
say "yes, these messages are all good" or "no, the user has actually revoked their cert, these
messages are fake and evil and bad". And that information then also needs to arrive at all the
clients that participated in this conversation.</p>
<p>And defining all these delicate security aspects and how exactly communication around this subject
works is precisely what we need the "continuity" section in the protocol for.</p>
<hr>
<p>This actually took like, 25 minutes, instead of the 15 minutes I wanted it to take, but oh well. I
am also very sorry if this blog post makes no sense at all or is hard to understand; though I <em>did</em>
warn you of that in the beginning :3</p>]]></content:encoded>
            <category>polyproto</category>
            <category>polyproto-core</category>
        </item>
        <item>
            <title><![CDATA[Prior Art and Competing Projects]]></title>
            <link>https://polyproto.org/ca/blog/2026/01/02/prior-art</link>
            <guid>https://polyproto.org/ca/blog/2026/01/02/prior-art</guid>
            <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[In this blog post, we will compare Polyphony with various existing projects, both open-source and]]></description>
            <content:encoded><![CDATA[<p>In this blog post, we will compare Polyphony with various existing projects, both open-source and
proprietary, to understand their strengths and weaknesses, and to identify areas where Polyphony can
either copy features or differentiate itself.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="signal"><a href="https://signal.org/" target="_blank" rel="noopener noreferrer" class="">Signal</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#signal" class="hash-link" aria-label="Direct link to signal" title="Direct link to signal" translate="no">​</a></h2>
<p>Signal is a pioneer in modern end-to-end message encryption. The protocol and software are
engineered around security and privacy concerns. Signal excels in this regard, accepting some cuts
in features or usability compared to other messengers.</p>
<p>While all apps and server software are available under a FOSS license, Signal is not federated and
discourages third-party clients; it is instead implemented as a centralized service. This makes it
hard for users to self-host or modify the software, which is a practical barrier to truly free
software. That said, some practical efforts have been made to base third-party software on Signal,
such as <a href="https://github.com/CableIM" target="_blank" rel="noopener noreferrer" class="">Cable IM</a> and <a href="https://molly.im/" target="_blank" rel="noopener noreferrer" class="">Molly</a>.</p>
<p>Moreover, Signal makes a fairly decent argument against federation
<a href="https://signal.org/blog/the-ecosystem-is-moving/" target="_blank" rel="noopener noreferrer" class="">on their blog</a>, arguing that federated protocols
have a tendency to get "stuck in the past" as multiple independent implementations have a tendency
not to evolve as quickly as centralized services. We will have to plan around this trade-off in some
way.</p>
<p>Signal requires accounts to be tied to a phone number, which forces users to have a single
identity/account, making it hard to keep parts of ones' online life separate.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="simplex"><a href="https://simplex.chat/" target="_blank" rel="noopener noreferrer" class="">SimpleX</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#simplex" class="hash-link" aria-label="Direct link to simplex" title="Direct link to simplex" translate="no">​</a></h2>
<p>SimpleX is an end-to-end encrypted messaging app with a strong emphasis on metadata privacy.</p>
<p>The lack of global identifiers is a core design feature. Users invite each other to converse over a
particular set of relay servers, whose addresses are included in the invite link. Each link is
unidirectional, so that when Alice talks to Bob, the relays used are different than when Bob replies
to Alice. When multiple users use a single relay server, messages are sent out with randomized
timing ("traffic mixing") to prevent external observers from learning who is talking to who. Due to
the invite-only messaging, the protocol is inherently spam-resistant.</p>
<p>Relays can be easily self-hosted, and any user is free to choose which relay servers they trust -
the extent to this trust is limited to relaying messages effectively. A trade-off exists between
larger relays that can effectively perform traffic mixing, or smaller relays that are operated by
better-trusted parties.</p>
<p>As a result of this strong focus on security, the design is fairly complex, with security features
somewhat dominating over user experience.</p>
<p>Multi-device experience is poor and requires some technical knowledge, involving
remotely-controlling clients through TCP ports, causing issues with firewalls and availability when
the machine running the client may be offline.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="discord"><a href="https://discord.com/" target="_blank" rel="noopener noreferrer" class="">Discord</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#discord" class="hash-link" aria-label="Direct link to discord" title="Direct link to discord" translate="no">​</a></h2>
<p>Discord is a large commercial chat and communications platform, with an emphasis on building
communities ("servers" or "guilds") of varying sizes and with optional public accessibility. Thanks
to its size, the freemium business model, ease of use, and voice and video chat offerings, it has
evolved into a de-facto standard messaging platform for casual conversations, especially for younger
generations.</p>
<p>Discord serves as a significant source of inspiration for Polyphony, especially its focus on
communities rather than more individualized messaging.</p>
<p>As a proprietary and centralized service, a single, large, commercial party — a company based in the
USA — processes and stores all communication in clear text—including direct messages. With lax
privacy statements, they are in a position to effectively do whatever they want with this data.</p>
<p>Users are at the mercy of a centralized moderation team, which are in a position to ban users for
any reason, which are not in much of a position to appeal. For instance, Discord discourages the use
of third-party clients, and may ban an account if abnormal behavior from a client is detected. Their
policy on this is a bit unclear, alleging they ban third-party clients for appearing like spam bots
abusing the client API rather than the dedicated bot API, but it still illustrates being at the
whims of their moderation team. Recently, invite links to servers marked as "community" were set to
auto-expire after a while - this was unilaterally done without the consent of these communities. It
is fairly common to find expired Discord invite links issued by users who were not aware of this
restriction.</p>
<p>Moreover, Discord is frequently misused for hosting files, documentation, or discussion which may
have future value for indexing, searching, and archiving. Discord servers are almost always closed
off to the wider web, unless third-party archiving solutions are used.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="activitypubfediverse"><a href="https://www.w3.org/TR/activitypub/" target="_blank" rel="noopener noreferrer" class="">ActivityPub/Fediverse</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#activitypubfediverse" class="hash-link" aria-label="Direct link to activitypubfediverse" title="Direct link to activitypubfediverse" translate="no">​</a></h2>
<p>ActivityPub is a
<a href="https://www.w3.org/TR/activitypub/" target="_blank" rel="noopener noreferrer" class="">W3C recommended federated social networking protocol</a>, known
for microblogging applications such as <a href="https://joinmastodon.org/" target="_blank" rel="noopener noreferrer" class="">Mastodon</a>,
<a href="https://misskey-hub.net/" target="_blank" rel="noopener noreferrer" class="">Misskey</a> (and its forks), <a href="https://gotosocial.org/" target="_blank" rel="noopener noreferrer" class="">GoToSocial</a>, etc. It
enables a network of independent servers to provide a decentralized, federated microblogging
service. Users on any server may view posts by and interact with users from any other server.</p>
<p>Due to its decentralized and federated nature, the Fediverse is generally resilient against issues
that affect individual servers; a single server failure will generally not affect users on other
servers.</p>
<p>Culture, rules, policies, and how they are enforced may vary wildly from one server to the next.
While this allows a great plurality of ways of working, being, and existing, it also frequently
leads to spouts of drama. Especially the notion of "defederation", whereby one server blocks
another - preventing any interactions between users of both servers, including severing existing
follower/followee relations - frequently leads to conflict.</p>
<p>If a server administrator is abusive, users may open an account on another server and continue -
this is a significant strength of the federated model. However, while migrating followers/followees
from one account to the other <em>is</em> supported, this process often does not transfer all followers,
does not transfer posts from the old account to the new, and relies on cooperation from the old
server, which might not occur in case of abuse or sudden instance shutdown. It is on this aspect
that Polyproto (and Polyphony more general) intends to significantly improve, by empowering
individual users to take control of their own identity on the network and support migration as a
first-class feature.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="email-smtp"><a href="https://en.wikipedia.org/wiki/Simple_Mail_Transfer_Protocol" target="_blank" rel="noopener noreferrer" class="">Email (SMTP)</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#email-smtp" class="hash-link" aria-label="Direct link to email-smtp" title="Direct link to email-smtp" translate="no">​</a></h2>
<p>SMTP-based Email is a comparatively ancient system, but still in extremely widespread and active
use. SMTP is a truly federated system with a wide variety of implementations and providers, and is
fairly easy to self-host. Hosting is usually dominated by large providers, but small single-user
self-hosted SMTP servers generally work fine, once DNS records are set up correctly.</p>
<p>There is also relatively little security built into the protocol itself, with most measures added on
afterward and not being consistent among implementations. PGP and S/MIME are common methods for
signing and encrypting messages, though this is mainly done by expert users who know how to use
these technologies. Sadly, PGP and S/MIME
<a href="https://efail.de/" target="_blank" rel="noopener noreferrer" class="">come with their own suite of vulnerabilities</a>.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="gnu-jami-formerly-ring"><a href="https://jami.net/" target="_blank" rel="noopener noreferrer" class="">GNU Jami (formerly Ring)</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#gnu-jami-formerly-ring" class="hash-link" aria-label="Direct link to gnu-jami-formerly-ring" title="Direct link to gnu-jami-formerly-ring" translate="no">​</a></h2>
<p>Jami/Ring uses a distributed hash table to organize a truly serverless peer-to-peer instant
messaging system. Accounts are merely public/private key pairs with some metadata, and can be
created without email verification or other such steps.</p>
<p>Unfortunately, GNU Jami also comes with a lot of the downsides associated with P2P networking. For
instance, when tried by the author of this document, messages were simply not delivered or delivered
with an extreme delay. P2P does not always play well with local network setups, which often involve
a myriad of different firewalls, network address translation (NAT), local administrative policies,
which may lead to mysterious and hard-to-diagnose issues, especially for novice users. Protocols
that ensure clients only ever talk to servers in standard ways (such as HTTP(S)) avoid such local
issues.</p>
<p>Moreover, in P2P, nobody is in charge of the infrastructure by design; this makes the overall
network somewhat uncontrollable.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="retroshare"><a href="https://retroshare.cc/" target="_blank" rel="noopener noreferrer" class="">RetroShare</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#retroshare" class="hash-link" aria-label="Direct link to retroshare" title="Direct link to retroshare" translate="no">​</a></h2>
<p>Another mostly serverless peer-to-peer networking application. Integrates messaging, social
networking, and even email over its network.</p>
<p>RetroShare further integrates somewhat features regarding a kind of "social graph", meaning an
observable graph of who is a peer of who, which may serve as a solid basis for establishing webs of
trust and social organization.</p>
<p>Similar to Ring/Jami, uses an NAT for routing; the result is a similar truly decentralized design
for peer-to-peer networking. While the client includes a number of tricks for routing, this page's
author had trouble actually connecting to a peer - despite both parties being fairly well-versed in
technological matters. In our view, this cements the need for more traditional client-server
approaches, if only because these play better with local networks.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="mumble"><a href="https://mumble.info/" target="_blank" rel="noopener noreferrer" class="">Mumble</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#mumble" class="hash-link" aria-label="Direct link to mumble" title="Direct link to mumble" translate="no">​</a></h2>
<p>While Mumble does voice chat, not instant messaging, we do feel a need to mention it as a piece of
self-hostable free software that simply does one thing well.</p>
<p>While technically not federated, any client can connect to any server. Servers may host small
communities, all while there is no lock-in of specific users to specific servers. Communities and
groups themselves, however, do not necessarily have an option for migration if they are defined by
the server's address.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="zulip"><a href="https://zulip.com/" target="_blank" rel="noopener noreferrer" class="">Zulip</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#zulip" class="hash-link" aria-label="Direct link to zulip" title="Direct link to zulip" translate="no">​</a></h2>
<p>Zulip is a free and open source (Apache license) non-federated collaboration message platform. The
project collaboration talk is hosted on <a href="https://polyphony.zulipchat.com/" target="_blank" rel="noopener noreferrer" class="">the official instance</a>,
but the software can be self-hosted as well.</p>
<p>We mention Zulip for its notable UX surrounding asynchronous communication organized by topic, where
topics are themselves grouped into "channels".</p>
<p>As conversation threads tend to go off-topic after a while, a remarkable feature is the ability for
moderators to post-facto move messages to different threads or topics, keeping things organized
without enforcing that conversations rigidly remain on-topic all the time.</p>
<p>Polyphony should probably steal some ideas here.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="matrix"><a href="https://matrix.org/" target="_blank" rel="noopener noreferrer" class="">Matrix</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#matrix" class="hash-link" aria-label="Direct link to matrix" title="Direct link to matrix" translate="no">​</a></h2>
<p>Matrix operates as a decentralized, federated communication platform. Users may be hosted on any
server, and can then communicate freely with users on any other.</p>
<p>Matrix provides end-to-end encrypted chat as well as a number of fairly complex and original
mechanisms for resilience and security.</p>
<p>While this work is legitimately impressive, the resulting protocol is complex and relatively
difficult to implement, whereas Polyphony aims at simplicity and practical usability above all.</p>
<p>We explicitly wish to avoid Matrix's dreaded "unable to decrypt message" issue, which most new users
run into and are frequently confused by.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="xmpp"><a href="https://xmpp.org/" target="_blank" rel="noopener noreferrer" class="">XMPP</a><a href="https://polyproto.org/ca/blog/2026/01/02/prior-art#xmpp" class="hash-link" aria-label="Direct link to xmpp" title="Direct link to xmpp" translate="no">​</a></h2>
<p>XMPP (Extensible Messaging and Presence Protocol) is a relatively old, well-used federated message
exchange protocol with a wide and diverse variety of implementations. The federation is meaningful
in that anyone can easily self-host a server and communicate with others freely.</p>
<p>The protocol counts a core instant message functionality, as well as somewhat overwhelmingly large
number of protocol extensions (XEPs) enabling a variety of behaviors and applications, including
group chat, keeping message histories on servers, copying messages to other clients, end-to-end
encryption over OMEMO, as well as several competing standards for message styling and formatting.</p>
<p>While extremely granular and modular, this makes the protocol somewhat difficult to implement and
use in practice, which is why Polyphony aims to implement protocol extensions in a far less granular
manner.</p>
<h1>Conclusion</h1>
<p>Comparing to existing and competing protocols, Polyphony fills a nice currently not occupied by
other applications. Applications are either proprietary, prioritize security over usability, are
centralized, deal poorly with abuse by infrastructure owners, or miss the kind of community-building
that a platform like Discord offers.</p>
<p>By focusing on different priorities, Polyphony aims to provide real-world usability and
dependability.</p>]]></content:encoded>
            <category>Polyphony</category>
        </item>
        <item>
            <title><![CDATA[Governing polyproto]]></title>
            <link>https://polyproto.org/ca/blog/2025/02/12/governing-polyproto</link>
            <guid>https://polyproto.org/ca/blog/2025/02/12/governing-polyproto</guid>
            <pubDate>Wed, 12 Feb 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[There's precedence which suggests that governing federated software as a one-man-band is a bad idea.]]></description>
            <content:encoded><![CDATA[<p>There's precedence which suggests that governing federated software as a one-man-band is a bad idea.
This begs the question: How would polyproto be governed?</p>
<p>{/_ truncate _/}</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="i-am-in-a-somewhat-interesting-situation">I am in a somewhat interesting situation<a href="https://polyproto.org/ca/blog/2025/02/12/governing-polyproto#i-am-in-a-somewhat-interesting-situation" class="hash-link" aria-label="Direct link to I am in a somewhat interesting situation" title="Direct link to I am in a somewhat interesting situation" translate="no">​</a></h2>
<p>Polyphony and polyproto are, at the moment, "just hobbies" for me. However, I <em>do</em> still really want
this all to succeed long-term. These wishes do involve a lot of planning ahead, including thinking
about passing on the torch, so that this fire does not die with me. A pretty uncommon thing to say
about a hobby, I think.</p>
<p>It is pretty clear to me that I do not want to be the sole ruler of all things polyproto. I simply
don't have the time, energy and skills to manage everything myself, should polyproto really become
something that is used by a larger audience. polyproto must be an open standard, and in my opinion,
to make a standard truly open is to eventually let go and involve other people in decision making
processes. This is what I have been thinking about a lot lately, and I wanted to use this article as
a space to share my thoughts and wishes for the future.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="democracy">Democracy<a href="https://polyproto.org/ca/blog/2025/02/12/governing-polyproto#democracy" class="hash-link" aria-label="Direct link to Democracy" title="Direct link to Democracy" translate="no">​</a></h2>
<p>To make a long story short, I believe that establishing a non-profit foundation or association that
concerns itself with governing and developing polyproto is <em>the</em> way to go. The tasks of such an
association would be:</p>
<ul>
<li class=""><strong>Coordinating and overseeing work on the protocol:</strong> As the polyproto sees increased usage,
changes and additions to the core protocol will most definitely need to be made to align the
protocol with real-world needs and wants voiced by users and developers alike. The polyproto
association would have the final say over what changes will be included in the next version of
polyproto by reviewing, commenting on and accepting/rejecting change proposals submitted by
people/groups.</li>
<li class=""><strong>Foster a collaborative environment:</strong> I believe it would really <em>suck</em> if there were 12
(exaggeration) different p2-extensions defining what a Discord-like chat application should look
like. The polyproto association should make efforts to foster, unify and certify "official"
extensions and standards that all developers should use. I am not 100% sure about what this would
look like; Imagine, someone develops a p2-extension defining what a Google Photos-like should look
like. This person now comes to the polyproto association with a wish to get a "seal of approval"
via getting their extension certified. The association members notice, that this extension is
pretty awesome. What happens now? Should this extension be "absorbed" into the association
somehow? Should only this exact version of the extension receive certification, requiring the
developer to contact the association again if an update to the extension is made, to get the
updated version certified as well? And if this is the case, say there happens to be a disagreement
between the association and the developer on the contents of the extension update – what then?
Does the association eventually "hard fork" the extension? This seems very complex, and I think
that cases like these should be considered, given that sadly not every human being gets along with
each other. In any case, the polyproto association should make the process of getting your
extension proposal reviewed and seen by other people easier, so that extensions are not created in
a vacuum, but through <em>collaboration</em>.</li>
<li class=""><strong>Act as a giant documentation resource:</strong> The association should be a great source of information
for interested developers. Documentation and explanations of concepts should be available in
various levels of complexity and should always be up-to-date.</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-words">Closing words<a href="https://polyproto.org/ca/blog/2025/02/12/governing-polyproto#closing-words" class="hash-link" aria-label="Direct link to Closing words" title="Direct link to Closing words" translate="no">​</a></h2>
<p>The time for something like this has not yet arrived. What this project needs in its infancy is
rapid development and the freedom to change a great number of things quickly.</p>
<p>What I need <em>right now</em> though is to get healthy again. As I am writing this, the flu is still doing
a number on me. Bleh.</p>
<p>Stay healthy and stay safe!</p>]]></content:encoded>
            <category>polyproto</category>
        </item>
        <item>
            <title><![CDATA[NLnet grant application]]></title>
            <link>https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application</link>
            <guid>https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application</guid>
            <pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[The NLnet foundation is a non-profit organization that supports open-source]]></description>
            <content:encoded><![CDATA[<p>The <a href="https://nlnet.nl/" target="_blank" rel="noopener noreferrer" class="">NLnet foundation</a> is a non-profit organization that supports open-source
projects. They have a grant program that funds projects that align with their goals. On behalf of
Polyphony and the polyproto project, I have submitted an application for a grant of 10,000€ from the
NLnet foundation in their funding round of October 2024.</p>
<p>{/_ truncate _/}</p>
<p>Should we be successful in our application, the grant will be used to fund the development of the
Polyphony and polyproto projects, which would rapidly increase the development velocity of both
projects and bring them one big step closer to being ready for a public alpha release.</p>
<p>The application required a bunch of different, interesting questions to be answered. I would like to
share the answers with you, as they give a good overview of what we are working on, what we are
planning to do, and considerations we have made in the past.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="can-you-explain-the-whole-project-and-its-expected-outcomes">Can you explain the whole project and its expected outcome(s)?<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#can-you-explain-the-whole-project-and-its-expected-outcomes" class="hash-link" aria-label="Direct link to Can you explain the whole project and its expected outcome(s)?" title="Direct link to Can you explain the whole project and its expected outcome(s)?" translate="no">​</a></h2>
<p>polyproto is a new federation protocol with the goal of offering account portability and an
effortless experience for users and developers alike. It is part of the Polyphony Project, which
aims to be a truly competitive alternative to centralized, proprietary chat services like Discord.
We came up with the idea for polyproto because of a lingering frustration with current federation
protocols and their sub-optimal suitability for such a project.</p>
<p>polyproto is not limited to an application in a chat service, and that it is not incompatible with
federation protocols such as ActivityPub. It would technically be possible to write a polyproto +
ActivityPub server and client to offer new possibilities to the currently existing Fediverse. We
want to empower users, not split userbases further.</p>
<p>Our goal is to deliver the Polyphony chat service with polyproto at its core, build great SDKs for
other developers to work with, and to also directly work together with other developers to get
alternative implementations of polyproto-based chat services for users to choose from. Polyphony
should be the ideal, federated and decentralized Discord replacement; a service, that can be used by
teenagers, the elderly and anyone in between and which ideally does not require any additional
technical knowledge or proficiency to use.</p>
<ul>
<li class=""><a href="https://docs.polyphony.chat/Protocol%20Specifications/core/" target="_blank" rel="noopener noreferrer" class="">Documentation/Protocol specification</a></li>
<li class=""><a href="https://docs.polyphony.chat/Overviews/core/" target="_blank" rel="noopener noreferrer" class="">Simplified overview of the protocol</a></li>
<li class=""><a href="https://docs.polyphony.chat/APIs/core/" target="_blank" rel="noopener noreferrer" class="">API Documentation</a></li>
<li class=""><a href="https://codeberg.org/polyphony/polyproto-rs" target="_blank" rel="noopener noreferrer" class="">"polyproto-rs" Rust crate</a></li>
<li class=""><a href="https://codeberg.org/polyphony" target="_blank" rel="noopener noreferrer" class="">Polyphony organization overview</a></li>
<li class=""><a href="https://codeberg.org/polyphony/chorus" target="_blank" rel="noopener noreferrer" class="">"chorus" API Wrapper</a></li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="have-you-been-involved-with-projects-or-organisations-relevant-to-this-project-before-and-if-so-can-you-tell-us-a-bit-about-your-contributions">Have you been involved with projects or organisations relevant to this project before? And if so, can you tell us a bit about your contributions?<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#have-you-been-involved-with-projects-or-organisations-relevant-to-this-project-before-and-if-so-can-you-tell-us-a-bit-about-your-contributions" class="hash-link" aria-label="Direct link to Have you been involved with projects or organisations relevant to this project before? And if so, can you tell us a bit about your contributions?" title="Direct link to Have you been involved with projects or organisations relevant to this project before? And if so, can you tell us a bit about your contributions?" translate="no">​</a></h2>
<p>I (Flori Weber, bitfl0wer) have been following the Spacebar-Chat (formerly "Fosscord") project for
some time before deciding to start the Polyphony-Chat GitHub organization in March 2023. The
contributions I have made to the Spacebar project were limited to additions and overhauls of the
projects documentation, because of a lack of TypeScript knowledge, which is the programming language
primarily used in the Spacebar organization. Of course, I have prior experience in software
development and software design through my work at Deutsche Telekom MMS GmbH, but this is my first
project with such a topic. I am part of a software development community called "Commune", which is
a home for individuals and groups who also have interest in federated and/or decentralized social
media, as well as "reclaiming" the web from the hands of large corporations. There, I have access to
like-minded individuals who are also very much interested in polyproto and in seeing polyproto
succeed.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="requested-amount">Requested Amount<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#requested-amount" class="hash-link" aria-label="Direct link to Requested Amount" title="Direct link to Requested Amount" translate="no">​</a></h2>
<p>$10.000</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="explain-what-the-requested-budget-will-be-used-for-does-the-project-have-other-funding-sources-both-past-and-present">Explain what the requested budget will be used for? Does the project have other funding sources, both past and present?<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#explain-what-the-requested-budget-will-be-used-for-does-the-project-have-other-funding-sources-both-past-and-present" class="hash-link" aria-label="Direct link to Explain what the requested budget will be used for? Does the project have other funding sources, both past and present?" title="Direct link to Explain what the requested budget will be used for? Does the project have other funding sources, both past and present?" translate="no">​</a></h2>
<p>There are three key things that I (Flori Weber, bitfl0wer) have been wanting to tackle for months
now, but have never been able to do, because of a lack of available personal time or expertise.
These three things are:</p>
<ol>
<li class="">Writing new material and, if necessary, reworking existing material that
<ul>
<li class="">Describes, in a condensed form, what polyproto is about, targeted towards people who do not
have [a lot of] existing knowledge in the topics of federation and decentralized social
networking concepts ($250-400)</li>
<li class="">Describes, in a condensed form, how polyproto works, targeted towards developers who might be
interested in learning more about the inner workings of polyproto, without needing to read the
entire protocol specification document ($250-400)</li>
</ul>
</li>
<li class="">Starting to build some sort of "brand" by
<ul>
<li class="">Commissioning an artist to create a recognizable logo for polyproto ($200-400)</li>
<li class="">Commissioning a frontend developer to build a landing page for our project, since
non-developers do seem to prefer information hosted outside of GitHub and plain looking
documentation pages. This landing page would also host the written material mentioned in 1.
($500-1500)</li>
</ul>
</li>
<li class="">Paying (freelance) developers to expedite this projects' journey to completion, where there are
the following tasks we could use additional brains on:
<ul>
<li class="">Paying developers to start integrating our polyproto crate into our "chorus" client library and
"symfonia" server (~$2000)</li>
<li class="">Stabilizing and extending the symfonia server to host a first, publicly usable instance
(~$1500)</li>
<li class="">Getting additional help from UI/UX designers and frontend developers to build a client mockup,
then having this mockup translated into a client prototype which can be hosted alongside the
symfonia server (~$2000)</li>
<li class="">"Overhaul"/Refactoring tasks which we, as a group of mainly university students working part
time jobs in addition, simply did not yet have the time to get to (~$1000-1500)</li>
</ul>
</li>
</ol>
<p>This would total to
$7700 or $9700, depending on whether the lower or higher estimate is used.
Additionally, I would like to extend the domains polyphony.chat and polyproto.org for some years using the funding and top up our prepaid E-Mail
server hosted at <a href="https://uberspace.de/en/" target="_blank" rel="noopener noreferrer" class="">Uberspace</a>. The domain and the E-Mail server make up most of our current operating costs, ranging between 7-12$
a month. This might not sound like a lot in the grand scheme of things, but I am currently paying
for these out of my own pocket as an undergraduate with little income, so being able to potentially
reduce monthly expenses is a nice prospect.</p>
<p>We currently have and have never had additional/other sources of funding. Receiving funding from
NLNet would thus be our first source of funding.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="compare-your-own-project-with-existing-or-historical-efforts">Compare your own project with existing or historical efforts<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#compare-your-own-project-with-existing-or-historical-efforts" class="hash-link" aria-label="Direct link to Compare your own project with existing or historical efforts" title="Direct link to Compare your own project with existing or historical efforts" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="spacebar-chat">Spacebar Chat<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#spacebar-chat" class="hash-link" aria-label="Direct link to Spacebar Chat" title="Direct link to Spacebar Chat" translate="no">​</a></h3>
<p>Already previously mentioned, Spacebar Chat is also working on an open-source Discord replacement in
form of offering an API-compatible server. However, they do not seem interested in making Spacebar
Chat a federated chat application with good user experience, as their primary focus is to
reverse-engineer and re-implement the Discord API spec-for-spec.</p>
<p>From talking to Spacebar Maintainers, their code reportedly seems to have accrued noticeable amounts
of technical debt which made it undesirable for most of the maintainers to continue development on
the server. Being friends with some of the now mostly inactive maintainers, I have considered
forking the server repository to have an already mostly working starting ground to work with.
However, due to the reports of technical debt and our organizations' unfamiliarity with
JavaScript/TypeScript, we have decided to start from scratch, in Rust.</p>
<p>The accumulated knowledge that Spacebar contributors and maintainers have collected in form of
documentation has already been of great use for our project, and we are contributing back by
updating documentation and creating issues, when we find disparities between the behaviours of our
own server implementation and their server implementation.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="xmpp">XMPP<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#xmpp" class="hash-link" aria-label="Direct link to XMPP" title="Direct link to XMPP" translate="no">​</a></h3>
<p>Much like XMPP, I have decided to make polyproto an extensible protocol.</p>
<p>I am of the opinion that XMPPs biggest downfall is how many extensions there are, and that a server
aiming to be compatible with other implementations of XMPP-based chat services should aim to
implement all of the XEPs to be a viable choice.</p>
<p>polyproto is actively trying to circumvent this by limiting polyproto extensions (P2 extensions for
short) to</p>
<ul>
<li class="">
<p>either be a <strong>set</strong> of APIs and behaviours, defining a generic(!) version of a service. A
"service" is, for example, a chat application, a microblogging application or an image blogging
application. Service extensions should be the core functionality that is universally needed to
make an application function. In the case of a chat application, that might be:</p>
<ul>
<li class="">Defining message group size granularity: Direct messages, Group messages, Guild-based messages</li>
<li class="">Defining what a room looks like</li>
<li class="">Defining the APIs and behaviours required to send and receive messages</li>
<li class="">Defining the APIs and behaviours required to perform commonly sought after things, such as
reacting to a message with an emoji</li>
<li class="">etc.</li>
</ul>
<p>The goal is that all different polyproto-based chat applications should then implement this shared
behaviour. Of course, developers may absolutely add their own behaviours and functionality which
is perhaps exclusive to their specific implementation. Core functionality remains commonly defined
however, which should make all polyproto-based chat applications interoperable in these defined,
common behaviours.</p>
</li>
<li class="">
<p>or describe a <strong>major</strong> technological addition, which can be used in the "requires" section of
another P2 extension. This "requires" section can be thought of like the dependency list of a
software package.</p>
<p>Technological additions might be:</p>
<ul>
<li class="">Defining APIs and behaviours needed to implement the MLS (Messaging Layer Security) Protocol</li>
<li class="">Defining APIs and behaviours needed to establish and maintain a WebSocket connection, and how to
send/receive messages over this WebSocket connection.</li>
</ul>
</li>
</ul>
<p>By using clay-brick-sized building blocks instead of more LEGO-sized building blocks like XMPP does,
we hope to mitigate this problem that we perceive, while still offering an extensible yet
well-defined platform to build on.</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="matrixelement">Matrix/Element<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#matrixelement" class="hash-link" aria-label="Direct link to Matrix/Element" title="Direct link to Matrix/Element" translate="no">​</a></h3>
<p>Matrix is perhaps the closest we have yet gotten to federated chat software aimed towards a general
audience. However, as a strong believer in user experience - especially how first impressions impact
new, non-technical users, I believe that Matrix falls flat in this regard. A lot of peoples first
experience with Matrix is the infamous "Could not decrypt: The senders device has not yet sent us
the keys for this message". The protocol and its sub-protocols are vast and complicated and use
bespoke cryptography protocol implementations such as Olm and Megolm, which, in the past, has
already been the cause of high-caliber vulnerabilities (see:
<a href="https://nebuchadnezzar-megolm.github.io/" target="_blank" rel="noopener noreferrer" class="">Nebuchadnezzar</a> and, more recently,
<a href="https://soatok.blog/2024/08/14/security-issues-in-matrixs-olm-library/#addendum-2024-08-14" target="_blank" rel="noopener noreferrer" class="">Soatok's blog post</a>).</p>
<p>Matrix is truly impressive from a technical standpoint. Its extremely low centralized architecture
fills a niche which especially people already interested in technology seem to enjoy. However, this
invariably results in the fact that user experience has to be compromised. It is of my opinion that
while Matrix is relatively good at what it is doing, it is not a good fit to be a potential Discord
replacement.</p>
<p>As for a comparison: We are taking a radically different approach to Matrix. Matrix aims for
eventually-consistent federation of events using cryptographically fully verifiable directed acyclic
event graphs, where as polyproto, and by extension Polyphony, prioritize usability above all,
intentionally disregarding highly complex or novel data structures in favor of cryptographic
verifiability through digital signatures and simple public key infrastructure.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-are-significant-technical-challenges-you-expect-to-solve-during-the-project-if-any">What are significant technical challenges you expect to solve during the project, if any?<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#what-are-significant-technical-challenges-you-expect-to-solve-during-the-project-if-any" class="hash-link" aria-label="Direct link to What are significant technical challenges you expect to solve during the project, if any?" title="Direct link to What are significant technical challenges you expect to solve during the project, if any?" translate="no">​</a></h2>
<p>Currently, our trust model acknowledges, that a users home server is able to create sessions and
session tokens on the users' behalf, and is thus able to listen in on unencrypted communications,
or, in the case of a truly malicious admin, would even be able to send messages on behalf of the
user. This is not a novel problem, as it also affects all Mastodon ActivityPub servers in existence.
Given that this potential abuse risk has not been a large issue in the Fediverse, we expect this to
also not be a major problem. However, I would like to find additional mitigations or even a solution
for this problem during further development of polyproto.</p>
<p>Another area that will likely need more work is my current design for how to connect to multiple
servers at once: Currently, I expect every client to hold a WebSocket connection with each server
that they are communicating with, at once. Depending on the amount of traffic, this could lead to
constantly high resource consumption for clients. If this turns out to be the case, I am sure that
we can find plenty of software- and protocol-side adjustments and improvements to implement - though
it is still a potential technical challenge.</p>
<p>My last major area of concern is how well transmission and de-/serializing of the X.509 based
Identity Certificates will work. I am optimistic about this however, since the X.500 series of RFCs
are extremely well documented and already deeply explored, so that even if challenges arise in this
area, I am certain that there is enough literature on the exact problem we might be facing, and
enough people to ask/talk to.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="describe-the-ecosystem-of-the-project-and-how-you-will-engage-with-relevant-actors-and-promote-the-outcomes">Describe the ecosystem of the project, and how you will engage with relevant actors and promote the outcomes?<a href="https://polyproto.org/ca/blog/2024/10/14/nlnet-grant-application#describe-the-ecosystem-of-the-project-and-how-you-will-engage-with-relevant-actors-and-promote-the-outcomes" class="hash-link" aria-label="Direct link to Describe the ecosystem of the project, and how you will engage with relevant actors and promote the outcomes?" title="Direct link to Describe the ecosystem of the project, and how you will engage with relevant actors and promote the outcomes?" translate="no">​</a></h2>
<p>As the commercialization of Discord.com steadily increases, it is becoming clear that people are
looking for a usable alternative. This is an audience that we are hoping to capture. Our Polyphony
Chat service is Discord API compatible, so that actors may use the Polyphony client to interact with
both Discord.com and polyproto-chat-based instances, and that existing bots and automations could
potentially be ported over very easily. This essentially gives people looking for a Discord
replacement exactly what they are looking for, as there should be little to no additional concepts,
behaviors or patterns that users have to learn or re-learn to use our service.</p>
<p>As previously touched on, we are blessed to already have made a great amount of connections to
like-minded developers also working on similar projects, who are looking optimistically towards
polyproto as the tool to use to federate. I also have received explicit permission from Spacebar
Maintainers to promote our projects on their Discord Guild, which currently counts 3600 members.</p>]]></content:encoded>
            <category>polyproto</category>
            <category>Updates</category>
        </item>
        <item>
            <title><![CDATA[polyproto extensions]]></title>
            <link>https://polyproto.org/ca/blog/2024/06/01/extensions</link>
            <guid>https://polyproto.org/ca/blog/2024/06/01/extensions</guid>
            <pubDate>Sat, 01 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[polyproto is a new federation protocol. Its main focus is enabling seamless participation of one]]></description>
            <content:encoded><![CDATA[<p>polyproto is a new federation protocol. Its main focus is enabling seamless participation of one
actor on many different servers. The core specification lacks routes for sending any sort of user
generated data anywhere, though. What is up with that?</p>
<p>{/_ truncate _/}</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="to-federate-is-to-be-familiar">To federate is to be familiar<a href="https://polyproto.org/ca/blog/2024/06/01/extensions#to-federate-is-to-be-familiar" class="hash-link" aria-label="Direct link to To federate is to be familiar" title="Direct link to To federate is to be familiar" translate="no">​</a></h2>
<p>If any application wants to participate in the network of polyproto services, it has to speak the
same language as those other services. When wanting to send a message to a server that you are
authenticated on, your client needs to know exactly what that HTTP request has to look like. This is
nothing new. One take on a solution for this problem stems from the people working on the
ATProtocol, who created <a href="https://atproto.com/guides/lexicon" target="_blank" rel="noopener noreferrer" class="">Lexicon</a>. From the atproto website:</p>
<p>:::quote "Lexicon TL;DR"</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Lexicon is a global schema system. It uses reverse-DNS names like "`com.example.ping()`". The</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">definitions are JSON documents, similar to JSON-Schema. It's currently used for HTTP endpoints,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">event streams, and repo records</span><br></div></code></pre></div></div>
<p>The core of polyproto is supposed to be infinitely adaptable, to be flexible enough to be used for
just about anything, which is why I do not want to force a fixed set of routes onto every single
polyproto implementation.</p>
<p>Lexicon sounds interesting and really versatile! However, as mature as the idea itself might be, it
is pretty complex and does not yet seem to have good community support in the form of
libraries/crates to aid in working with this new schema system. I also do not want to force
polyproto integrations to use a (potentially very complex) Lexicon parser and dynamic routing system
thingymajig - although having "no rules" means, that if you <em>want</em> to build a polyproto service
which uses Lexicon, you absolutely can.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="we-need-a-common-foundation">We need a common foundation<a href="https://polyproto.org/ca/blog/2024/06/01/extensions#we-need-a-common-foundation" class="hash-link" aria-label="Direct link to We need a common foundation" title="Direct link to We need a common foundation" translate="no">​</a></h2>
<p>I am a big proponent of defining a set of (mutually independent) protocol extensions, which include
additionally needed behavior and concrete HTTP routes for building a specific application. This has
the following benefits:</p>
<ul>
<li class="">If you'd like to build a polyproto chat client, and there's a polyproto-chat extension, you simply
need to add the additional things required by that extension. No need for complex parsing! Code
only what you need and do not care about the rest.</li>
<li class="">Mutual independence means being able to combine extensions however you'd like. You could, for
example, create a chat app with integrated microblogging functionality.</li>
<li class="">Developers are free to come up with whatever they want. How about ActivityPub x polyproto? Since
polyproto doesn't define a message format, this is absolutely possible!</li>
<li class="">Simplicity! polyproto and its "official" extensions will always just have plain old REST APIs, for
which tooling is readily available. Why bother with something fancy and dynamic, when this does
the trick?</li>
</ul>
<p>On the other hand, everyone now has to agree on one extension to use for a specific application. You
cannot participate on servers, which have use an extension which is completely different from the
one that your client implements, as an example.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-polyproto-foundation-get-it-sigh">...the <em>polyproto</em> foundation. Get it? <em>sigh</em><a href="https://polyproto.org/ca/blog/2024/06/01/extensions#the-polyproto-foundation-get-it-sigh" class="hash-link" aria-label="Direct link to the-polyproto-foundation-get-it-sigh" title="Direct link to the-polyproto-foundation-get-it-sigh" translate="no">​</a></h2>
<p>To develop, provide and maintain polyproto and some major "official" extensions (such as
polyproto-chat), creating a non-profit foundation is likely a good idea for a future where polyproto
is actually being used in the real world.</p>
<p>This could sort of be seen like the XMPP Standards Foundation which develops and maintains XMPP
extensions. Unlike XMPPs extensions however, official polyproto extensions should always be <em>major</em>
additions in functionality. As an example: <a href="https://xmpp.org/extensions/xep-0084.html" target="_blank" rel="noopener noreferrer" class="">XEP-0084</a> is
the official XMPP extension for User Avatars. An entire 12 point document, which describes one
simple feature!</p>
<p>polyproto extensions should either always be a major technological addition, which can be taken
advantage of by other extensions (examples for this would be WebSocket Gateways and Messaging Layer
Security), or a document describing a <strong>set</strong> of routes, which define a particular application use
case (A Discord-like, a Reddit-like, a Twitter-like, and so on). Having official extensions adhere
to these rules ensures that polyproto will not become a cluttered mess of extensions and that it and
its extensions are easy to understand and implement, due to less documentation having to be read and
written.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="is-this-a-bottleneck-for-me-as-a-developer">Is this a bottleneck for me as a developer<a href="https://polyproto.org/ca/blog/2024/06/01/extensions#is-this-a-bottleneck-for-me-as-a-developer" class="hash-link" aria-label="Direct link to Is this a bottleneck for me as a developer" title="Direct link to Is this a bottleneck for me as a developer" translate="no">​</a></h2>
<p>If you are a developer, you might ask yourself:</p>
<div><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Implementing common chat behaviour sounds cool in terms of intercompatibility, but doesn't this</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">limit what I can do with my application? I have planned for a cool feature X to exist in my chat</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">service, but that doesn't exist in the protocol extension!</span><br></div></code></pre></div></div><p>Extensions should be a usable minimum of common behavior that all implementations targeting the same
"class" of application must share. Implementations can absolutely offer all the additional
special/unique features they'd like, though. polyproto clients implementing the same extensions can
be treated as clients with a reduced feature set in this case. What is crucial, however, is that the
additional features do not prohibit "reduced feature set clients" from using the behavior described
in the extension, if any sort of federation or interoperability is wanted.</p><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Example: What works</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">In your implementation of a chat service, users can send each other messages with special</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">effects, such as fireworks, confetti and similar. A different implementation of polyproto-chat</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">is unlikely to see these special effects on their end. However, they can still see the messages'</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">text contents, send replies to the message, and do all sorts of other things as described in</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">this hypothetical polyproto-chat extension.</span><br></div></code></pre></div></div><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Example: What doesn't work</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">In your implementation of a chat service, users can send each other messages with special effects,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">such as fireworks, confetti and similar. Your implementation requires every client to send</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">information about the special effect they'd like to send with a message - otherwise sending the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">message fails. If this is the case and you haven't implemented a sort of "adapter" for other</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">polyproto-chat clients, these clients will not be able to send any messages to servers running</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">your chat software. This conflicts with the behaviour required by the polyproto-chat extension</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">and is therefore unacceptable.</span><br></div></code></pre></div></div><p>Also keep in mind that through clever engineering, it might be possible to write adapters for
behavior, which should be required in your implementation and conflicts with the base extension.
Picking up the "What doesn't work" example again, the implementer could simply "translate" message
sending requests made to the polyproto-chat endpoints and add the required "special effects"
information, stating that messages sent through polyproto-chat endpoints have no special effects
added to them.</p><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="closing-words">Closing words<a href="https://polyproto.org/ca/blog/2024/06/01/extensions#closing-words" class="hash-link" aria-label="Direct link to Closing words" title="Direct link to Closing words" translate="no">​</a></h2><p>I am of the opinion that, while this way of having extensions might not be the most technologically
advanced solution, it certainly offers many possibilities while being easy to understand and
implement.</p><p>These are my current plans, ideas and thoughts for making a v1 of polyproto extensible. If you have
any thoughts on this matter, please do let me know! You can contact me via
<a href="mailto:flori@polyphony.chat" target="_blank" rel="noopener noreferrer" class="">email</a> or by writing a message on our
<a href="https://polyphony.zulipchat.com/" target="_blank" rel="noopener noreferrer" class="">Zulip</a>.</p><p>Thank you for reading! :&gt;</p><h1>Happy pride month! 🏳️‍🌈🏳️‍⚧️💛🤍💜🖤</h1></div></div></div></div></div>]]></content:encoded>
            <category>polyproto</category>
        </item>
        <item>
            <title><![CDATA[Work on polyproto and a "vacation" ⛱️]]></title>
            <link>https://polyproto.org/ca/blog/2024/03/06/updates-and-vacation</link>
            <guid>https://polyproto.org/ca/blog/2024/03/06/updates-and-vacation</guid>
            <pubDate>Wed, 06 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[In this little update post I write about what I've done in the last couple of weeks alongside]]></description>
            <content:encoded><![CDATA[<p>In this little update post I write about what I've done in the last couple of weeks alongside
talking about taking just a little break (don't worry, y'all are not getting rid of me!)</p>
<p>{/_ truncate _/}</p>
<p>It's been more or less two weeks since the last post - time for the next one!</p>
<p>A good amount of commits have been since the
<a href="https://docs.polyphony.chat/blog/2024/02/19/x509-in-polyproto/" target="_blank" rel="noopener noreferrer" class="">X.509 in polyproto</a> was published.
Let's break them down a little, shall we?</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="certificate-signing-requests">Certificate Signing Requests<a href="https://polyproto.org/ca/blog/2024/03/06/updates-and-vacation#certificate-signing-requests" class="hash-link" aria-label="Direct link to Certificate Signing Requests" title="Direct link to Certificate Signing Requests" translate="no">​</a></h2>
<p>The polyproto crate can now be used to create very basic - but to the best of my knowledge fully RFC
compliant - Certificate Signing Requests! This is cool, because Certificate Signing Requests are how
all Actors (Users) in polyproto will request a Certificate from their home server. The generated
CSRs can be fully verified using the OpenSSL/LibreSSL CLIs, which is very important, as these two
applications are the industry standard when it comes to working with cryptographic standards like
X.509.</p>
<p>Specifically, polyproto uses the well-defined
<a href="http://www.pkiglobe.org/pkcs10.html" target="_blank" rel="noopener noreferrer" class="">PKCS #10 standard</a> to pack up and transport all the needed CSR
information to your future home server.</p>
<p>The next steps here are:</p>
<ul>
<li class="">Creating validators for the information supplied in the CSRs</li>
<li class="">Implementing methods to create an ID-Cert from a CSR</li>
<li class="">Write great documentation for what exactly the data inside of the ID-CSR has to look like to be
valid</li>
</ul>
<p>...and as you might have already guessed, I am already working on all of these things! :) They just
take time™️</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="cleaning-up">Cleaning up<a href="https://polyproto.org/ca/blog/2024/03/06/updates-and-vacation#cleaning-up" class="hash-link" aria-label="Direct link to Cleaning up" title="Direct link to Cleaning up" translate="no">​</a></h2>
<p>As fun as designing APIs and software architecture is for me, I don't yet always get all of it right
on the first try. This is fine though, as long as you recognize the mistakes you've made, learn from
them and clean the mess you've made.</p>
<p>I noticed that, as well-meant as some of the traits and trait bounds I've added, they made
implementing polyprotos' base types and traits a lot harder than needed. I've been chipping away at
the unnecessary and redundant bits, removing some of these traits entirely.</p>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="updating-the-specification-document">Updating the specification document<a href="https://polyproto.org/ca/blog/2024/03/06/updates-and-vacation#updating-the-specification-document" class="hash-link" aria-label="Direct link to Updating the specification document" title="Direct link to Updating the specification document" translate="no">​</a></h2>
<p>I really wanted to get started on a reference polyproto implementation <em>before</em> finishing the
specification document. This might seem a little counter intuitive, but my thought process was, that
implementing the crate in code would force me to think about everything from scratch again, which
would make it much easier to spot mistakes I potentially made when writing the specification
documentation. These mistakes would primarily be:</p>
<ul>
<li class="">Information that is there, but unimportant</li>
<li class="">Information that is important, but not there</li>
<li class="">Information that is important, there, but wrong</li>
</ul>
<p>This turned out to be right. I have added a lot of "TODO"s and "FIXME"s into the specification
document since started working on the polyproto crate. All of these TODOs have since been worked on
and removed! This doesn't mean that the specification document is now perfect, but it's already
better than before, and it'll only get better as I continue to work on the crate!</p>
<p>Another, notable thing that happened is <em>removing the auth-part from the core polyproto protocol</em>!
You might be thinking "whaaaat? does that mean that there will be no authentication in polyproto??"
but I can assure you, that that's not what this means. Removing the authentication endpoints from
the core protocol means that polyproto extensions can now choose authentication technologies and
methods for themselves, instead of being forced to implement a bunch of REST-based authentication
endpoints they might not even want or use anyways.</p>
<p>I would like to thank <code>@laxla@tech.lgbt</code> for this idea! :&gt; Collaboration and feedback are truly
great things, and I am happy to have such a nice group of people on Discord and Matrix who are
genuinely interested in the silly thing I/we want to do with Polyphony and polyproto :)</p>
<hr>
<p>Now for the perhaps biggest and probably most important announcement:</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="taking-a-little-break-for-my-silly-mental-health">Taking a little break for my silly mental health<a href="https://polyproto.org/ca/blog/2024/03/06/updates-and-vacation#taking-a-little-break-for-my-silly-mental-health" class="hash-link" aria-label="Direct link to Taking a little break for my silly mental health" title="Direct link to Taking a little break for my silly mental health" translate="no">​</a></h2>
<hr>
<p>It just dawned on me that March 8th marks the one year anniversary of Polyphony!! That's genuinely
so cool, and means that this is the project I have worked on the longest for, out of all of my
personal projects.</p>
<p>So yeah - it's been almost a year now! And not a lazy one for me, either.</p>
<p><img decoding="async" loading="lazy" alt="bitfl0wer&amp;#39;s (mine) commit graph for the past year. A lot of green squares, signalling a lot of commits/activity that has been made. The text above the graph reads: &amp;quot;2,858 contributions in the last year&amp;quot;" src="https://polyproto.org/ca/assets/images/2024-03-05-commit_graph-2224ee4d96dfa57fe57b5f1b37fb1ebf.png" width="929" height="228" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>Content warning</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">The following paragraph covers the topics of anxiety and depression. If you would not like to read about this, feel free to</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">scroll down until you see a big green box with a check mark. The box indicates that it is safe for you to read again!</span><br></div></code></pre></div></div><p>Big shocker: I am 👻👻👻👻 depreeeeeeessed 👻👻👻👻👻, and have been for the past... 4-6 years of my
life. In that time, I have experienced the absolute lowest points of my life. Luckily, I have the
absolute privilege to have a great therapist who I have been with for 2 years now, and I am also on
medication which already does a good job (most of the time) at taking the edge off the depression.</p><p>As it has been explained to me by my therapist, medication should only be a crutch, though. It
should not be the tool you should solely rely on for the rest of your life to deal with extreme
(social) anxiety and depression. Other, non-medication-related options should be tried, to
potentially get you to stop having to take medication to feel
non-completely-absolutely-positively-awful every day.</p><p>One of these options is therapy, and, as I've mentioned, I've already been doing that for 2+ years
now. It has helped me a great, great deal already, and I can absolutely encourage anyone reading who
is feeling similarly to how I've described and who is in the lucky position to get (or at least be
put on a waiting list for) therapy, to take the first step. It isn't easy; it can actually feel
really really scary at first. But do believe me when I say that a good therapist can absolutely help
you to get better.</p><p>But one hour of therapy a week can sadly only do <em>so</em> much. This is why I, with the encouragement of
my friends, loved ones (particularly my lovely, lovely girlfriend) and my therapist, have decided to
admit myself into a mental health clinic that specializes in the treatment of depression, anxiety
disorders and the like.</p><div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Safety checkpoint reached!</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">It's now over! :)</span><br></div></code></pre></div></div></div></div></div></div>
<p>Starting on March 20th, I will be leaving my everyday life, my girlfriend, my friends, laptop, work,
personal projects and everything else behind to go there, and hopefully leave a good bad part of me
behind when I come back.</p>
<p>The clinic is far away though, and leaving absolutely everything behind for a month or possibly a
little longer is really, really scary to me. However, I think and hope that the metaphorical plunge
into icy water will be worth it for me and my mental health.</p>
<p>When I come back, I'll be better than I was before, which will also mean that I can hopefully be
more happy and productive in all aspects of my life, including Polyphony.</p>
<p>If you're reading this on or after March 20th, then see you on the other side :) I hope the grass is
greener there!</p>
<p>:::quote "BEGPOSTING ON MAIN"</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">I am lucky and extremely privileged to have been growing up in Germany, a country with a (mostly) functioning social welfare system and universal health care.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">If this wasn't the case, I'd likely be absolutely unable to afford to put myself into such good care. Germany doesn't pay for everything though, and the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">train rides to and from the clinic will likely be expensive for me, as will the 10€ daily fee for staying at a clinic (capped at 280€).</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">I can currently afford this without financially ruining myself, so don't worry about that. However, this whole endeavour will take a good chunk out</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">of my current savings. Thus, if you'd like to [donate to my ko-fi](https://ko-fi.com/bitfl0wer) to help me cover the costs, it would mean a lot to me! \&lt;3</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Please only do so if you are in a stable financial standing yourself, though. As I said, with or without tips, I'll manage. :)</span><br></div></code></pre></div></div>]]></content:encoded>
            <category>polyproto</category>
            <category>Updates</category>
        </item>
        <item>
            <title><![CDATA[X.509 in polyproto]]></title>
            <link>https://polyproto.org/ca/blog/2024/02/19/x509-in-polyproto</link>
            <guid>https://polyproto.org/ca/blog/2024/02/19/x509-in-polyproto</guid>
            <pubDate>Mon, 19 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[This blog post covers a bit about how and why X.509 is used in polyproto, and how we try to make the]]></description>
            <content:encoded><![CDATA[<p>This blog post covers a bit about how and why X.509 is used in polyproto, and how we try to make the
process of implementing your own server and incorporating it into an existing network a little
easier.</p>
<p>{/_ truncate _/}</p>
<p>:::quote "Authors' note"</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">Before knowing and reading about the X.500- and PKCS-series of RFCs, I legitimately thought,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">that implementing an own certificate standard for polyproto would be a good idea! Looking back,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">this is **incredibly** naive. But learning new things and improving myself is one of the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">biggest joys I experience when writing software, so this humbling experience was totally worth</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">it for me, personally.</span><br></div></code></pre></div></div>
<p>polyproto is a federation protocol that uses X.509 Public Key Infrastructure (PKI) to prove and
federate your identity across a whole network of decentralized services.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="x509">X.509<a href="https://polyproto.org/ca/blog/2024/02/19/x509-in-polyproto#x509" class="hash-link" aria-label="Direct link to X.509" title="Direct link to X.509" translate="no">​</a></h2>
<p>Specifically, polyproto leverages the already well-documented and widely used X.509 standard at its
core. X.509 was chosen over <code>OpenPGP</code> because of its comparative simplicity. The Web of Trust from
<code>OpenPGP</code> often requires active user input to assign trust levels to users and their keys, which is
not inline with our ideas and goals for user experience in a decentralized system. Ideally,
decentralization and federation is as seamless as possible for the end-user, and X.509 with its
Certificate Authority (CA for short) model is the better fit for such a goal. In fact, X.509 can be
<em>so</em> seamless to the end-user, that you have probably forgotten that you are already using it right
now!</p>
<p>HTTPS (SSL/TLS) certificates are likely the most popular form of digital certificate out there, and
they're implemented in a way, where the only time us humans ever have to think about them, is when
our browser tells us that a certificate from a website we're trying to visit, is not valid anymore.</p>
<p>This popularity is great news for polyproto, because it means that mature tooling for all sorts of
programming languages exists <em>today</em>, along with tutorials and documentation, teaching potential
implementers how everything works.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-polyproto-uses-x509-briefly">How polyproto uses X.509, briefly<a href="https://polyproto.org/ca/blog/2024/02/19/x509-in-polyproto#how-polyproto-uses-x509-briefly" class="hash-link" aria-label="Direct link to How polyproto uses X.509, briefly" title="Direct link to How polyproto uses X.509, briefly" translate="no">​</a></h2>
<p>In polyproto, home servers act as Certificate Authorities, while each client you connect from has
its own end-user Certificate, issued by your home server. With certificates, you can prove your
identity to any person or server at any time. Certificates are also used to verify the integrity of
data sent across the polyproto network.</p>
<p>If servers and clients have well-implemented cryptography, it should be <em>extremely</em> unlikely - if
not impossible - for non-quantum-based, non-supercomputer-cluster home servers to alter the contents
of a message before passing them on to the recipient.</p>
<p>:::quote "Authors note"</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">:nerd: Technically, polyproto and X.509 absolutely support Post-Quantum Hybrid Digital</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">Signatures. If these Hybrid Digital Signatures use well-made Post-Quantum Signature schemes</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">and are implemented well, polyproto also offers post-quantum-computing resilience. There</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">seems to be very little, easy to understand reading material on hybrid schemes out there.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">The best/most easy to understand definition or explanation of hybrid schemes I could find is</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">[this one, in the document "A Hybrid Signature Method with Strong Non-Separability"](https://www.ietf.org/archive/id/draft-nir-lamps-altcompsigs-00.html#name-non-separability).</span><br></div></code></pre></div></div>
<p>In short, clients generate a <a href="https://datatracker.ietf.org/doc/html/rfc2986" target="_blank" rel="noopener noreferrer" class="">PKCS #10</a> Certificate
Signing Request (CSR). This CSR includes some information about the client. In polyprotos case, this
information is:</p>
<ul>
<li class="">session ID</li>
<li class="">federation ID</li>
<li class="">algorithm used to generate the public key attached to the CSR</li>
<li class="">the public key attached to the CSR</li>
<li class="">a signature which is verifiable using the attached public key, validating all of the
aforementioned information</li>
</ul>
<p>This CSR is sent to your home server, which verifies this information and in turn responds with a
polyproto X.509 Certificate (ID-Cert).</p>
<p>Home servers get their root certificate by self-signing a CSR. Unlike actor/client certificates, the
home server root certificate features
<a href="https://en.wikipedia.org/wiki/X.509#Extensions_informing_a_specific_usage_of_a_certificate" target="_blank" rel="noopener noreferrer" class="">X.509 extensions such as the "Basic Constraints" attribute</a>,
marking its certificate as a CA certificate, allowing the home server to sign CSRs using this
certificate.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="but-its-not-all-perfect">But it's not all perfect<a href="https://polyproto.org/ca/blog/2024/02/19/x509-in-polyproto#but-its-not-all-perfect" class="hash-link" aria-label="Direct link to But it's not all perfect" title="Direct link to But it's not all perfect" translate="no">​</a></h2>
<p>Root Certificates in the context of HTTPS and the modern, SSL/TLS protected web are a big source of
centralization. This centralization might be necessary to a degree, but it inevitably means less
plurality, and way more hoops to jump through, should you also want to be a CA.</p>
<p>To give context for those who might need it, essentially, every certificate for every website out
there has to be able to be traced back to one of the root certificates installed on your
internet-capable device's operating system or web browser. This creates an incredible amount of
centralization, because one Root Certificate Authority is directly responsible for hundreds of
thousands, if not millions of websites. This dependency on a few privileged Root CAs has been
monetized, which is why getting an SSL/TLS certificate for your website used to cost you money (and
depending on who you are, it might still be that way). Nowadays though,
<a href="https://letsencrypt.org/" target="_blank" rel="noopener noreferrer" class="">Let's Encrypt</a> exists, offering free SSL/TLS certificates, with the caveat
that these certificates are only valid for three months at a time.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="what-can-we-do-about-this">What can we do about this?<a href="https://polyproto.org/ca/blog/2024/02/19/x509-in-polyproto#what-can-we-do-about-this" class="hash-link" aria-label="Direct link to What can we do about this?" title="Direct link to What can we do about this?" translate="no">​</a></h2>
<p>To try and keep open polyproto networks to <em>stay</em> open for everyone, polyproto should make
centralization to the degree of modern-day SSL/TLS at infeasible.</p>
<p>An approach we are taking is limiting the length of the certification path.</p>
<p>In X.509, to validate and trust a certificate, you must also trust all the other certificates
leading up to the Root Certificate of the Certificate Tree.</p>
<figure id="x509-cert-chain" class="static-mermaid-figure" role="img" aria-label="&quot;Diagram of an X.509 certificate chain with a root CA, two intermediate CAs, a middleman, and two leaf certificates.&quot;" aria-labelledby="x509-cert-chain-caption" aria-describedby="x509-cert-chain-desc"><img decoding="async" loading="lazy" width="auto" class="mermaid-light img_ev3q" src="https://polyproto.org/ca/img/diagrams/x509-cert-chain-661342efb0-en-light.svg?v=d31a8da894" alt=""><img decoding="async" loading="lazy" width="auto" class="mermaid-dark img_ev3q" src="https://polyproto.org/ca/img/diagrams/x509-cert-chain-661342efb0-en-dark.svg?v=d50dd646ad" alt=""><figcaption id="x509-cert-chain-caption">"An X.509 certificate chain example."</figcaption></figure>
<div id="x509-cert-chain-desc" class="sr-only">
  <p>
    Nodes: Root CA; CA 1 and CA 2; Middleman; Leaf Certificate 1 and Leaf Certificate 2.
  </p>
  <ol>
    <li class="">Root CA links to CA 1 and to CA 2.</li>
    <li class="">CA 1 links to Middleman.</li>
    <li class="">Middleman links to Leaf Certificate 1.</li>
    <li class="">CA 2 links to Leaf Certificate 2.</li>
  </ol>
  <p>
    One certification path runs Root CA, CA 1, Middleman, Leaf Certificate 1. Another runs Root CA,
    CA 2, Leaf Certificate 2.
  </p>
</div>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Example</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">To trust `Leaf Certificate 1`, one would have to also trust the certificates held by the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">`Middleman CA`, `CA 1` and the `Root CA`.</span><br></div></code></pre></div></div><p>This path from the certificate you are actually trying to validate to the Root Certificate is
referred to as the certification path. By arbitrarily limiting the length of this path, it becomes
harder for one certificate authority to issue and manage a great (1.000.000+) number of
certificates, due to the increasing amount of processing power required to handle web requests and
to verify and sign CSRs.</p><p>In polyproto, the maximum length of this certification path is 1, meaning a Root Certificate may
only issue leaf certificates. Cutting out middlemen makes it hard to scale to monstrous levels of
centralization, as the control one CA can have over the entire network is limited.</p><p>All of these factors combined should always make developing or hosting your own home server a viable
option.</p><p>:::quote "Authors note"</p><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">To clarify, this does not mean that polyproto servers will only be able to handle a small amount</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">of users, or that polyproto is designed for small-userbase scenarios. A well-implemented</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">and fast home server implementation should, with the given resources, be able to handle a great</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">number of registered users. This shallow-depth trust model should aid in stopping trust</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">hierarchies with great amounts of influence over the network from forming.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">However, real-life power distribution scenarios can be be unpredictable, which</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">means that the efficacy of limiting the certificate path length as a measure to prevent</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">centralization can only be proven when polyproto is being deployed in the real world.</span><br></div></code></pre></div></div><hr><p>If you have any questions or feedback, feel free to reach out to me via email, where you can reach
me under <code>flori@polyphony.chat</code>. OpenPGP is supported, and my public key can be found on
<a href="https://keys.openpgp.org/vks/v1/by-fingerprint/1AFF5E2D2145C795AB117C2ADCAE4B6877C6FC4E" target="_blank" rel="noopener noreferrer" class="">keys.openpgp.org</a></p></div></div>]]></content:encoded>
            <category>polyproto</category>
            <category>X.509</category>
        </item>
        <item>
            <title><![CDATA[Account migration in polyproto]]></title>
            <link>https://polyproto.org/ca/blog/2024/02/07/account-migration</link>
            <guid>https://polyproto.org/ca/blog/2024/02/07/account-migration</guid>
            <pubDate>Wed, 07 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Account migration is an important and difficult thing to get right in federated systems. In this]]></description>
            <content:encoded><![CDATA[<p>Account migration is an important and difficult thing to get right in federated systems. In this
blog post, I will outline how I imagine account migration to work in polyproto, and what benefits
this approach brings.</p>
<p>{/_ truncate _/}</p>
<p>It seems that striking a good balance between user experience, convenience and privacy has been a
difficult task for many federated systems, when it comes to account migration. polyprotos' approach
to how data is distributed and stored, and how identities are managed, makes it possible to have a
very smooth and secure account migration process.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="the-problem">The problem<a href="https://polyproto.org/ca/blog/2024/02/07/account-migration#the-problem" class="hash-link" aria-label="Direct link to The problem" title="Direct link to The problem" translate="no">​</a></h2>
<p>Using Mastodon as an example; When a user wants to move from one instance to another, they have to
create a new account on the new instance, and follow all the people they were following on the old
account. All the toots and other data from the old account are left behind, and you do not have a
way of porting them over to the new account. This is a problem that has been around for a long time,
and it is not just a problem with Mastodon, but with many other federated systems as well.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="how-polyproto-works-briefly">How polyproto works, briefly<a href="https://polyproto.org/ca/blog/2024/02/07/account-migration#how-polyproto-works-briefly" class="hash-link" aria-label="Direct link to How polyproto works, briefly" title="Direct link to How polyproto works, briefly" translate="no">​</a></h2>
<p>In polyproto, your federation ID, e.g. <code>xenia@example.com</code>, is what identifies you. If you want to
use this identity on a client, your client will generate a key pair for a certificate signing
request, and send this request to your home server. Given that you didn't provide any invalid data,
your home server will sign the certificate, and send it back to you.</p>
<p>Any data you send to anyone - be it a chat message, a social media post, or anything else - is
signed using your private key. This signature can be verified by anyone using your public key, which
is part of the certificate you received from your home server. To check a certificates' validity,
you can ask the home server for its root certificate, and verify the signature on the certificate
you received.</p>
<p>This means:</p>
<ul>
<li class="">All the data you send is cryptographically tied to your identity</li>
<li class="">Anyone can verify that the data was actually sent by you</li>
<li class="">Anyone can verify that the data was not tampered with by anyone else</li>
<li class="">Everybody can verify that you are who you say you are</li>
</ul>
<p>This is even true when you are sending data to a different server than your home server.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="migrating-an-account-on-polyproto">Migrating an account on polyproto<a href="https://polyproto.org/ca/blog/2024/02/07/account-migration#migrating-an-account-on-polyproto" class="hash-link" aria-label="Direct link to Migrating an account on polyproto" title="Direct link to Migrating an account on polyproto" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="low-data-centralization">Low data centralization<a href="https://polyproto.org/ca/blog/2024/02/07/account-migration#low-data-centralization" class="hash-link" aria-label="Direct link to Low data centralization" title="Direct link to Low data centralization" translate="no">​</a></h3>
<p>Fundamentally, the process of migrating an account in polyproto relies mostly on changing data
ownership, rather than moving data around. This works best in scenarios where data is highly
distributed, and not stored in a central location.</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>Example</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">This might be the case in a social chat messaging system</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">similar to Discord, where messages are stored on the servers of the people hosting the chat rooms.</span><br></div></code></pre></div></div></div></div>
<p>When you want to move your account from one server to another, you:</p>
<ol>
<li class="">First, create a new account on the new server</li>
<li class="">Then, you configure the new account to back-reference the old account</li>
<li class="">Next, if you are able to, you tell your old home server about the move</li>
<li class="">Last but not least, you verify to the servers storing your data that you are the same person as
the one who created the old account. The servers then update the data ownership to your new
account. This is done by using your old private key(s), in a way that does not reveal your
private key(s) to anyone else.</li>
</ol>
<p>If applicable, your friends and followers will also be notified about the move, keeping existing
relationships intact.</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>note</div><div class="admonitionContent_BuS1"><div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#393A34"><span class="token plain">This entire process does not rely on the old server being online.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">This means that the process can be completed even if the old server is down, or if the old server</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">is not cooperating with the user.</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">However, including the homeserver in the process adds to the</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">general user experience. If you, for example, have included your federation ID as part of another,</span><br></div><div class="token-line" style="color:#393A34"><span class="token plain">non-polyproto social media profile, the old server can automatically refer people to the new account.</span><br></div></code></pre></div></div></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-data">Moving data<a href="https://polyproto.org/ca/blog/2024/02/07/account-migration#moving-data" class="hash-link" aria-label="Direct link to Moving data" title="Direct link to Moving data" translate="no">​</a></h3>
<p>Should data actually need to be moved, for example when the old server is going to be shut down, or
if the centralization of data is higher, the migration process is extended by a few steps:</p>
<ol>
<li class="">Using the old account, your client requests a data export from your old home server.</li>
<li class="">The old home server sends you a data export. Your client will check the signatures on the
exported data, to make sure that the data was not tampered with.</li>
<li class="">You then import the data into your new account on the new home server.</li>
<li class=""></li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="conclusion">Conclusion<a href="https://polyproto.org/ca/blog/2024/02/07/account-migration#conclusion" class="hash-link" aria-label="Direct link to Conclusion" title="Direct link to Conclusion" translate="no">​</a></h2>
<p>polyproto's approach to account migration is very user-friendly, and does not require the user to do
anything that is not already part of the normal usage of the system. The process is also very
secure, as it relies on the cryptographic properties of X.509 certificates, and also works across a
highly distributed data model, which, in my opinion, is how the internet <em>should</em> be.</p>
<p>The biggest drawback to this approach is that there are a whole lot of web requests involved.
Depending on the amount of data, this can take some minutes or possibly even hours.</p>
<p>It is also worth noting that all of this does not require any new or young technology. polyproto
relies on <a href="https://en.wikipedia.org/wiki/X.509" target="_blank" rel="noopener noreferrer" class="">X.509 certificates</a>, which have been around for a
long time, and are widely used in many different applications. This means that the technology is
well understood, and that there are already many great tools in all sorts of programming languages
available to work with it. From my point of view, there is no need to reinvent the wheel.</p>
<p>I hope that this article has given you a good understanding of how account migration works in
polyproto. If you have any questions or feedback, feel free to reach out to me via E-Mail, where I
can be reached under <code>flori@polyphony.chat</code>. OpenPGP is supported, and my public key can be found on
<a href="https://keys.openpgp.org/vks/v1/by-fingerprint/1AFF5E2D2145C795AB117C2ADCAE4B6877C6FC4E" target="_blank" rel="noopener noreferrer" class="">keys.openpgp.org (click to download pubkey)</a></p>]]></content:encoded>
            <category>polyproto</category>
        </item>
        <item>
            <title><![CDATA[Porting chorus to WebAssembly + Client Update]]></title>
            <link>https://polyproto.org/ca/blog/2023/11/23/webassembly-chorus</link>
            <guid>https://polyproto.org/ca/blog/2023/11/23/webassembly-chorus</guid>
            <pubDate>Thu, 23 Nov 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[What the current state of GUI libraries in Rust means for Polyphony and chorus, and why we are]]></description>
            <content:encoded><![CDATA[<p>What the current state of GUI libraries in Rust means for Polyphony and chorus, and why we are
porting chorus to WebAssembly.</p>
<p>{/_ truncate _/}</p>
<p>Hi all!</p>
<p>To make this part of the post short: The web-based client will be worked on <em>before</em> the native one,
if there even ever will be one. The reason is that no currently available native Rust GUI library
meets the standards I'd like to see when using it to build an application I am putting my name
behind. I'd like to have</p>
<ul>
<li class="">accessibility</li>
<li class="">great styling</li>
<li class="">cross compilation</li>
<li class="">memory safety</li>
</ul>
<p>and the current state of Rust GUIs essentially tells me to "pick three", which is unacceptable to
me. A WebAssembly based application is the best we'll get for now, and I am fine with that.</p>
<p>Compiling to WebAssembly isn't all that easy though: The <code>wasm32-unknown-unknown</code> target
intentionally makes no assumptions about the environment it is deployed in, and therefore does not
provide things like a <code>net</code> or <code>filesystem</code> implementation (amongst other things). Luckily, adding
support for this compilation target only took me a full 40h work week [:)], and we are now the first
Rust Discord-API library (that I know of) to support this target.</p>
<p>You might not have yet heard much about WebAssembly: In the past, web developers could only really
use three languages - HTML, CSS, and JavaScript - to write code that browsers could understand
directly. With WebAssembly, developers can write code in many other languages, then use WASM to
convert it into a form the browser can run.</p>
<p>This is particularly helpful for programs that require a lot of computing power, like video games or
design software. Before, running such programs in a browser would be slow or impossible. WebAssembly
can make these run smoothly, right in your web browser.</p>
<p>Overall, WebAssembly is expanding the kinds of applications that can be run on the web, making the
web a more flexible and powerful place to work and play. Compiling Chorus for WASM allows us to
leverage this fairly new technology and bring all of Rusts benefits into a web context.</p>
<p>The next blog post will likely be about progress with the web-based client. See ya until then! :)</p>]]></content:encoded>
            <category>Chorus</category>
            <category>Polyphony</category>
            <category>Updates</category>
        </item>
        <item>
            <title><![CDATA[Getting started with the Polyphony Client]]></title>
            <link>https://polyproto.org/ca/blog/2023/09/02/client-getting-started</link>
            <guid>https://polyproto.org/ca/blog/2023/09/02/client-getting-started</guid>
            <pubDate>Sat, 02 Sep 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[{/ truncate /}]]></description>
            <content:encoded><![CDATA[<p>{/_ truncate _/}</p>
<p>Us labeling Chorus to be in a public-alpha state was really great news for me, for a lot of reasons!
It marked a point in Polyphonys history where, after all these months of work, we agreed upon the
fact that what we <em>have</em> is good enough to be shown to the public, and that's always a nice thing
when investing so much of your free-time into a project. The other main reason why this is such a
great thing is, because this alpha state (at least to me) means, that the public API is kind-of
stable, or at least stable enough so that I, the project lead, can rely upon the fact that all the
public methods will not, in fact, be replaced in 4 days.</p>
<p>This means, that I can finally start working on the Client! And I have done that! For the past 2? 3?
Days, I've been tinkering around with Iced-rs (a really, really great UI framework for Rust, written
in Rust) and the client repository to create the 'skeleton' of the application. While this is
definitely not trivial, especially since I have <em>no</em> prior experience in desktop application
development, it's also not too hard either.</p>
<p>While Iced is not mature yet, and "how-to" guides, as well as the promised Iced-book, are still
largely missing, the maintainers have done a great job with providing a LOT of code examples and
solid rustdocs. It's a fun library/framework to work with, and the Elm-inspired approach of dividing
up State, Messages, View- and Update-Logic feels really intuitive and seems to make sure that your
Application will never end up in an unexpected state.</p>
<p>That's all I have for today. Thanks for reading this! Here's a video of multi-user login already
working ^^</p>
<video controls="" width="auto">
    <source src="https://cloud.bitfl0wer.de/index.php/s/Gd556SnwAQYejYw/download/screenrec.mp4">
</video>]]></content:encoded>
            <category>Polyphony</category>
            <category>Updates</category>
        </item>
        <item>
            <title><![CDATA[chorus Alpha 0.1.0]]></title>
            <link>https://polyproto.org/ca/blog/2023/08/29/chorus-alpha</link>
            <guid>https://polyproto.org/ca/blog/2023/08/29/chorus-alpha</guid>
            <pubDate>Tue, 29 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[We are alpha now! As of 2 days ago, the first Alpha of Chorus, Version 0.1.0, has been released for]]></description>
            <content:encoded><![CDATA[<p>We are alpha now! As of 2 days ago, the first Alpha of Chorus, Version 0.1.0, has been released for
everyone to look at and use on crates.io!</p>
<p>{/_ truncate _/}</p>
<p>So, is the library complete now? No. And yes! It's, well, complicated... Let me explain!</p>
<p>Chorus is at a point where I can comfortably say that, if you take voice-support out of the
calculation for a bit, the foundation feels rock-solid, easy to work with and easily expandable.
However, to stay with our house/building metaphor for a bit, the walls aren't painted yet, there's
barely any furniture and not all of the electrical outlets have been installed yet.</p>
<p>Okay, enough with this bad metaphor; What I meant to convey is, that a lot of the API endpoints have
not yet been implemented, and there are at least a few points we haven't addressed yet - like
Gateway Error Handling, to name an example.</p>
<p>But for an early Alpha, this, in my opinion, is absolutely acceptable. Implementing API endpoints is
something that probably someone who is entirely new to Rust could do, given that we've streamlined
the procedure so much, and the other stuff can comfortably be fixed without having to do any major
changes to the internals.</p>
<p>I, for one, am currently experimenting around with the Polyphony Client, which, by the way, will
likely be written with Iced as a GUI Framework, not GTK. I have no prior experience in GUI/Desktop
Application development, but I am feeling more confident than ever and I'm eager to learn all there
is to know about these topics.</p>
<p>That's that! Seeya next time. Cheers,</p>
<p>Flori</p>]]></content:encoded>
            <category>Chorus</category>
            <category>Updates</category>
        </item>
        <item>
            <title><![CDATA[Self-updating structs, moving blog posts to GitHub, and more]]></title>
            <link>https://polyproto.org/ca/blog/2023/08/17/self-updating-structs</link>
            <guid>https://polyproto.org/ca/blog/2023/08/17/self-updating-structs</guid>
            <pubDate>Thu, 17 Aug 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[Introducing self-updating structs, explaining how they work, and what they are good for. Also,]]></description>
            <content:encoded><![CDATA[<p>Introducing self-updating structs, explaining how they work, and what they are good for. Also,
moving blog posts to GitHub, and other improvements.</p>
<p>{/_ truncate _/}</p>
<p>It has been a while since the last update post - 1 month to be precise! I haven't gotten around to
writing one of these, mostly because of personal time- and energy constraints. However, now that
these resources are finally replenishing again, I figured that it is once again time!</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="moving-blog-posts-to-github">Moving Blog Posts to GitHub<a href="https://polyproto.org/ca/blog/2023/08/17/self-updating-structs#moving-blog-posts-to-github" class="hash-link" aria-label="Direct link to Moving Blog Posts to GitHub" title="Direct link to Moving Blog Posts to GitHub" translate="no">​</a></h2>
<p>This is a pretty self-explanatory point. I thought, that opencollective would find more use by me
and other polyphony-curious folk, however, this didn't go as planned. Also, opencollective made
their Discord embeds really poopy, which is why I am moving all the blog posts over to GitHub.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="a-big-one-self-updating-structs">A big one: Self-updating structs<a href="https://polyproto.org/ca/blog/2023/08/17/self-updating-structs#a-big-one-self-updating-structs" class="hash-link" aria-label="Direct link to A big one: Self-updating structs" title="Direct link to A big one: Self-updating structs" translate="no">​</a></h2>
<p>Ideally, you want entities like Channels, Guilds, or Users to react to Gateway events. A Gateway
event is basically a message from Spacebar/Discord to you, which says: "Hey, User <code>x</code> has changed
their name to <code>y</code>!". If you can reflect those changes immediately within your code, you save
yourself from having to make a lot of requests and potentially getting rate-limited.</p>
<p>This is exactly what Self-updating structs set out to solve. The first implementation was done by
@SpecificProtagonist and me (thank you a lot again, btw) on the 21st of July. However: This
implementation, being in its' infancy, has had some design flaws, which to me made pretty clear,
that this whole thing needed to be thought through a little better.</p>
<p>The second iteration of these Self-updating structs was finished... today, actually, by me. It saves
memory compared to the first iteration by storing unique objects only once, instead of
<code>n = how many times they are being referenced</code>-times. While this way of doing things is really
efficient, it also has been a pain in the ass to make, which is precisely the reason why this took
me so long. I've learned a lot along the way though.</p>
<p>The public API has also gotten a <em>lot</em> better in "v2". This is mostly because I am a big believer in
writing tests for your code, and through writing what are essentialy real-world-simulation-examples,
I noticed how repetitive or stupid some things were, and thus could improve upon them.</p>
<p>Having this whole thing finished is a big relief. This self-updating thing is an essential feature
for any Discord/Spacebar compatible library, and I think that we implemented it very nicely.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="documentation-and-other-improvements">Documentation and other improvements<a href="https://polyproto.org/ca/blog/2023/08/17/self-updating-structs#documentation-and-other-improvements" class="hash-link" aria-label="Direct link to Documentation and other improvements" title="Direct link to Documentation and other improvements" translate="no">​</a></h2>
<p>@kozabrada123 took it upon himself to re-write a lot of the codes' Documentation. Thanks for that!
This will massively improve the ease of use of this library - both when developing <em>for</em> and <em>with</em>
it. koza also improved our CI/CT pipeline by incorporating build-caching into it, which speeds up
builds.</p>
<p>This has been the last month of Polyphony. In the coming weeks, I will be working on</p>
<ul>
<li class="">Implementing self-updating-struct behavior for every struct which needs it</li>
<li class="">Fixing bugs</li>
<li class="">Adding more features, like emojis, 2FA, Guild Settings, etc.!</li>
</ul>
<p>See ya next time!</p>]]></content:encoded>
            <category>Chorus</category>
            <category>Updates</category>
        </item>
    </channel>
</rss>