GNU social V3https://gnusocial.rocks/v3/index.html Development blog where we announce our progress.en Tue, 18 Jan 2022 13:56:41 +0000 Tue, 18 Jan 2022 13:56:41 +0000 Milestone: Automatic Accesibility (A11Y) testing We use pa11y-ci to run our accesibility testing on all GNU social pages. The process of setting this up was a bit of a ride, but the results are quite useful:

Accesibility report generated by Pa11y

We also take screenshots of all pages and compare them with the previous, allowing us to spot (possibly) unintended changes in the UI.

The way we do this is by using a docker image derived from node, with pa11y-ci installed, which doesn't have an entrypoint. This then allows us to spin up a webserver, PHP and Redis containers, mimiking a staging environment. pa11y-ci uses a JSON config file to tell it what to do, and handles visiting all pages with the given resolution, logging in and registering any accesibility violations found.

Accesibility violations found by Pa11y

Note that most of these errors are actually the same.

The saved screenshots are then used to detect changes, with ImageMagik's compare, to generate a report on visual changes.

Screenshot comparisons

We were already striving for making GNU social accesible, which is clear from the really low number of violations found, but there's always room for improvement :)

]]>
https://gnusocial.rocks/v3/milestone-automatic-accesibility-a11y-testing.html https://gnusocial.rocks/v3/./milestone-automatic-accesibility-a11y-testing.html GNU social development team Tue, 18 Jan 2022 13:56:33 +0000
Milestone: ActivityStreams 2.0 and WebFinger The primary use of GNU social is to access the free network, be it ActivityWeb (ActivityPub) or Fediverse (OStatus).

Contrary to the original plan, we have merged The Free Network Module, WebFinger and LRDD into a single component named FreeNetwork. Likewise, ActivityPub and ActivityStreams 2.0 was kept the same plugin instead of separated.

Understanding the organisation chosen

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.

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.

Situation Report

ActivityPub already translates between activity and entity and allows plugins to extend it (thus serving a similar purpose to data modelling and representation plugins).

GNU social v3 now supports mentions, which is a process that starts in the Posting component. The processing of local mentions naturally finds its entire handling here.

For remote ActivityPub mentions, ActivityPub handles it aided by the FreeNetwork component).

Next steps

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.

]]>
https://gnusocial.rocks/v3/milestone-activitystreams-20-and-webfinger.html https://gnusocial.rocks/v3/./milestone-activitystreams-20-and-webfinger.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Actor colour theme plugin Actors are now able to set their own colours, through a brand new plugin: "Oomox". Those accustomed to customising their own desktop should know where the name comes from ;)

Here's how it works!

The Oomox plugin main class catches the "PopulateProfileSettingsTabs" event upon visiting user panel.

public function onPopulateProfileSettingsTabs(Request $request, array &$tabs): bool
{
    $tabs[] = [
        'title'      => 'Light theme colours',
        'desc'       => 'Change the theme colours.',
        'controller' => C\Oomox::oomoxSettingsLight($request),
    ];

    $tabs[] = [
        'title'      => 'Dark theme colours',
        'desc'       => 'Change the theme colours.',
        'controller' => C\Oomox::oomoxSettingsDark($request),
    ];

    return Event::next;
}

As made evident by the code, two new tabs are added to profile settings, light and dark theme colours. Since the page styling follows the system theme, actors may want to style each theme differently, therefore they are treated separately.

The actor's defined colours are then saved in the respective entity and cached. Finally, the colour preferences are used to render the corresponding CSS file which defines the various colour variables used:

public function oomoxCSS(): Response
{
    $user = Common::ensureLoggedIn();

    $oomox_table = PluginOomox::getEntity($user);
    if (is_null($oomox_table)) {
        throw new ClientException(_m('No custom colours defined', 404));
    }

    $content = Formatting::twigRenderFile('/oomox/root_override.css.twig', ['oomox' => $oomox_table]);
    return new Response($content, status: 200, headers: ['content-type' => 'text/css']);
}

Please note, upon rendering for the first time, page render may be blocked until the resulting file is served. Nonetheless, subsequent page renders won't experience the issue again. That is, if the file is cached by the browser.

How it looks

Tabs added using the "PopulateProfileSettingsTabs" event: User panel Oomox sections

Changing the dark theme colours! Dark theme colours selection

The result of given changes, please note it's no longer a 'dark' theme. Given a valid colour, it's the actor's responsibility whether or not the colours make sense. So, go wild! The resulting colours in action!

]]>
https://gnusocial.rocks/v3/milestone-actor-colour-theme-plugin.html https://gnusocial.rocks/v3/./milestone-actor-colour-theme-plugin.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Albums This is a natural follow up to the Collections Milestone.

An album is a specialisation of an attachment collection, which is itself a specialisation of a collection.

Albums were implemented with the Attachment Collections plugin.

Here's how it looks

Adding an attachment (this is in the right sidebar of attachment pages)

List of collections

Viewing a collection of attachments

]]>
https://gnusocial.rocks/v3/milestone-albums.html https://gnusocial.rocks/v3/./milestone-albums.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Collections We have generalized collections around our search engine. For that introducing the Collection component.

This structure has the following implication:

Collection -> OrderedCollection
|-> Notes (known as Feed)
|-> Actors (known as Circle)
|-> Other Object (known as Collection of ...)
  |-> Attachments: AttachmentCollection
  |-> Tags: TagCollection

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.

Finally, with this, a plugin such as Note Type Feed Filter can be useful in every note collection (feed).

It also allows plugins such as ActivityPub to translate every collection automatically.

Notes Filter and Sorting Options

Actors Filter and Sorting Options

The Search Component

Results

Note Options

Actor Options

ActivityPub Examples

]]>
https://gnusocial.rocks/v3/milestone-collections.html https://gnusocial.rocks/v3/./milestone-collections.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Documentation and Tests Infrastructure >WIKI Milestone entry

GNU social now has its documentation available in https://docs.gnusocial.rocks/. It features four different books. These are automatically generated from the source using mdBook.

Only the development book is in an elaborated state, the other books are holding for more ready code.

And two of them are new:

  • The Developer is both intended to guide third-party plugin developers and to make it easier of contributing to the code.
  • The Designer 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.

And two of them are updates from existing documentation:

Together with the documentation we've introduced a wiki. 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.

Finally, when the documentation doesn't explain, and to ensure the whole code is properly tested, we have the tests. And the coverage is available here. At the time of writing the coverage has 98.76% code lines tested.

]]>
https://gnusocial.rocks/v3/milestone-documentation-and-tests-infrastructure.html https://gnusocial.rocks/v3/./milestone-documentation-and-tests-infrastructure.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Mute notifications from a conversation If a conversation in which you have interacted becomes very active and you wish to stop receiving notifications derived from that, it is now possible:

]]>
https://gnusocial.rocks/v3/milestone-mute-notifications-from-a-conversation.html https://gnusocial.rocks/v3/./milestone-mute-notifications-from-a-conversation.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Notes and Actors with languages Well, it's that, our notes now have a language attribute.

... All right, all right, it's not just it.

Here's what comes with it:

Here's how it looks

First, the user panel section where the desired preferences are selected: User panel language settings section

Upon sending the previous form, the user is redirected to order their selection: Ordering the selections made in previous page

Finally, when posting the language with the highest priority is selected by default.

However, by accessing "Additional options", another language may be selected. The resulting note will have the html lang attribute according to it.

The posting widget itself: Selecting the language of a note when posting

What does this mean?

We can now show you the notes you can read, but for groups, this mean that you can access umbrella groups and filter the feeds to see what's in your language and even region.

For too long the fediverse struggled with languages, this step makes it easier for actual internationalization of the free network.

A marvellous feed filtered by note language

]]>
https://gnusocial.rocks/v3/milestone-notes-and-actors-with-languages.html https://gnusocial.rocks/v3/./milestone-notes-and-actors-with-languages.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Notes with LaTeX LaTeX content types is now supported.

latex

]]>
https://gnusocial.rocks/v3/milestone-notes-with-latex.html https://gnusocial.rocks/v3/./milestone-notes-with-latex.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000
Milestone: Notes with Markdown Markdown content types is now supported.

Markdown

]]>
https://gnusocial.rocks/v3/milestone-notes-with-markdown.html https://gnusocial.rocks/v3/./milestone-notes-with-markdown.html GNU social development team Tue, 18 Jan 2022 13:56:12 +0000