TL;DR; J'ai créé un petit serveur de chat minimal utilisant ntfy comme backend. Sources et image Docker dispo ici : https://codeberg.org/nanawel/chatfy
Pour un besoin mi-perso/mi-boulot, je me suis mis à la recherche d'un serveur de discussion auto-hébergé (forcément), ultra-léger, sans création de compte ni authentification d'aucune sorte, et que je pourrais poser simplement sur une page web ou donner en lien préparamétré via un autre canal (email, autre chat, etc.). Idéalement j'aurais voulu qu'il soit entièrement chiffré de bout en bout mais ce n'était pas une contrainte absolue.
J'ai écumé pas mal d'annuaires et de projets Github ou autres mais à chaque fois ce n'était pas exactement "ce que je voulais".
Pour info si quelqu'un arrive ici avec la même recherche, voilà quelques pistes intéressantes (aucune ne remplit toutes les conditions précédentes, donc bien lire les README d'abord) :
- ChitChatter : https://chitchatter.im
- otr.to : https://github.com/jermainee/otr.to
- chatto : https://chatto.run
- campfire : https://once.com/campfire
- tinode : https://tinode.co
- NtfyChat : https://github.com/SmugZombie/NtfyChat
Une fois ce tour fait, je me suis dit qu'en taillant bien dans les ambitions, il devait être possible de coder ça moi-même. Puis, Zeitgeist aidant, je me suis dit que ça mériterait quand même de voir ce qu'un LLM pourrait me produire avec un prompt simpliste. Juste pour voir.
Eh ben évidemment c'était bluffant d'efficacité et en même temps carrément flippant pour l'avenir de mon boulot (pas que je l'ignorais, mais le voir en direct c'est toujours impressionnant).
Mon prompt indiquait grosso-modo de respecter les points suivants (j'ai utilisé Claude) :
- architecture Nuxt/Vue
- backend ntfy (inspiré de l'idée de NtfyChat qui m'a bien plu)
- pas de chiffrement (pour simplifier, et parce que comme je suis une bille en chiffrement, je ne pourrai pas valider ce que le LLM pourrait me pondre)
- onboarding utilisateur réduit à sa plus simple expression (login et canal, sauf si la config impose un canal fixe)
- support PWA pour le mobile
Bon, il a fallu quelques itérations pour arriver à un socle intéressant que j'ai pu ensuite reprendre, l'objectif n'étant vraiment pas de vibe-coder une application à 100%.
La première itération ressemblait à une interface Whatsapp/Telegram/Signal qu'on aurait posé dans une page web, avec les bulles de discussion en alternance gauche/droite alors que je visais plutôt un layout type RocketChat/Slack. Ensuite il y avait quelques problèmes sur le logout puis re-login, sachant que je voulais pouvoir conserver la config de l'utilisateur dans son localStorage pour accélérer encore l'onboarding en cas de visite successive.
Cela m'a permis de mettre les pattes dedans et de relire toute ce qui avait été écrit. J'ai pu découvrir qu'ils s'était appuyé sur les SSE pour la communication, ce à quoi je n'avais pas initialement pensé (OSL fonctionne avec des WebSockets), et découvrir un peu plus la syntaxe de la Composition API de Vue 3 (OSL utilise encore l'Option API héritée de Vue 2).
Mais il faut le mentionner : ça "juste marchait" immédiatement malgré ces petits défauts.
J'ai quand même corrigé quelques points qui me gênaient, notamment la confusion entre channel et topic un peu partout dans le code et quelques erreurs de gestion de l'authentification avec le token de ntfy. J'ai ajouté un support superficiel de Markdown pour pouvoir mettre en forme les messages (notamment les blocs de code), puis j'ai dockerifié tout ça et j'ai arrangé le logo (qui avait été généré aussi par Claude sans que je lui demande). Bref, ça m'a pris quelques heures mais je suis pas parti d'une feuille blanche sinon c'était plutôt en jours que j'aurais compté.
Les sources sont sur Codeberg ici : https://codeberg.org/nanawel/chatfy
Et si vous voulez savoir à quoi ça ressemble en live, une démo est accessible sur https://chatfy-demo.lanterne-rouge.info et en version iframe ci-dessous :
Ah oui et le nom ? Ben comme le gros du boulot est assuré par ntfy (qui se prononce notifaïe comme notify), j'ai choisi chatfy (qui se prononce donc tchatifaïe ^^).
Comments