<p>The primary use of GNU social is to access the <ahref="https://blog.diogo.site/what-is-the-fediverse">free network</a>, be it ActivityWeb (ActivityPub) or Fediverse (OStatus).</p>
<p>Contrary to the original plan, we have merged <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/nightly/modules/TheFreeNetwork">The Free Network Module</a>, <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/nightly/plugins/WebFinger">WebFinger</a> and <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/nightly/plugins/LRDD">LRDD</a> into a single component named <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/components/FreeNetwork">FreeNetwork</a>. Likewise, ActivityPub and ActivityStreams 2.0 was kept the same plugin instead of separated.</p>
<h2>Understanding the organisation chosen</h2>
<p>The FreeNetwork component adds WebFinger (RFC7033) lookup and implements Link-based Resource Descriptor Discovery (LRDD) based on RFC6415, Web Host Metadata. It takes and produces both Extensible Resource Descriptor (XRD) and JSON (JavaSript Object Notation). Furthermore, and different from v2, every federation protocol will use the same distribution queue maintained by this component instead of holding its own.</p>
<p>We originally intended to have data modelling plugins that would extend the GS's "language". We then understood that it added more complexity than we wanted without any considerable advantage because we cannot dissociate data reception handling of the protocol itself.</p>
<h2>Situation Report</h2>
<p><ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/plugins/ActivityPub">ActivityPub</a> already translates between activity and entity and allows plugins to extend it (thus serving a similar purpose to data modelling and representation plugins).</p>
<p>GNU social v3 now supports <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/src/Util/Formatting.php#L292">mentions</a>, which is a process that starts in the <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/components/Posting/Posting.php#L197">Posting component</a>. The processing of local mentions naturally finds its entire handling here.</p>
<p>For remote ActivityPub mentions, <ahref="(https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/plugins/ActivityPub/Entity/ActivitypubActor.php#L179">ActivityPub handles it aided by the FreeNetwork component</a>).</p>
<h2>Next steps</h2>
<p>We still have to port OStatus (and ActivityStreams 1.0) and implement the distribution by FreeNetwork, although the base work is done. Regarding ActivityPub, although some of it already works, expanding the existing plugins to supplement ActivityPub, and full validation isn't ready yet. We will most likely finish the implementation of the whole federation stack in the next week.</p>
<p>This is a natural follow up to the <ahref="https://www.gnusocial.rocks/v3/milestone-collections.html">Collections Milestone</a>.</p>
<p>An album is a specialisation of an attachment collection, which is itself a
specialisation of a collection.</p>
<p>Albums were implemented with the <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/plugins/AttachmentCollections">Attachment Collections plugin</a>.</p>
<h2>Here's how it looks</h2>
<h3>Adding an attachment (this is in the right sidebar of attachment pages)</h3>
<p>We have generalized collections around our search engine. For that introducing
the <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/components/Collection">Collection component</a>.</p>
<p>This structure has the following implication:</p>
<pre><code>Collection -> OrderedCollection
|-> Notes (known as Feed)
|-> Actors (known as Circle)
|-> Other Object (known as Collection of ...)
|-> Attachments: AttachmentCollection
|-> Tags: TagCollection
</code></pre>
<p>And it allow us to centralise the scope system in the core, ensuring that no
actor will have access to notes or other objects that shouldn't be able to see.</p>
<p>Finally, with this, a plugin such as <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/plugins/NoteTypeFeedFilter">Note Type Feed Filter</a> can be useful in
every note collection (feed).</p>
<p>It also allows plugins such as ActivityPub to <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/plugins/ActivityPub/Util/OrderedCollectionController.php">translate every collection
<p>GNU social now has its documentation available in
<ahref="https://docs.gnusocial.rocks/">https://docs.gnusocial.rocks/</a>. It features four
different books. These are automatically generated from the <ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/docs">source</a> using <ahref="https://rust-lang.github.io/mdBook/">mdBook</a>.</p>
<blockquote>
<p>Only the development book is in an elaborated state, the other books are
holding for more ready code.</p>
</blockquote>
<p>And two of them are new:</p>
<ul>
<li>The <ahref="https://docs.gnusocial.rocks/developer">Developer</a> is both intended to guide third-party plugin developers and to make it easier of contributing to the code.</li>
<li>The <ahref="https://docs.gnusocial.rocks/designer">Designer</a> is the most recent of the four and came from a necessity of keeping some standardization between templates and ensuring the same principles are kept in mind when designing new themes.</li>
</ul>
<p>And two of them are updates from existing documentation:</p>
<ul>
<li>The <ahref="https://docs.gnusocial.rocks/user">User</a> one is adapted
from the existing GNU social documentation for users that was provided in v2.</li>
<li>The <ahref="https://docs.gnusocial.rocks/administrator">Administrator</a> one is adapted
from the "Unofficial GNU social docs" by Thomask who <ahref="https://notabug.org/diogo/gnu-social/issues/246">asked us to make it official</a>.</li>
</ul>
<p>Together with the documentation we've introduced a
<ahref="https://agile.gnusocial.rocks/">wiki</a>. Its purpose is to walk-through decisions,
convention, terminology. It's where we document the reasoning the development team went
through before implementing more sophisticated functionalities.</p>
<p>Finally, when the documentation doesn't explain, and to ensure the whole code
is properly tested, we have the
<ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/tests">tests</a>. And the coverage is available <ahref="https://coverage.gnusocial.rocks/">here</a>. At the time of writing the coverage has 98.76% code lines tested.</p>
<li><ahref="">Filter the streams with only the languages you know</a></li>
<li><ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/components/Tag/Tag.php#L135-L146">Make Tag Wrangling possible and transversal to languages</a></li>
<li><ahref="https://code.undefinedhackers.net/GNUsocial/gnu-social/src/branch/v3/plugins/ActivityPub/Util/Model/Note.php#L123">Federate the language for a more inclusive free network</a></li>