Architecture

Raindrop se compose de plusieurs composants :

  • un agrégateur qui récupère des messages de tout type et les stocke en base;
  • un moteur qui traite chaque nouveau message et en extrait les informations en fonction de règles;
  • une base de données qui contient une copie de tous ces messages et de leurs informations extraites ou calculées;
  • une interface pour interagir avec le tout;

L'agrégateur est déjà capable de communiquer avec des comptes mail (via IMAP), Twitter, Skype et des flux RSS. L'ajout du support d'autres protocoles ne devrait pas être compliqué. Une fois les messages récupérés, ils sont insérés en base. Cette insertion déclenche des traitements, définis sous forme d'extensions, qui analysent les messages, en extraient des information, et enrichissent la base de ces nouvelles informations qui seront utilisées pour proposer des vues spécifiques. Ces informations permettent par exemple d'essayer de regrouper les messages en conversations, de séparer les listes de discussion des échanges privés, etc

L'agrégateur est pour l'instant basé sur Twisted, un framework réseau écrit en Python. Cependant, ce choix n'est pas définitif. S'il a permis de développer rapidement un premier prototype, mais n'est peut-être pas le composant le plus adaptés aux besoins de Raindrop. En particuliers, son fonctionnement assez complexe peut être une barrière à la création d'extensions par un maximum de gens. Le wiki du projet contient plus d'informations sur les discussions en cours sur le sujet.

C'est CouchDB qui a été choisie pour stocker les messages. C'est une base de données orientée documents, c'est à dire qu'elle ne stocke pas de données ayant des formats rigides, avec des tables aux schémas figés, mais enregistre tout type de documents, représentés par une simple liste de clés et de valeurs. De ce fait, il n'est pas besoin de créer de nouvelles tables pour enrichir la base d'autres types d'information. Autre caractéristique intéressante de CouchDB, c'est une base distribuée, il est très simple d'avoir plusieurs instances de la base et de les synchroniser. Enfin, elle intègre un serveur Web, qui est son interface naturelle. L'interface actuelle de Raindrop se connecte donc directement à la base et affiche des vues sur les données.

Outre les messages et leurs informations, la base de données stocke également tout le nécessaire pour les afficher, c'est à dire le HTML, CSS et JavaScript utilisés dans l'interface utilisateur. Pour l'instant, tous ces composants sont également disponibles en tant que fichiers dans l'arborescence du projet, et la base est synchronisée avec les fichiers. Au fur et à mesure du développement des interfaces pour modifier Raindrop, les versions en base pourront prendre le pas sur celles du système de fichier.

Une plate-forme

En fait, plus qu'une application, Raindrop est une plate-forme complètement personnable de gestion de conversations. Elle respecte deux éléments essentiels de la philosophie Mozilla : l'utilisateur est central, le Web est bidouillable. Raindrop est donc entièrement configurable, modifiable, extensible, à tous les niveaux. Il permettra à chacun d'être maître de ses données et des usages qu'il en fera.

Côté backend, tous les traitements reposent sur des extensions qui sont appelées quand un nouveau message est ajouté à la base, ou lors de certains événements. Ces extensions analysent les messages et enrichissent la base en créant de nouveaux documents. A titre d'exemple, les extensions disponibles dans la première version permettent :

  • d'analyser le contenu d'un mail pour détecter les citations du mail répondu;
  • d'analyser les mails pour essayer de les regrouper en conversations;
  • d'ajouter tous les identifiants Twitter détectés à vos contacts;
  • d'extraire les hashtags des gazouillis;
  • etc

Pour l'instant, toutes les extensions backend sont traitées par le moteur dans un seul processus, et doivent donc être écrites en Python. A terme, elles seront déléguées à des processus externes et pourront donc être écrite dans n'importe quel langage, avec une préférence pour JavaScript, pour unifier les développements entre les modules front et back. Le moteur JavaScript embarqué par CouchDB (SpiderMonkey, le même que Firefox) pourrait être mis à contribution.

Côté frontend, l'utilisateur peut interagir avec les données soit au moyen d'applications Web, soit à travers une API. Une application Web n'est rien d'autre qu'une page HTML, mise en forme avec des CSS, et motorisée par JavaScript. Les applications reposent sur des Widgets qui elles-mêmes utilisent une API JavaScript de bas niveau pour communiquer avec la base de données. Et là encore, on peut adapter Raindrop à ses besoins. Soit en écrivant une application Web complète, soit en créant de nouvelles Widgets pour l'application existante (qui n'est pas l'interface de Raindrop, mais un exemple d'interface), soit via des extensions. Le tout utilise les technologies classiques du Web, HTML, CSS et JavaScript.

Si vous avez installé Raindrop, le lien pour accéder au gestionnaire d'extension est en bas de la page principale. Celui-ci intègre l'éditeur Bespin, pour éditer le code des extensions directement, sans avoir besoin de recourir à un autre logiciel ou d'accéder au système de fichier[1].

Les extensions déjà disponibles permettent par exemple:

  • de rajouter en dessous de chaque message la liste des liens HTML qu'il contient (ces liens sont extraits et stockés en base par une extension côté backend, il suffit donc de les afficher);
  • si un message contient un lien vers une vidéo YouTube, d'afficher la vidéo directement dans le message;
  • d'afficher la liste des dossiers disponilbes, des mailing-list auxquelles vous êtes abonnés, etc;
  • et bien d'autres choses. Evidemment, l'activation ou la désactivation d'une extension met à jour l'affichage instantanément;

L'architecture se veut la plus ouverte possible, les communications entre chaque composant passant par des API. Les choix techniques pour chaque module étant loin d'être définitif, cela devrait permettre à tout moment de modifier l'un des composants sans avoir d'impact sur les autres. De plus, cela permet de faire fonctionner les composants sur des machines distinctes. Bien entendu, ces API visent aussi à augmenter la bidouillabilité, à donner aux utilisateurs un maximum de méthodes pour interagir avec les données et l'application. L'API essaiera de se conformer au modèle REST, répondant peut-être enfin au vieux rêve d'accéder à ses mail en mode REST. Et comme tout le reste, elle sera également extensible.

Une pluie rafraîchissante

Attention, Raindrop est un prototype, une expérience à son premier stade. Il est encore loin d'être utilisable, et n'est pas simple à installer. Il nécessite des versions particulières de logiciels (par exemple CouchDB 0.10 alors que seule la 0.9 est disponible dans Sid), a de nombreuses dépendances, etc. Mais c'est le but du prototype : en dévoiler assez pour permettre de se faire une idée des possibilités du concept, et appeler la communauté à la rescousse. Donc voilà. Si vous êtes geek, essayez d'installer la bête, faites remonter vos problèmes, vos idées, bref, profitez-en, on ne vous demande pas de tester pour faire remonter les bugs mais de participer à l'élaboration de ce qui pourrait être une jolie évolution du Web.

Je trouve ce projet excitant, à la fois par ses choix technologiques et par les perspectives qu'il ouvre en terme de nouveux moyens de jouer avec nos données. Cerise sur la chantilly, il reprend, en la menant bien plus loin, mon idée de départ lorsque j'ai codé Couac : avoir une interface unique pour gérer l'ensemble de ses communications.

Mais je l'adore surtout parce qu'après Weave, je vois là une nouvelle brique pour se ré-approprier nos données, pour en reprendre le contrôle. Raindrop est prévu pour fonctionner aussi bien dans le nuage (hébergé sur un serveur donc accessible de partout) qu'installé en local sur le poste de l'utilisateur[2] Avec Weave et Raindrop, on disposera sous peu de deux conteneurs extensibles où stocker toutes nos données aujourd'hui dispersées un peu partout sur le Web. Les stocker, et les bidouiller à notre guise. Elle est pas belle la vie dans le monde merveilleux du Grand Lézard ?

Notes

[1] pour l'instant, toutes les extensions sont également présentes dans le système de fichier et cette version écrase celle en base au moment du lancement de l'application. A terme, les modifications effectuées en base au moyen de l'éditeur en ligne seront évidemment pérennes

[2] vu le nombre de dépendances, la tâche semble pour l'instant ardue, mais si les équipes du projet arrivent à créer un programme pour facilement installer le serveur Raindrop sur n'importe quelle machine locale, et je ne doute pas qu'elles y arriveront, cela ouvrira bien des perspectives : imaginez, Python et CouchDB largement déployés sur les postes utilisateurs;