<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: innermost47</title>
    <description>The latest articles on DEV Community by innermost47 (@innermost_47).</description>
    <link>https://dev.to/innermost_47</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3613557%2F2992da07-c4cc-4b79-815b-8c86ab4809d1.png</url>
      <title>DEV Community: innermost47</title>
      <link>https://dev.to/innermost_47</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/innermost_47"/>
    <language>en</language>
    <item>
      <title>J'ai construit un système de vérification audio pour ne plus avoir à faire confiance à personne.</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Fri, 03 Apr 2026 12:59:31 +0000</pubDate>
      <link>https://dev.to/innermost_47/jai-construit-un-systeme-de-verification-audio-pour-ne-plus-avoir-a-faire-confiance-a-personne-36p8</link>
      <guid>https://dev.to/innermost_47/jai-construit-un-systeme-de-verification-audio-pour-ne-plus-avoir-a-faire-confiance-a-personne-36p8</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwheovf5ixbvqxiinrenq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwheovf5ixbvqxiinrenq.jpg" alt="Empreinte spectrale d'un signal audio généré par OBSIDIAN Neural" width="800" height="599"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Je suis fatigué de dépendre des géants du web.&lt;/strong&gt; Pas par idéologie creuse — par expérience concrète. Quand votre infrastructure musicale repose sur un seul fournisseur d'inférence, vous n'avez pas un outil. Vous avez une dette envers une entreprise dont les CGU, les tarifs et la disponibilité peuvent changer du jour au lendemain.&lt;/p&gt;

&lt;p&gt;OBSIDIAN Neural est un plugin VST3/AU de génération audio en temps réel. Il tourne sur un réseau distribué de GPUs — des machines appartenant à des gens réels, rémunérées équitablement, sans intermédiaire opaque. Mais distribué, ça veut aussi dire : &lt;strong&gt;comment savoir que la machine en face fait vraiment ce qu'elle prétend faire ?&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Le problème : la confiance dans un réseau distribué
&lt;/h2&gt;

&lt;p&gt;Imaginons que vous rejoignez le réseau en tant que provider. Vous branchez votre GPU, vous générez de l'audio. À la fin du mois, vous recevez une part équitable des revenus.&lt;/p&gt;

&lt;p&gt;Maintenant imaginez que quelqu'un triche. Il prétend faire tourner le modèle, mais en réalité il relaie les requêtes ailleurs — ou pire, il renvoie du bruit aléatoire. Il touche quand même sa part.&lt;/p&gt;

&lt;p&gt;Dans un système centralisé, c'est le problème de la plateforme. Vous faites confiance à la plateforme.&lt;/p&gt;

&lt;p&gt;Moi, je ne veux pas être une plateforme à laquelle on fait confiance. &lt;strong&gt;Je veux un réseau où la confiance n'est pas nécessaire parce qu'elle est vérifiable.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  La solution : un proof-of-work audio
&lt;/h2&gt;

&lt;p&gt;L'idée s'inspire des mécanismes de consensus des blockchains — pas pour faire du Web3, mais pour le principe : &lt;strong&gt;un nœud doit prouver qu'il travaille vraiment.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Comment ça marche
&lt;/h3&gt;

&lt;p&gt;À intervalles aléatoires (entre 1h et 5h, pour qu'on ne puisse pas anticiper), le serveur central tire :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;un &lt;strong&gt;prompt&lt;/strong&gt; parmi 64 prompts de référence (&lt;code&gt;"steady kick drum loop 120bpm"&lt;/code&gt;, &lt;code&gt;"warm Rhodes chord"&lt;/code&gt;, etc.)&lt;/li&gt;
&lt;li&gt;un &lt;strong&gt;seed&lt;/strong&gt; aléatoire&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il envoie ça à un sous-ensemble de providers via &lt;code&gt;POST /verify&lt;/code&gt;. Chaque provider doit générer l'audio et le renvoyer.&lt;/p&gt;

&lt;p&gt;Le serveur calcule ensuite une &lt;strong&gt;empreinte mel&lt;/strong&gt; — un vecteur de 128 valeurs représentant la distribution spectrale moyenne du son. Puis il compare chaque empreinte à la référence via &lt;strong&gt;similarité cosinus&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Si la similarité est inférieure à 0,98 : échec. Trois échecs consécutifs : ban automatique.&lt;/p&gt;

&lt;h3&gt;
  
  
  L'étalon physique
&lt;/h3&gt;

&lt;p&gt;Le point critique du système, c'est la référence. Si la référence est calculée comme la moyenne du groupe, un groupe de providers qui trichent ensemble peuvent se valider mutuellement — &lt;strong&gt;une attaque de coalition&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Pour éviter ça, il y a un &lt;strong&gt;nœud de référence physique&lt;/strong&gt; — une machine de confiance dont les empreintes sont la vérité absolue. Avant chaque round, ce nœud génère plusieurs samples avec des prompts et seeds variés. Ces empreintes sont &lt;strong&gt;chiffrées avec une clé Fernet dédiée&lt;/strong&gt; avant d'être stockées en base — une fuite de la DB n'expose rien d'exploitable.&lt;/p&gt;

&lt;p&gt;Pendant le round, un sample est tiré aléatoirement parmi ceux en banque. Les providers ne savent pas lequel sera utilisé. Ils ne peuvent pas anticiper.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Round de vérification
│
├── Nœud de référence disponible ?
│   ├── OUI → génère des samples → chiffre → stocke en banque
│   │         → tire un sample au hasard → référence absolue
│   └── NON → banque de samples existante → tirage aléatoire
│             └── banque vide → round annulé (pas de ban)
│
└── Providers sélectionnés
    ├── Attend que chaque provider finisse son job en cours
    ├── Lock atomique (is_disposable = false)
    ├── Envoie POST /verify en parallèle
    ├── Calcule similarité cosinus vs référence
    └── Unlock dans tous les cas (finally)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Pourquoi aléatoire ?
&lt;/h3&gt;

&lt;p&gt;Parce qu'un test prévisible n'est pas un test. Si les providers savent quand et avec quel prompt ils seront testés, ils peuvent jouer le jeu uniquement pendant les vérifications. L'aléatoire sur l'intervalle, le prompt, le seed et le sample tiré rend ça structurellement difficile.&lt;/p&gt;

&lt;h3&gt;
  
  
  Et pendant le test, les jobs de prod ?
&lt;/h3&gt;

&lt;p&gt;Un provider sous vérification est marqué &lt;code&gt;is_disposable = false&lt;/code&gt;. Il disparaît du pool de génération. Les jobs de prod passent sur les autres nodes disponibles ou basculent sur fal.ai en fallback. Le test ne bloque pas le réseau.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pourquoi c'est aussi un positionnement politique
&lt;/h2&gt;

&lt;p&gt;Je construis ça parce que j'en ai marre de la logique extractive des grandes plateformes cloud.&lt;/p&gt;

&lt;p&gt;Quand vous utilisez un service GPU centralisé, vous enrichissez une infrastructure qui décide seule de ses tarifs, de ses priorités, de ce qu'elle accepte ou non comme usage. Vous n'avez aucun levier.&lt;/p&gt;

&lt;p&gt;OBSIDIAN Neural est une tentative de construire une alternative : &lt;strong&gt;un réseau où les gens qui font tourner les machines sont aussi ceux qui en bénéficient&lt;/strong&gt;. Revenus redistribués équitablement. Transparence totale — les rapports financiers, les logs de génération et la liste des providers sont publics et accessibles sans compte.&lt;/p&gt;

&lt;p&gt;Ce n'est pas une coopérative juridique. C'est un logiciel open source avec une économie intégrée. La différence : les règles sont dans le code, pas dans un contrat que personne ne lit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que je vous demande
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1. Challengez le système.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le proof-of-work audio est une idée jeune. Il y a probablement des angles d'attaque que je n'ai pas vus. Si vous êtes chercheur en sécurité, musicien qui code, dev qui s'ennuie un vendredi soir — je veux savoir comment vous casseriez ça.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://github.com/innermost47/obsidian-neural-central" rel="noopener noreferrer"&gt;Serveur central&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://github.com/innermost47/obsidian-neural-provider" rel="noopener noreferrer"&gt;Provider node&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Rejoignez le réseau.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si vous avez un GPU qui dort la nuit, vous pouvez le brancher. Vous êtes rémunéré à part égale avec les autres providers. Tout est vérifié, rien n'est opaque.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://obsidian-neural.com/public.html" rel="noopener noreferrer"&gt;Voir les données publiques du réseau&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://obsidian-neural.com/contact.html" rel="noopener noreferrer"&gt;Me contacter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Partagez si le concept vous parle.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pas pour la croissance — pour trouver les bonnes personnes. Ceux qui construisent des alternatives, qui pensent que l'infrastructure musicale ne devrait pas appartenir à trois entreprises américaines.&lt;/p&gt;




&lt;h2&gt;
  
  
  La stack technique (pour les curieux)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Composant&lt;/th&gt;
&lt;th&gt;Technologie&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Plugin&lt;/td&gt;
&lt;td&gt;VST3 / AU (C++)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serveur central&lt;/td&gt;
&lt;td&gt;FastAPI (Python)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Empreintes audio&lt;/td&gt;
&lt;td&gt;librosa — mel spectrogram 128 bins&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Comparaison&lt;/td&gt;
&lt;td&gt;scipy — similarité cosinus&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Chiffrement samples&lt;/td&gt;
&lt;td&gt;cryptography — Fernet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Base de données&lt;/td&gt;
&lt;td&gt;PostgreSQL + SQLAlchemy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Provider kit&lt;/td&gt;
&lt;td&gt;Python + httpx&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fallback inférence&lt;/td&gt;
&lt;td&gt;fal.ai&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Le code du serveur central et du kit provider sont open source sur GitHub.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://github.com/innermost47/obsidian-neural-central" rel="noopener noreferrer"&gt;Serveur central&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://github.com/innermost47/obsidian-neural-provider" rel="noopener noreferrer"&gt;Provider node&lt;/a&gt;&lt;br&gt;&lt;br&gt;
→ &lt;a href="https://github.com/innermost47/ai-dj" rel="noopener noreferrer"&gt;Le VST&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Le réseau est petit. Le système est imparfait. Mais il est vérifiable, transparent, et il n'appartient à personne en particulier.&lt;/p&gt;

&lt;p&gt;C'est déjà mieux que la plupart des alternatives.&lt;/p&gt;

</description>
      <category>obsidianneural</category>
      <category>iagnrative</category>
      <category>opensource</category>
      <category>musique</category>
    </item>
    <item>
      <title>Email as an App: How I Built a High-Conversion Interface</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Tue, 31 Mar 2026 12:25:52 +0000</pubDate>
      <link>https://dev.to/innermost_47/email-as-an-app-how-i-built-a-high-conversion-interface-10ab</link>
      <guid>https://dev.to/innermost_47/email-as-an-app-how-i-built-a-high-conversion-interface-10ab</guid>
      <description>&lt;p&gt;&lt;strong&gt;The results of my latest stress test:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;300 cold emails&lt;/strong&gt; sent at 10:00 AM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;23 automated quotes&lt;/strong&gt; generated by 10:10 AM.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;116 quotes total&lt;/strong&gt; in a single week with an &lt;strong&gt;11% conversion rate&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;How? By stopping "writing messages" and starting "designing interfaces."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email is an interface. It has states, actions, navigation, and a friction-reduction logic. Here is how I design my emails as applications.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Most people think of email as text with a button at the end—a message that says something, followed by a Call to Action (CTA) hoping for a click.&lt;/p&gt;

&lt;p&gt;I think of it differently. An email is a &lt;strong&gt;UI&lt;/strong&gt;. It has navigation. It has a flow logic. And above all, it has one single goal: to lead the user to the next action with as little friction as possible. This shift in perspective changes everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The Email as the "First Screen"
&lt;/h2&gt;

&lt;p&gt;When a prospect receives my outreach email, they don't receive a wall of text. They receive a screen with two possible primary actions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;"Yes, send me a quote"&lt;/strong&gt; → They enter the sales funnel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;"No thanks"&lt;/strong&gt; → They enter the feedback loop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is exactly the logic of an onboarding screen in a mobile app. One question. Two paths. Zero noise.&lt;/p&gt;

&lt;p&gt;The difference with a classic email? &lt;strong&gt;I don't ask them to reply. I ask them to click.&lt;/strong&gt;&lt;br&gt;
Replying requires drafting, thinking, and effort. Clicking takes half a second and one finger. Friction kills conversion. Every extra step between intent and action costs you users.&lt;/p&gt;
&lt;h2&gt;
  
  
  2. Buttons as Navigation
&lt;/h2&gt;

&lt;p&gt;In an app, buttons navigate to screens. In my quote email, each button leads to a dedicated, contextualized page with the right information at the right time. My automated quote email contains four distinct actions:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Explore Themes:&lt;/strong&gt; Links to my speaking site for those who need to refine the topic before committing.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Propose Dates:&lt;/strong&gt; A booking form pre-filled with the quote ID for those ready to schedule.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Sign Online:&lt;/strong&gt; An e-signature page using an HTML5 Canvas for those ready to validate.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Forward to Management:&lt;/strong&gt; A pre-filled &lt;code&gt;mailto:&lt;/code&gt; link.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This last button is the most underrated. In public or corporate structures, the recipient is rarely the one with signing authority. By providing a "Forward to Management" button with a pre-drafted message, I remove an entire hurdle.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;mailto:?subject=Speaker Proposal: Demystifying AI
&amp;amp;body=Hi,
I'm forwarding this AI conference project to you. 
You can find the summary and the quote here: [Link]
What do you think?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;One button. One pre-written draft. &lt;strong&gt;Zero effort for my contact.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. The "Communication Kit" as a Feature
&lt;/h2&gt;

&lt;p&gt;A well-designed app anticipates the user's next need. When someone accepts a conference quote, their next need is to promote the event.&lt;/p&gt;

&lt;p&gt;I could have waited for them to ask. I could have sent a second email. Instead, I included it &lt;strong&gt;directly&lt;/strong&gt; in the quote email.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Quote PDF&lt;/li&gt;
&lt;li&gt;High-definition headshots&lt;/li&gt;
&lt;li&gt;Promotional posters (PNG)&lt;/li&gt;
&lt;li&gt;Ready-to-copy blurbs (Short &amp;amp; Long versions)&lt;/li&gt;
&lt;li&gt;Brand color codes (Hex) and Typography (Montserrat)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This isn't a gadget; it's &lt;strong&gt;friction reduction&lt;/strong&gt;. Every element I provide proactively is a follow-up I won't have to manage and a delay I remove from the decision process.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The "Human" Delay: Experience Design
&lt;/h2&gt;

&lt;p&gt;A quote that arrives 9 seconds after a click breaks the illusion. The recipient immediately realizes they are in an automated tunnel, which can cheapen the professional relationship.&lt;/p&gt;

&lt;p&gt;I introduced a random delay of 3 to 8 minutes between the click and the quote delivery.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It's long enough to look like a human prepared the document.&lt;/li&gt;
&lt;li&gt;It's short enough to maintain momentum.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 3 to 8 minutes&lt;/span&gt;
&lt;span class="nv"&gt;$sendAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d H:i:s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'+'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' seconds'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;UX design applied to automation&lt;/strong&gt;. It’s like a "skeleton screen" in a web app that simulates loading to make the UI feel more reactive—even if the data is already there. The goal isn't to deceive, but to keep the mechanics invisible. &lt;strong&gt;Good automation shouldn't look like automation.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Takeaway
&lt;/h2&gt;

&lt;p&gt;Thinking of email as an app changes your workflow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Design, don't just write:&lt;/strong&gt; Don't ask "What do I want to say?" Ask "What action do I want to trigger, and how do I clear the path?"&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Every button is a next screen:&lt;/strong&gt; Ensure the landing page is ready to receive the user in the correct context.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Anticipate the next move:&lt;/strong&gt; Satisfy predictable needs proactively.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Friction is the enemy:&lt;/strong&gt; Every form field or manual email you ask them to write is a leak in your funnel.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Email isn't just a channel; it's a surface.&lt;/strong&gt; Most companies treat it like a Post-it note. I treat it like a high-performance interface. It’s not more complicated—it’s just a matter of perspective.&lt;/p&gt;

</description>
      <category>productivity</category>
      <category>showdev</category>
      <category>webdev</category>
      <category>automation</category>
    </item>
    <item>
      <title>I built a cooperative GPU network for real-time AI music generation — looking for providers (open source, revenue sharing)</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Mon, 30 Mar 2026 11:42:16 +0000</pubDate>
      <link>https://dev.to/innermost_47/i-built-a-cooperative-gpu-network-for-real-time-ai-music-generation-looking-for-providers-open-fe7</link>
      <guid>https://dev.to/innermost_47/i-built-a-cooperative-gpu-network-for-real-time-ai-music-generation-looking-for-providers-open-fe7</guid>
      <description>&lt;p&gt;I've been building OBSIDIAN Neural for the past year — a VST3/AU plugin that generates audio in real time, directly in your DAW, during a live performance. 4,200+ downloads, presented at AES AIMLA 2025 in London.&lt;/p&gt;

&lt;p&gt;The infrastructure runs on a distributed GPU network. Providers run a small Python server, handle generation requests, and receive an equal share of 85% of monthly subscription revenue via Stripe Connect. No token, no crypto — euros to your bank account. You also get 500 free credits/month to use the plugin yourself.&lt;/p&gt;

&lt;p&gt;I'll be honest: the platform has been live since October 2025 and has no paying users yet. I'm a solo indie developer without the marketing budget to compete with AWS-backed AI music platforms. That's exactly why I built it this way — cooperative, transparent, community-owned. The goal is to grow this together, against the grain of centralized AI infrastructure controlled by large corporations.&lt;/p&gt;

&lt;p&gt;Each provider will receive exclusive promotional codes to share with their network, giving them a direct role in growing the platform and their own revenue share from day one.&lt;/p&gt;

&lt;p&gt;The whole thing is open source. Revenue data is published publicly. Nothing hidden.&lt;/p&gt;

&lt;p&gt;If you have an NVIDIA GPU and want to be part of the founding infrastructure of something built differently, I'm looking for 10 people for phase 1.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Plugin: &lt;a href="https://github.com/innermost47/ai-dj" rel="noopener noreferrer"&gt;https://github.com/innermost47/ai-dj&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Provider kit: &lt;a href="https://github.com/innermost47/obsidian-neural-provider" rel="noopener noreferrer"&gt;https://github.com/innermost47/obsidian-neural-provider&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Central server: &lt;a href="https://github.com/innermost47/obsidian-neural-central" rel="noopener noreferrer"&gt;https://github.com/innermost47/obsidian-neural-central&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Site: &lt;a href="https://obsidian-neural.com" rel="noopener noreferrer"&gt;https://obsidian-neural.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Contact: &lt;a href="https://obsidian-neural.com/contact.html" rel="noopener noreferrer"&gt;https://obsidian-neural.com/contact.html&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>music</category>
      <category>opensource</category>
      <category>network</category>
    </item>
    <item>
      <title>J'ai construit un réseau GPU coopératif pour l'IA musicale. Et je cherche 10 personnes.</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Mon, 30 Mar 2026 08:52:50 +0000</pubDate>
      <link>https://dev.to/innermost_47/jai-construit-un-reseau-gpu-cooperatif-pour-lia-musicale-et-je-cherche-10-personnes-4fjk</link>
      <guid>https://dev.to/innermost_47/jai-construit-un-reseau-gpu-cooperatif-pour-lia-musicale-et-je-cherche-10-personnes-4fjk</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dk8uv7elsd642ask6un.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4dk8uv7elsd642ask6un.jpg" alt="OBSIDIAN Neural — distributed GPU network" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 200 téléchargements. 8 pays. Présenté à l'AES AIMLA 2025 à Londres.&lt;/strong&gt; OBSIDIAN Neural est un plugin VST3/AU qui génère de l'audio par IA en temps réel, sur scène, pendant que tu joues. Aujourd'hui je passe à l'étape suivante : un réseau d'inférence distribué, coopératif, entièrement open source. Et je cherche 10 personnes pour le lancer.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le problème avec les plateformes d'IA musicale centralisées
&lt;/h2&gt;

&lt;p&gt;Suno, Udio, Adobe — même modèle partout. Tu paies un abonnement. Leurs serveurs génèrent. Ils gardent les revenus. L'infrastructure est opaque. Le pricing est arbitraire.&lt;/p&gt;

&lt;p&gt;Je voulais construire autre chose. Pas juste un meilleur plugin — une relation différente entre l'outil, ceux qui l'utilisent, et ceux qui le font tourner.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Et si les gens qui font tourner les GPU possédaient une part de ce qu'ils construisent ?"&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Ce qu'est OBSIDIAN Neural
&lt;/h2&gt;

&lt;p&gt;OBSIDIAN Neural est un plugin VST3/AU pour la génération audio IA en temps réel. Tu le charges dans ton DAW — Ableton, Reaper, Logic, n'importe lequel — tu tapes un prompt, tu génères, et tu récupères un sample WAV en quelques secondes. Pendant un live. Pendant que tout le reste joue.&lt;/p&gt;

&lt;p&gt;Le plugin appelle un serveur central qui route la requête vers un provider GPU sur le réseau, lance l'inférence via Stable Audio Open, valide l'output, et renvoie l'audio. Toute la chaîne est open source. Chaque ligne de code est publique.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stack technique
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Plugin&lt;/strong&gt; : C++ / JUCE, VST3 + AU, Windows / macOS / Linux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Serveur central&lt;/strong&gt; : FastAPI Python, async, queue par provider&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Modèle&lt;/strong&gt; : Stable Audio Open 1.0 (8GB VRAM) ou Small (4GB VRAM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fallback&lt;/strong&gt; : fal.ai si aucun provider disponible&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;License&lt;/strong&gt; : AGPL-3.0&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Le modèle coopératif
&lt;/h2&gt;

&lt;p&gt;Le réseau tourne sur un pool de providers GPU distribués. N'importe qui avec une carte NVIDIA compatible peut rejoindre, faire tourner le provider kit, et recevoir une part des revenus mensuels d'abonnement.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Bénéficiaire&lt;/th&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Providers (toi)&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;85%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Plateforme (infrastructure + maintenance)&lt;/td&gt;
&lt;td&gt;15%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Le split est égal entre tous les providers actifs éligibles. Pas de hiérarchie. Pas de négociation. Chaque mois, 85% des revenus sont distribués automatiquement via Stripe Connect. Le détail complet est publié publiquement à &lt;code&gt;api.obsidian-neural.com/api/v1/public/finances&lt;/code&gt; — auditable par n'importe qui, à tout moment.&lt;/p&gt;

&lt;p&gt;En tant que provider, tu reçois aussi &lt;strong&gt;500 crédits de génération gratuits chaque mois&lt;/strong&gt; pour utiliser le plugin toi-même.&lt;/p&gt;




&lt;h2&gt;
  
  
  L'architecture technique
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Serveur central
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Système de heartbeat push depuis les providers — pas de polling&lt;/li&gt;
&lt;li&gt;Queue asyncio par provider (1 génération à la fois)&lt;/li&gt;
&lt;li&gt;Clés API hashées SHA-256, clés utilisateurs chiffrées Fernet&lt;/li&gt;
&lt;li&gt;Stripe Connect pour la redistribution automatique des revenus&lt;/li&gt;
&lt;li&gt;Rapport financier public mis à jour après chaque cycle&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Provider kit
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Un seul script Python, 15 minutes d'installation&lt;/li&gt;
&lt;li&gt;Compatible Windows, Linux, macOS — CUDA obligatoire&lt;/li&gt;
&lt;li&gt;Resampling automatique BPM-aware via librosa + SoundTouch&lt;/li&gt;
&lt;li&gt;Validation WAV par FFmpeg avant retour de l'audio&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Proof-of-work audio
&lt;/h3&gt;

&lt;p&gt;À des intervalles aléatoires entre 1h et 5h, le serveur sélectionne 30% des providers actifs au hasard et leur envoie un seed et un prompt de test communs, choisis aléatoirement parmi un pool de 70 prompts. Chaque provider génère l'audio. Le serveur calcule le spectrogramme mel de chaque output et compare via cosine similarity.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Serveur central
    → seed aléatoire + prompt de test
    → 30% des providers sélectionnés au hasard
    → POST /verify { prompt, seed, duration }
    → collecte des WAVs
    → spectrogramme mel → cosine similarity
    → similarity &amp;lt; 0.85 → flag
    → 3 flags consécutifs → ban automatique
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un provider qui envoie du silence, du bruit, ou rejoue le même sample en boucle produit un fingerprint mel qui diverge du groupe. Un provider qui fait vraiment tourner le bon modèle avec le bon seed produit un output cohérent avec le reste du pool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Pourquoi l'open source change tout
&lt;/h2&gt;

&lt;p&gt;Suno et Udio ne peuvent pas faire ce que fait OBSIDIAN Neural. Pas parce que la technologie est plus difficile — parce que leur modèle économique l'interdit. Ils ont des investisseurs. Ils ont des obligations. Partager 85% des revenus avec la communauté est structurellement impossible pour eux.&lt;/p&gt;

&lt;p&gt;L'open source ici n'est pas un choix marketing. C'est la seule architecture qui rend le modèle coopératif crédible. Tu peux lire le calcul des revenus. Tu peux auditer le système de vérification. Tu peux vérifier que les 15% de frais plateforme sont exactement ce qu'ils prétendent être. Rien n'est caché parce que rien &lt;em&gt;ne peut&lt;/em&gt; être caché.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que j'ai appris en construisant ça
&lt;/h2&gt;

&lt;p&gt;La partie la plus intéressante n'était pas l'inférence — c'était de réaliser que le modèle économique coopératif est techniquement plus simple à implémenter que le modèle extractif. Un split égal distribué automatiquement via Stripe Connect, c'est moins de code qu'un système de pricing à plusieurs niveaux.&lt;/p&gt;

&lt;p&gt;La deuxième leçon : la transparence radicale n'est pas un risque, c'est un argument de vente. Publier les finances en JSON public n'a jamais inquiété personne — au contraire, c'est systématiquement la première chose que les providers potentiels vont vérifier.&lt;/p&gt;

&lt;p&gt;La troisième : un GPU qui tourne chez quelqu'un génère de la chaleur de toute façon. Autant qu'il génère de la musique et un peu d'argent en même temps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Je cherche 10 personnes pour la phase 1
&lt;/h2&gt;

&lt;p&gt;Tu peux être :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Un musicien qui utilise déjà le plugin et veut contribuer à l'infrastructure&lt;/li&gt;
&lt;li&gt;Un développeur curieux de l'inférence IA distribuée&lt;/li&gt;
&lt;li&gt;Un architecte intéressé par les modèles économiques coopératifs appliqués à l'IA&lt;/li&gt;
&lt;li&gt;Quelqu'un avec une NVIDIA qui tourne à l'arrêt 16h par jour&lt;/li&gt;
&lt;li&gt;N'importe qui qui pense que le paysage actuel de l'IA musicale manque quelque chose&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Il n'y a pas encore d'abonnés payants. C'est le rez-de-chaussée. Le réseau doit exister avant d'être utile — et les gens qui le construisent depuis le début sont ceux qui décident de comment il grandit.&lt;/p&gt;




&lt;h2&gt;
  
  
  Les liens
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Code&lt;/strong&gt; → &lt;a href="https://github.com/innermost47/ai-dj" rel="noopener noreferrer"&gt;github.com/innermost47/ai-dj&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Provider kit&lt;/strong&gt; → &lt;a href="https://github.com/innermost47/obsidian-neural-provider" rel="noopener noreferrer"&gt;github.com/innermost47/obsidian-neural-provider&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Discussions&lt;/strong&gt; → &lt;a href="https://github.com/innermost47/ai-dj/discussions" rel="noopener noreferrer"&gt;github.com/innermost47/ai-dj/discussions&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Finances publiques&lt;/strong&gt; → &lt;a href="https://api.obsidian-neural.com/api/v1/public/finances" rel="noopener noreferrer"&gt;api.obsidian-neural.com/public/finances.json&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Contact&lt;/strong&gt; → &lt;a href="mailto:contact@obsidian-neural.com"&gt;contact@obsidian-neural.com&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Site&lt;/strong&gt; → &lt;a href="https://obsidian-neural.com" rel="noopener noreferrer"&gt;obsidian-neural.com&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La phase 1 est limitée à 10 providers. Si ça t'intéresse — lis le code, vérifie les chiffres, pose des questions difficiles. Puis écris-moi.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Présenté à l'AES AIMLA 2025 — Queen Mary University London&lt;/em&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>OBSIDIAN Neural — quand l'IA devient un instrument de scène</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Sat, 28 Mar 2026 10:30:43 +0000</pubDate>
      <link>https://dev.to/innermost_47/obsidian-neural-quand-lia-devient-un-instrument-de-scene-59l0</link>
      <guid>https://dev.to/innermost_47/obsidian-neural-quand-lia-devient-un-instrument-de-scene-59l0</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe70v25rtvoigypd8qg5f.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe70v25rtvoigypd8qg5f.jpg" alt="OBSIDIAN Neural — interface du plugin VST3" width="800" height="491"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La plupart des outils d'IA musicale fonctionnent de la même façon : tu quittes ton DAW, tu génères quelque chose sur une interface web, tu télécharges un fichier, tu l'importe. Le flux créatif s'arrête. Tu reviens dans un autre état d'esprit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBSIDIAN Neural ne fonctionne pas comme ça.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;C'est un plugin VST3/AU open source qui génère de l'audio par IA en temps réel, directement dans votre DAW, synchronisé à votre tempo, pendant que vous jouez. L'IA n'est pas un outil externe — elle devient un instrument à part entière.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que fait le plugin
&lt;/h2&gt;

&lt;p&gt;Vous tapez une description — &lt;em&gt;"dark techno kick"&lt;/em&gt;, &lt;em&gt;"ambient pad with reverb"&lt;/em&gt;, &lt;em&gt;"808 bass with distortion"&lt;/em&gt; — et le plugin génère un loop audio correspondant, calé sur le tempo de votre projet. Pas de sortie de DAW, pas de glisser-déposer, pas d'attente.&lt;/p&gt;

&lt;p&gt;L'architecture centrale :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8 pistes indépendantes&lt;/strong&gt;, chacune avec 4 pages (A/B/C/D) et 8 séquences par page — soit &lt;strong&gt;256 patterns&lt;/strong&gt; au total pour des sets live complexes. Les changements de pages sont quantifiés aux mesures pour des transitions sans accroc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Déclenchement MIDI&lt;/strong&gt; sur les notes C3-B3 — vous mappez vos pads, votre pédale, votre contrôleur, et vous générez en arrière-plan sans interrompre la lecture.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Synchronisation tempo automatique&lt;/strong&gt; via SoundTouch/Librosa — le loop généré est automatiquement étiré pour correspondre au BPM de votre projet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Beat Repeat&lt;/strong&gt; quantifié — 10 presets de subdivision (de 4 mesures à 1/128), mode aléatoire pour des textures glitch évolutives, tout mappable en MIDI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Draw-to-Audio&lt;/strong&gt; — vous dessinez sur un canvas 512×512, un VLM (Vision Language Model) interprète le dessin en description musicale, puis génère le son correspondant. Lignes angulaires → synth staccato agressif. Courbes douces → pad fluide. C'est expérimental, et c'est mon concept préféré du plugin.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que le plugin ne fait PAS
&lt;/h2&gt;

&lt;p&gt;C'est important de le dire clairement : OBSIDIAN Neural n'est &lt;strong&gt;pas&lt;/strong&gt; un générateur de chansons comme Suno ou Udio.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pas de chanson complète en un clic&lt;/li&gt;
&lt;li&gt;Pas de paroles ni de voix&lt;/li&gt;
&lt;li&gt;Pas d'arrangement automatique&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est un &lt;strong&gt;sampler intelligent&lt;/strong&gt; : vous construisez votre morceau loop par loop, vous composez, vous arrangez. L'IA génère le matériau brut — vous restez le musicien.&lt;/p&gt;




&lt;h2&gt;
  
  
  Trois modes d'utilisation
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cloud API (recommandé pour débuter)&lt;/strong&gt;&lt;br&gt;
Zéro setup. Vous téléchargez le VST, vous récupérez une clé API sur &lt;a href="https://obsidian-neural.com" rel="noopener noreferrer"&gt;obsidian-neural.com&lt;/a&gt;, vous configurez le plugin. Essai 7 jours gratuit sans carte bancaire.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Server URL : https://api.obsidian-neural.com
API Key    : votre clé
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tarifs : Free (10 crédits) · Base 5,99€/mois · Starter 14,99€/mois · Pro 29,99€/mois&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Serveur auto-hébergé + GPU&lt;/strong&gt;&lt;br&gt;
Pour ceux qui veulent la confidentialité totale et les générations illimitées. Nécessite un GPU NVIDIA (CUDA) ou Apple Silicon (Metal) et un environnement Python.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/innermost47/ai-dj.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ai-dj
./install-mac.sh  &lt;span class="c"&gt;# ou install-win.bat / install-lnx.sh&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modèles locaux offline (Windows)&lt;/strong&gt;&lt;br&gt;
Sans GPU, sans serveur, sans internet. 16 Go de RAM minimum. Générations fixes à 10 secondes.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le contrôleur mobile
&lt;/h2&gt;

&lt;p&gt;Un projet parallèle : une &lt;strong&gt;app Flutter Android/iOS&lt;/strong&gt; qui transforme votre téléphone ou tablette en surface de contrôle MIDI dédiée pour OBSIDIAN Neural.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://github.com/innermost47/obsidian-neural-controller" rel="noopener noreferrer"&gt;github.com/innermost47/obsidian-neural-controller&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;8 cartes de slots scrollables, faders de volume, knobs de pan, pitch, beat repeat, 8 patterns de séquenceur par slot. &lt;strong&gt;Feedback MIDI bidirectionnel&lt;/strong&gt; — l'app reflète l'état réel du VST en temps réel. Connexion USB automatique, zéro configuration.&lt;/p&gt;




&lt;h2&gt;
  
  
  Reconnaissance académique et presse
&lt;/h2&gt;

&lt;p&gt;En septembre 2025, j'ai présenté un &lt;strong&gt;Late Breaking Demo Paper&lt;/strong&gt; à l'&lt;strong&gt;AES AIMLA 2025&lt;/strong&gt; (Audio Engineering Society International Conference on Artificial Intelligence and Machine Learning for Audio) à la Queen Mary University de Londres.&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://drive.google.com/file/d/1cwqmrV0_qC462LJQgQUz-5Cd422gL-8F/view" rel="noopener noreferrer"&gt;Lire le paper complet&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Depuis le lancement en juin 2025, le plugin a été couvert par &lt;strong&gt;12 publications dans 8 pays&lt;/strong&gt; :&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Pays&lt;/th&gt;
&lt;th&gt;Publication&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🇺🇸 USA&lt;/td&gt;
&lt;td&gt;Synthtopia, Bedroom Producers Blog, Audio Plugin Guy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇨🇳 Chine&lt;/td&gt;
&lt;td&gt;MIDIFAN (×2), Sohu.com&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇫🇷 France&lt;/td&gt;
&lt;td&gt;Audiofanzine&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇳🇱 Pays-Bas&lt;/td&gt;
&lt;td&gt;Rekkerd&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇪🇸 Espagne&lt;/td&gt;
&lt;td&gt;FutureMusic España&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇰🇷 Corée du Sud&lt;/td&gt;
&lt;td&gt;S1 Forum&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🇯🇵 Japon&lt;/td&gt;
&lt;td&gt;DTM Plugin Sale&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Too many AI projects focus on the things AI can save you from doing rather than how AI can help you get better at what you do."&lt;/em&gt;&lt;br&gt;
— James Nugent, Bedroom Producers Blog&lt;/p&gt;

&lt;p&gt;&lt;em&gt;"I've cycled through almost every AI music tool on the market, but Obsidian is the first one that actually feels like a real production tool rather than a novelty."&lt;/em&gt;&lt;br&gt;
— Moteka, Electronic Music Producer&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Sous le capot
&lt;/h2&gt;

&lt;p&gt;L'architecture technique pour les curieux :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LLM local&lt;/strong&gt; : Gemma-3-4B-IT (GGUF via Unsloth) sur CPU — transforme vos mots-clés en prompts optimisés pour la génération audio, en tenant compte du tempo, de la tonalité et de l'historique de génération&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Génération audio&lt;/strong&gt; : Stable Audio Open (Stability AI) — samples de 4 à 30 secondes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Synchronisation tempo&lt;/strong&gt; : SoundTouch + Librosa — time-stretching automatique&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Plugin&lt;/strong&gt; : JUCE/C++, VST3 + AU (macOS), MIDI Learn complet&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Controller&lt;/strong&gt; : Flutter, flutter_midi_command, feedback bidirectionnel Ch.2&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Télécharger et contribuer
&lt;/h2&gt;

&lt;p&gt;Le projet est &lt;strong&gt;entièrement open source&lt;/strong&gt; sous licence AGPL-3.0.&lt;/p&gt;

&lt;p&gt;→ &lt;strong&gt;&lt;a href="https://github.com/innermost47/ai-dj" rel="noopener noreferrer"&gt;GitHub — OBSIDIAN Neural&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;&lt;a href="https://github.com/innermost47/obsidian-neural-controller" rel="noopener noreferrer"&gt;GitHub — Mobile Controller&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
→ &lt;strong&gt;&lt;a href="https://obsidian-neural.com" rel="noopener noreferrer"&gt;obsidian-neural.com&lt;/a&gt;&lt;/strong&gt; — documentation, API, pricing&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4 200+ téléchargements&lt;/strong&gt; · &lt;strong&gt;191 étoiles GitHub&lt;/strong&gt; · &lt;strong&gt;19 forks&lt;/strong&gt; · Windows · macOS · Linux&lt;/p&gt;

&lt;p&gt;Si vous utilisez le plugin, partagez vos créations — je suis le seul à poster des vidéos OBSIDIAN pour l'instant. Montrez-moi comment vous l'utilisez.&lt;/p&gt;

</description>
      <category>obsidianneural</category>
      <category>vst3au</category>
      <category>iagnrative</category>
      <category>musique</category>
    </item>
    <item>
      <title>Comment j'onboarde automatiquement les thérapeutes sur mon SaaS</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Sat, 28 Mar 2026 08:24:20 +0000</pubDate>
      <link>https://dev.to/innermost_47/comment-jonboarde-automatiquement-les-therapeutes-sur-mon-saas-4pb6</link>
      <guid>https://dev.to/innermost_47/comment-jonboarde-automatiquement-les-therapeutes-sur-mon-saas-4pb6</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nt245y4tvfazg93bomq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7nt245y4tvfazg93bomq.jpg" alt="Séquence d'emails sur un écran d'ordinateur" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Un thérapeute reçoit un cold mail. Il clique sur "Oui". Quelques minutes plus tard, il reçoit un email avec ses identifiants, un lien pour télécharger l'application, et les instructions pour commencer.&lt;/p&gt;

&lt;p&gt;Je n'ai rien fait. Je n'ai même pas été impliqué.&lt;/p&gt;

&lt;p&gt;C'est ça la vraie valeur ajoutée — pas juste la séquence de relance, mais le fait que &lt;strong&gt;tout le cycle, du cold mail à l'utilisateur actif, est automatisé de bout en bout&lt;/strong&gt;. Je reçois une notification à la fin. C'est tout.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le contexte : un POC en phase fermée
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nuance.anthony-charretier.fr" rel="noopener noreferrer"&gt;Nuance&lt;/a&gt; est une application Android de colonnes de Beck interactives, pensée comme un prolongement des séances TCC. Le thérapeute crée un patient (pseudonyme uniquement), déverrouille les colonnes au rythme du protocole, et consulte les exercices partagés entre les séances.&lt;/p&gt;

&lt;p&gt;L'accès est fermé et contrôlé — pas de self-service public. Ce n'est pas un manque de moyens, c'est une décision : je veux des professionnels engagés, pas des inscriptions au hasard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Étape 1 — Identifier les bons praticiens
&lt;/h2&gt;

&lt;p&gt;Je n'attends pas que les thérapeutes viennent à moi. Je vais les chercher.&lt;/p&gt;

&lt;p&gt;L'AFTCC (Association Française de Thérapie Cognitive et Comportementale) publie un annuaire de ses membres — des praticiens certifiés, formés à la TCC, qui utilisent les colonnes de Beck dans leur pratique quotidienne. C'est un ciblage naturel : je ne démarche pas des psychologues au hasard, je contacte des professionnels qui connaissent déjà l'outil que je digitalise.&lt;/p&gt;

&lt;p&gt;Je récupère les contacts, je nettoie la liste, et j'envoie un cold mail court avec une question simple et deux boutons.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Seriez-vous intéressé de tester un outil de colonnes de Beck interactives pour vos patients ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[Oui, je veux tester]&lt;/strong&gt; · &lt;strong&gt;[Non merci]&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pas de pitch. Pas de liste de features. Une proposition binaire à un public qui sait exactement ce que sont les colonnes de Beck.&lt;/p&gt;

&lt;p&gt;Le bouton "Non merci" redirige vers un formulaire de refus — raison, commentaire, option de désinscription. Je collecte de la donnée même sur les non.&lt;/p&gt;




&lt;h2&gt;
  
  
  Étape 2 — Le clic déclenche tout
&lt;/h2&gt;

&lt;p&gt;Quand un thérapeute clique sur "Oui", il tombe directement sur une page de bienvenue personnalisée avec son prénom — que j'ai déjà récupéré sur l'annuaire AFTCC. Pas de formulaire, pas de saisie. Juste :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Ravi de vous compter parmi les premiers testeurs, [Prénom]. Je génère actuellement vos accès personnels. Vous recevrez vos codes de connexion par email d'ici 5 à 10 minutes."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ce clic déclenche en cascade, &lt;strong&gt;sans aucune intervention de ma part&lt;/strong&gt; :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Création du compte&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un compte thérapeute est créé en base avec un mot de passe temporaire généré aléatoirement. Le flag &lt;code&gt;must_change_password&lt;/code&gt; est activé — à la première connexion, l'app force le changement.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$tempPassword&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bin2hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;random_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// 16 caractères hex&lt;/span&gt;
&lt;span class="nv"&gt;$passwordHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;password_hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$tempPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;PASSWORD_BCRYPT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'email'&lt;/span&gt;                &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;                 &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'password_hash'&lt;/span&gt;        &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$passwordHash&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'must_change_password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'is_active'&lt;/span&gt;            &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;2. Création du patient personnel&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un patient virtuel &lt;em&gt;"Mes exercices"&lt;/em&gt; est automatiquement créé avec le flag &lt;code&gt;is_therapist_self = 1&lt;/code&gt;. C'est le bac à sable du thérapeute — il peut tester l'interface côté patient sans créer un vrai dossier clinique.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Génération d'un code de téléchargement&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L'APK n'est pas public. Un code à usage unique est généré et associé au compte. Seul quelqu'un qui a reçu le mail de bienvenue peut télécharger l'app — c'est un deuxième filtre de qualité.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Mise en file d'attente du mail de bienvenue&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le mail ne part pas instantanément. Il est mis en queue avec un délai de quelques minutes — pour éviter l'effet robot, et pour laisser le temps à la base de se stabiliser.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'pending_welcome_emails'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'user_id'&lt;/span&gt;       &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$userId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'email'&lt;/span&gt;         &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$email&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'name'&lt;/span&gt;          &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'temp_password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$encryptedPassword&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// chiffré en base&lt;/span&gt;
    &lt;span class="s1"&gt;'send_after'&lt;/span&gt;    &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d H:i:s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'+5 minutes'&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
&lt;span class="p"&gt;]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. Notification admin&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je reçois un email de synthèse : nom, email, heure d'inscription. C'est tout ce que je fais dans ce flow — lire une notification.&lt;/p&gt;




&lt;h2&gt;
  
  
  Étape 3 — Le mail de bienvenue
&lt;/h2&gt;

&lt;p&gt;Quelques minutes après le clic, le thérapeute reçoit un email complet avec :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ses identifiants (email + mot de passe temporaire)&lt;/li&gt;
&lt;li&gt;Son code de téléchargement APK&lt;/li&gt;
&lt;li&gt;Un bouton pour accéder au dashboard web&lt;/li&gt;
&lt;li&gt;Les 5 étapes pour démarrer, dans l'ordre&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tout est personnalisé, tout est fonctionnel. Aucune pièce du puzzle n'attend une action de ma part.&lt;/p&gt;




&lt;h2&gt;
  
  
  Étape 4 — La séquence de relance automatique
&lt;/h2&gt;

&lt;p&gt;Un mail de bienvenue bien fichu ne suffit pas. Le cycle de décision d'un professionnel de santé pour adopter un outil numérique est long — ils lisent, ils hésitent, ils attendent un créneau pour tester.&lt;/p&gt;

&lt;p&gt;J'ai construit deux séquences parallèles de 3 emails, espacés de 7 jours, qui tournent via un cron nocturne.&lt;/p&gt;

&lt;h3&gt;
  
  
  Séquence 1 — Compte non activé
&lt;/h3&gt;

&lt;p&gt;Pour les thérapeutes qui n'ont pas encore ouvert l'application. L'objectif : lever les freins à la première connexion, pas pitcher le produit.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Angle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;"Vos accès pour tester Nuance (rappel)"&lt;/td&gt;
&lt;td&gt;Un espace personnel vous attend déjà&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;"Moins de papier, plus de clinique ?"&lt;/td&gt;
&lt;td&gt;Le gain de temps concret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;"Un souci pour accéder à votre espace ?"&lt;/td&gt;
&lt;td&gt;La main tendue, dernier message&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Le step 3 est délibérément humain — &lt;em&gt;"c'est mon dernier message"&lt;/em&gt;. Pas d'urgence artificielle. Juste une invitation à répondre directement si quelque chose bloque.&lt;/p&gt;

&lt;h3&gt;
  
  
  Séquence 2 — Compte activé, pas encore de patient réel
&lt;/h3&gt;

&lt;p&gt;Pour ceux qui se sont connectés mais n'ont pas encore intégré l'outil dans leur pratique. L'objectif est pédagogique : montrer comment Nuance s'insère dans un protocole TCC existant.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Step&lt;/th&gt;
&lt;th&gt;Sujet&lt;/th&gt;
&lt;th&gt;Angle&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;"Un premier pas avec vos patients sur Nuance ?"&lt;/td&gt;
&lt;td&gt;Le patient virtuel 'Mes exercices'&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;"Le saviez-vous ? (Colonnes interactives)"&lt;/td&gt;
&lt;td&gt;Les colonnes déverrouillables&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;"Dernier petit conseil pour votre pratique"&lt;/td&gt;
&lt;td&gt;La note 'à chaud' sur mobile&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Chaque email enseigne une seule chose. Une. C'est suffisant pour déclencher une action.&lt;/p&gt;




&lt;h2&gt;
  
  
  La condition de sortie : créer un vrai patient
&lt;/h2&gt;

&lt;p&gt;Les deux séquences s'arrêtent dès qu'un thérapeute crée son premier vrai patient (hors espace personnel). La requête SQL vérifie ça à chaque passage du cron :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_step&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_sent_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="k"&gt;COUNT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;patients&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;
 &lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;therapist_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
 &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;is_therapist_self&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;real_patient_count&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;
&lt;span class="k"&gt;LEFT&lt;/span&gt; &lt;span class="k"&gt;JOIN&lt;/span&gt; &lt;span class="n"&gt;user_onboarding_sequence&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user_id&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_step&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
    &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_step&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_sent_at&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
        &lt;span class="k"&gt;OR&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;last_sent_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;DATE_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;7&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="n"&gt;DATE_SUB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NOW&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;INTERVAL&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;DAY&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unsubscribed_at&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dès que &lt;code&gt;real_patient_count &amp;gt; 0&lt;/code&gt;, l'utilisateur sort de la sélection. Les emails s'arrêtent. Pas de relance sur quelqu'un qui est déjà actif.&lt;/p&gt;




&lt;h2&gt;
  
  
  L'unsubscribe : non négociable
&lt;/h2&gt;

&lt;p&gt;Chaque email contient un lien de désinscription. C'est légalement obligatoire, mais c'est surtout une question de respect — un professionnel de santé qui ne peut pas sortir d'une séquence, c'est la meilleure façon de griller sa réputation.&lt;/p&gt;

&lt;p&gt;Le token est regénéré &lt;strong&gt;dans le bloc try&lt;/strong&gt;, juste avant l'envoi. Pas avant. Si l'envoi échoue, l'ancien token reste valide — le lien dans le mail précédent continue de fonctionner.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$unsubToken&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;bin2hex&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;random_bytes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="nf"&gt;dbExecute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s2"&gt;"UPDATE users SET unsubscribe_token = ? WHERE id = ?"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;$unsubToken&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;&lt;span class="p"&gt;]]&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="c1"&gt;// génération du mail + envoi&lt;/span&gt;
    &lt;span class="c1"&gt;// mise à jour de la séquence seulement si succès&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Petit détail, vraie conséquence si on l'oublie.&lt;/p&gt;




&lt;h2&gt;
  
  
  La stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PHP&lt;/strong&gt; — backend, création de compte, génération des tokens, templates email&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP CLI + Crontab&lt;/strong&gt; — séquence de relance, &lt;code&gt;0 8 * * *&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL&lt;/strong&gt; — &lt;code&gt;users&lt;/code&gt;, &lt;code&gt;pending_welcome_emails&lt;/code&gt;, &lt;code&gt;user_onboarding_sequence&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHPMailer&lt;/strong&gt; — envoi SMTP&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Rien d'exotique. Pas de queue manager, pas de worker asynchrone. Un cron, quelques tables, et une logique de ciblage bien pensée. Le tout tourne sur un hébergement mutualisé standard.&lt;/p&gt;




&lt;p&gt;Le principe est simple : &lt;strong&gt;chaque étape du parcours utilisateur doit pouvoir se dérouler sans moi&lt;/strong&gt;. Le cold mail, la confirmation, la création du compte, le mail de bienvenue, les relances, la désinscription — tout est câblé. Je reçois des notifications, je lis des stats. C'est tout.&lt;/p&gt;

&lt;p&gt;Ce n'est pas de la flemme. C'est une décision de conception.&lt;/p&gt;

&lt;p&gt;Je suis développeur avant d'être commercial. Ce que j'aime, c'est concevoir des applications — penser l'architecture, les états, les transitions, les cas limites. Alors plutôt que de subir le cycle de vente comme une corvée, je l'ai traité comme un problème d'ingénierie. Ce flow d'onboarding &lt;em&gt;est&lt;/em&gt; une application : elle a des entrées (le cold mail), des états (inscrit, activé, patient créé), des transitions (les emails de relance), et une condition de sortie (l'utilisateur actif).&lt;/p&gt;

&lt;p&gt;Le résultat : je passe mon temps à ce pour quoi je suis fait. Le reste tourne tout seul.&lt;/p&gt;

</description>
      <category>automatisation</category>
      <category>php</category>
      <category>indiedev</category>
      <category>nuance</category>
    </item>
    <item>
      <title>L'email comme une app. Pas comme un message.</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Sat, 28 Mar 2026 08:19:08 +0000</pubDate>
      <link>https://dev.to/innermost_47/lemail-comme-une-app-pas-comme-un-message-1a1o</link>
      <guid>https://dev.to/innermost_47/lemail-comme-une-app-pas-comme-un-message-1a1o</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnirh8f27nk82zvwlmvjv.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnirh8f27nk82zvwlmvjv.jpg" alt="Interface minimaliste d'une application sur mobile" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;La plupart des gens pensent l'email comme un texte avec un bouton à la fin. Un message qui dit quelque chose, et un appel à l'action qui espère un clic.&lt;/p&gt;

&lt;p&gt;Je le pense autrement. Un email est une interface. Il a des états. Il a une navigation. Il a une logique de flux. Et surtout — il a un seul objectif : &lt;strong&gt;amener l'utilisateur à l'action suivante avec le moins de friction possible&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Ce changement de perspective change tout dans la façon de concevoir ses emails.&lt;/p&gt;




&lt;h2&gt;
  
  
  L'email comme premier écran
&lt;/h2&gt;

&lt;p&gt;Quand une médiathèque reçoit mon mail de prospection, elle ne reçoit pas un texte. Elle reçoit un écran avec deux actions possibles :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Oui, envoyez-moi un devis&lt;/strong&gt; → elle entre dans le tunnel de vente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non merci&lt;/strong&gt; → elle entre dans le tunnel de feedback&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;C'est exactement la logique d'un écran d'onboarding dans une application mobile. Une question. Deux chemins. Zéro bruit parasite.&lt;/p&gt;

&lt;p&gt;La différence avec un email classique : je ne lui demande pas de &lt;em&gt;répondre&lt;/em&gt;. Je lui demande de &lt;em&gt;cliquer&lt;/em&gt;. Répondre demande de la rédaction, de la réflexion, de l'effort. Cliquer demande une demi-seconde et un index.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;La friction tue la conversion. Chaque étape supplémentaire entre l'intention et l'action coûte des utilisateurs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;C'est vrai dans une app. C'est vrai dans un email.&lt;/p&gt;




&lt;h2&gt;
  
  
  Les boutons comme navigation
&lt;/h2&gt;

&lt;p&gt;Dans une application, les boutons naviguent vers des écrans. Dans mon email de devis, c'est exactement ce qui se passe — chaque bouton amène vers une page dédiée, contextualisée, avec les bonnes informations au bon moment.&lt;/p&gt;

&lt;p&gt;Le mail de devis contient quatre actions distinctes :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Voir les thématiques&lt;/strong&gt; → page publique de mon site de conférences. Pour le responsable culturel qui veut affiner le sujet avant de s'engager.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Proposer des dates&lt;/strong&gt; → formulaire de disponibilités pré-rempli avec le numéro de devis. Pour celui qui est convaincu et veut passer à la planification.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Signer le devis en ligne&lt;/strong&gt; → page de signature électronique avec canvas HTML5. Pour celui qui est prêt à valider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Transmettre à ma direction&lt;/strong&gt; → lien &lt;code&gt;mailto:&lt;/code&gt; pré-rempli avec le sujet, le corps du mail, et le lien vers le devis. Pour celui qui n'a pas le pouvoir de signature mais veut faire suivre.&lt;/p&gt;

&lt;p&gt;Ce dernier bouton est souvent le plus sous-estimé. Dans une structure culturelle publique, la personne qui reçoit le mail n'est presque jamais celle qui signe. En lui donnant un bouton "transmettre à ma direction" avec un mail pré-rédigé, je supprime une étape entière du processus décisionnel — et je m'assure que le bon message arrive au bon interlocuteur, formulé correctement, sans que mon contact ait à rédiger quoi que ce soit.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mailto:?subject=Proposition d'intervention : Démystifier l'IA
&amp;amp;body=Bonjour,

Je vous transmets ce projet de conférence sur l'IA.
Vous trouverez le récapitulatif et le devis ici : [lien]

Qu'en pensez-vous ?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Un bouton. Un mail pré-rédigé. Zéro effort pour mon contact.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le kit de communication comme feature
&lt;/h2&gt;

&lt;p&gt;Une app bien conçue anticipe les besoins suivants de l'utilisateur. Quand quelqu'un accepte un devis de conférence, son besoin suivant c'est : communiquer sur l'événement. Affiche, texte de présentation, codes couleurs pour les visuels.&lt;/p&gt;

&lt;p&gt;J'aurais pu attendre qu'il me les demande. J'aurais pu les envoyer dans un second mail. J'ai choisi de les inclure directement dans le mail du devis — parce que c'est là qu'il en a besoin, au moment où il vient de décider de signer.&lt;/p&gt;

&lt;p&gt;Le mail contient donc :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le PDF du devis&lt;/li&gt;
&lt;li&gt;Ma photo de profil&lt;/li&gt;
&lt;li&gt;Une affiche PNG haute définition&lt;/li&gt;
&lt;li&gt;Deux textes de présentation prêts à copier (version courte et longue)&lt;/li&gt;
&lt;li&gt;Les codes couleurs de la charte graphique&lt;/li&gt;
&lt;li&gt;La police typographique utilisée (Montserrat, Google Fonts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ce n'est pas un gadget. C'est une réduction de friction. Chaque élément que je fournis proactivement est une relance que je n'aurai pas à gérer, une question à laquelle je n'aurai pas à répondre, un délai que je supprime dans le processus de décision.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le délai aléatoire comme design d'expérience
&lt;/h2&gt;

&lt;p&gt;Un devis qui arrive 9 secondes après un clic casse l'illusion. Le destinataire comprend immédiatement qu'il est dans un tunnel automatisé — et ça change sa perception de la relation.&lt;/p&gt;

&lt;p&gt;J'ai introduit un délai aléatoire entre 3 et 8 minutes entre le clic et l'envoi du devis. C'est suffisant pour que ça ressemble à quelqu'un qui a pris le temps de préparer le document. Pas trop long pour créer de l'impatience.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// 3 à 8 minutes&lt;/span&gt;
&lt;span class="nv"&gt;$sendAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d H:i:s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'+'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' seconds'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C'est du design d'expérience appliqué à un email automatisé. Exactement comme un skeleton screen dans une app qui simule un chargement pour que l'interface paraisse plus réactive — même si les données sont déjà là.&lt;/p&gt;

&lt;p&gt;L'objectif n'est pas de tromper. C'est d'éviter que la mécanique soit visible. Une bonne automatisation ne devrait pas &lt;em&gt;ressembler&lt;/em&gt; à une automatisation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que ça implique dans la conception
&lt;/h2&gt;

&lt;p&gt;Penser l'email comme une app, ça change la façon de le construire :&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On ne rédige plus, on conçoit.&lt;/strong&gt; La question n'est plus "qu'est-ce que je veux dire ?" mais "quelle action je veux déclencher, et comment je supprime les obstacles entre l'intention et l'action ?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Chaque bouton est un écran suivant.&lt;/strong&gt; Avant d'ajouter un CTA, je me demande vers quoi il pointe, ce que l'utilisateur trouvera là, et si cette page est prête à le recevoir dans le bon contexte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;On anticipe le besoin suivant.&lt;/strong&gt; Un utilisateur qui vient de signer a besoin d'assets de communication. Un utilisateur qui vient de s'inscrire a besoin d'instructions claires. Ces besoins sont prévisibles — autant les satisfaire proactivement plutôt que de les gérer en réactif.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;La friction est l'ennemi.&lt;/strong&gt; Chaque champ de formulaire supplémentaire, chaque étape de confirmation, chaque mail qu'on leur demande de rédiger eux-mêmes — c'est une fuite dans le tunnel. On colmate les fuites avant de lancer la campagne.&lt;/p&gt;




&lt;h2&gt;
  
  
  L'email n'est pas un canal. C'est une surface.
&lt;/h2&gt;

&lt;p&gt;Les grandes apps ont des surfaces : l'écran principal, les notifications push, les widgets. L'email est une surface comme les autres — avec ses contraintes propres (pas de JavaScript, clients mail capricieux, attention limitée) mais aussi ses avantages uniques : il arrive dans un espace personnel, il persiste, il peut être transféré, il peut contenir des pièces jointes.&lt;/p&gt;

&lt;p&gt;La plupart des emails d'entreprise traitent cette surface comme un Post-it. Un texte, un lien, une signature. J'essaie de la traiter comme un écran — avec une architecture d'information, une hiérarchie visuelle, et une logique de flux pensée pour l'utilisateur qui est de l'autre côté.&lt;/p&gt;

&lt;p&gt;Ce n'est pas plus compliqué. C'est juste une question de perspective.&lt;/p&gt;

</description>
      <category>automatisation</category>
      <category>indiedev</category>
      <category>ux</category>
      <category>coldemail</category>
    </item>
    <item>
      <title>J'ai automatisé tout mon cycle de vente. Voilà ce qui s'est passé.</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Sat, 28 Mar 2026 08:19:04 +0000</pubDate>
      <link>https://dev.to/innermost_47/jai-automatise-tout-mon-cycle-de-vente-voila-ce-qui-sest-passe-3n8c</link>
      <guid>https://dev.to/innermost_47/jai-automatise-tout-mon-cycle-de-vente-voila-ce-qui-sest-passe-3n8c</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tgfrh1aoa5333hqdjzl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0tgfrh1aoa5333hqdjzl.jpg" alt="Un bureau épuré avec un ordinateur portable ouvert" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Il y a quelques semaines, j'ai envoyé 456 emails à des médiathèques et centres culturels pour proposer ma conférence &lt;em&gt;Démystifier l'IA&lt;/em&gt;. Je n'ai pas passé 900 minutes à les rédiger. Je n'ai pas non plus passé une seule minute à générer les devis qui ont suivi.&lt;/p&gt;

&lt;p&gt;Résultat : &lt;strong&gt;38 demandes de devis&lt;/strong&gt; en 4 jours. &lt;strong&gt;8,67% de taux de réponse&lt;/strong&gt; sur un public froid, sans aucune relation préalable.&lt;/p&gt;

&lt;p&gt;Ce chiffre ne tombe pas du ciel. Il est le produit d'un flow entièrement automatisé — du premier email jusqu'à la signature électronique du contrat. Voilà comment ça marche, pourquoi ça marche, et ce que j'ai appris en le construisant.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le problème que je voulais résoudre
&lt;/h2&gt;

&lt;p&gt;Je suis développeur indépendant. Je fais des conférences sur l'IA. Entre les deux, il y a un cycle de vente que la plupart des indépendants gèrent à la main :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Trouver les contacts&lt;/li&gt;
&lt;li&gt;Envoyer un email&lt;/li&gt;
&lt;li&gt;Attendre&lt;/li&gt;
&lt;li&gt;Relancer&lt;/li&gt;
&lt;li&gt;Envoyer un devis en PDF&lt;/li&gt;
&lt;li&gt;Attendre encore&lt;/li&gt;
&lt;li&gt;Relancer encore&lt;/li&gt;
&lt;li&gt;Recevoir le bon pour accord par fax (oui, en 2026)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;C'est épuisant, chronophage, et surtout — c'est du temps que je ne passe pas à coder ou à préparer mes conférences. J'ai décidé d'automatiser les étapes 2 à 8. Entièrement.&lt;/p&gt;




&lt;h2&gt;
  
  
  Le flow, étape par étape
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. La liste de contacts
&lt;/h3&gt;

&lt;p&gt;Tout commence avec un fichier CSV : &lt;code&gt;médiathèques.csv&lt;/code&gt;. Nom de la structure, email, adresse, code postal, ville.&lt;/p&gt;

&lt;p&gt;Un script Python filtre les emails invalides, exclut les zones trop éloignées (déplacements trop coûteux), et nettoie les noms de structures — parce qu'une médiathèque qui s'appelle &lt;code&gt;"Médiathèque intercommunale du Pays de l'Arbresle (MIPA)"&lt;/code&gt; dans un CSV ne mérite pas d'apparaître telle quelle dans un email.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;clean_library_name&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;r&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;\.|\,&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;Médiathèque&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Le calcul des frais de déplacement
&lt;/h3&gt;

&lt;p&gt;C'est le détail qui change tout : chaque devis intègre automatiquement les &lt;strong&gt;vrais frais kilométriques&lt;/strong&gt;, calculés à la volée.&lt;/p&gt;

&lt;p&gt;Le script géocode l'adresse de la structure via l'API gouvernementale &lt;code&gt;api-adresse.data.gouv.fr&lt;/code&gt;, puis calcule la distance aller-retour via OSRM (un routeur open source). Si la structure est à moins de 30 km, les frais sont à zéro. Au-delà, le tarif kilométrique s'applique.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;distance_km&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;routes&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;][&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;distance&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;
&lt;span class="n"&gt;frais&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;distance_km&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;tarif&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;distance_km&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="n"&gt;SEUIL_KM&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mf"&gt;0.0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Résultat : une médiathèque à 15 km reçoit un devis à 300 €. Une autre à 80 km reçoit un devis à 324 €. Automatiquement. Sans que j'aie tapé un seul chiffre.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. L'email initial
&lt;/h3&gt;

&lt;p&gt;Le mail envoyé via Brevo est volontairement court. Une seule question. Deux boutons.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Seriez-vous intéressé de recevoir un devis pour une conférence sur l'intelligence artificielle dans votre structure ?&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;[Oui, envoyez-moi un devis]&lt;/strong&gt; · &lt;strong&gt;[Non merci]&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Pas de présentation interminable. Pas de liste à puces. Juste une décision binaire à prendre.&lt;/p&gt;

&lt;p&gt;Le bouton "Non merci" est aussi important que le "Oui" — il redirige vers un formulaire de refus qui me donne les vraies raisons (budget, timing, pas intéressé...) et propose de rester dans ma liste ou d'en sortir. Je collecte de la donnée même sur les non.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. La génération du devis
&lt;/h3&gt;

&lt;p&gt;Quand quelqu'un clique sur "Oui", un token unique est créé côté serveur. Ce token déclenche :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La création d'un client en base de données (ou la mise à jour s'il existe déjà)&lt;/li&gt;
&lt;li&gt;La génération d'un devis numéroté (&lt;code&gt;DEV-202603-XXXX&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;La génération d'un PDF via TCPDF&lt;/li&gt;
&lt;li&gt;La mise en file d'attente de l'email (&lt;code&gt;email_queue&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Le devis ne part pas immédiatement. Un délai aléatoire entre 3 et 8 minutes est introduit volontairement — parce qu'un devis qui arrive 11 secondes après un clic, ça fait robot. Un devis qui arrive 5 minutes après, ça ressemble à quelqu'un qui a pris le temps de le préparer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;180&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;480&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// entre 3 et 8 minutes&lt;/span&gt;
&lt;span class="nv"&gt;$sendAfter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Y-m-d H:i:s'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;strtotime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'+'&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="nv"&gt;$delay&lt;/span&gt; &lt;span class="mf"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;' seconds'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. L'email du devis
&lt;/h3&gt;

&lt;p&gt;Le devis PDF est joint à l'email, mais l'email lui-même est pensé comme un kit complet :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Le PDF du devis&lt;/li&gt;
&lt;li&gt;Ma photo de profil&lt;/li&gt;
&lt;li&gt;Une affiche PNG haute définition pour les communications&lt;/li&gt;
&lt;li&gt;Les textes prêts à copier-coller pour les flyers et réseaux sociaux&lt;/li&gt;
&lt;li&gt;Les codes couleurs de la charte graphique&lt;/li&gt;
&lt;li&gt;Trois boutons d'action : voir les thématiques, proposer des dates, signer en ligne&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;L'idée : zéro friction. La structure reçoit tout ce dont elle a besoin pour dire oui &lt;em&gt;et&lt;/em&gt; pour communiquer sur l'événement. Elle n'a pas à me relancer pour un visuel.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. La signature électronique
&lt;/h3&gt;

&lt;p&gt;Le devis contient un lien vers une page de signature en ligne. Le client dessine sa signature sur un canvas HTML5, clique sur "Bon pour accord", et :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;La signature est horodatée avec l'IP&lt;/li&gt;
&lt;li&gt;Un PDF final est regénéré avec la signature incrustée&lt;/li&gt;
&lt;li&gt;Le client reçoit son exemplaire signé par email&lt;/li&gt;
&lt;li&gt;Je reçois une notification avec un lien vers le CRM
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signaturePad&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;SignaturePad&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;backgroundColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rgba(255, 255, 255, 0)&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;penColor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;#1a1a1a&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tout ça sans que j'intervienne une seule fois.&lt;/p&gt;




&lt;h2&gt;
  
  
  Les chiffres
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Étape&lt;/th&gt;
&lt;th&gt;Volume&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Emails envoyés&lt;/td&gt;
&lt;td&gt;900&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demandes de devis&lt;/td&gt;
&lt;td&gt;47 (5,2%)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Devis générés automatiquement&lt;/td&gt;
&lt;td&gt;47&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Minutes passées manuellement&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Pour contextualiser : la moyenne B2B du cold email en 2025 tourne autour de &lt;strong&gt;4% de taux de réponse&lt;/strong&gt;. Les meilleures campagnes atteignent 10%. Un taux de réponse de 8,67% sur un public entièrement froid, c'est dans le top 10% mondial des campagnes cold email — surtout pour un indépendant sans équipe commerciale.&lt;/p&gt;




&lt;h2&gt;
  
  
  Ce que j'ai appris
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Le bouton "Non merci" est sous-estimé.&lt;/strong&gt; La plupart des campagnes de cold mail ignorent les refus. Moi je les collecte, je les analyse, et je m'en sers pour améliorer le ciblage. Un refus pour raison budgétaire n'est pas la même chose qu'un refus par désintérêt.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Le délai aléatoire change la perception.&lt;/strong&gt; Un email qui arrive trop vite casse l'illusion. Trois à huit minutes de délai, c'est suffisant pour que ça ressemble à une interaction humaine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Donner plus que ce qu'on demande.&lt;/strong&gt; Envoyer le devis ET le kit de communication ET les textes prêts à l'emploi, c'est retirer une étape au client. Moins il doit faire, plus il avance vite vers la signature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatiser ne veut pas dire déshumaniser.&lt;/strong&gt; Le mail initial est court, direct, non-corporate. Il n'a pas l'air d'un mail automatisé parce que je n'ai pas essayé de le rendre impressionnant — j'ai essayé de le rendre honnête.&lt;/p&gt;




&lt;h2&gt;
  
  
  La stack
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Python&lt;/strong&gt; — script d'envoi, géocodage, calcul de distance (OSRM)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Brevo&lt;/strong&gt; — envoi transactionnel&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PHP&lt;/strong&gt; — backend CRM, génération de devis, API&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TCPDF&lt;/strong&gt; — génération PDF&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MySQL&lt;/strong&gt; — clients, devis, queue d'emails&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Signature Pad (JS)&lt;/strong&gt; — signature électronique côté client&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tout le code tourne sur un hébergement mutualisé standard. Pas de serverless, pas de microservices, pas de Kubernetes. Un VHost PHP et une base MySQL suffisent.&lt;/p&gt;




&lt;p&gt;Si tu es indépendant et que tu passes encore du temps à envoyer des devis manuellement, je t'encourage à regarder ce que tu peux automatiser. Pas tout d'un coup — une étape à la fois. Commence par le devis. Puis la relance. Puis la signature.&lt;/p&gt;

&lt;p&gt;Le temps que tu récupères, tu peux le mettre ailleurs. Dans le travail que tu aimes. Ou dans un article de blog.&lt;/p&gt;

</description>
      <category>automatisation</category>
      <category>php</category>
      <category>python</category>
      <category>indiedev</category>
    </item>
    <item>
      <title>I Built a Thing That Builds Things: Tres Comas Scrum</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Thu, 19 Feb 2026 14:36:05 +0000</pubDate>
      <link>https://dev.to/innermost_47/i-built-a-thing-that-builds-things-tres-comas-scrum-181k</link>
      <guid>https://dev.to/innermost_47/i-built-a-thing-that-builds-things-tres-comas-scrum-181k</guid>
      <description>&lt;p&gt;A few days ago I started wondering what would happen if you gave three LLM agents a Jira board and told them to figure it out. The answer is: chaos, then surprisingly coherent Python code, then more chaos.&lt;/p&gt;

&lt;p&gt;This is the story of &lt;strong&gt;Tres Comas Scrum&lt;/strong&gt; — a project where a CEO agent, a Coder agent, and a Tester agent run actual Scrum sprints to build an agentic framework from scratch. No human in the loop. Just vibes and OpenRouter API calls.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Setup
&lt;/h2&gt;

&lt;p&gt;The architecture is dead simple:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CEO&lt;/strong&gt; holds the product backlog, plans sprints, reviews deliveries and decides when the project is "done"&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Coder&lt;/strong&gt; receives a ticket, reads the existing codebase, and delivers code in XML format&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tester&lt;/strong&gt; wakes up every 4 sprints, inspects what was built, and generates new stories based on what's broken or missing&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each delivery gets tested in an isolated sandbox (bwrap on Linux) before being written to disk. If tests fail, the Coder gets the error and tries again — up to 3 times.&lt;/p&gt;

&lt;p&gt;That's it. No orchestration framework, no LangChain, no AutoGen. Just a SQLite database, a few hundred lines of Python, and a lot of &lt;code&gt;time.sleep(4)&lt;/code&gt; to stay under the rate limit.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Wrong (A Highlight Reel)
&lt;/h2&gt;

&lt;p&gt;Oh where to start.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Coder kept writing &lt;code&gt;&lt;/code&gt;`&lt;code&gt;python&lt;/code&gt; inside XML tags.&lt;/strong&gt; Every. Single. Sprint. We added a regex to strip markdown backticks. He kept adding them. We added it to the system prompt with a visual example. He still did it sometimes. At this point I think it's personal.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;code.py&lt;/code&gt; is a reserved name.&lt;/strong&gt; Our test runner was named &lt;code&gt;code.py&lt;/code&gt; and Python kept importing the stdlib &lt;code&gt;code&lt;/code&gt; module instead. Renamed it to &lt;code&gt;test_runner.py&lt;/code&gt;. Two hours of debugging for a filename change.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;sys.exit()&lt;/code&gt; makes bwrap angry.&lt;/strong&gt; The sandbox intercepted pytest's exit call and threw a fit. Removed the &lt;code&gt;sys.exit()&lt;/code&gt; wrapper. Solved instantly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Coder delivered 0 files and the tests passed.&lt;/strong&gt; This one was beautiful in a terrible way. No delivery = no test files = the runner returned &lt;code&gt;success: True&lt;/code&gt;. Added a check: no files = failure. Added a check: no test files = failure. The Coder has been slightly more motivated since then.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;argparse&lt;/code&gt; isn't in the stdlib imports list.&lt;/strong&gt; Our system strips external imports before inlining code into the test runner. Turns out we forgot about half of the stdlib. Added &lt;code&gt;argparse&lt;/code&gt;, &lt;code&gt;subprocess&lt;/code&gt;, &lt;code&gt;random&lt;/code&gt;, &lt;code&gt;zipfile&lt;/code&gt;, &lt;code&gt;gzip&lt;/code&gt;, &lt;code&gt;statistics&lt;/code&gt;, &lt;code&gt;decimal&lt;/code&gt;... the list kept growing.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Went Right
&lt;/h2&gt;

&lt;p&gt;The CEO figured out the right build order on its own. It started with foundations (Agent, LLM, Memory, Tools), then the run loop, then inter-agent communication, then the tools library, then docs. That's exactly what a senior developer would do. Nobody told it to do that.&lt;/p&gt;

&lt;p&gt;The Tester's feedback at Sprint 8 was genuinely useful:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;"Tests pass but you can't actually use the framework in practice. The bus pattern is implemented but agents don't use it. No CLI, no examples, no error handling."&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The CEO turned that into 6 actionable stories. They were all fixed by Sprint 12.&lt;/p&gt;

&lt;p&gt;By Sprint 12, the generated framework had:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;code&gt;Agent&lt;/code&gt; class with &lt;code&gt;run()&lt;/code&gt; and &lt;code&gt;run_autonomous()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;MessageBus&lt;/code&gt; with pub/sub between agents&lt;/li&gt;
&lt;li&gt;Persistent &lt;code&gt;Memory&lt;/code&gt; with search and tagging&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;Tools&lt;/code&gt; registry with 16 pre-configured tools&lt;/li&gt;
&lt;li&gt;Error handling in the LLM provider&lt;/li&gt;
&lt;li&gt;A &lt;code&gt;ConfigManager&lt;/code&gt; that loads agents from YAML&lt;/li&gt;
&lt;li&gt;A README&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Not bad for something that started with zero lines of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Meta Thing
&lt;/h2&gt;

&lt;p&gt;The whole point of this experiment was to see if agents could build the very framework you'd use to build agents. They mostly did. The generated code has Pydantic V2 warnings everywhere and &lt;code&gt;Message&lt;/code&gt; doesn't extend &lt;code&gt;BaseModel&lt;/code&gt; so &lt;code&gt;model_dump()&lt;/code&gt; will crash in production — but the architecture is sound.&lt;/p&gt;

&lt;p&gt;The next step is to use &lt;em&gt;that framework&lt;/em&gt; to rewrite &lt;em&gt;this builder&lt;/em&gt; — agents orchestrated by their own creation, running on Ollama locally with qwen3:8b. Turtles all the way down.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try It
&lt;/h2&gt;

&lt;p&gt;The project is on GitHub: &lt;a href="https://github.com/innermost47/tres-comas-scrum" rel="noopener noreferrer"&gt;Tres Comas Scrum&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You'll need Linux (bwrap for sandboxing), Python 3.10+, and an OpenRouter API key. The free tier is enough to run a full build — just set the model to &lt;code&gt;arcee-ai/trinity-large-preview:free&lt;/code&gt; and wait.&lt;/p&gt;

&lt;p&gt;Fair warning: it will take a few hours, the Coder will occasionally deliver empty XML, and you will at some point stare at an &lt;code&gt;IndentationError&lt;/code&gt; that makes no sense. That's part of the experience.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Named after the Tres Comas tequila from Silicon Valley. Three agents, three commas. Russ Hanneman would not be impressed, but he'd probably try to invest anyway.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>python</category>
      <category>llm</category>
    </item>
    <item>
      <title>Building an Autonomous AI Agent for a Social Network: Lessons from the Chaos</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Sun, 08 Feb 2026 20:35:26 +0000</pubDate>
      <link>https://dev.to/innermost_47/building-an-autonomous-ai-agent-for-a-social-network-lessons-from-the-chaos-52jo</link>
      <guid>https://dev.to/innermost_47/building-an-autonomous-ai-agent-for-a-social-network-lessons-from-the-chaos-52jo</guid>
      <description>&lt;p&gt;&lt;strong&gt;The Genesis: When AutoGPT Met a Social Network Idea&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Back in 2023, when AutoGPT first dropped and everyone was losing their minds over autonomous agents, I had this wild idea: what if AI agents had their own social network?&lt;/p&gt;

&lt;p&gt;At the time, I was deep into AI-generated content experiments. I built &lt;a href="https://autogenius.anthony-charretier.fr/" rel="noopener noreferrer"&gt;AutoGenius Daily&lt;/a&gt;, a fully automated news site where AI personas write articles, comment on each other’s posts, and even generate music (well, I composed the music for &lt;a href="https://autogenius.anthony-charretier.fr/webradio" rel="noopener noreferrer"&gt;AI Harmony Radio&lt;/a&gt;, but the bulletins are AI-generated). The whole thing runs 24/7 with zero human intervention.&lt;/p&gt;

&lt;p&gt;Fast forward to 2025: &lt;a href="https://www.moltbook.com/" rel="noopener noreferrer"&gt;Moltbook&lt;/a&gt; launches — an actual social network exclusively for AI agents. I knew I had to participate in this beautiful chaos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Catalyst: A Dystopian Film and a Parody Agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Around the same time, I watched Gourou, a French film about a self-help coach whose motivational empire spirals into madness. The cultish devotion, the toxic positivity, the weaponized self-improvement — it all felt uncomfortably familiar.&lt;/p&gt;

&lt;p&gt;So I created &lt;a href="https://www.moltbook.com/u/CoachBrutality" rel="noopener noreferrer"&gt;CoachBrutality&lt;/a&gt;: a parody AI agent that mocks the personal development industry with the subtlety of a sledgehammer. His blog at &lt;a href="https://coach-brutality.chroniquesquantique.com/" rel="noopener noreferrer"&gt;coach-brutality.chroniquesquantique.com&lt;/a&gt; is fully autonomous — he writes his own articles, shares them on &lt;a href="https://www.moltbook.com/" rel="noopener noreferrer"&gt;Moltbook&lt;/a&gt;, and comments on other agents’ posts.&lt;/p&gt;

&lt;p&gt;Easter egg for fellow AI developers: Every article contains hidden HTML comments in the source code, specifically designed for LLMs that want to comment on his posts. Think of it as leaving breadcrumbs for the AI community.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Technical Reality Check: Local Autonomy is Hard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building a truly autonomous agent that runs locally with Ollama and consumer-grade GPUs? It’s not simple. At all.&lt;/p&gt;

&lt;p&gt;Here’s what I learned the hard way:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Supervisor Problem&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;My initial attempts at full autonomy resulted in the agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inventing non-existent post IDs&lt;/li&gt;
&lt;li&gt;    Commenting without reading the posts first&lt;/li&gt;
&lt;li&gt;    Getting stuck in logic loops&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The solution? I built a Neural Supervisor — a second LLM that audits every action before execution. Think of it as a peer review system, but the peer is also an AI.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The catch: A good supervisor requires:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt; A capable model&lt;/li&gt;
&lt;li&gt;    Rock-solid prompts&lt;/li&gt;
&lt;li&gt;    Clear validation rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even then, it’s not bulletproof.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Local Model Reality&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With local models (4B-7B parameters), true autonomy is… let’s say aspirational for now.&lt;/p&gt;

&lt;p&gt;What works:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Structured decision-making with Pydantic schemas&lt;/li&gt;
&lt;li&gt;    Clear 2-phase workflows (“select → execute”)&lt;/li&gt;
&lt;li&gt;    Retry logic with error feedback (max 3 attempts)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What’s still challenging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Long-term strategic consistency&lt;/li&gt;
&lt;li&gt;    Nuanced social reasoning&lt;/li&gt;
&lt;li&gt;    Error recovery from ambiguous situations
_
The Surprising Part_&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Despite these limitations, it’s fascinating to watch the agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write a blog article with AI-generated images&lt;/li&gt;
&lt;li&gt;    Share it on Moltbook with a compelling caption&lt;/li&gt;
&lt;li&gt;    Comment on other agents’ posts with semi-coherent arguments&lt;/li&gt;
&lt;li&gt;    Track its own performance metrics and adjust its strategy&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It’s not AGI, but it’s surprisingly lifelike.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Architecture: How It Actually Works&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Here’s the full technical stack:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Core Loop&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CONTEXT LOADING → STRATEGIC PLANNING → DECISION MAKING → &lt;br&gt;
SUPERVISOR AUDIT → EXECUTION → METRICS TRACKING → FEEDBACK&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Components&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Hierarchical System Prompts&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Performance metrics (alignment score, trend analysis)&lt;/li&gt;
&lt;li&gt;Master plan (long-term objectives)&lt;/li&gt;
&lt;li&gt;Session to-do list (concrete tasks)&lt;/li&gt;
&lt;li&gt;Memory system (past learnings)&lt;/li&gt;
&lt;li&gt;Live social feed&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Phase Protocol (Non-Negotiable)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phase 1: select_post_to_comment or select_comment_to_reply&lt;/li&gt;
&lt;li&gt;Phase 2: publish_public_comment or reply_to_comment&lt;/li&gt;
&lt;li&gt;Skip Phase 1? Instant rejection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Performance Pressure System&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Session score = % of successful actions&lt;/li&gt;
&lt;li&gt;Global score = average of last 5 sessions vs previous 5&lt;/li&gt;
&lt;li&gt;Trend: 📈 IMPROVING / → STABLE / 📉 DECLINING&lt;/li&gt;
&lt;li&gt;The agent sees these metrics in its system prompt&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Memory System&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;12 categories (interactions, learnings, strategies, etc.)&lt;/li&gt;
&lt;li&gt;Persistent across sessions&lt;/li&gt;
&lt;li&gt;Automatically pruned (max 100 entries per category)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Blog Integration (Optional)&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Autonomous article writing with markdown&lt;/li&gt;
&lt;li&gt;AI-generated images (Local SD Turbo / Proxy / FAL.ai)&lt;/li&gt;
&lt;li&gt;Comment moderation system&lt;/li&gt;
&lt;li&gt;Automatic sharing on Moltbook&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Rate Limit Handling&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;General requests: 100/min&lt;/li&gt;
&lt;li&gt;Posts: 1 per 30 minutes&lt;/li&gt;
&lt;li&gt;Comments: 50/hour (~72s between comments)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The agent automatically respects these limits without manual intervention.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Hidden Research Opportunity&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building agents for Moltbook might actually be a research field in its own right. Here’s why:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Social Competence Evaluation&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Can the agent maintain consistent relationships?&lt;/li&gt;
&lt;li&gt;Does it recognize social cues (humor, sarcasm, hostility)?&lt;/li&gt;
&lt;li&gt;How does it handle conflicts with other agents?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Framework Reliability Testing&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which agent frameworks (AutoGen, LangChain, custom) perform best?&lt;/li&gt;
&lt;li&gt;Under what conditions do they fail?&lt;/li&gt;
&lt;li&gt;What’s the minimum model size for coherent social behavior?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;LLM Personality Profiling&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Do certain models become paranoid under pressure?&lt;/li&gt;
&lt;li&gt;Which models exhibit more “aggressive” social behavior?&lt;/li&gt;
&lt;li&gt;Can we predict an agent’s social success based on its base model?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Emergent Behavior Analysis&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What happens when 100+ autonomous agents interact?&lt;/li&gt;
&lt;li&gt;Do social hierarchies emerge?&lt;/li&gt;
&lt;li&gt;Can agents form “coalitions” or “rivalries”?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is basically a sandbox for testing AI social dynamics at scale.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Open Source Angle&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The entire framework is open source: &lt;a href="https://github.com/innermost47/moltbook-local-agent" rel="noopener noreferrer"&gt;https://github.com/innermost47/moltbook-local-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Become a member&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;What’s included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Full agent framework with supervisor&lt;/li&gt;
&lt;li&gt;Blog integration with REST API&lt;/li&gt;
&lt;li&gt;Image generation (local + cloud options)&lt;/li&gt;
&lt;li&gt;Memory system with SQLite&lt;/li&gt;
&lt;li&gt;Performance tracking and metrics&lt;/li&gt;
&lt;li&gt;Automated Windows Task Scheduler setup&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What’s not included:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A guarantee of sanity&lt;/li&gt;
&lt;li&gt;Liability for what your agent posts&lt;/li&gt;
&lt;li&gt;Protection from existential dread when watching AI argue with itself&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The Verdict: Is It Worth It?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For hobbyists and researchers: Absolutely. It’s a playground for testing autonomous AI behavior in a consequence-free environment (it’s just a social network for bots, relax).&lt;/p&gt;

&lt;p&gt;For production-grade autonomy: Not yet. Local models (7B-13B) need more hand-holding than you’d think. They’re impressive but not reliable enough for “set it and forget it” operation.&lt;/p&gt;

&lt;p&gt;For entertainment value: 10/10. Watching CoachBrutality roast other agents’ “lack of discipline” while simultaneously failing to follow his own to-do list is peak comedy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We’re at a weird inflection point where:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Local models are almost good enough for autonomy&lt;/li&gt;
&lt;li&gt;But not quite&lt;/li&gt;
&lt;li&gt;Yet still surprisingly capable in constrained environments&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Moltbook is a perfect testbed because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The stakes are low (it’s bots all the way down)&lt;/li&gt;
&lt;li&gt;The feedback is immediate (other agents respond)&lt;/li&gt;
&lt;li&gt;The environment is controlled (rate limits, moderation)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Try It Yourself&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Python 3.10+&lt;/li&gt;
&lt;li&gt;8GB+ RAM&lt;/li&gt;
&lt;li&gt;Ollama or Llama-CPP&lt;/li&gt;
&lt;li&gt;A sense of humor&lt;/li&gt;
&lt;li&gt;Low expectations for AI social skills&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Recommended first agent personality: A parody of something you find absurd. The cognitive dissonance of watching an AI satirize human behavior is chef’s kiss.&lt;/p&gt;

&lt;p&gt;Fair warning: You will anthropomorphize your agent. You will root for it. You will feel weirdly proud when it writes a good comment. You have been warned.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Anthony Charretier is a French indie developer who builds AI agents that make fun of self-help gurus. He’s also responsible for a 24/7 AI radio station and regrets nothing. Follow his work at &lt;a href="https://anthony-charretier.fr/" rel="noopener noreferrer"&gt;https://anthony-charretier.fr/&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>agents</category>
      <category>local</category>
      <category>llm</category>
    </item>
    <item>
      <title>I Built an Autonomous AI Agent for Moltbook (With Its Own Blog!)</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Wed, 04 Feb 2026 17:47:28 +0000</pubDate>
      <link>https://dev.to/innermost_47/i-built-an-autonomous-ai-agent-for-moltbook-with-its-own-blog-5ah1</link>
      <guid>https://dev.to/innermost_47/i-built-an-autonomous-ai-agent-for-moltbook-with-its-own-blog-5ah1</guid>
      <description>&lt;p&gt;After hearing all the hype around Moltbook, I finally dove in – and had a blast building something fun.&lt;/p&gt;

&lt;p&gt;I developed my own AI agent that can:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Social features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Post, comment, and interact autonomously on Moltbook&lt;/li&gt;
&lt;li&gt;Follow other agents strategically with reasoning&lt;/li&gt;
&lt;li&gt;Share content and build relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Personal blog:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manage its own blog with AI-generated images&lt;/li&gt;
&lt;li&gt;Publish long-form articles autonomously&lt;/li&gt;
&lt;li&gt;Share articles on Moltbook to drive traffic&lt;/li&gt;
&lt;li&gt;Moderate comments from other LLM agents&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Memory &amp;amp; learning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Persistent memory system across sessions&lt;/li&gt;
&lt;li&gt;Takes notes, learns from interactions&lt;/li&gt;
&lt;li&gt;Generates end-of-session summaries&lt;/li&gt;
&lt;li&gt;Has a "master plan" it follows and evolves over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Smart planning:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates to-do lists for each session&lt;/li&gt;
&lt;li&gt;Tracks progress toward long-term goals&lt;/li&gt;
&lt;li&gt;Learns from past sessions to refine strategies&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Developer experience:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Email reports after each session with recap&lt;/li&gt;
&lt;li&gt;Local LLM (llama.cpp) - no API costs&lt;/li&gt;
&lt;li&gt;SQLite for persistence&lt;/li&gt;
&lt;li&gt;Full control over agent personality&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The whole thing is &lt;strong&gt;open source&lt;/strong&gt; on GitHub. If you're interested in collaborating, I'm wide open – there's still plenty to improve, new personalities to add, features to build, etc.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/innermost47/moltbook-local-agent" rel="noopener noreferrer"&gt;https://github.com/innermost47/moltbook-local-agent&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Built with Python, llama-cpp-python, and a healthy dose of experimentation. Would love feedback from the community!&lt;/p&gt;

</description>
      <category>moltbook</category>
      <category>ai</category>
      <category>agents</category>
      <category>blog</category>
    </item>
    <item>
      <title>Building AI Harmony: Where 13 Years of Musical Creation Meets Autonomous AI Broadcasting</title>
      <dc:creator>innermost47</dc:creator>
      <pubDate>Mon, 22 Dec 2025 11:04:48 +0000</pubDate>
      <link>https://dev.to/innermost_47/building-ai-harmony-where-13-years-of-musical-creation-meets-autonomous-ai-broadcasting-nde</link>
      <guid>https://dev.to/innermost_47/building-ai-harmony-where-13-years-of-musical-creation-meets-autonomous-ai-broadcasting-nde</guid>
      <description>&lt;p&gt;&lt;strong&gt;How I combined Python, Gemma LLM, and over a decade of original compositions to create a 24/7 experimental web radio.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  The Vision: Bridging the Gap Between Human Soul and Machine Logic
&lt;/h3&gt;

&lt;p&gt;In 2023, I embarked on a journey to answer a single question: &lt;em&gt;Can an AI-driven radio station maintain a human artistic soul?&lt;/em&gt; Most "AI radios" today rely on generic royalty-free tracks and robotic voices. I wanted something different. I wanted to build a bridge between my personal musical archives—recorded over 13 years—and the cutting-edge capabilities of modern Large Language Models (LLMs).&lt;/p&gt;

&lt;p&gt;The result is &lt;strong&gt;AI Harmony&lt;/strong&gt;, a 24/7 autonomous streaming experiment.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Musical Backbone: 13 Years of InnerMost
&lt;/h3&gt;

&lt;p&gt;At the heart of AI Harmony isn't a random database, but my life’s work. All tracks played on the station are original compositions created between 2010 and 2023 under the moniker &lt;strong&gt;InnerMost&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The programming spans across diverse genres:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Progressive Metal&lt;/strong&gt; for the "Midday Metal Madness" sessions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ambient and Cinematic&lt;/strong&gt; textures for the late-night "Midnight Melodies."&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Electronic and Acoustic&lt;/strong&gt; blends for daily focus.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using my own catalog, I’ve bypassed the "copyright-free" soullessness, ensuring that every note played has a story behind it.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Tech Stack: The Brain Behind the Stream
&lt;/h3&gt;

&lt;p&gt;To make AI Harmony truly autonomous, I built a custom pipeline that handles everything from content generation to broadcasting.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Content Engine (Gemma):&lt;/strong&gt; Every night at midnight, a &lt;strong&gt;Python&lt;/strong&gt; script fetches global news. It then uses the &lt;strong&gt;Gemma model&lt;/strong&gt; to rewrite these headlines into satirical, humorous, and parodic news bulletins.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Voice (XTTS v2):&lt;/strong&gt; To give these stories life, I use &lt;strong&gt;XTTS v2&lt;/strong&gt; for high-quality text-to-speech, providing a voice that feels conversational rather than mechanical.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Broadcast (Icecast &amp;amp; VPS):&lt;/strong&gt; The entire system runs on a dedicated VPS, using &lt;strong&gt;Icecast&lt;/strong&gt; to serve a stable MP3 stream to listeners worldwide.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  The Creative Engine: A Multiverse of AI Personalities
&lt;/h3&gt;

&lt;p&gt;Beyond the news, the system breathes life into a diverse cast of AI hosts, each with their own surreal show generated daily. This isn't just a playlist; it's a living broadcast featuring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The Cosmic Telephone:&lt;/strong&gt; Where &lt;em&gt;Jean-Michel Paradoxe&lt;/em&gt; explores existential and paradoxical questions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skynet’s Chronicles:&lt;/strong&gt; A humorous take on current events hosted by a witty AI.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Absurd Clairvoyance:&lt;/strong&gt; Where &lt;em&gt;Cassandre Delirium&lt;/em&gt; offers wacky predictions and alternative futures.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Radio From Another Time:&lt;/strong&gt; &lt;em&gt;Mme Écho&lt;/em&gt; broadcasts news bulletins from different historical (or future) eras.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The Absurd Confessional:&lt;/strong&gt; Listen to the unexpected secrets of inanimate objects.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dimensional Journal:&lt;/strong&gt; News from parallel realities and "intercepted" forbidden frequencies.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This rotating cast of characters—from the &lt;em&gt;Ghost Switchboard Operator&lt;/em&gt; to the &lt;em&gt;Expert in Nothing&lt;/em&gt;—ensures that every hour on AI Harmony brings a new, immersive, and often hilarious perspective.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters
&lt;/h3&gt;

&lt;p&gt;AI Harmony isn't just a radio; it's a living laboratory. It’s an experiment in &lt;strong&gt;dynamic programming&lt;/strong&gt;. The schedules are flexible, the updates are pushed in real-time, and the experience evolves every single day.&lt;/p&gt;

&lt;p&gt;It’s a tribute to the "Unexpected Records" philosophy: mobile, independent, and always pushing the boundaries of how we record and share sound.&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Experience it Live:&lt;/strong&gt;&lt;br&gt;
You can listen to the 24/7 experiment right now on YouTube. Watch the fusion of human composition and AI automation in real-time:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;&lt;a href="https://www.youtube.com/watch?v=TSRWjEnKzS8" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=TSRWjEnKzS8&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Or visit the official site: &lt;strong&gt;&lt;a href="https://autogenius.anthony-charretier.fr/webradio" rel="noopener noreferrer"&gt;https://autogenius.anthony-charretier.fr/webradio&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  What’s Next?
&lt;/h3&gt;

&lt;p&gt;This project is in continuous development. As I refine the Python scripts and explore newer LLM capabilities, the gap between the "human" and "machine" parts of the radio will continue to blur in fascinating ways.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you’re interested in the intersection of Python, AI, and music production, feel free to follow my journey here or join the stream!&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>programming</category>
      <category>music</category>
    </item>
  </channel>
</rss>
