Implementing Microsub yourself (part 1)

In this article I will try to show how you can implement a very simple version of Microsub yourself. 

Let's start

The protocol for Microsub consists of a number of actions. The actions can be provided with a parameter action to the microsub endpoint. When implementing a Microsub server it's possible to create a version of responses where you don't need to implement the full thing. It depends on what you want to use. At the moment we will only implement channels and timeline.

Simplified channels

For example the channels action provides 4 different functions in the full implementation.

  1. Get a list of the available channels
  2. Create a new channel with a name
  3. Update the name of a channel
  4. Delete a channel

A great way to start is to only return a fixed number of channels. That way you only implement function 1 and only return a successful response for functions 2, 3 and 4. Clients will work when you do this and it becomes a lot easier to implement.

As an example in PHP:

  
if ($_GET['action'] == 'channels') {
    $channels = [
        [ 'name' => 'Notifications', 'uid' => 'notifications' ],
        [ 'name' => 'Home', 'uid' => 'home' ],
    ];

    header('Content-Type: application/json');
    echo json_encode(['channels'=>$channels]);
}


Simplified timeline

The timeline action provides 1 function. There are 2 parameters that allow paging. For a simplified version this does not need to be implemented.

The timeline action should return a response that looks like this:

{
  "items": [
    { ... },
    { ... }
  ],
  "paging": {}
}

By leaving paging empty you signal to the client, that there are no pages available at the moment.

The items array should be filled with JF2 items. JF2 is a simplified version of Microformats 2 that allows for easier implementation by clients and servers. An example could look like this:


    {
        "type": "entry",
        "name": "Ekster now supports actual Indieauth to the Microsub channels. It's now possible for example to connect with http://indiepaper.io and archive pages to a channel. But of course the possibilities are endless.",
        "content": {
            "text": "Ekster now supports actual Indieauth to the Microsub channels. It's now possible for example to connect with http://indiepaper.io and archive pages to a channel. But of course the possibilities are endless.",
            "html": "Ekster now supports actual Indieauth to the Microsub channels. It's now possible for example to connect with indiepapier.io and archive pages to a channel. But of course the possibilities are endless."
        },
        "published": "2018-07-15T12:54:00+02:00",
        "url": "https://p83.nl/p/795"
    }

If you return a list of the items from your microsub endpoint, you could see them in the client. Now the harder part is, gathering these items from feeds and websites and converting these to JF2.

Simplified Microsub endpoint

And create a file with the following code called endpoint.php in the web root of your website.

The code can be found here: endpoint.php

Add the following information to your <head> tag:

<link rel="microsub" href="https://yourdomain.com/endpoint.php" />

That's all there is to it. Now you can Login with Monocle.

I justed re-added filtering as a setting in Ekster. This allows for easy mentions from all feeds, because it will match all incoming items with a regexes and add the matching items.
Blocking items also works (but it's channel only)
Ekster now supports actual Indieauth to the Microsub channels. It's now possible for example to connect with indiepaper.io and "archive" pages to a channel. But of course the possibilities are endless.
Perhaps it's possible with some kind of introspection to copy fields from a microformats.Data object to a normal struct, just like how "encoding/json" works. You could create your own structs and copy those fields from the MF2 into your own data model.
Using time.Time will by default not result in a nice serialization in Redis. Now I use unix time as int64, which is much easier to work with.
I did some updates on the WebSub part of my Microsub server Ekster. It now tries to subscribe to feeds and send resubscribes. Before it already received incoming posts.

I got indieweb.xyz working in Ekster. The microformats use h-feed, which were not supported yet. And the items don't have published dates. These items where skipped in Ekster, but I try to add the current date. I'm not sure yet how this will work, but for now I can see the items.

I just made a change to Ekster that allows it to receive Micropub requests from Indiepaper. In a way this already worked, but only with source_id and JF2 request bodies. This change allows the auth token to be in the Authorization header and JSON micropub requests.

I just started the data download request for Spotify, to see with I get back from there.
I made a start with the "books" page. That will gather the "read-of" posts into a snapshot of the current situation.

Load more