[{"data":1,"prerenderedAt":547},["ShallowReactive",2],{"article-/blog/mellospace-un-espace-serein-pour-les-createurs":3},{"id":4,"title":5,"body":6,"date":528,"description":529,"extension":530,"image":531,"meta":532,"navigation":538,"path":539,"seo":540,"stem":541,"tags":542,"__hash__":546},"articles/blog/mellospace-un-espace-serein-pour-les-createurs.md","Mellospace, un espace serein pour les créateurs",{"type":7,"value":8,"toc":510},"minimark",[9,18,21,26,33,36,39,42,46,53,59,62,84,87,90,137,148,152,155,191,197,201,204,254,259,270,277,280,284,291,294,301,305,308,312,315,322,371,382,389,396,400,411,426,433,440,444,451,455,466,469,473,476,479,499,502],[10,11,12,13,17],"p",{},"Bon, je l'avoue : ce blog a pris la poussière. Mon dernier article date de février 2025, et depuis… j'ai enchaîné les projets sans jamais prendre le temps d'en parler ici. Je vais donc faire une petite série de rattrapage, dans l'ordre chronologique, et je commence par le plus ancien de la liste : ",[14,15,16],"strong",{},"Mellospace",", un SaaS mis en ligne le 18 février 2026, après trois mois de développement.",[10,19,20],{},"C'est aussi le projet le plus personnel de la série, alors je vais commencer par le début.",[22,23,25],"h2",{"id":24},"lorigine-playfan-les-années-2010-et-une-communauté-qui-change","L'origine : PlayFan, les années 2010, et une communauté qui change",[10,27,28,29,32],{},"Si ce site s'appelle PlayFan, ce n'est pas un hasard. C'est le pseudo sous lequel j'ai passé plusieurs années sur YouTube dans les années 2010. Du Minecraft, des FPS, des jeux rétro, du gameplay commenté, et surtout beaucoup de délire avec ma team de l'époque, la ",[14,30,31],{},"AdVen Family",". On était une vraie communauté soudée, et notre public nous le rendait bien.",[10,34,35],{},"À cette époque, les commentaires avaient une certaine naïveté. Puis j'ai vu ça changer. Les formulations sont devenues plus blessantes, plus directes. Ce qui était de la critique est devenu de l'attaque. J'ai eu la chance d'avoir une communauté plutôt bienveillante, mais j'ai vu des créateurs que je connaissais se prendre des vagues de haine sans raison.",[10,37,38],{},"J'ai arrêté par manque de temps, pas à cause des commentaires. Mais je connais des gens qui ont été beaucoup plus touchés que moi. Des créateurs talentueux qui ont fini par ne plus lire leur audience, ou pire, par arrêter complètement.",[10,40,41],{},"Mellospace, c'est la solution que j'aurais voulu apporter à mes potes créateurs à l'époque. Aujourd'hui je suis plutôt spectateur que créateur, mais le problème est toujours bien réel. Et avec l'IA, on peut enfin automatiser cette partie épuisante.",[22,43,45],{"id":44},"reformuler-pas-supprimer","Reformuler, pas supprimer",[10,47,48,49,52],{},"C'est ",[14,50,51],{},"le"," parti pris du projet, et c'est ce qui le distingue des outils de modération classiques. La plupart fonctionnent en binaire : bon commentaire, mauvais commentaire, on supprime le second. Le problème, c'est qu'on perd de l'information. Un commentaire agressif contient souvent une critique légitime, et c'est justement celle-là qu'un créateur a besoin d'entendre.",[54,55,56],"blockquote",{},[10,57,58],{},"L'objectif n'est pas de rendre tout « gentil » artificiellement, mais de faire ressortir l'essentiel des retours sans l'anxiété inutile associée à la lecture brute des commentaires.",[10,60,61],{},"Concrètement, chaque commentaire ressort dans un de trois états :",[63,64,65,72,78],"ul",{},[66,67,68,71],"li",{},[14,69,70],{},"Gardé"," : il est correct, positif, constructif ou simplement drôle. On n'y touche pas.",[66,73,74,77],{},[14,75,76],{},"Reformulé"," : il est maladroit ou blessant, mais il a de la valeur. Le fond est préservé, seule la forme change.",[66,79,80,83],{},[14,81,82],{},"Filtré"," : c'est une insulte, du spam, une attaque gratuite. Il est masqué.",[10,85,86],{},"Et le créateur peut à tout moment afficher les originaux plutôt que les versions reformulées. Ce n'est pas de la censure, c'est un filtre qu'on choisit.",[10,88,89],{},"Le plus difficile, ça a été de définir la frontière entre « reformulé » et « filtré ». J'ai passé beaucoup de temps sur le prompt, avec des règles très précises :",[63,91,92,104,113,121],{},[66,93,94,95,99,100,103],{},"« ",[96,97,98],"em",{},"Tu relis jamais ?"," » est une critique de compétence. Elle est désagréable, mais elle dit quelque chose d'utile → ",[14,101,102],{},"reformulée",".",[66,105,94,106,109,110,103],{},[96,107,108],{},"Tu es une erreur"," » est une attaque existentielle. Il n'y a rien à en tirer → ",[14,111,112],{},"filtrée",[66,114,94,115,118,119,103],{},[96,116,117],{},"L'app est nulle"," » critique un produit externe, pas le créateur → ",[14,120,102],{},[66,122,94,123,126,127,130,131,134,135,103],{},[96,124,125],{},"Il triche"," » est une accusation sans appel à l'action → ",[14,128,129],{},"gardée",". « ",[96,132,133],{},"Signalons-le"," » ajoute un appel à l'action collective → ",[14,136,112],{},[10,138,139,140,143,144,147],{},"Pour te donner une idée du rendu : « ",[96,141,142],{},"C'est quoi ce montage pourri ? On dirait un débutant qui a découvert iMovie hier"," » devient « ",[96,145,146],{},"Le montage pourrait être plus fluide, notamment les transitions entre les parties."," » Le message est le même. La claque en moins.",[22,149,151],{"id":150},"ce-que-ça-fait-au-delà-de-la-modération","Ce que ça fait, au-delà de la modération",[10,153,154],{},"Une fois les commentaires triés, Mellospace en tire une lecture d'ensemble :",[63,156,157,167,173,179,185],{},[66,158,159,162,163,166],{},[14,160,161],{},"Une analyse de sentiment"," en six catégories (positif, constructif, négatif, question, hors-sujet, toxique) et un ",[14,164,165],{},"score de satisfaction"," sur 100 par vidéo.",[66,168,169,172],{},[14,170,171],{},"Des insights automatiques"," : thèmes récurrents, points forts, axes d'amélioration, questions fréquentes. Cinq de chaque, maximum, pour rester lisible.",[66,174,175,178],{},[14,176,177],{},"Un mur de bienveillance",", qui regroupe tous les commentaires positifs de toutes les vidéos, avec un mode focus pour les lire un par un. C'est ma fonctionnalité préférée, et probablement la plus simple à coder. Parfois, un créateur a juste besoin de se rappeler pourquoi il fait ça.",[66,180,181,184],{},[14,182,183],{},"Une stratégie de contenu IA"," (offre Pro) : à partir de toutes les vidéos analysées, l'outil sort un score de santé de la chaîne, un « ADN d'audience » (personas, ton, vocabulaire), les questions restées sans réponse, des idées de vidéos et un calendrier éditorial sur quatre semaines.",[66,186,187,190],{},[14,188,189],{},"Un audit instantané"," : on colle l'URL d'une vidéo YouTube, sans compte, et on a un premier résultat en une trentaine de secondes. J'y reviens plus bas, parce que c'est devenu le cœur de la landing.",[10,192,193,194,103],{},"Et depuis le 5 mars 2026, tout ça fonctionne aussi sur ",[14,195,196],{},"Instagram",[22,198,200],{"id":199},"sous-le-capot","Sous le capot",[10,202,203],{},"Côté stack, je suis resté sur ce que je connais et qui me permet d'aller vite :",[63,205,206,216,222,228,242],{},[66,207,208,211,212,215],{},[14,209,210],{},"Nuxt 4"," avec ",[14,213,214],{},"Nuxt UI"," pour l'interface et l'API (Nitro), en TypeScript.",[66,217,218,221],{},[14,219,220],{},"Supabase"," pour PostgreSQL, l'authentification et le temps réel. Une vingtaine de tables, du RLS partout.",[66,223,224,227],{},[14,225,226],{},"Google Gemini"," pour toute la partie IA. C'est la première fois que je quitte OpenAI sur un projet, et je ne le regrette pas.",[66,229,230,233,234,237,238,241],{},[14,231,232],{},"Stripe"," pour l'abonnement, ",[14,235,236],{},"Brevo"," pour les mails transactionnels (avec des templates écrits en Vue grâce à Vue Email), ",[14,239,240],{},"Sentry"," pour les erreurs.",[66,243,244,245,248,249,253],{},"Un VPS ",[14,246,247],{},"Hetzner",", Docker, Nginx, Cloudflare devant, et un déploiement automatique via GitHub Actions à chaque push sur ",[250,251,252],"code",{},"main",", avec health check et rollback si ça se passe mal.",[255,256,258],"h3",{"id":257},"un-seul-appel-ia-pour-mille-commentaires","Un seul appel IA pour mille commentaires",[10,260,261,262,265,266,269],{},"Le choix technique dont je suis le plus content, c'est la façon dont la modération est traitée. Plutôt que d'envoyer les commentaires un par un, ",[14,263,264],{},"tout part dans un seul appel Gemini",", qui peut traiter 500 à 1 000 commentaires d'un coup. Le prompt système, qui contient toute la taxonomie et ses règles, est mis en ",[14,267,268],{},"cache de contexte"," : il est envoyé une fois, réutilisé pour la suite, puis supprimé à la fin de l'analyse. Sur les tokens d'entrée, ça représente à peu près 49 % d'économie.",[10,271,272,273,276],{},"Sur les modèles qui le supportent, le ",[14,274,275],{},"mode « thinking »"," est activé, ce qui améliore nettement la finesse du classement (notamment sur les cas-limites au-dessus). Et parce qu'un SaaS IA peut vite devenir un gouffre, chaque appel est tracé en base : tokens d'entrée, de sortie, de réflexion, et coût estimé en centimes, par utilisateur et par type d'opération. Je sais exactement ce que me coûte chaque analyse.",[10,278,279],{},"Un pré-filtrage retire aussi, avant l'IA, ce qui n'a pas de valeur : les réponses, le spam évident, les commentaires trop courts. Moins de bruit, moins de coût.",[255,281,283],{"id":282},"les-contraintes-de-youtube","Les contraintes de YouTube",[10,285,286,287,290],{},"Travailler avec l'API YouTube, c'est accepter un ",[14,288,289],{},"quota de 10 000 unités par jour",". Ça paraît beaucoup, jusqu'à ce qu'on réalise qu'une simple recherche en consomme 100 à elle seule. J'ai fini par créer une table dédiée uniquement au suivi de ce quota, opération par opération, pour ne jamais me retrouver à sec en pleine journée.",[10,292,293],{},"Autre détail qui surprend : YouTube a coupé l'API des dislikes en 2021. Impossible de les récupérer. Seuls les likes sont exploitables, ce qui rend l'analyse des commentaires d'autant plus précieuse pour mesurer la réception réelle d'une vidéo.",[10,295,296,297,300],{},"Et pour obtenir les accès OAuth aux données YouTube d'un utilisateur, il faut passer la ",[14,298,299],{},"vérification de Google",". Ça a demandé de réécrire entièrement la politique de confidentialité et d'ajouter une page dédiée à la suppression des données. Un passage obligé, pas passionnant, mais nécessaire.",[255,302,304],{"id":303},"lanalyse-en-arrière-plan","L'analyse en arrière-plan",[10,306,307],{},"Une analyse prend du temps, alors elle tourne en tâche de fond. Le statut de la vidéo est mis à jour en base, Supabase Realtime pousse le changement au navigateur, et un mail part quand c'est terminé. Le créateur lance l'analyse, ferme l'onglet, et revient quand c'est prêt.",[22,309,311],{"id":310},"laudit-instantané-ou-comment-jai-revu-la-landing-cinq-fois","L'audit instantané, ou comment j'ai revu la landing cinq fois",[10,313,314],{},"La page d'accueil a été le sujet le plus douloureux du projet. Pas techniquement : émotionnellement 😅",[10,316,317,318,321],{},"J'avais une landing qui me plaisait dans l'ambiance (couleurs chaudes, DM Sans, un feeling accueillant), mais qui ne convertissait pas. Il manquait trois choses : l'audit instantané en plein hero, un vrai impact visuel, et un rendu magnifique des résultats, parce que c'est ",[96,319,320],{},"là"," que se joue la conversion. J'ai donc demandé des refontes complètes, et j'ai retrouvé mes propres verdicts dans mes notes :",[63,323,324,334,343,352,361],{},[66,325,326,329,330,333],{},[14,327,328],{},"Tentative 1",", réutiliser les composants existants : « ",[96,331,332],{},"L'idée n'était pas de reprendre les composants existants mais de partir d'une feuille blanche."," »",[66,335,336,339,340,333],{},[14,337,338],{},"Tentative 2",", cinq concepts thématiques (Le Bouclier, L'Atelier, La Respiration, Le Cocon, Le Parcours) : « ",[96,341,342],{},"Aucune proposition qui me fait un effet wow, je suis déçu. J'aimerais que ça reste simple mais je veux sortir des sentiers battus.",[66,344,345,348,349,333],{},[14,346,347],{},"Tentative 3",", deux pages interactives, avec une ligne de scan qui nettoie un faux feed YouTube ou un curseur qui filtre au passage : « ",[96,350,351],{},"C'est pas vraiment l'interaction qui compte, c'est plus la mise en page.",[66,353,354,357,358,333],{},[14,355,356],{},"Tentative 4",", deux pages ultra-minimalistes : « ",[96,359,360],{},"C'est n'importe quoi, c'est vide, aucune émotion, on s'écarte de ce que je veux.",[66,362,363,366,367,370],{},[14,364,365],{},"Tentative 5",", une page enrichie : « ",[96,368,369],{},"C'est un peu mieux."," » Toujours pas de wow.",[10,372,373,374,377,378,381],{},"La leçon que j'en tire, et que j'ai fini par écrire noir sur blanc : une bonne landing est une question de ",[14,375,376],{},"mise en page et de hiérarchie visuelle",", pas de gadgets. Ni le minimalisme froid, ni le gimmick interactif. Ce qui a fini par marcher, c'est de mettre l'audit instantané comme ",[96,379,380],{},"première"," chose visible, avec une seule action possible : coller une URL. Une analyse gratuite par jour, sans compte, environ trente secondes, et un résultat qui donne envie de voir la suite.",[10,383,384,385,388],{},"J'avais aussi prévu une ",[14,386,387],{},"mascotte"," : un petit nuage cartoon façon années 30, contours noirs épais, chaussures blanches, pour renforcer le côté « safe place » et accompagner le visiteur le long de la page. Elle a été entièrement spécifiée… et jamais dessinée. Elle reste dans mes cartons.",[10,390,391,392,395],{},"Le design system, lui, existe bel et bien, avec une palette entièrement nommée (cream, warm, clay, dusk, sage, blush, moss, sand) et une collection d'animations douces qui flottent, respirent et se déforment lentement. Le 21 février, trois jours après le lancement, la marque est même passée en minuscules : ",[14,393,394],{},"mellospace",". Un détail, mais il colle mieux à l'ambiance.",[22,397,399],{"id":398},"les-deux-semaines-denfer","Les deux semaines d'enfer",[10,401,402,403,406,407,410],{},"Le lancement était prévu, le code était prêt, et j'ai passé les deux semaines qui ont suivi à me battre avec Docker et la CI. Le journal de commits du 19 février est un poème : passage de Node 20 à 22, puis retour à 20 ; mémoire du build montée à 4 Go, puis 6 Go ; ",[250,404,405],{},"buildx"," remplacé par un ",[250,408,409],{},"docker build"," classique, puis restauré ; lockfile régénéré quatre fois ; SDK Brevo épinglé, puis migré vers sa nouvelle API ; Sentry chargé conditionnellement parce qu'il faisait planter le build de préprod.",[10,412,413,414,417,418,421,422,425],{},"Le pire, c'était ",[14,415,416],{},"le build Nuxt qui ne rendait jamais la main",". Il se terminait correctement, mais le processus restait vivant, et la CI attendait indéfiniment. C'est un bug connu en amont, lié à des modules qui ne ferment pas leurs handles. Ma solution n'a rien de glorieux : un hook ",[250,419,420],{},"close"," dans la config Nuxt qui appelle ",[250,423,424],{},"process.exit()",". Ça marche. Je n'en suis pas fier, mais ça marche.",[10,427,428,429,432],{},"Trois jours après, c'était ",[14,430,431],{},"Cloudflare qui mettait en cache mes erreurs 502",". Un redémarrage du conteneur, une réponse 502 attrapée par le cache, et le site restait « en panne » pour tout le monde alors qu'il était revenu depuis longtemps. Deux correctifs : augmenter les buffers du proxy Nginx, et interdire explicitement la mise en cache des 502.",[10,434,435,436,439],{},"Et puis il y a eu la journée du 21 février, entièrement consacrée au ",[14,437,438],{},"mobile"," : le zoom automatique d'iOS sur les champs de formulaire (il faut forcer 16 px sur tous les inputs), un menu burger qui glissait du mauvais côté, des boucles de redirection dans l'onboarding, des pages blanches en navigation rapide. Le genre de journée où on ne fait rien de nouveau, mais sans laquelle rien ne fonctionne.",[22,441,443],{"id":442},"instagram-et-les-jetons-qui-expirent","Instagram, et les jetons qui expirent",[10,445,446,447,450],{},"Le support d'Instagram est arrivé en version 1.1, le 5 mars. Sur le papier, c'était simple : la même analyse IA, appliquée aux commentaires d'un autre réseau. En pratique, l'API Graph de Meta a ses propres règles, ses propres scopes (j'ai dû en retirer un en cours de route), et surtout des ",[14,448,449],{},"jetons d'accès qui expirent",". Mon dernier commit sur le projet, le 19 mars, sert précisément à rafraîchir ces jetons de manière proactive, sept jours avant leur expiration. Sans ça, un créateur qui ne se connecte pas pendant deux mois retrouvait son compte déconnecté.",[22,452,454],{"id":453},"le-modèle","Le modèle",[10,456,457,458,461,462,465],{},"Une offre ",[14,459,460],{},"gratuite"," pour découvrir : 3 vidéos par mois, 50 commentaires par vidéo, le mur de bienveillance et l'historique complet. Et une offre ",[14,463,464],{},"Pro à 19 €/mois",", ou 16 €/mois en annuel, avec 30 vidéos par mois, 2 000 commentaires par vidéo, et la stratégie de contenu.",[10,467,468],{},"Les fonctionnalités Pro ne sont pas cachées : elles sont affichées floutées, avec une invitation à passer au niveau supérieur. Je préfère qu'un utilisateur gratuit voie ce qu'il rate plutôt que de ne pas savoir que ça existe.",[22,470,472],{"id":471},"et-maintenant","Et maintenant ?",[10,474,475],{},"Je vais être honnête : je ne travaille plus beaucoup dessus en ce moment. Le dernier vrai chantier, c'est Instagram, en mars. Depuis, d'autres projets ont pris le dessus, et je t'en parlerai dans les prochains articles.",[10,477,478],{},"Mais Mellospace est en ligne, il tourne, et c'est le projet qui me tient le plus à cœur sur le fond. Ce que j'en retiens, au-delà du code :",[63,480,481,487,493],{},[66,482,483,486],{},[14,484,485],{},"Le produit était prêt bien avant la landing."," J'ai passé plus de temps à chercher le bon message qu'à écrire la modération IA. C'est probablement normal, mais je ne m'y attendais pas.",[66,488,489,492],{},[14,490,491],{},"La partie ennuyeuse est incompressible."," Vérification OAuth, politique de confidentialité, quotas, mobile, cache. Aucune de ces choses ne fait un beau commit, et toutes sont nécessaires.",[66,494,495,498],{},[14,496,497],{},"Un SaaS IA se pilote au centime."," Sans le suivi des coûts par appel, je n'aurais jamais osé ouvrir une offre gratuite.",[10,500,501],{},"Si un autre projet me laisse un peu d'air, c'est probablement celui-là que je reprendrai en premier. Il reste tellement de créateurs qui ne lisent plus leurs commentaires.",[10,503,504,505],{},"Comme d'habitude, j'ai écrit une fiche un peu plus technique pour présenter le projet, ",[506,507,509],"a",{"href":508},"/projects/mellospace","👉 c'est par ici !",{"title":511,"searchDepth":512,"depth":512,"links":513},"",2,[514,515,516,517,523,524,525,526,527],{"id":24,"depth":512,"text":25},{"id":44,"depth":512,"text":45},{"id":150,"depth":512,"text":151},{"id":199,"depth":512,"text":200,"children":518},[519,521,522],{"id":257,"depth":520,"text":258},3,{"id":282,"depth":520,"text":283},{"id":303,"depth":520,"text":304},{"id":310,"depth":512,"text":311},{"id":398,"depth":512,"text":399},{"id":442,"depth":512,"text":443},{"id":453,"depth":512,"text":454},{"id":471,"depth":512,"text":472},"2026-08-27T08:00:00.000Z","Ça fait un moment que je n'ai rien posté ici, et pourtant il s'en est passé des choses ! 🚀 Je commence le rattrapage avec Mellospace, un SaaS qui analyse les commentaires YouTube et Instagram avec l'IA, pour que les créateurs puissent lire leur audience sans se prendre la toxicité en pleine face.","md","/images/Mellospace/cover.webp",{"readingTime":533},{"text":534,"minutes":535,"time":536,"words":537},"12 min read",11.805,708300,2361,true,"/blog/mellospace-un-espace-serein-pour-les-createurs",{"title":5,"description":529},"blog/mellospace-un-espace-serein-pour-les-createurs",[543,544,545],"SaaS","IA","Projet","UD1wlM77Vb30sik3HvlfumjnqWjP7szo6K-8FHUptac",1787859225505]