IndieWeb, le challenge

Quelques notes sur la refonte de mon site personnel. Ce billet est susceptible de changer au fur et à mesure de mes recherches sur le sujet.

L’idée est d’avoir un point d’entrée unique avec mon contenu hébergé chez moi, puis partagé sur les réseaux sociaux. Post Once Share Somewhere Else (POSSE).

C’est le principe de l’IndieWeb (https://indieweb.org/) qui a déjà beaucoup réfléchit à la question. Les outils développé par Aaron Parecki (https://aaronparecki.com/) sont géniaux mais très lourds, par exemple.

L’idée que j’ai est la suivante :

L’idée est ainsi d’avoir un unique point d’entrée au web. Une sorte de timeline regroupant tous mes réseaux, sur laquelle je peux répondre simplement, et qui est assez ouverte pour ne pas nécessiter une inscription supplémentaire pour me suivre.

h-card

Le premier point est somme toute assez simple : h-card (http://microformats.org/wiki/h-card). Il suffit de placer une page sur mon hébergement avec les microformats qui vont bien et voilà, nous avons un profil attestant de mon identité sur le web. C’est déjà le cas à https://yom.li/.

IndieAuth

La seconde étape est de faire en sorte que cette identité puisse me servir à me connecter sur d’autres sites et applications, comme OpenID ou ces boutons « Se connecter avec Twitter ». C’est là qu’entre en jeu IndieAuth (https://indieauth.com/). Sur les sites compatibles, il me suffit d’entrer l’adresse de mon profil pour que l’on m’offre de me connecter via Twitter, GitHub, email ou clé PGP. C’est déjà un bon début, mais j’aimerais aller plus loin en supportant IndieAuth, c’est-à-dire que le site sur lequel je me connecte me demande un mot de passe, contacte mon site pour le vérifier, et accepte. En d’autres termes, ne pas avoir à dépendre de Twitter ou GitHub pour une connexion.

Pour ça, j’ai trouvé Selfauth (https://github.com/Inklings-io/selfauth). Un petit script PHP qui permet de se connecter à d’autres sites grâce au sien.

Blog

IndieWeb reconnait plusieurs types de posts (https://indieweb.org/posts#Types_of_Posts) :

Pour le type article, j’ai simplement à mettre en place un moteur de blog en modifiant quelque peu le thème pour utiliser les bons microformats (https://indieweb.org/article).

Des moteurs de blog, il y en a des milliers. J’en ai même déjà codé un. Je choisis Pico (http://picocms.org/) parce que j’arrive à le comprendre dans son ensemble, assez pour écrire des plugins. J’y ajoute un plugin pour gérer les flux RSS/Atom, et nous avons déjà la possibilité de me suivre dans un lecteur RSS.

Problème : pour poster de manière simple, il me faut une interface d’administration. J’ai plusieurs possibilités :

Dans les trois premiers cas, l’insertion de photos dans les articles est complexe car aucune interface n’a été pensée pour simplement uploader et insérer des documents. Il faudrait donc que je code moi-même une interface d’administration qui permette cela. De plus, Codiad est difficile à utiliser sur mobile.

La troisième solution est la plus complexe. Je pourrais par exemple héberger ma propre instance de Quill (https://github.com/aaronpk/Quill). Ouf, on a du SQLite en option à la place de MySQL. Reste qu’il y a besoin de trois choses.

Authorization Endpoint

La connexion par IndieAuth, on va utiliser Selfauth (https://github.com/Inklings-io/selfauth), puis sur la page de profil : <link rel="authorization_endpoint" href="https://yom.li/auth">.

Token Endpoint

Un générateur de jeton, on va utiliser PHP-Mintoken (https://github.com/Zegnat/php-mintoken), puis sur la page de profil : <link rel="token_endpoint" href="https://yom.li/token">.

Micropub Endpoint

Celui-ci est le plus complexe. Doit être lié sur la page de profil : <link rel="micropub" href="https://yom.li/micropub">. Le point d’entrée Micropub est ce qui va réellement poster textes et images sur le blog, il fait la liaison avec le moteur de blog. Il reçoit une requête Micropub et s’occupe d’en créer l’entrée. C’est là que je suis coincé.

De manière basique, j’ai simplement besoin d’un bout de PHP qui crée un fichier Markdown dans un répertoire donné, avec images en plus (si Quill supporte bien l’ajout d’images, ce que je ne sais pas). Pour ça, je dois pouvoir faire quelque chose à partir de Micropub Endpoint (https://github.com/yesdevnull/micropub-endpoint), Nanopub (https://github.com/dg01d/nanopub) ou Minimal micropub endpoint (https://gist.github.com/adactio/8168e6b78da7b16a4644), voire porter le plugin de Grav (https://github.com/metbril/grav-plugin-micropub). La documentation nécessaire est ici : https://indieweb.org/micropub-endpoint, et un bout de code intéressant se trouve là : https://rhiaro.co.uk/2015/04/minimum-viable-micropub.

Microblog

Donc maintenant j’ai un blog sur lequel je peux me connecter depuis un PC ou une application mobile, pour y poster ce que je veux comme articles. Reste les autres types de posts. Pour ça, il me faut un microblog.

Micropub

Pour assurer la liaison Micropub, j’ai le choix entre deux options :

L’avantage de la seconde option, c’est qu’en plus de gérer un blog et un microblog, je pourrai mettre en place à l’avenir des choses différentes comme une galerie de photos ou un livre de recettes.

Notes

Le microblog va principalement poster des notes. La différence avec les articles, c’est l’absence de titre.

Mais ce que j’aimerais surtout, c’est pouvoir utiliser ce microblog pour d’autres types :

Bref, un endroit unique pour garder trace de ces différentes interactions en dehors des articles. Là, nous avons un problème.

Des moteurs de microblog, il en existe des centaines. Encore une fois, j’ai fait mes armes en PHP en en codant un. Il m’en faut un qui supporte ces différents types, et si possible qui interagisse avec les réseaux sociaux : si je reply à un tweet de Twitter, que cela envoie effectivement un tweet de réponse à Twitter.

Jusqu’à présent, j’utilisais Shaarli (https://github.com/shaarli/Shaarli), qui permettait bien d’utiliser des notes, bookmarks et reposts (sort of). Pour les photos et videos, c’était mort, il fallait coder un plugin permettant l’upload directement dans l’interface. Mais c’était compatible Twitter/Mastodon/Facebook, dans une moindre mesure. Notons tout de même que Shaarli n’avait pas vocation à servir de microblog, à la base, et c’est déjà bien qu’il puisse le faire.

Donc là j’ai un problème : soit je code ces fonctionnalités en plugins Shaarli, soit je code de zéro un moteur de microblog qui me sied davantage, soit j’en trouve un qui fasse ce que j’attends de lui.

Cahier des charges

Ce qu’il nous faut est somme toute assez simple :

Recherche

micro.blog

On a la possibilité d’utiliser le service micro.blog (https://micro.blog/), mais à $5/mois c’est quelque peu excessif lorsqu’on a déjà un hébergement complet au même prix. De plus, le développement semble se porter vers les produits Apple (les applications disponibles le sont pour iOS et Mac). Je vois pas trop l’intérêt de ce service, en réalité.

Moteur de microblog

On peut chercher un moteur déjà compatible, mais on va vite être à court :

Je pourrais aussi me reposer sur des logiciels plus volumineux comme Mastodon, Diaspora, Pleroma, Identi.ca, Pump.io, StatusNet, GNU Social, Twister… Mais outre que ce sont des usines à gaz difficiles à maintenir pour un usage personnel, on est loin de la simplicité PHP sans base de données (la plupart tourne sous Node, ou plus exotique encore).

Le plus proche serait micro.pub (https://github.com/tsileo/microblog.pub), qui est un microblog mono-utilisateur basé sur ActivityPub (et donc pleinement compatible avec les autres). Comme d’habitude, c’est pas du PHP mais du Python.

Osada (https://zotlabs.com/osada/) est proche, mais repose sur MySQL. Next.

À ce tarif, j’aurais plus vite fait de coder moi-même un moteur. Reprendre les grandes lignes de microstat (https://github.com/joshdick/microstat) en PHP, y ajouter une compatibilité ActivityPub, et il me suffirait de coder un microblog simple générant une page à partir de fichiers markdown. Pour ce dernier, il y a certains moteurs déjà proches, qu’il faudrait modifier :

Ça me fend le cœur : oText

C’est vraiment dommage que Timo ne s’intéresse pas plus que ça à l’IndieWeb, parce que oText (https://github.com/timovn/oText) est juste une beauté rare en termes de simplicité d’utilisation, de code minimal et de fonctionnalités en pagaille. Blog, microblog, bookmarks, commentaires, gestionnaire de fichiers, prise de notes, agenda, carnet de contacts, lecteur RSS (quand j’ai vu qu’on pouvait commenter un article lu dans le lecteur directement avec un lien, j’ai fondu), tout ça dans 1 Mo. Plus de fonctionnalités qu’un Pico, en moins de place. Si je ne devais pas garder Pico (que je garde uniquement parce que j’y ai développé deux plugins en deux jours, qu’en règle général je vais trouve vite comment l’étendre à partir de n’importe quel bout de code que j’ai en tête, et qu’il m’est arrivé d’éditer des articles en Markdown en urgence dans le train sur mon téléphone portable, cela n’a pas de prix), que je pouvais me faire à SQLite (qui quoi qu’on en dise demande plus niveau code que de simplement poser un bout de fichier texte dans un répertoire) et que le tout accepte un plugin IndieWeb tout-en-un de mes rêves, bah j’irais avec cette solution. On est déjà proche du simple point d’entrée sur le web. C’est ce que je recommande à toute personne voulant une solution simple sans prise de tête et rapide à déployer pour un blog/microblog (j’attends avec impatience l’opportunité de faire mumuse avec, mais elle ne se présente pas pour le moment).

Social

Depuis la version 15, Nextcloud (https://nextcloud.com/) propose une application Social (https://apps.nextcloud.com/apps/social) qui sert de serveur personnel pour le Fediverse (autrement dit, il est possible de poster dessus, et d’être suivi depuis une instance Mastodon, Pleroma, Friendica, Diaspora, Peertube, etc.). Problème : c’est lourd. Ça reste léger (si vous voulez votre propre réseau social sans avoir à installer Mastodon, c’est l’idéal), mais ça demande d’installer Nextcloud (tous les hébergeurs ne le permettent pas), ce n’est pas simple de poster depuis l’extérieur, et si vous perdez votre instance Nextcloud pour une raison ou une autre je vous souhaite bon courage pour en récupérer les posts.

Pourquoi ne pas rester sur Shaarli ?

Shaarli (https://github.com/shaarli/Shaarli/) est génial. Je dis pas ça uniquement parce que c’est une idée de SebSauvage (https://sebsauvage.net/). Liens et notes publics, liens et notes privés, intégration des miniatures, tags, qrcode sur tous les liens, flux RSS, recherche avancée, bookmarklet, plugins, compatibilité Wallabag et FreshRSS… Il y a quelques soucis mineurs :

Ce dernier point est le plus problématique, ça signifie que pour ajouter un lien, on doit nécessairement passer par l’interface de Shaarli. Une API REST est disponible, peut-être y a-t-il un espoir. Ou alors on s’amuse à coder une fonction pour lire la base de données et écrire dedans (la documentation donne un simple unserialize(gzinflate(base64_decode($data))); mais vu que c’est du PHP commenté ça rend les choses légèrement plus complexes).

Les types de posts pourraient être pris en charge avec un plugin qui ajoute des champs personnalisés (kalvn a fait un plugin là-dessus https://github.com/kalvn/shaarli-plugin-via, mais il date de 3 ans, bien que toujours fonctionnel).

J’étudie encore cette option, qui demande de développer plusieurs plugins pour Shaarli (mais c’est toujours moins de code que de recommencer à partir de zéro, je pense).

Pourquoi pas Known ?

J’avais mis de côté Known (https://withknown.com/) pour la simple raison que leur site web met en avant MySQL comme base de donnée. Il se trouve qu’une base SQLite est possible, si l’on en croit la documentation (http://docs.withknown.com/en/latest/install/instructions/). On a tout ce qu’il faut. L’import depuis Wordpress/Blogger (si on peut importer à partir de ça, on peut importer à partir de n’importe quoi, suffit de faire un script). Les microformats. Les flux RSS. ActivityStreams. Les webmentions. La possibilité de poster, de commenter un article, d’envoyer des photos, de la musique, des vidéos… Des plugins au cas où il manquerait quelque chose. Et même une API au cas où ça ne suffirait pas. Niveau synchronisation du contenu, ça peut envoyer, via plugins, vers Twitter, Flickr, Facebook, SoundCloud, LinkedIn… Une large communauté pour appuyer, c’est aussi appréciable.

Deux problèmes :

  1. Peut-être un poil lourd sur les dépendances, mais en même temps il faut ce qu’il faut (ça dit pouvoir s’installer sans problème chez Dreamhost, donc c’est sans doute pas un souci).
  2. Énorme, juste énorme. 40 Mo dézippé, quand Shaarli prend 8 Mo, Pico 2 Mo. Ça donne un monstre à maintenir : 27 Mo juste pour les dépendances… Je cherche quelque chose de plus léger sur les ressources.

Voilà le dilemme. Known est la solution toute prête. Celle que je recommanderais à quiconque voudrait suivre mon exemple. Vous installez, c’est prêt, vous écrivez. Mais c’est très lourd. Rien que SQLite je suis réticent. Et je me dis que si je code, j’apprendrais moi-même comment tout cela fonctionne (avec l’inconvénient notable qu’il faudra que je maintienne mon code au cas où ça change).

Oh, et c’est en anglais. Pas trop un problème, mais c’est toujours plus agréable d’avoir une interface d’administration en français, non ?

Syndication

RSS/Atom

Le blog et le microblog fournissent des flux RSS/Atom, il est ainsi possible d’y accéder via n’importe quel lecteur de flux RSS.

WebSub (ex-PubSubHubbub)

Pour une souscription en temps réel, on peut utiliser WebSub. Les lecteurs de flux ont ainsi une notification instantanée du nouveau contenu posté. Voir : https://indieweb.org/How_to_publish_and_consume_WebSub.

ActivityPub et OStatus

Pour que l’on puisse souscrire aux posts et interagir avec eux directement depuis le Fediverse (Mastodon, etc.), il faut les rendre compatible avec ActivityPub.

Mentions et pingbacks

Maintenant, il faut pouvoir récupérer les mentions que l’on fait des posts des différents blogs et réseaux sociaux pour les intégrer en commentaires du blog. C’est le boulot des webmentions. On a le choix d’utiliser deux services externes :

Il faudra faire d’autres recherches (https://github.com/search?q=webmentions) pour trouver comment intégrer les webmentions à la fois dans Pico et dans le microblog, en envoyant des mentions et en les affichant comme commentaires.

Avis personnel

J’ai l’impression qu’en faisant comme ça, je joue à monter mon bout de web acentré, mais en carton et qui tient avec du ruban adhésif. Vous me direz, c’était presque le cas des missions Apollo, et pourtant on a bien envoyé des hommes sur la Lune. L’image se tient, mais j’avoue être quelque peu lassé de maintenir un ensemble sur un équilibre précaire. J’aimerais tellement qu’il existe une solution clé en main, tu poses ça sur ton serveur, ça marche, c’est libre et fait par des gens soignés donc tu peux garder ça pendant les 5 prochaines années sans avoir à bidouiller parce que telle mise à jour aura bousillé le setup.

Là, concrètement, depuis que je les connais, Pico et Shaarli ont tous deux changé de version de manière suffisamment radicale pour rendre obsolètes des plugins et des thèmes que j’avais développé dans le passé. J’ai pas envie de devoir recoder des plugins dans un an parce que l’un d’eux aura fait une mise à jour. Pour Pico, à la limite je m’en fiche, je prends n’importe quel moteur de blog et en moins d’une journée j’aurais mes articles en ligne (qu’importe s’ils ne bénéficient pas de mes améliorations typographiques, après tout). Shaarli est plus complexe à aborder, en ce sens qu’il n’existe à ce jour aucune alternative viable de ce que j’essaie de construire avec. D’où ma lassitude de devoir tout recommencer au moindre pépin.