<?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: Mathieu Ledru</title>
    <description>The latest articles on DEV Community by Mathieu Ledru (@matyo91).</description>
    <link>https://dev.to/matyo91</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%2F182978%2F61c41098-10ce-4833-acf3-b00cc42f852c.jpeg</url>
      <title>DEV Community: Mathieu Ledru</title>
      <link>https://dev.to/matyo91</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/matyo91"/>
    <language>en</language>
    <item>
      <title>💡 I created a GDPR-compliant AI app in 1 hour with Symfony</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 03 Apr 2026 06:41:54 +0000</pubDate>
      <link>https://dev.to/matyo91/i-created-a-gdpr-compliant-ai-app-in-1-hour-with-symfony-3dpl</link>
      <guid>https://dev.to/matyo91/i-created-a-gdpr-compliant-ai-app-in-1-hour-with-symfony-3dpl</guid>
      <description>&lt;p&gt;Today, many developers use AI to generate code.&lt;/p&gt;

&lt;p&gt;The question we are addressing here is the following:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;How ​​to transform an idea into an executable system?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's normal.&lt;/p&gt;

&lt;p&gt;Because we learned to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;coding features&lt;/li&gt;
&lt;li&gt;write functions&lt;/li&gt;
&lt;li&gt;connect APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But not to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;structuring an idea so that it can be executed&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At Darkwood, we never start with the code.&lt;/p&gt;

&lt;p&gt;We begin with a much more fundamental step:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;the reasoning&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In this article, we will look at the following in concrete terms:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How to transform an idea into a usable unit&lt;/li&gt;
&lt;li&gt;How to use AI to execute this idea&lt;/li&gt;
&lt;li&gt;How to apply this in a real project: &lt;strong&gt;SketchUp Shape&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  🧠 1. An idea is not code
&lt;/h2&gt;

&lt;p&gt;When you think:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Créer une application”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Your reflex as a developer is often:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Okay, I’m going to code an API, a database, etc.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 Bad starting point.&lt;/p&gt;

&lt;p&gt;An idea is not yet something you can execute.&lt;/p&gt;

&lt;p&gt;That's right:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 a &lt;strong&gt;vague intention&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  💡 The right mental model
&lt;/h2&gt;

&lt;p&gt;At Darkwood, we believe that:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;one idea = one task&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;No more, no less.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Créer une application”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;becomes :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: create_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may seem trivial.&lt;/p&gt;

&lt;p&gt;But this is a significant change:&lt;/p&gt;

&lt;p&gt;👉 You no longer think in terms of “projects”&lt;br&gt;
👉 You think in &lt;strong&gt;executable units&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  ⚙️ Why this method works: Church, Turing, and the idea as an executable unit
&lt;/h1&gt;

&lt;p&gt;One might think that “prompting an AI” is a recent, almost purely practical topic, linked to current LLM news.&lt;/p&gt;

&lt;p&gt;In reality, the problem is much older.&lt;/p&gt;

&lt;p&gt;When a developer takes an idea and tries to turn it into an executable system, they always encounter the same question:&lt;/p&gt;

&lt;p&gt;How do we move from an abstract intention to a form that the machine can actually process?&lt;/p&gt;

&lt;p&gt;This is exactly the type of question that lies at the root of theoretical computer science.&lt;/p&gt;

&lt;p&gt;In a previous Darkwood article - &lt;a href="https://blog.darkwood.com/index.php/fr/article/create-a-lambda-interpreter-in-php-1" rel="noopener noreferrer"&gt;&lt;em&gt;Create a Lambda Interpreter in PHP&lt;/em&gt;&lt;/a&gt; - we already explored this boundary between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;the idea of ​​a calculation&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;and &lt;strong&gt;its actual execution by a machine&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This article started with Alonzo Church's λ-calculus, then linked it to the Turing machine, recalling a fundamental point:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The λ-calculus and the Turing machine are two equivalent models of computation&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Church provides a &lt;strong&gt;conceptual model&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Turing provides a &lt;strong&gt;model of execution&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's exactly what interests us here.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 Church: before execution, a conceivable form is necessary
&lt;/h2&gt;

&lt;p&gt;Alonzo Church does not start from a machine.&lt;br&gt;
It stems from a much deeper problem:&lt;/p&gt;

&lt;p&gt;What is a function?&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;and more broadly:&lt;/p&gt;

&lt;p&gt;What is a calculation?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The λ-calculus responds to this with a radical idea:&lt;/p&gt;

&lt;p&gt;Any calculation can be expressed as an abstraction and application of functions.&lt;/p&gt;

&lt;p&gt;In this model:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A function is a transformation&lt;/li&gt;
&lt;li&gt;a value can be passed to another function&lt;/li&gt;
&lt;li&gt;and evaluation consists of applying functions to one another&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the theoretical root of many things we use today without thinking about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;functional programming&lt;/li&gt;
&lt;li&gt;the currying&lt;/li&gt;
&lt;li&gt;closures&lt;/li&gt;
&lt;li&gt;the combinators&lt;/li&gt;
&lt;li&gt;pure transformations&lt;/li&gt;
&lt;li&gt;DSLs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the article on the lambda interpreter in PHP, this idea was presented in a very concrete way:&lt;br&gt;
We started with an expression, tokenized it, parsed it, built an AST, and then evaluated it.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;before a system executes something,&lt;br&gt;
First, it must &lt;strong&gt;understand a form&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is exactly the point that interests us regarding AI.&lt;/p&gt;

&lt;p&gt;When you give an LLM a sentence like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Create a house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You haven't given it an execution yet.&lt;br&gt;
You give it an &lt;strong&gt;abstract form&lt;/strong&gt;, an intention, a request that is still insufficiently structured.&lt;/p&gt;

&lt;p&gt;And that's where Church's intuition becomes useful to us.&lt;/p&gt;
&lt;h3&gt;
  
  
  Developer translation
&lt;/h3&gt;

&lt;p&gt;When we talk about ideas in this article, we are not talking about vague inspiration or brainstorming.&lt;/p&gt;

&lt;p&gt;We are already talking about a &lt;strong&gt;manipulable abstraction&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;An idea must become a unit upon which a system can reason.&lt;/p&gt;

&lt;p&gt;That's why, at Darkwood, we make an initial mental shift:&lt;/p&gt;

&lt;p&gt;An idea is not yet code.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An idea is already a transformation in progress.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, to put it another way:&lt;/p&gt;

&lt;p&gt;An idea is a potential task&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚙️ Turing: once the form is defined, it must be executed
&lt;/h2&gt;

&lt;p&gt;Church formalizes calculation on the side of abstraction.&lt;br&gt;
Turing, however, answers a different question:&lt;/p&gt;

&lt;p&gt;What does a machine capable of performing this calculation look like?&lt;/p&gt;

&lt;p&gt;His answer is famous:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a memory strip&lt;/li&gt;
&lt;li&gt;a reading head&lt;/li&gt;
&lt;li&gt;a current state&lt;/li&gt;
&lt;li&gt;transition rules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The power of the model does not come from its complexity, but rather from its simplicity.&lt;/p&gt;

&lt;p&gt;A Turing machine reads a cell, takes its state into account, applies a rule, possibly writes something, and then moves on.&lt;/p&gt;

&lt;p&gt;It's an extremely simple model, but sufficient to reason about what a machine can do.&lt;/p&gt;

&lt;p&gt;What interests us here is not teaching the entire theory of automata.&lt;br&gt;
It's about recovering a very concrete intuition:&lt;/p&gt;

&lt;p&gt;An executable system needs readable units.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;and a clear mechanism for switching from one state to the other&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is where the link with modern work on ideas, tasks, and AI agents becomes very concrete.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔁 What Church and Turing teach us about working with AI
&lt;/h2&gt;

&lt;p&gt;The essential point is this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Church teaches us to think of calculation as &lt;strong&gt;transformation&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Turing teaches us to think of computation as &lt;strong&gt;structured execution&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you combine the two, you get a much healthier way of working with AI.&lt;/p&gt;

&lt;p&gt;We stop thinking:&lt;/p&gt;

&lt;p&gt;“I’m going to ask the model for some code”&lt;/p&gt;

&lt;p&gt;And we start to think:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“I’m going to give him a structured unit of work,&lt;br&gt;
that he will be able to transform,&lt;br&gt;
then another system can execute”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's exactly what we do at Darkwood.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧩 Darkwood translation: an idea becomes a task
&lt;/h2&gt;

&lt;p&gt;At this stage, we can simplify the model without betraying it.&lt;/p&gt;

&lt;p&gt;Here is the translation we are using as a basis:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Theoretical concept&lt;/th&gt;
&lt;th&gt;Darkwood interpretation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Abstraction&lt;/td&gt;
&lt;td&gt;Structured idea&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Function&lt;/td&gt;
&lt;td&gt;Transformation&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory slot&lt;/td&gt;
&lt;td&gt;Task&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Strip&lt;/td&gt;
&lt;td&gt;To-do list / stack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Read&lt;/td&gt;
&lt;td&gt;Execute&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Transition&lt;/td&gt;
&lt;td&gt;Change from one state to another&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;This gives us a simple rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;an idea becomes a task&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;a task becomes a readable unit&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A readable unit can be executed.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is this change of perspective that matters.&lt;/p&gt;

&lt;p&gt;Because as long as an idea remains only in your head, it is unusable by the system:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;nor your terminal&lt;/li&gt;
&lt;li&gt;nor your IDE&lt;/li&gt;
&lt;li&gt;nor your LLM&lt;/li&gt;
&lt;li&gt;nor your orchestrator&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;cannot work on it properly.&lt;/p&gt;

&lt;p&gt;It therefore needs to be given a form.&lt;/p&gt;
&lt;h2&gt;
  
  
  💡 The idea as a unit of calculation
&lt;/h2&gt;

&lt;p&gt;This is where our method becomes truly meaningful.&lt;/p&gt;

&lt;p&gt;When we say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Créer une application
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It's not a system yet.&lt;br&gt;
This is not yet architecture.&lt;br&gt;
This is not yet a usable prompt.&lt;/p&gt;

&lt;p&gt;But it's not "nothing" either.&lt;/p&gt;

&lt;p&gt;That's already it:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a unit of calculation to be specified&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;At Darkwood, we put it through a nomination and reduction stage.&lt;/p&gt;

&lt;p&gt;For example :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: create_app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task: generate_sketchup_shape
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;From this point on, the machine - or the system of agents - no longer manipulates just a human sentence.&lt;br&gt;
She is manipulating an identifiable task.&lt;/p&gt;

&lt;p&gt;And once you can identify a task, you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;store it&lt;/li&gt;
&lt;li&gt;reread it&lt;/li&gt;
&lt;li&gt;reproduce it&lt;/li&gt;
&lt;li&gt;transmit it&lt;/li&gt;
&lt;li&gt;cut it&lt;/li&gt;
&lt;li&gt;parallelize it&lt;/li&gt;
&lt;li&gt;to orchestrate it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's it, that's the real change.&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 Why this is so useful for a developer
&lt;/h2&gt;

&lt;p&gt;A developer often tends to jump directly to implementation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;create a folder&lt;/li&gt;
&lt;li&gt;Install Symfony&lt;/li&gt;
&lt;li&gt;connect an API&lt;/li&gt;
&lt;li&gt;write an order&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But if the initial idea has not been modeled correctly, everything else becomes unstable.&lt;/p&gt;

&lt;p&gt;This leads to what many people experience with LLMs today:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;vague prompts&lt;/li&gt;
&lt;li&gt;unclear outputs&lt;/li&gt;
&lt;li&gt;fragile structures&lt;/li&gt;
&lt;li&gt;projects that “work”, but lack coherence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The theory of Church and Turing reminds us of something very simple:&lt;/p&gt;

&lt;p&gt;The quality of the execution depends on the quality of the initial representation.&lt;/p&gt;

&lt;p&gt;In other words:&lt;/p&gt;

&lt;p&gt;If you want to improve the performance of an AI,&lt;br&gt;
First, you need to represent your idea better.&lt;/p&gt;

&lt;p&gt;And that's precisely what we're going to do next with SketchUp Shape:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;starting from an intention&lt;/li&gt;
&lt;li&gt;convert it into a task&lt;/li&gt;
&lt;li&gt;to structure it&lt;/li&gt;
&lt;li&gt;transform it into a design&lt;/li&gt;
&lt;li&gt;then only in code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🧭 The rule to remember
&lt;/h2&gt;

&lt;p&gt;If this entire section had to be condensed into a single sentence, it would be this:&lt;/p&gt;

&lt;p&gt;A useful idea for AI is not an inspiration.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;It's a sufficiently clear abstraction to become an executable task&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And that's where Church and Turing cease to be distant theory.&lt;/p&gt;

&lt;p&gt;They become a practical model for the modern developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Church helps you think about form&lt;/li&gt;
&lt;li&gt;Turing helps you think about execution&lt;/li&gt;
&lt;li&gt;Darkwood helps you connect the two&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  📚 Concrete example
&lt;/h1&gt;

&lt;p&gt;You have several ideas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- créer une app
- construire une API
- générer un modèle 3D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You can represent them as a stack:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Stack:
- create_app
- build_api
- generate_model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And then, everything becomes simpler:&lt;/p&gt;

&lt;p&gt;You can handle each task &lt;strong&gt;one by one&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Or&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;in parallel&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  ⚡ 2. Your brain already works like this
&lt;/h1&gt;

&lt;p&gt;You don't need to learn a new system.&lt;/p&gt;

&lt;p&gt;👉 You're already using it.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 Simple case: different tasks
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task A: répondre à un message
Task B: installer un package
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 No link&lt;br&gt;
👉 You can easily switch between them&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Complicated case: similar tasks
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task A: coder une API
Task B: refactor la même API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;👉 Now, things are getting tough&lt;/p&gt;

&lt;p&gt;For what ?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;same context&lt;/li&gt;
&lt;li&gt;same mental variables&lt;/li&gt;
&lt;li&gt;same files&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;confusion&lt;/li&gt;
&lt;li&gt;errors&lt;/li&gt;
&lt;li&gt;fatigue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  💥 What this implies
&lt;/h2&gt;

&lt;p&gt;Your brain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;has limited memory&lt;/li&gt;
&lt;li&gt;handles too much context poorly&lt;/li&gt;
&lt;li&gt;saturates quickly&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 So:&lt;/p&gt;

&lt;p&gt;You can't manage many complex tasks at the same time.&lt;/p&gt;
&lt;h1&gt;
  
  
  🧩 3. The real problem: reproducibility
&lt;/h1&gt;

&lt;p&gt;A task is only valuable if you can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;find her&lt;/li&gt;
&lt;li&gt;to revive it&lt;/li&gt;
&lt;li&gt;share it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Otherwise, it stays in your head&lt;br&gt;
👉 and she disappears&lt;/p&gt;
&lt;h2&gt;
  
  
  🧠 Darkwood Approach
&lt;/h2&gt;

&lt;p&gt;We introduce a simple idea:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;one task = one pointer&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  In concrete terms
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;You write your task in Joplin&lt;/li&gt;
&lt;li&gt;she has an ID&lt;/li&gt;
&lt;li&gt;This ID becomes your “pointer”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And then:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;in your terminal → you are referencing this task&lt;/li&gt;
&lt;li&gt;in your IDE → same&lt;/li&gt;
&lt;li&gt;in your AI → same&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;you manipulate &lt;strong&gt;the same object&lt;/strong&gt;, everywhere&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  💡 What this changes
&lt;/h2&gt;

&lt;p&gt;You no longer say:&lt;/p&gt;

&lt;p&gt;“I’m going to work on my idea.”&lt;/p&gt;

&lt;p&gt;You say:&lt;/p&gt;

&lt;p&gt;“I will carry out this task”&lt;/p&gt;

&lt;p&gt;And that's much more powerful.&lt;/p&gt;
&lt;h1&gt;
  
  
  ⚙️ 4. AI: not a magic tool, an execution system
&lt;/h1&gt;

&lt;p&gt;Today, many developers use AI like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“generate a function for me”&lt;/li&gt;
&lt;li&gt;“write me a class”&lt;/li&gt;
&lt;li&gt;“Fixes this bug”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It works.&lt;/p&gt;

&lt;p&gt;But you remain within a certain logic:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;responsive&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🧠 Darkwood Approach
&lt;/h2&gt;

&lt;p&gt;We completely change the perspective:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 AI is becoming an &lt;strong&gt;execution system&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🏗 We model like a business
&lt;/h2&gt;

&lt;p&gt;Rather than “magical agents”, a simple structure is used:&lt;/p&gt;
&lt;h3&gt;
  
  
  👤 You (human)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;you define the intention&lt;/li&gt;
&lt;li&gt;you pose the problem&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🧠 AI Architect
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;he understands your intention&lt;/li&gt;
&lt;li&gt;he breaks it down into tasks&lt;/li&gt;
&lt;li&gt;he decides how to organize the system&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ⚙️ Agents
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;they execute&lt;/li&gt;
&lt;li&gt;they produce code&lt;/li&gt;
&lt;li&gt;they transform the data&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  💡 Key Rule
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;The prompt = your intention&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If your prompt is unclear:&lt;/p&gt;

&lt;p&gt;👉 the system is unclear&lt;/p&gt;

&lt;p&gt;If your prompt is structured:&lt;/p&gt;

&lt;p&gt;👉 the system becomes structured&lt;/p&gt;
&lt;h2&gt;
  
  
  🔥 Example
&lt;/h2&gt;

&lt;p&gt;❌ Bad prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Generate a house”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Good prompt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Create a structured architectural design of a house,
with walls, roof, proportions and constraints,
then generate SketchUp Ruby code from it”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Here, you give:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a direction&lt;/li&gt;
&lt;li&gt;a structure&lt;/li&gt;
&lt;li&gt;a clear objective&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🧠 What you need to remember
&lt;/h1&gt;

&lt;p&gt;👉 You don't need to be better at coding&lt;/p&gt;

&lt;p&gt;👉 You need to get better at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;structuring&lt;/li&gt;
&lt;li&gt;intention&lt;/li&gt;
&lt;li&gt;orchestration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And that's exactly what we're going to apply now with:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;SketchUp Shape&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  🚀 5. Practical application: SketchUp Shape
&lt;/h1&gt;

&lt;p&gt;Project :&lt;br&gt;
👉 &lt;a href="https://github.com/matyo91/sketchup-shape" rel="noopener noreferrer"&gt;https://github.com/matyo91/sketchup-shape&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🎯 Objective
&lt;/h2&gt;

&lt;p&gt;Transformer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;“Create a house”
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in:&lt;/p&gt;

&lt;p&gt;👉 Ruby script executable in &lt;a href="https://sketchup.trimble.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 Why SketchUp?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;3D modeling tool&lt;/li&gt;
&lt;li&gt;Documented Ruby API:
→ &lt;a href="https://ruby.sketchup.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp Ruby API&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;extensible (plugins, scripts)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🎓 Context
&lt;/h2&gt;

&lt;p&gt;I personally learned SketchUp with&lt;br&gt;
&lt;a href="https://www.youtube.com/@sebastienmaison?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Sébastien Maison (YouTube)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 Here, the goal is not to use their AI:&lt;/p&gt;

&lt;p&gt;→ &lt;a href="https://sketchup.trimble.com/fr/ai-in-sketchup?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Official SketchUp AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 But to build &lt;strong&gt;our own system&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  ⚙️ 6. Pipeline: from idea to (concrete) 3D model
&lt;/h1&gt;

&lt;p&gt;Before going any further, let's take a real-life example.&lt;/p&gt;

&lt;p&gt;👉 Here, we're not talking about an abstract API&lt;br&gt;
👉 We're talking about &lt;strong&gt;generating a 3D object in SketchUp&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  🧱 A little background: why SketchUp?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sketchup.trimble.com/fr?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp&lt;/a&gt; is a widely used 3D modeling tool:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architecture&lt;/li&gt;
&lt;li&gt;design&lt;/li&gt;
&lt;li&gt;prototyping&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Personally, I discovered SketchUp thanks to &lt;a href="https://www.youtube.com/@sebastienmaison?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Sébastien Maison&lt;/a&gt;, with whom I took a course.&lt;/p&gt;

&lt;p&gt;👉 I modeled a house there “by hand”&lt;/p&gt;

&lt;p&gt;And that's where the idea came from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 “What if I could generate that directly with code?”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  ⚠️ Why not use SketchUp's native AI?
&lt;/h2&gt;

&lt;p&gt;SketchUp already offers AI:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://sketchup.trimble.com/fr/ai-in-sketchup?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp AI&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But that's not the point here.&lt;/p&gt;

&lt;p&gt;👉 We are developers.&lt;/p&gt;

&lt;p&gt;👉 We want:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;to understand&lt;/li&gt;
&lt;li&gt;control&lt;/li&gt;
&lt;li&gt;automate&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So we go through:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;SketchUp Ruby API&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;
  
  
  🧠 The technical entrance
&lt;/h2&gt;

&lt;p&gt;To do this, SketchUp explains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.sketchup.com/learn?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Developer documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ruby.sketchup.com/?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Ruby API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 In concrete terms:&lt;/p&gt;

&lt;p&gt;You write Ruby like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;Sketchup&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;active_model&lt;/span&gt;
&lt;span class="n"&gt;entities&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;entities&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And you build:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faces&lt;/li&gt;
&lt;li&gt;volumes&lt;/li&gt;
&lt;li&gt;groups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  🧩 Resources used
&lt;/h2&gt;

&lt;p&gt;To make the AI ​​more reliable, I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/SketchUp/ruby-api-stubs?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Ruby API Stubs&lt;/a&gt;&lt;br&gt;
👉 to give the LLM a clear view of the available objects&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/SketchUp/sketchup-ruby-api-tutorials/tree/main/examples?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;Official examples&lt;/a&gt;&lt;br&gt;
👉 to understand the real patterns&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you want to go further:&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://extensions.sketchup.com/extension/add?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp Extensions&lt;/a&gt;&lt;br&gt;
→ You can package your code as a plugin&lt;/p&gt;
&lt;h2&gt;
  
  
  ⚠️ Important prerequisite
&lt;/h2&gt;

&lt;p&gt;To run Ruby:&lt;/p&gt;

&lt;p&gt;👉 You must use the desktop version:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://sketchup.trimble.com/fr/products/sketchup-pro/trial?utm_source=chatgpt.com" rel="noopener noreferrer"&gt;SketchUp Pro Trial&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;👉 The web version does not allow this (or only in very limited ways)&lt;/p&gt;
&lt;h1&gt;
  
  
  🔁 Pipeline Darkwood (applied)
&lt;/h1&gt;

&lt;p&gt;Now that we have the context, here is the actual pipeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intention
   ↓
Design (LLM #1)
   ↓
Code (LLM #2)
   ↓
SketchUp
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Step 1: Intention
&lt;/h2&gt;

&lt;p&gt;You start with a simple idea:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/console app:generate-shape &lt;span class="s2"&gt;"Create a house"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Nothing more.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧱 Step 2: Design (LLM #1)
&lt;/h2&gt;

&lt;p&gt;Here, AI does not code.&lt;/p&gt;

&lt;p&gt;👉 She &lt;strong&gt;thinks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;She acts like an architect:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"house"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"structure"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"walls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"roof"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 She decides:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;proportions&lt;/li&gt;
&lt;li&gt;elements&lt;/li&gt;
&lt;li&gt;of the structure&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ⚙️ Step 3: Code (LLM #2)
&lt;/h2&gt;

&lt;p&gt;Only then:&lt;/p&gt;

&lt;p&gt;👉 a second AI transforms this plan into code&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start_operation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'House'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kp"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;commit_operation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 She acts like a developer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It uses the SketchUp API&lt;/li&gt;
&lt;li&gt;she constructs the geometry&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ⚠️ 7. Why 2 LLMs (and not 1)
&lt;/h1&gt;

&lt;p&gt;This is one of the most important parts.&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Naive approach
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idée → code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 What you get:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;inconsistent&lt;/li&gt;
&lt;li&gt;unpredictable&lt;/li&gt;
&lt;li&gt;difficult to correct&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ Darkwood Approach
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idée → design → code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 You separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🧠 the &lt;strong&gt;what&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;⚙️ the &lt;strong&gt;comment&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 It's exactly like in a team:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;architect → decides&lt;/li&gt;
&lt;li&gt;developer → implements&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🧠 8. The real problem encountered
&lt;/h1&gt;

&lt;p&gt;When I launched:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Create a house
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;technically valid&lt;/li&gt;
&lt;li&gt;but visually… false&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 It wasn't a house&lt;/p&gt;

&lt;h2&gt;
  
  
  ❌ Why?
&lt;/h2&gt;

&lt;p&gt;Because AI did this:&lt;/p&gt;

&lt;p&gt;“A house = shapes”&lt;/p&gt;

&lt;p&gt;👉 She stacked:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;cubes&lt;/li&gt;
&lt;li&gt;a roof&lt;/li&gt;
&lt;li&gt;without logic&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  💥 The real problem
&lt;/h2&gt;

&lt;p&gt;AI doesn't understand:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;gravity&lt;/li&gt;
&lt;li&gt;the proportions&lt;/li&gt;
&lt;li&gt;actual usage&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 She doesn't understand:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;what a house is&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  🧠 Correction made
&lt;/h2&gt;

&lt;p&gt;A layer was introduced:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;structured design&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Instead of :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"parts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We force:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"house"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"foundation"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"walls"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roof"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"constraints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"symmetry"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"alignment"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"centered"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Result:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;consistency&lt;/li&gt;
&lt;li&gt;stability&lt;/li&gt;
&lt;li&gt;made credible&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  ⚙️ 10. Technical Stack
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧱 Backend
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Symfony 8&lt;/li&gt;
&lt;li&gt;Symfony AI&lt;/li&gt;
&lt;li&gt;&lt;code&gt;darkwood/navi&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Installation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require darkwood/navi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🧠 Local AI (GDPR)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://mistral.ai/news/mistral-3" rel="noopener noreferrer"&gt;Mistral 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://ollama.com/library/ministral-3" rel="noopener noreferrer"&gt;Ollama&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 everything runs locally&lt;/p&gt;

&lt;h2&gt;
  
  
  ⚖️ Why this is important
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;no external API&lt;/li&gt;
&lt;li&gt;no data leak&lt;/li&gt;
&lt;li&gt;total control&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 You build a system:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;GDPR compliant by design&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  ⚙️ 11. Orders
&lt;/h1&gt;

&lt;h2&gt;
  
  
  🧠 Local LLM
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ollama pull ministral-3:8b
ollama serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Generation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;bin/console app:generate-shape &lt;span class="s2"&gt;"Create a house"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Useful Options
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nt"&gt;-o&lt;/span&gt; house.rb        &lt;span class="c"&gt;# sauvegarde du script&lt;/span&gt;
&lt;span class="nt"&gt;--spec&lt;/span&gt; design.json &lt;span class="c"&gt;# sauvegarde du design&lt;/span&gt;
&lt;span class="nt"&gt;-v&lt;/span&gt;                 &lt;span class="c"&gt;# debug complet&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🧠 12. What you really need to remember
&lt;/h1&gt;

&lt;h2&gt;
  
  
  ❌ This is not:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;“How to use AI”&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  ✅ It is:
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 &lt;strong&gt;How ​​to structure an idea so that an AI can execute it&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  🔁 Final Model
&lt;/h1&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;idée
 → tâche
 → design
 → code
 → exécution
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  🚀 Conclusion
&lt;/h1&gt;

&lt;p&gt;The future of development is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;write more code&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;structuring ideas&lt;br&gt;
and orchestrate their execution&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;👉 At Darkwood:&lt;/p&gt;

&lt;p&gt;we are not trying to go faster&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;we are trying to be fairer&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>php</category>
      <category>privacy</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🎨 Darkwood v1.0.4 - Présentation du design V4</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 16 Mar 2026 12:29:36 +0000</pubDate>
      <link>https://dev.to/matyo91/darkwood-v104-presentation-du-design-v4-3f4m</link>
      <guid>https://dev.to/matyo91/darkwood-v104-presentation-du-design-v4-3f4m</guid>
      <description>&lt;p&gt;Darkwood v1.0.4 est maintenant disponible.&lt;/p&gt;

&lt;p&gt;Cette version introduit Design V4, la quatrième itération visuelle majeure de Darkwood.&lt;/p&gt;

&lt;p&gt;Pour les nouveaux lecteurs, voici deux idées de versionnage différentes :&lt;/p&gt;

&lt;p&gt;v1.0.4 est la version du logiciel&lt;br&gt;
Design V4 est la quatrième évolution de l'interface de Darkwood&lt;br&gt;
Au fil des ans, Darkwood a connu plusieurs itérations de conception :&lt;/p&gt;

&lt;p&gt;V1 se concentrait sur la première identité visuelle&lt;br&gt;
V2 a exploré de nouvelles orientations de mise en page&lt;br&gt;
V3 a affiné la marque et la structure globale&lt;br&gt;
V4 remanie la navigation sur l'ensemble du site&lt;br&gt;
Cette version n'est donc pas « Darkwood version 4 » au sens du terme. Il s'agit de la version 1.0.4, qui introduit Darkwood Design V4.&lt;/p&gt;

&lt;p&gt;Et c'est important, car cette mise à jour ne se limite pas à une simple amélioration visuelle. Elle modernise également l'infrastructure technique et ouvre Darkwood aux flux de travail basés sur l'IA.&lt;/p&gt;

&lt;p&gt;Notes de version : &lt;a href="https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Qu'est-ce que Darkwood ?&lt;br&gt;
Darkwood est un jeu tactique axé sur les API.&lt;/p&gt;

&lt;p&gt;Il est conçu comme les deux :&lt;/p&gt;

&lt;p&gt;un système de jeu jouable&lt;br&gt;
un terrain de jeu technique&lt;br&gt;
une application Symfony conçue pour l'expérimentation à long terme&lt;br&gt;
L'idée de base est simple : le gameplay ne doit pas dépendre entièrement de l'interface graphique.&lt;/p&gt;

&lt;p&gt;L'interface utilisateur est importante, mais la logique du jeu réside avant tout dans l'API.&lt;/p&gt;

&lt;p&gt;Cette approche a été décrite précédemment ici : &lt;a href="https://blog.darkwood.com/article/darkwood-building-an-api-first-tactical-game" rel="noopener noreferrer"&gt;https://blog.darkwood.com/article/darkwood-building-an-api-first-tactical-game&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette version s'inscrit dans cette continuité.&lt;/p&gt;

&lt;p&gt;Darkwood combine désormais :&lt;/p&gt;

&lt;p&gt;une interface repensée&lt;br&gt;
une pile PHP mise à jour&lt;br&gt;
et intégration MCP pour les agents d'IA&lt;br&gt;
Pourquoi concevoir V4 ?&lt;br&gt;
Au fil du temps, Darkwood a accumulé des couches.&lt;/p&gt;

&lt;p&gt;Des pages ont été ajoutées. Les expériences ont été intégrées. Navigation étendue.&lt;/p&gt;

&lt;p&gt;Le résultat était fonctionnel, mais pas toujours clair.&lt;/p&gt;

&lt;p&gt;La version 4 de Design se concentre sur un objectif principal :&lt;/p&gt;

&lt;p&gt;Redonner au navigateur un aspect naturel.&lt;/p&gt;

&lt;p&gt;Le changement le plus important entre la version V3 et la version V4 ne réside pas dans la marque elle-même. Il s'agit de la manière dont les utilisateurs naviguent sur le site.&lt;/p&gt;

&lt;p&gt;Les versions précédentes portaient principalement sur la mise en page et l'identité visuelle. Celui-ci concerne l'architecture de navigation.&lt;/p&gt;

&lt;p&gt;La nouvelle conception a d'abord été explorée avec Pencil, ce qui a permis d'accélérer les études d'interface et les décisions de mise en page avant la mise en œuvre.&lt;/p&gt;

&lt;p&gt;Elle bénéficie également directement des leçons apprises lors de la construction d'Uniflow.&lt;/p&gt;

&lt;p&gt;Chez Uniflow, un travail considérable a été consacré à l'amélioration de la clarté des menus sur ordinateur et mobile. Cette expérience a contribué à façonner le nouveau modèle de navigation de Darkwood.&lt;/p&gt;

&lt;p&gt;Une bonne façon de résumer cet état d'esprit est :&lt;/p&gt;

&lt;p&gt;Penser macro, agir micro.&lt;/p&gt;

&lt;p&gt;Au niveau macro, la plateforme a besoin d'une structure claire. Au niveau micro, chaque interaction doit rester simple.&lt;/p&gt;

&lt;p&gt;Voilà l’esprit qui anime le design V4.&lt;/p&gt;

&lt;p&gt;Qu'est-ce qui a changé dans l'interface ?&lt;br&gt;
Une nouvelle structure de navigation&lt;br&gt;
Le changement le plus visible concerne la navigation.&lt;/p&gt;

&lt;p&gt;Darkwood utilise désormais une navigation centrée en haut au lieu de l'ancienne structure latérale.&lt;/p&gt;

&lt;p&gt;Le site est organisé autour de quatre sections principales :&lt;/p&gt;

&lt;p&gt;Jouer - accéder au jeu tactique&lt;br&gt;
Monde - explorez l'univers et son contexte&lt;br&gt;
Journal - Consultez les articles techniques et les notes de développement&lt;br&gt;
Projets - Découvrez des expériences et des travaux connexes&lt;br&gt;
Cela rend la plateforme plus facile à comprendre au premier coup d'œil.&lt;/p&gt;

&lt;p&gt;Au lieu d'être fragmentée, l'expérience est désormais organisée autour de quatre points d'entrée clairement définis.&lt;/p&gt;

&lt;p&gt;La même logique est utilisée sur ordinateur et mobile, la navigation reste donc cohérente quel que soit l'appareil.&lt;/p&gt;

&lt;p&gt;Une tête plus légère&lt;br&gt;
L'en-tête a été repensé pour paraître plus léger et plus réfléchi.&lt;/p&gt;

&lt;p&gt;Elle reste disponible pendant le défilement, mais avec un poids visuel réduit.&lt;/p&gt;

&lt;p&gt;Le but n'était pas de le rendre plus décoratif. L'objectif était de le rendre plus utile.&lt;/p&gt;

&lt;p&gt;Un pied de page remanié&lt;br&gt;
Le pied de page a également été restructuré.&lt;/p&gt;

&lt;p&gt;Elle permet désormais de regrouper le contenu plus clairement tout en restant secondaire par rapport à la page elle-même.&lt;/p&gt;

&lt;p&gt;L'objectif était d'améliorer l'orientation sans que le pied de page ne domine l'expérience de lecture.&lt;/p&gt;

&lt;p&gt;Un système visuel plus cohérent&lt;br&gt;
La version 4 de Design introduit également un nettoyage plus global du site :&lt;/p&gt;

&lt;p&gt;espacement amélioré&lt;br&gt;
Hiérarchie de boutons plus claire&lt;br&gt;
meilleure navigation mobile&lt;br&gt;
Expérience de connexion améliorée&lt;br&gt;
Comportement de mise en page plus cohérent&lt;br&gt;
Il ne s'agit pas d'une refonte radicale. Il s'agit d'un passage de cohérence à travers l'expérience complète.&lt;/p&gt;

&lt;p&gt;Construit avec une pile mise à jour&lt;br&gt;
Cette version met également à jour les fondements techniques de Darkwood.&lt;/p&gt;

&lt;p&gt;Darkwood fonctionne désormais avec :&lt;/p&gt;

&lt;p&gt;PHP 8.5&lt;br&gt;
Symfony 8&lt;br&gt;
FrankenPHP v1.12.1&lt;br&gt;
Il comprend également :&lt;/p&gt;

&lt;p&gt;Migration des contrôleurs des annotations vers les attributs PHP&lt;br&gt;
Configuration Nix et CI mise à jour&lt;br&gt;
Mise à jour des recettes et de la configuration du framework&lt;br&gt;
Corrections de dépréciation concernant le groupe d'exceptions Darkwood IA&lt;br&gt;
Renforcement de la sécurité en production sur plusieurs points, notamment le référencement naturel, Castor, la sérialisation des utilisateurs, reCAPTCHA et l'intégration optionnelle de Baserow&lt;br&gt;
L'objectif est simple :&lt;/p&gt;

&lt;p&gt;Maintenir la plateforme à jour, rapide et facile à maintenir.&lt;/p&gt;

&lt;p&gt;Pas par mode. Pour sa durabilité.&lt;/p&gt;

&lt;p&gt;Darkwood devrait pouvoir se développer sans rencontrer de difficultés techniques évitables.&lt;/p&gt;

&lt;p&gt;Intégration MCP pour les flux de travail d'IA&lt;br&gt;
Cette version ajoute également l'intégration de l'outil MCP grâce aux nouvelles capacités d'IA de la plateforme API.&lt;/p&gt;

&lt;p&gt;Référence: &lt;a href="https://les-tilleuls.coop/blog/sortie-dapi-platform-4-3-rencontre-avec-lia" rel="noopener noreferrer"&gt;https://les-tilleuls.coop/blog/sortie-dapi-platform-4-3-rencontre-avec-lia&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cela correspond naturellement à l'approche « API-first » de Darkwood.&lt;/p&gt;

&lt;p&gt;Si la logique du jeu existe déjà sous forme d'API, l'exposer à des agents d'IA devient une extension de la même philosophie.&lt;/p&gt;

&lt;p&gt;Autrement dit, le jeu tactique était déjà programmable. Il est désormais également prêt pour les agents.&lt;/p&gt;

&lt;p&gt;Outils MCP de DarkwoodGame&lt;br&gt;
La ressource API DarkwoodGame expose désormais quatre outils MCP :&lt;/p&gt;

&lt;p&gt;get_darkwood_state Renvoie l'état actuel du jeu&lt;/p&gt;

&lt;p&gt;darkwood_action Exécute une action de jeu à partir d'une entrée&lt;/p&gt;

&lt;p&gt;list_darkwood_archives Liste des captures d'écran archivées des puzzles pour les utilisateurs premium&lt;/p&gt;

&lt;p&gt;get_darkwood_archive Récupère une archive par identifiant pour les utilisateurs premium&lt;/p&gt;

&lt;p&gt;Tous utilisent une sortie de contenu structuré, ce qui signifie que la réponse de l'API est directement renvoyée sous forme de sortie de l'outil MCP.&lt;/p&gt;

&lt;p&gt;Aucune nouvelle route HTTP n'a été introduite pour cela.&lt;/p&gt;

&lt;p&gt;La couche MCP expose simplement les capacités API existantes de manière à ce que les agents d'IA puissent les exploiter sans problème.&lt;/p&gt;

&lt;p&gt;Outils MCP de l'article&lt;br&gt;
Les articles de Darkwood sont désormais également accessibles via MCP.&lt;/p&gt;

&lt;p&gt;Deux outils ont été ajoutés :&lt;/p&gt;

&lt;p&gt;list_articles&lt;br&gt;
get_article&lt;br&gt;
Cela permet aux agents d'IA de récupérer des données structurées d'articles tout en conservant les mêmes règles de sécurité que la ressource API elle-même.&lt;/p&gt;

&lt;p&gt;Là encore, l'objectif n'est pas de dupliquer l'application. Il s'agit de rendre le système existant accessible via une nouvelle couche d'interaction.&lt;/p&gt;

&lt;p&gt;Gratuit vs Premium&lt;br&gt;
Darkwood est actuellement en cours de développement en Bêta Saison 0.&lt;/p&gt;

&lt;p&gt;La proposition commerciale reste inchangée.&lt;/p&gt;

&lt;p&gt;Deux types de clés d'accès sont disponibles.&lt;/p&gt;

&lt;p&gt;🎟 Accès bêta (gratuit)&lt;br&gt;
Clé API personnelle&lt;br&gt;
Actions quotidiennes limitées&lt;br&gt;
Accès à l'état jouable actuel&lt;br&gt;
Accès aux archives impossible&lt;br&gt;
💎 Fondateur Premium&lt;br&gt;
Clé API personnelle&lt;br&gt;
Actions quotidiennes illimitées&lt;br&gt;
Accès aux instantanés archivés des puzzles&lt;br&gt;
Statut de soutien précoce&lt;br&gt;
Les archives sont des instantanés en lecture seule des états jouables antérieurs. Ils permettent de révéler l'état historique du jeu sans affecter la partie en cours.&lt;/p&gt;

&lt;p&gt;Édition limitée pour les fondateurs&lt;br&gt;
Cette version reste volontairement confidentielle.&lt;/p&gt;

&lt;p&gt;Disponible dès maintenant :&lt;/p&gt;

&lt;p&gt;5 clés d'accès bêta&lt;br&gt;
5 clés Fondateur Premium&lt;br&gt;
C'est tout.&lt;/p&gt;

&lt;p&gt;Il ne s'agit pas d'un lancement destiné au marché de masse. Il s'agit d'une version contrôlée destinée à valider le modèle.&lt;/p&gt;

&lt;p&gt;L'accès est géré par Bonzai :&lt;/p&gt;

&lt;p&gt;Accès bêta (gratuit) &lt;a href="https://www.bonzai.pro/matyo91/shop/yDxv_7247/darkwood-api-beta-access-free" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/yDxv_7247/darkwood-api-beta-access-free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fondateur Premium &lt;a href="https://www.bonzai.pro/matyo91/shop/lQxn_7249/darkwood-api-founder-premium" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/lQxn_7249/darkwood-api-founder-premium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chaque clé est personnelle et peut être changée si nécessaire.&lt;/p&gt;

&lt;p&gt;Ce que cette publication signifie réellement&lt;br&gt;
Darkwood v1.0.4 est une version qui poursuit trois objectifs :&lt;/p&gt;

&lt;p&gt;rendre l'interface plus facile à naviguer&lt;br&gt;
Mettre à jour l'architecture technique selon les normes modernes&lt;br&gt;
Étendre le modèle de jeu basé sur les API aux agents d'IA via MCP&lt;br&gt;
Le design V4 correspond à la partie visible.&lt;/p&gt;

&lt;p&gt;Mais en coulisses, le projet se consolide et s'ouvre également.&lt;/p&gt;

&lt;p&gt;On peut désormais aborder ce même jeu tactique par le biais de :&lt;/p&gt;

&lt;p&gt;le site web&lt;br&gt;
l'API&lt;br&gt;
et les flux de travail pilotés par l'IA&lt;br&gt;
Cette continuité est importante.&lt;/p&gt;

&lt;p&gt;Darkwood ne se divise pas en idées distinctes. Cela devient plus cohérent.&lt;/p&gt;

&lt;p&gt;Découvrez la version&lt;br&gt;
Darkwood v1.0.4 est disponible.&lt;/p&gt;

&lt;p&gt;Il apporte Design V4, une pile Symfony et PHP modernisée, et une intégration MCP pour le jeu tactique axé sur les API.&lt;/p&gt;

&lt;p&gt;Explorez l'interface. Lisez le journal. Accédez à l'API. Ou commencez à jouer.&lt;/p&gt;

&lt;p&gt;Libérer: &lt;a href="https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-com/releases/tag/v1.0.4&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>👾 Darkwood : Créer un jeu tactique axé sur les API</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 08 Mar 2026 09:31:07 +0000</pubDate>
      <link>https://dev.to/matyo91/darkwood-creer-un-jeu-tactique-axe-sur-les-api-4fo9</link>
      <guid>https://dev.to/matyo91/darkwood-creer-un-jeu-tactique-axe-sur-les-api-4fo9</guid>
      <description>&lt;p&gt;Darkwood est désormais jouable entièrement via API.&lt;/p&gt;

&lt;p&gt;Il n'y a pas d'interface utilisateur dédiée. Aucune interface utilisateur requise. Pas de client graphique.&lt;/p&gt;

&lt;p&gt;Vous interagissez avec le jeu via HTTP.&lt;/p&gt;

&lt;p&gt;Que signifie réellement « API-First » ?&lt;br&gt;
Dans Darkwood, la boucle de jeu est simple et explicite :&lt;/p&gt;

&lt;p&gt;GET /api/darkwood/state → observer la situation actuelle&lt;br&gt;
Interpréter la réponse JSON&lt;br&gt;
POST /api/darkwood/action → décider de l'action à effectuer&lt;br&gt;
Recevoir l'état mis à jour&lt;br&gt;
Répéter&lt;br&gt;
Le jeu se comporte comme une machine à états via HTTP.&lt;/p&gt;

&lt;p&gt;Chaque réponse comprend :&lt;/p&gt;

&lt;p&gt;état — où vous vous trouvez (principal, combat, infos, boutique, etc.)&lt;br&gt;
mode — sous-phase (combat, victoire, mort, etc.)&lt;br&gt;
data — détails contextuels (vie, ennemi, statistiques, session de combat)&lt;br&gt;
Votre client — qu'il s'agisse de curl, d'un outil en ligne de commande, d'un script ou d'un agent d'IA — lit l'état et décide de la prochaine action.&lt;/p&gt;

&lt;p&gt;Il n'y a pas de logique d'interface utilisateur cachée.&lt;/p&gt;

&lt;p&gt;Le protocole est la clé du jeu.&lt;/p&gt;

&lt;p&gt;Deux niveaux d'accès&lt;br&gt;
Darkwood divise l'accès en deux niveaux :&lt;/p&gt;

&lt;p&gt;1️⃣ Accès API&lt;br&gt;
Chaque demande doit inclure :&lt;/p&gt;

&lt;p&gt;X-API-Key: &lt;br&gt;
La clé API contrôle :&lt;/p&gt;

&lt;p&gt;Si vous pouvez appeler l'API&lt;br&gt;
Que vous fassiez partie de la saison bêta 0&lt;br&gt;
Que vous ayez un accès premium&lt;br&gt;
Votre quota d'actions quotidien (pour les clés gratuites)&lt;br&gt;
2️⃣ Identité du joueur&lt;br&gt;
Pour jouer avec un personnage spécifique (progression persistante, combats, statistiques), vous vous authentifiez avec :&lt;/p&gt;

&lt;p&gt;Authorization: Bearer &lt;br&gt;
Le JWT identifie le compte du joueur. La clé API contrôle l'accès et la monétisation.&lt;/p&gt;

&lt;p&gt;Ils sont séparés par conception.&lt;/p&gt;

&lt;p&gt;La documentation complète est disponible sur GitHub : &lt;a href="https://github.com/darkwood-com/darkwood-com/blob/main/docs/" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-com/blob/main/docs/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gratuit vs Premium&lt;br&gt;
Darkwood est actuellement en cours de développement en Bêta Saison 0.&lt;/p&gt;

&lt;p&gt;Il existe deux types de clés :&lt;/p&gt;

&lt;p&gt;🎟 Accès bêta (gratuit)&lt;br&gt;
Clé API personnelle&lt;br&gt;
Actions quotidiennes limitées&lt;br&gt;
Accès à l'état jouable actuel&lt;br&gt;
Accès aux archives impossible&lt;br&gt;
💎 Fondateur Premium&lt;br&gt;
Clé API personnelle&lt;br&gt;
Actions quotidiennes illimitées&lt;br&gt;
Accès aux instantanés archivés des puzzles&lt;br&gt;
Statut de soutien précoce&lt;br&gt;
Les archives sont des instantanés en lecture seule des états jouables antérieurs. Ils permettent de révéler l'état historique du jeu sans modifier le déroulement en direct.&lt;/p&gt;

&lt;p&gt;Édition limitée pour les fondateurs&lt;br&gt;
Pour que ce lancement reste sous contrôle :&lt;/p&gt;

&lt;p&gt;5 clés d'accès bêta&lt;br&gt;
5 clés Fondateur Premium&lt;br&gt;
C'est ça.&lt;/p&gt;

&lt;p&gt;Il ne s'agit pas d'un lancement à grande échelle. Il s'agit d'une version ciblée visant à valider le modèle.&lt;/p&gt;

&lt;p&gt;Les ventes sont gérées par Bonzai :&lt;/p&gt;

&lt;p&gt;Accès bêta (gratuit) : &lt;a href="https://www.bonzai.pro/matyo91/shop/yDxv_7247/darkwood-api-beta-access-free" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/yDxv_7247/darkwood-api-beta-access-free&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Premium Fondateur : &lt;a href="https://www.bonzai.pro/matyo91/shop/lQxn_7249/darkwood-api-founder-premium" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/shop/lQxn_7249/darkwood-api-founder-premium&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Chaque clé est personnelle. Les touches peuvent être pivotées si nécessaire.&lt;/p&gt;

&lt;p&gt;Pourquoi pas d'interface utilisateur ?&lt;br&gt;
Parce que l'interface est optionnelle.&lt;/p&gt;

&lt;p&gt;Vous pouvez jouer à Darkwood avec :&lt;/p&gt;

&lt;p&gt;curl&lt;br&gt;
Postman&lt;br&gt;
une interface de ligne de commande personnalisée&lt;br&gt;
un petit client web&lt;br&gt;
un script&lt;br&gt;
un agent d'IA&lt;br&gt;
L'API définit le contrat du jeu.&lt;/p&gt;

&lt;p&gt;Le client n'est qu'un interprète.&lt;/p&gt;

&lt;p&gt;Saison bêta 0&lt;br&gt;
La logique du jeu reste inchangée.&lt;/p&gt;

&lt;p&gt;L'objectif de cette phase est :&lt;/p&gt;

&lt;p&gt;Stabilité de l'API&lt;br&gt;
Modèle de monétisation propre (clé API uniquement)&lt;br&gt;
Flux d'état déterministe&lt;br&gt;
Clarté de la documentation&lt;br&gt;
Pas de sur-ingénierie. Aucune fonctionnalité superflue.&lt;/p&gt;

&lt;p&gt;Un simple jeu tactique déguisé en protocole.&lt;/p&gt;

&lt;p&gt;Darkwood n'est pas qu'un simple projet backend.&lt;/p&gt;

&lt;p&gt;C'est un jeu qui fonctionne entièrement via HTTP.&lt;/p&gt;

&lt;p&gt;Et la saison 0 de la bêta est maintenant disponible.&lt;/p&gt;

</description>
      <category>api</category>
      <category>architecture</category>
      <category>gamedev</category>
      <category>showdev</category>
    </item>
    <item>
      <title>🚀 Création d'une application PHP MCP pour publier des articles Darkwood</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Mar 2026 20:09:22 +0000</pubDate>
      <link>https://dev.to/matyo91/creation-dune-application-php-mcp-pour-publier-des-articles-darkwood-2pcm</link>
      <guid>https://dev.to/matyo91/creation-dune-application-php-mcp-pour-publier-des-articles-darkwood-2pcm</guid>
      <description>&lt;p&gt;Les grands modèles de langage sont déjà performants pour la génération de texte. Ce qui manque encore, dans de nombreux projets, c'est une méthode simple pour transformer cette génération de texte en un véritable flux de travail : rédiger un brouillon, le relire, le corriger, le publier et l'intégrer de manière intuitive dans une application cliente d'IA.&lt;/p&gt;

&lt;p&gt;C’est précisément là que les applications MCP deviennent intéressantes.&lt;/p&gt;

&lt;p&gt;Dans ce projet, l'objectif n'était pas de créer « une énième intégration de chatbot ». L'objectif était de développer une véritable application MCP en PHP permettant de publier un article de blog Darkwood via un flux de travail éditorial simplifié :&lt;/p&gt;

&lt;p&gt;générer un brouillon,&lt;br&gt;
le réviser ou le corriger,&lt;br&gt;
le publier,&lt;br&gt;
et, si nécessaire, revenir en arrière avant la publication.&lt;br&gt;
Le résultat est un serveur PHP MCP qui peut fonctionner sur stdio ou HTTP, exposer des outils, exposer des ressources d'interface utilisateur et être conditionné comme une extension Claude Desktop.&lt;/p&gt;

&lt;p&gt;Pourquoi les applications MCP sont importantes&lt;br&gt;
Un serveur MCP classique peut exposer des outils et des ressources. C'est déjà utile : un LLM peut appeler un outil, obtenir une sortie structurée et poursuivre son raisonnement.&lt;/p&gt;

&lt;p&gt;Mais les applications MCP ajoutent quelque chose de plus pratique : elles permettent à un outil d’intégrer sa propre interface utilisateur embarquée.&lt;/p&gt;

&lt;p&gt;Cela modifie considérablement le modèle d'interaction.&lt;/p&gt;

&lt;p&gt;Au lieu de se contenter de renvoyer du texte, un outil peut désormais ouvrir une interface dédiée au sein du système hôte. Cette interface peut afficher l'état des entrées, présenter les résultats, guider l'utilisateur tout au long d'un flux et déclencher des appels d'outils supplémentaires. Autrement dit, l'outil cesse d'être une simple fonction distante et se comporte davantage comme une interface d'application à part entière.&lt;/p&gt;

&lt;p&gt;Dans un flux de travail éditorial, c'est beaucoup plus adapté que le simple texte brut.&lt;/p&gt;

&lt;p&gt;Générer un brouillon n'est pas le plus difficile. La difficulté réside dans la gestion de la transition entre le texte généré et le contenu prêt à être publié. C'est là qu'une interface utilisateur d'application MCP s'avère utile : elle structure le processus.&lt;/p&gt;

&lt;p&gt;Le cas d'utilisation de Darkwood&lt;br&gt;
Le cas d'utilisation concret est ici simple à expliquer.&lt;/p&gt;

&lt;p&gt;Cette application MCP est utilisée pour faciliter la publication d'un article de blog sur Darkwood.&lt;/p&gt;

&lt;p&gt;Le flux de travail commence par une première étape, GenerateDraft, qui produit une ébauche initiale à partir d'un sujet ou d'un contexte.&lt;/p&gt;

&lt;p&gt;Vient ensuite la deuxième étape, PublishDraft, qui gère le processus de publication. Si le brouillon n'est pas encore satisfaisant, le processus peut se poursuivre. Il est possible de revenir en arrière et de procéder à une correction ou une révision avant de tenter une nouvelle publication.&lt;/p&gt;

&lt;p&gt;Cette boucle est importante.&lt;/p&gt;

&lt;p&gt;En pratique, le processus de publication est rarement linéaire. Une première ébauche peut être trop brouillonne, trop générique, trop longue, ou tout simplement ne pas correspondre à l'intention éditoriale. C'est pourquoi l'application MCP est conçue autour d'une idée réaliste : la publication est l'objectif final, mais l'itération fait partie intégrante du cheminement.&lt;/p&gt;

&lt;p&gt;Un serveur MCP, plusieurs façons de l'utiliser&lt;br&gt;
Un aspect utile de ce projet est que la même logique MCP est réutilisée dans plusieurs modes d'exécution.&lt;/p&gt;

&lt;p&gt;Le serveur peut être utilisé :&lt;/p&gt;

&lt;p&gt;via stdio, généralement pour les intégrations locales et le packaging Claude Desktop,&lt;br&gt;
via HTTP, pour les hôtes basés sur un navigateur ou les points de terminaison MCP locaux,&lt;br&gt;
via le serveur Symfony, lorsque vous souhaitez une configuration HTTP plus standard autour de public/index.php,&lt;br&gt;
via une extension Claude Desktop, conditionnée sous forme de .mcpb,&lt;br&gt;
et, dans tous ces cas, en tant qu'outil compatible avec l'application MCP lorsque l'hôte prend en charge l'interface utilisateur intégrée.&lt;br&gt;
C'est important du point de vue de l'architecture : la logique métier n'est pas liée à un seul client ni à un seul protocole de transport. Le protocole de transport change, le modèle d'orchestration évolue légèrement, mais l'interface MCP reste la même.&lt;/p&gt;

&lt;p&gt;Architecture&lt;br&gt;
La manière la plus simple de comprendre le projet est de le diviser en quatre rôles : l’hôte, le serveur PHP MCP, l’interface utilisateur de l’application MCP et la couche d’orchestration.&lt;/p&gt;

&lt;p&gt;Vue d'ensemble&lt;br&gt;
De manière générale, le système fonctionne comme suit :&lt;/p&gt;

&lt;p&gt;schema-architecture&lt;/p&gt;

&lt;p&gt;un hôte MCP se connecte au serveur PHP,&lt;br&gt;
l'hôte découvre les outils et ressources disponibles,&lt;br&gt;
l'hôte appelle un outil tel que GenerateDraft ou PublishDraft,&lt;br&gt;
si l'outil déclare une ressource d'interface utilisateur, l'hôte charge également la vue d'application MCP correspondante.&lt;br&gt;
l'interface utilisateur et l'hôte communiquent entre eux via JSON-RPC sur postMessage,&lt;br&gt;
et l'outil de transfert d'appels de l'hôte renvoie les appels au serveur PHP.&lt;br&gt;
Voici l'idée clé : l'interface utilisateur ne communique pas directement avec le serveur. L'hôte fait office d'intermédiaire.&lt;/p&gt;

&lt;p&gt;Cette séparation est utile car elle permet de conserver l'interface utilisateur portable sur les hôtes compatibles tout en préservant un contrat MCP propre côté serveur.&lt;/p&gt;

&lt;p&gt;Transports&lt;br&gt;
Le projet soutient deux principaux modes de transport.&lt;/p&gt;

&lt;p&gt;Stdio&lt;br&gt;
En mode stdio, l'hôte démarre le serveur PHP en tant que sous-processus et communique via STDIN et STDOUT.&lt;/p&gt;

&lt;p&gt;C'est le cas idéal pour les extensions Claude Desktop. L'hôte lance le serveur, envoie des messages JSON-RPC via l'entrée standard et lit les réponses depuis la sortie standard.&lt;/p&gt;

&lt;p&gt;Ce mode est simple, local et efficace lorsque le client est responsable de la gestion des processus.&lt;/p&gt;

&lt;p&gt;HTTP&lt;br&gt;
En mode HTTP, le serveur expose un point de terminaison MCP tel que POST /mcp.&lt;/p&gt;

&lt;p&gt;Ce mode est utile pour les hôtes orientés navigateur, les tests locaux ou toute configuration où une limite HTTP est plus pratique qu'un processus enfant.&lt;/p&gt;

&lt;p&gt;Dans ce projet, le protocole HTTP peut être servi de deux manières :&lt;/p&gt;

&lt;p&gt;grâce à un processus dédié et durable tel que le flow worker,&lt;br&gt;
ou via un point d'entrée web plus traditionnel tel que public/index.php.&lt;br&gt;
Messagerie&lt;br&gt;
Une fois connectés, l'hôte et le serveur communiquent avec JSON-RPC 2.0.&lt;/p&gt;

&lt;p&gt;Cela signifie que le modèle d'interaction reste clair et explicite :&lt;/p&gt;

&lt;p&gt;l'hôte envoie des requêtes,&lt;br&gt;
le serveur renvoie des réponses, Des notifications peuvent être échangées lorsqu'aucune réponse n'est attendue.&lt;br&gt;
Cela reste vrai, que le transport soit stdio ou HTTP. Le transport change, mais le contrat du protocole demeure le même.&lt;/p&gt;

&lt;p&gt;De plus, lorsque des applications MCP sont impliquées, l'interface utilisateur communique avec l'hôte via un autre canal JSON-RPC, cette fois via postMessage.&lt;/p&gt;

&lt;p&gt;Il y a donc en réalité deux niveaux de communication :&lt;/p&gt;

&lt;p&gt;hôte ↔ serveur via MCP,&lt;br&gt;
Interface utilisateur ↔ hôte via le pont MCP Apps.&lt;br&gt;
C’est cette séparation qui rend possible l’intégration d’une interface utilisateur sans coupler directement le front-end à l’environnement d’exécution PHP.&lt;/p&gt;

&lt;p&gt;Cycle de vie&lt;br&gt;
Une interaction typique se déroule en quelques étapes prévisibles.&lt;/p&gt;

&lt;p&gt;Tout d'abord, l'hôte initialise la connexion et découvre les capacités du serveur.&lt;/p&gt;

&lt;p&gt;Ensuite, il liste les outils et les ressources.&lt;/p&gt;

&lt;p&gt;Lorsqu'un utilisateur déclenche un outil, l'hôte appelle cet outil sur le serveur. Si cet outil est associé à une ressource d'interface utilisateur, l'hôte lit également la ressource ui://... correspondante et l'affiche dans une iframe isolée.&lt;/p&gt;

&lt;p&gt;À ce stade, l'application MCP devient interactive. Elle peut recevoir les données saisies par l'outil, afficher le résultat et déclencher des actions complémentaires via l'hôte.&lt;/p&gt;

&lt;p&gt;Dans le flux de travail Darkwood, cela signifie que l'utilisateur ou l'assistant peut passer de la génération d'ébauches à la publication, et éventuellement revenir dans une boucle de correction, sans quitter le modèle d'interaction MCP.&lt;/p&gt;

&lt;p&gt;Ce qui se passe où&lt;br&gt;
Le serveur PHP MCP possède la surface de protocole :&lt;/p&gt;

&lt;p&gt;initialiser&lt;br&gt;
tools/list&lt;br&gt;
outils/appel&lt;br&gt;
ressources/liste&lt;br&gt;
ressources/lire&lt;br&gt;
L’interface utilisateur de l’application MCP est responsable de l’expérience interactive.&lt;/p&gt;

&lt;p&gt;L'hôte gère le transport, le rendu et la liaison entre l'interface utilisateur et le serveur.&lt;/p&gt;

&lt;p&gt;La couche Flow gère l'orchestration des flux de travail lorsque celle-ci est nécessaire.&lt;/p&gt;

&lt;p&gt;Ce dernier point est important car les flux éditoriaux impliquent souvent plus d'une action et plus d'une transition d'état.&lt;/p&gt;

&lt;p&gt;Stdio, HTTP et le serveur Symfony ne sont pas la même chose&lt;br&gt;
Même si la logique métier reste la même, le modèle d'exécution n'est pas identique d'un mode à l'autre.&lt;/p&gt;

&lt;p&gt;Avec stdio et un worker HTTP persistant, vous pouvez envisager un processus persistant. Cela ouvre la voie à des fonctionnalités asynchrones, des boucles d'événements et une orchestration continue au sein du même environnement d'exécution.&lt;/p&gt;

&lt;p&gt;Avec Symfony Server, le modèle est plus classique. Chaque requête est traitée dans un cycle HTTP synchrone. C'est généralement plus simple à mettre en œuvre, mais cela implique une orchestration différente : la couche HTTP reste synchronisée, tandis que la logique de workflow est déléguée à Flow ou à une coordination externe.&lt;/p&gt;

&lt;p&gt;Il est important de faire explicitement cette distinction, car « prend en charge HTTP » ne signifie pas automatiquement « prend en charge le même modèle d'exécution partout ».&lt;/p&gt;

&lt;p&gt;Pourquoi cette conception est-elle efficace pour les flux de travail de publication ?&lt;br&gt;
Le flux de publication d'un blog se trouve dans une situation délicate.&lt;/p&gt;

&lt;p&gt;Il ne s'agit pas d'un simple appel de fonction, ni d'une application back-office complète. Elle nécessite une structure suffisante pour gérer l'état et les décisions, tout en restant assez légère pour être déclenchée par une conversation avec une IA.&lt;/p&gt;

&lt;p&gt;C’est précisément pourquoi les applications MCP sont parfaitement adaptées ici.&lt;/p&gt;

&lt;p&gt;L'interface de l'outil confère au modèle une surface d'interaction. L'interface utilisateur offre à l'utilisateur ou au client une vue contrôlée du flux de travail. Enfin, l'orchestration du flux permet au système de gérer les transitions en plusieurs étapes.&lt;/p&gt;

&lt;p&gt;Cette combinaison est efficace car chaque couche reste ciblée :&lt;/p&gt;

&lt;p&gt;le modèle décide quand utiliser l'outil,&lt;br&gt;
l'outil expose le flux de travail,&lt;br&gt;
l'interface utilisateur rend le flux de travail visible,&lt;br&gt;
le serveur l'exécute sans problème.&lt;br&gt;
Utilisation de l'application MCP dans Claude&lt;br&gt;
L'un des résultats pratiques de ce projet est que le même serveur MCP peut être intégré sous forme d'extension Claude Desktop.&lt;/p&gt;

&lt;p&gt;Cela signifie que le projet n'est pas seulement un prototype local ou une démo pour navigateur. Il peut être installé dans Claude et utilisé comme une véritable intégration d'outil.&lt;/p&gt;

&lt;p&gt;Dans cette configuration :&lt;/p&gt;

&lt;p&gt;le manifeste de l'extension définit comment Claude lance le serveur,&lt;br&gt;
le serveur fonctionne via stdio,&lt;br&gt;
Claude fait office d'hôte du MCP,&lt;br&gt;
et l'application MCP devient disponible en tant qu'outil au sein du client.&lt;br&gt;
Voilà un bon exemple qui illustre l'importance de séparer les protocoles de transport de la logique métier. Un même serveur PHP MCP peut ainsi gérer le développement local, les expérimentations HTTP et l'utilisation de Claude Desktop sans qu'il soit nécessaire de réécrire son fonctionnement de base.&lt;/p&gt;

&lt;p&gt;De la démo aux outils éditoriaux réels&lt;br&gt;
Ce qui rend ce projet intéressant, ce n'est pas l'existence d'un énième générateur de brouillons.&lt;/p&gt;

&lt;p&gt;C’est le fait que le projet définit déjà une forme réutilisable pour les outils éditoriaux :&lt;/p&gt;

&lt;p&gt;un outil pour produire un brouillon,&lt;br&gt;
un outil pour publier,&lt;br&gt;
un endroit pour gérer les révisions,&lt;br&gt;
une couche d'interface utilisateur pour prendre en charge l'interaction,&lt;br&gt;
et un serveur MCP indépendant du transport en dessous.&lt;br&gt;
C'est une base beaucoup plus durable qu'une chaîne de distribution ponctuelle.&lt;/p&gt;

&lt;p&gt;Une fois cette structure en place, l'amélioration du flux de travail devient beaucoup plus simple. Vous pouvez optimiser la qualité de la génération, enrichir les métadonnées de publication, ajouter des validations ou intégrer un véritable CMS. Le contrat entre l'hébergeur, l'interface utilisateur et le serveur reste stable.&lt;/p&gt;

&lt;p&gt;Open source&lt;br&gt;
Le projet complet est disponible en tant que dépôt open-source sur GitHub.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/darkwood-com/darkwood-publish-article-mcp-apps" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-publish-article-mcp-apps&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Ce projet démontre que les applications MCP ne se limitent pas à proposer des outils aux titulaires d'un LLM. Elles visent également à proposer des flux de travail utilisables.&lt;/p&gt;

&lt;p&gt;Dans le cas de Darkwood, le plus intéressant n'est pas que PHP puisse communiquer avec MCP. Le plus intéressant est qu'un serveur PHP MCP puisse désormais servir de backend à une petite application éditoriale, accessible depuis un client d'IA, avec à la fois la sémantique de l'outil et une interface utilisateur intégrée.&lt;/p&gt;

&lt;p&gt;Cela fait passer l'intégration de « le modèle peut appeler une fonction » à « le modèle peut participer à un flux de travail de publication contrôlé ».&lt;/p&gt;

&lt;p&gt;Et c'est un endroit bien plus utile.&lt;/p&gt;

&lt;p&gt;Sources Démarrage rapide des applications MCP&lt;br&gt;
README.md&lt;br&gt;
php-mcp-apps-mvp-architecture.md&lt;/p&gt;

</description>
      <category>ai</category>
      <category>automation</category>
      <category>mcp</category>
      <category>php</category>
    </item>
    <item>
      <title>🚀 Je construis un moteur de dictée en PHP (Flow + Symfony + Whisper.cpp)</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 22 Feb 2026 22:24:27 +0000</pubDate>
      <link>https://dev.to/matyo91/je-construis-un-moteur-de-dictee-en-php-flow-symfony-whispercpp-48e2</link>
      <guid>https://dev.to/matyo91/je-construis-un-moteur-de-dictee-en-php-flow-symfony-whispercpp-48e2</guid>
      <description>&lt;p&gt;Construire un moteur de dictée en 2026 est trivial.&lt;/p&gt;

&lt;p&gt;Construire une architecture propre autour d’un moteur de dictée est plus intéressant.&lt;/p&gt;

&lt;p&gt;Cet article présente Flowvox, un MVP de moteur de transcription audio développé en PHP, en s’appuyant sur :&lt;/p&gt;

&lt;p&gt;Symfony&lt;br&gt;
Symfony Messenger&lt;br&gt;
Flow : orchestrateur maison&lt;br&gt;
ffmpeg&lt;br&gt;
whisper.cpp&lt;br&gt;
Le code source est disponible en open source : 👉 &lt;a href="https://github.com/darkwood-com/flowvox" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/flowvox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’objectif n’était pas simplement d’utiliser Whisper. L’objectif était de structurer correctement le pipeline.&lt;/p&gt;

&lt;p&gt;Le problème : la transcription n’est qu’une étape&lt;br&gt;
Un moteur vocal minimal peut se résumer à :&lt;/p&gt;

&lt;p&gt;Audio → Texte&lt;br&gt;
Mais dans un système réel, plusieurs contraintes apparaissent :&lt;/p&gt;

&lt;p&gt;Déclenchement start / stop&lt;br&gt;
Finalisation propre du fichier audio&lt;br&gt;
Gestion d’état du recorder&lt;br&gt;
Orchestration des étapes&lt;br&gt;
Extension vers post-traitement (résumé, LLM, analyse)&lt;br&gt;
La question devient alors :&lt;/p&gt;

&lt;p&gt;Comment modéliser un pipeline audio propre, extensible et maîtrisé ?&lt;/p&gt;

&lt;p&gt;Stack technique&lt;br&gt;
Le MVP repose sur :&lt;/p&gt;

&lt;p&gt;PHP 8+&lt;br&gt;
Symfony&lt;br&gt;
Symfony Messenger&lt;br&gt;
Flow (orchestrateur)&lt;br&gt;
ffmpeg (captation audio locale)&lt;br&gt;
whisper.cpp (transcription open source locale)&lt;br&gt;
Aucune API distante. Aucun service cloud. Transcription 100% locale.&lt;/p&gt;

&lt;p&gt;Architecture générale&lt;br&gt;
L’architecture est organisée en trois flows :&lt;/p&gt;

&lt;p&gt;InputProvider → Recorder → Transcribe&lt;br&gt;
Chaque étape est isolée et responsable d’un rôle précis.&lt;/p&gt;

&lt;p&gt;InputProviderFlow&lt;br&gt;
Responsabilité :&lt;/p&gt;

&lt;p&gt;Écouter les commandes voice:start et voice:stop&lt;br&gt;
Émettre un VoiceControlEvent&lt;br&gt;
Les commandes CLI déclenchent des messages via Symfony Messenger.&lt;/p&gt;

&lt;p&gt;Le worker, en arrière-plan, reçoit ces événements et les injecte dans Flow.&lt;/p&gt;

&lt;p&gt;Ce découplage permet :&lt;/p&gt;

&lt;p&gt;Un contrôle granulaire&lt;br&gt;
Une gestion multi-session&lt;br&gt;
Une séparation claire des responsabilités&lt;br&gt;
RecorderFlow&lt;br&gt;
Responsabilité :&lt;/p&gt;

&lt;p&gt;Piloter une instance de VoiceRecorder&lt;br&gt;
Gérer le cycle de vie d’un processus ffmpeg&lt;br&gt;
Le VoiceRecorder encapsule un processus système lancé via :&lt;/p&gt;

&lt;p&gt;Symfony\Component\Process\Process&lt;br&gt;
Problème central :&lt;/p&gt;

&lt;p&gt;Comment gérer proprement start / stop sans corrompre le fichier audio ?&lt;/p&gt;

&lt;p&gt;Trois états sont explicitement modélisés :&lt;/p&gt;

&lt;p&gt;idle&lt;br&gt;
recording&lt;br&gt;
stopping&lt;br&gt;
Lors d’un stop, un SIGINT est envoyé à ffmpeg afin de finaliser correctement le header WAV.&lt;/p&gt;

&lt;p&gt;L’état stopping évite :&lt;/p&gt;

&lt;p&gt;Les double-start&lt;br&gt;
Les conflits concurrents&lt;br&gt;
Les fichiers incomplets&lt;br&gt;
Le processus est maîtrisé, pas subi.&lt;/p&gt;

&lt;p&gt;TranscribeFlow&lt;br&gt;
Responsabilité :&lt;/p&gt;

&lt;p&gt;Recevoir un fichier WAV finalisé&lt;br&gt;
Lancer whisper.cpp&lt;br&gt;
Produire un texte transcrit&lt;br&gt;
Whisper est exécuté localement via CLI.&lt;/p&gt;

&lt;p&gt;Le MVP reste volontairement simple :&lt;/p&gt;

&lt;p&gt;Pas de streaming&lt;br&gt;
Pas de chunking temps réel&lt;br&gt;
Une transcription synchrone&lt;br&gt;
L’objectif est de valider l’intégration et l’orchestration.&lt;/p&gt;

&lt;p&gt;Worker et orchestration&lt;br&gt;
Le moteur fonctionne via un worker Symfony :&lt;/p&gt;

&lt;p&gt;php bin/console voice:worker&lt;br&gt;
Ce worker :&lt;/p&gt;

&lt;p&gt;Instancie Flow&lt;br&gt;
Enregistre les flows&lt;br&gt;
Écoute Symfony Messenger&lt;br&gt;
Ordonne l’exécution des étapes&lt;br&gt;
Commandes disponibles :&lt;/p&gt;

&lt;p&gt;voice:start&lt;br&gt;
voice:stop&lt;br&gt;
voice:worker-list&lt;br&gt;
Le flux complet devient :&lt;/p&gt;

&lt;p&gt;voice:start&lt;br&gt;
→ Recorder démarre&lt;br&gt;
→ voice:stop&lt;br&gt;
→ Recorder finalise&lt;br&gt;
→ TranscribeFlow s’exécute&lt;br&gt;
→ Texte produit&lt;br&gt;
Sans état global externe.&lt;/p&gt;

&lt;p&gt;Pourquoi Flow ?&lt;br&gt;
Flow permet :&lt;/p&gt;

&lt;p&gt;Une architecture orientée pipeline&lt;br&gt;
Des stratégies d’Input Processing (IP Strategy)&lt;br&gt;
Une gestion explicite des événements&lt;br&gt;
Une séparation nette entre orchestration et logique métier&lt;br&gt;
Le système n’est pas couplé à Whisper.&lt;/p&gt;

&lt;p&gt;Whisper est une implémentation. Flow est la structure.&lt;/p&gt;

&lt;p&gt;Ce que valide le MVP&lt;br&gt;
Gestion propre d’un processus système&lt;br&gt;
Modélisation explicite des états&lt;br&gt;
Orchestration événementielle&lt;br&gt;
Extensibilité du pipeline&lt;br&gt;
Ce n’est pas un produit.&lt;/p&gt;

&lt;p&gt;C’est une base architecturale.&lt;/p&gt;

&lt;p&gt;Évolutions possibles&lt;br&gt;
Les prochaines itérations naturelles :&lt;/p&gt;

&lt;p&gt;Streaming par chunk audio&lt;br&gt;
Transcription parallèle&lt;br&gt;
Post-traitement LLM&lt;br&gt;
Intégration NativePHP (desktop)&lt;br&gt;
Support mobile&lt;br&gt;
Batching multi-modèles&lt;br&gt;
Mais ces évolutions ne changent pas le cœur :&lt;/p&gt;

&lt;p&gt;Une architecture claire. Une orchestration maîtrisée. Un pipeline extensible.&lt;/p&gt;

&lt;p&gt;Code source&lt;br&gt;
Le dépôt open source est disponible ici :&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/darkwood-com/flowvox" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/flowvox&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Contributions, suggestions et retours sont les bienvenus.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Construire un moteur vocal en PHP est simple.&lt;/p&gt;

&lt;p&gt;Construire une architecture propre autour d’un moteur vocal est plus intéressant.&lt;/p&gt;

&lt;p&gt;Flowvox valide un principe :&lt;/p&gt;

&lt;p&gt;La transcription n’est qu’un composant. L’orchestration est la véritable structure.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>architecture</category>
      <category>opensource</category>
      <category>php</category>
    </item>
    <item>
      <title>⚔️ Découverte de l'extension cataclysme Hearthstone</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Fri, 20 Feb 2026 22:06:20 +0000</pubDate>
      <link>https://dev.to/matyo91/decouverte-de-lextension-cataclysme-hearthstone-5441</link>
      <guid>https://dev.to/matyo91/decouverte-de-lextension-cataclysme-hearthstone-5441</guid>
      <description>&lt;p&gt;La nouvelle ère destructrice arrive le 17 mars 2026&lt;/p&gt;

&lt;p&gt;L’auberge est sur le point d’être secouée comme jamais. L’extension Cataclysme s’inspire d’une version alternative de l’univers de World of Warcraft, où Aile de mort n’a jamais été battu et règne en maître sur Azeroth.&lt;/p&gt;

&lt;p&gt;🌋 Une intrigue sombre : la menace d’Aile de mort&lt;br&gt;
À la fin de Par-delà les voies temporelles, Chromie déclenche par erreur une ligne temporelle cauchemardesque dans laquelle Aile de mort triomphe et envahit Azeroth avec ses six terribles lieutenants colossaux.&lt;/p&gt;

&lt;p&gt;Dans Cataclysme :&lt;/p&gt;

&lt;p&gt;Le ciel est rougeoyant&lt;br&gt;
Azeroth doit à nouveau se défendre&lt;br&gt;
Les héros et héroïnes doivent rallier les Vols draconiques&lt;br&gt;
De nouvelles cartes et mécaniques sont là pour faire pencher la balance&lt;br&gt;
💥 Nouvelle carte héroïque : Aile de Mort le Brise-monde&lt;br&gt;
L’une des grandes nouveautés de Cataclysme est la première carte héroïque Deathwing jouable dans Hearthstone :&lt;/p&gt;

&lt;p&gt;En la jouant, votre héros se transforme en Aile de Mort le Brise-monde&lt;br&gt;
Son Cri de guerre vous permet de choisir un Cataclysme&lt;br&gt;
Vous pouvez déclencher différentes actions destructrices selon vos choix et ressources&lt;br&gt;
Plus vous utilisez le mot-clé Convocation avant de la jouer, plus vous pouvez déclencher de Cataclysmes simultanément&lt;br&gt;
🧱 Mécaniques clés de Cataclysme&lt;br&gt;
🔹 Convocation&lt;br&gt;
Ce mot-clé est au cœur de l’extension :&lt;/p&gt;

&lt;p&gt;Jouer un serviteur avec Convocation invoque un soldat colosse sur le plateau&lt;br&gt;
Plus vous utilisez Convocation, plus votre serviteur colossal devient puissant&lt;br&gt;
Convocation renforce aussi Aile de Mort le Brise-monde pour déclencher davantage de Cataclysmes&lt;br&gt;
🔹 Retour des serviteurs Colossaux&lt;br&gt;
Géants qui occupent plusieurs cases du plateau&lt;br&gt;
Sont accompagnés d’appendices (bras, têtes) qui ont leurs propres effets&lt;br&gt;
Une nouvelle légendaire colossale est disponible pour chaque classe fidélisée à Aile de mort (ex : Ragnaros le Grand Feu pour les guerriers)&lt;br&gt;
🔹 Scission&lt;br&gt;
Ce mot-clé innovant affecte certaines cartes de type défense des Vols draconiques :&lt;/p&gt;

&lt;p&gt;Quand vous piochez une carte Scission, elle se sépare en deux morceaux&lt;br&gt;
Ces morceaux se placent aux extrémités de votre main&lt;br&gt;
Si vous les réunissez en jouant les cartes entre eux, ils se recombinent pour déclencher deux effets pour le prix d’un seul&lt;br&gt;
🌀 Autres effets innovants&lt;br&gt;
Cataclysme ajoute également des cartes qui permettent de :&lt;/p&gt;

&lt;p&gt;Cibler des cartes spécifiques dans votre main&lt;br&gt;
Manipuler la main à des fins tactiques&lt;br&gt;
Renforcer votre deck pour des stratégies plus dynamiques&lt;br&gt;
🛡️ Les Vols draconiques en renfort&lt;br&gt;
Pour contrer la puissance d’Aile de mort :&lt;/p&gt;

&lt;p&gt;🌟 Les classes mage, prêtre, druide, chasseur, paladin bénéficient d’un nouvel Aspect draconique légendaire. Par exemple, le chasseur obtient Ébyssian du Vol noir, capable de se transformer en puissant dragon.&lt;/p&gt;

&lt;p&gt;🎁 Récompenses gratuites et événements&lt;br&gt;
Blizzard a prévu un flot de récompenses pour préparer votre aventure :&lt;/p&gt;

&lt;p&gt;🎉 Avant la sortie :&lt;br&gt;
Paquets gratuits à gagner durant les diffusions Twitch&lt;br&gt;
Accès temporaire aux cartes des extensions Au cœur du Rêve d’émeraude et La cité perdue d’Un’Goro du 10 mars jusqu’à la sortie de Cataclysme&lt;br&gt;
Carte légendaire Maître de guerre Corne-Noire offerte au bonus de connexion&lt;br&gt;
Drops Twitch jusqu’à plusieurs paquets gratuits&lt;br&gt;
Récompenses pour événements en jeu (quêtes, vagues, hauts faits)&lt;br&gt;
📅 Pendant et après le lancement :&lt;br&gt;
Carte légendaire colossale gratuite au parcours de récompenses de la taverne&lt;br&gt;
Récompenses hebdomadaires en connexion (paquets, cartes signature)&lt;br&gt;
Récompenses liées aux quêtes de l’événement de lancement&lt;br&gt;
Dos de carte spécial si vous terminez certains exploits en Bras de fer&lt;br&gt;
👉 Bref : beaucoup de contenu gratuit à récupérer sans dépenser un centime si tu joues régulièrement.&lt;/p&gt;

&lt;p&gt;📆 Calendrier important&lt;br&gt;
🗓️ 10-17 mars : Bras de fer de prélancement – essayez la carte Aile de Mort et gagnez des récompenses 🗓️ 17 mars 2026 : Lancement de l’extension Cataclysme 📆 Du 10 mars au lancement : Accès temporaire aux cartes d’anciennes extensions pour tester des decks&lt;/p&gt;

&lt;p&gt;💡 En résumé : qu’est-ce qui change ?&lt;br&gt;
Cataclysme apporte une histoire alternative intense&lt;br&gt;
Aile de mort est jouable et destructrice&lt;br&gt;
De puissants mots-clés : Convocation, Scission&lt;br&gt;
Retour des serviteurs colossaux&lt;br&gt;
Beaucoup de récompenses gratuites&lt;br&gt;
Un gameplay plus tactique et stratégique&lt;br&gt;
💬 Mon avis Darkwood : Cette extension promet une expérience plus riche tactiquement, avec des decks qui récompensent la planification et la gestion de main. Elle offre aussi de nombreuses opportunités gratuites pour les joueurs Free-to-Play.&lt;/p&gt;

&lt;p&gt;Références :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hearthstone.blizzard.com/fr-fr/expansions-adventures/cataclysm" rel="noopener noreferrer"&gt;https://hearthstone.blizzard.com/fr-fr/expansions-adventures/cataclysm&lt;/a&gt; "Cataclysme"&lt;br&gt;
&lt;a href="https://hearthstone.blizzard.com/fr-fr/news/24245219/aile-de-mort-contre-attaque-dans-cataclysme-la-nouvelle-extension-de-hearthstone" rel="noopener noreferrer"&gt;https://hearthstone.blizzard.com/fr-fr/news/24245219/aile-de-mort-contre-attaque-dans-cataclysme-la-nouvelle-extension-de-hearthstone&lt;/a&gt; "Aile de mort contre-attaque dans CATACLYSME, la nouvelle extension de Hearthstone - Hearthstone"&lt;br&gt;
&lt;a href="https://hearthstone.blizzard.com/fr-fr/news/24242864/votre-guide-pour-decouvrir-les-cartes-de-cataclysme-et-obtenir-des-recompenses-gratuites" rel="noopener noreferrer"&gt;https://hearthstone.blizzard.com/fr-fr/news/24242864/votre-guide-pour-decouvrir-les-cartes-de-cataclysme-et-obtenir-des-recompenses-gratuites&lt;/a&gt; "Votre guide pour découvrir les cartes de CATACLYSME et obtenir des récompenses gratuites - Hearthstone"&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🤖 Développement parallèle d'IA avec Cursor et Git Worktrees</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 15 Feb 2026 22:28:07 +0000</pubDate>
      <link>https://dev.to/matyo91/developpement-parallele-dia-avec-cursor-et-git-worktrees-3480</link>
      <guid>https://dev.to/matyo91/developpement-parallele-dia-avec-cursor-et-git-worktrees-3480</guid>
      <description>&lt;p&gt;Dans cet article, je souhaite présenter un exemple concret de parallélisation du développement à l'aide de Cursor, Git worktrees et d'un véritable bundle Symfony :&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/darkwood-com/ia-exception-bundle" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/ia-exception-bundle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;L’objectif est simple : améliorer le produit en travaillant simultanément sur deux fonctionnalités indépendantes sans conflit, grâce à des agents d’IA.&lt;/p&gt;

&lt;p&gt;Contexte&lt;br&gt;
Je travaille actuellement sur un bundle Symfony appelé :&lt;/p&gt;

&lt;p&gt;Pack d'exceptions Darkwood IA Dépôt : &lt;a href="https://github.com/darkwood-com/ia-exception-bundle" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/ia-exception-bundle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Son objectif est d'améliorer la gestion des exceptions Symfony grâce à l'IA : lorsqu'une erreur 500 se produit, le module analyse l'exception et génère des diagnostics structurés (causes probables, solutions suggérées, score de confiance, etc.).&lt;/p&gt;

&lt;p&gt;Cependant, en travaillant dessus en local, j'ai identifié deux améliorations.&lt;/p&gt;

&lt;p&gt;🟥 Problème 1 Améliorer l'icône d'erreur&lt;br&gt;
L'icône actuelle est une icône de « danger » standard de Bootstrap. Cela fonctionne, mais cela ne communique pas visuellement que l'exception est augmentée par l'IA.&lt;/p&gt;

&lt;p&gt;L'idée : Remplacez-la par une icône de danger sur le thème de l'IA plus appropriée.&lt;/p&gt;

&lt;p&gt;🟦 Problème 2 : Rendu asynchrone de l’analyse IA&lt;br&gt;
Actuellement:&lt;/p&gt;

&lt;p&gt;Une exception se produit.&lt;br&gt;
L'appel à l'IA est déclenché.&lt;br&gt;
La réponse HTTP attend l'IA.&lt;br&gt;
La page complète n'est affichée qu'une fois que l'IA a terminé.&lt;br&gt;
Cela introduit une latence.&lt;/p&gt;

&lt;p&gt;Nous voulons plutôt :&lt;/p&gt;

&lt;p&gt;Rendu immédiat des exceptions.&lt;br&gt;
L'analyse IA est chargée de manière asynchrone. La page sera mise à jour dès réception de la réponse de l'IA.&lt;br&gt;
Pour cela, nous utilisons Symfony UX.&lt;/p&gt;

&lt;p&gt;Le Défi&lt;br&gt;
Comment pouvons-nous travailler sur les deux problèmes en parallèle en utilisant Cursor sans créer de conflits de fichiers ?&lt;/p&gt;

&lt;p&gt;La réponse provient d'une idée popularisée dans des articles récents sur les agents de codage IA :&lt;/p&gt;

&lt;p&gt;Utilisez les répertoires de travail Git pour l'isolation du contexte.&lt;/p&gt;

&lt;p&gt;Petit rappel concernant les arbres de travail Git&lt;br&gt;
Un répertoire de travail Git vous permet de créer un nouveau répertoire de travail rattaché au même dépôt.&lt;/p&gt;

&lt;p&gt;Ce n'est pas un clone parfait.&lt;/p&gt;

&lt;p&gt;Il partage l'historique Git mais réside dans un répertoire physique distinct.&lt;/p&gt;

&lt;p&gt;Exemple:&lt;/p&gt;

&lt;p&gt;git worktree add ../feature-ai-icon feature/ai-icon&lt;br&gt;
git worktree add ../feature-async-render feature/async-render&lt;br&gt;
Vous avez maintenant :&lt;/p&gt;

&lt;p&gt;Dépôt principal&lt;br&gt;
Arborescence de travail A → Fonctionnalité 1&lt;br&gt;
Arborescence de travail B → Fonctionnalité 2&lt;br&gt;
Chacun peut évoluer indépendamment.&lt;/p&gt;

&lt;p&gt;Aucun conflit de fichiers. Pollution sans contexte.&lt;/p&gt;

&lt;p&gt;Pourquoi c'est important pour les agents IA&lt;br&gt;
Avec Cursor, vous pouvez affecter un agent d'IA à chaque arbre de travail.&lt;/p&gt;

&lt;p&gt;L'agent 1 travaille uniquement à l'intérieur :&lt;/p&gt;

&lt;p&gt;feature/ai-icon&lt;br&gt;
L'agent 2 travaille uniquement à l'intérieur :&lt;/p&gt;

&lt;p&gt;feature/async-render&lt;br&gt;
Chaque agent opère de manière isolée.&lt;/p&gt;

&lt;p&gt;C’est ce que nous appelons :&lt;/p&gt;

&lt;p&gt;Isolation du contexte&lt;/p&gt;

&lt;p&gt;Et c'est essentiel pour paralléliser le développement piloté par l'IA.&lt;/p&gt;

&lt;p&gt;Mise en œuvre pratique&lt;br&gt;
Étape 1 Créer deux arbres de travail&lt;br&gt;
J'ai créé manuellement deux arborescences de travail correspondant aux deux problèmes.&lt;/p&gt;

&lt;p&gt;Ensuite, pour chaque arbre de travail, je :&lt;/p&gt;

&lt;p&gt;Ouvert dans le curseur&lt;br&gt;
J'ai collé la description du problème GitHub&lt;br&gt;
Laisser l'agent IA implémenter la fonctionnalité&lt;br&gt;
Étape 2 Rendu asynchrone des exceptions&lt;br&gt;
Pour la fonctionnalité asynchrone, l'IA a implémenté :&lt;/p&gt;

&lt;p&gt;Un chargeur de route dédié&lt;br&gt;
Un IAExceptionController&lt;br&gt;
Un système de stockage de contexte&lt;br&gt;
Un service d'analyse différée de l'IA Comportement conditionnel lorsque le mode asynchrone est activé&lt;br&gt;
Le flux de travail est maintenant le suivant :&lt;/p&gt;

&lt;p&gt;L'exception est générée instantanément.&lt;br&gt;
Symfony UX charge l'analyse IA de manière asynchrone.&lt;br&gt;
La page se met à jour dynamiquement dès réception de la réponse de l'IA.&lt;br&gt;
Cela améliore considérablement la performance perçue.&lt;/p&gt;

&lt;p&gt;Amélioration de l'icône de l'étape 3&lt;br&gt;
Dans le deuxième arbre de travail, l'agent :&lt;/p&gt;

&lt;p&gt;Icône de danger Bootstrap remplacée&lt;br&gt;
Introduction d'un SVG plus épuré sur le thème de l'IA&lt;br&gt;
Compatibilité de mise en page maintenue&lt;br&gt;
Style Bootstrap préservé&lt;br&gt;
Cela était totalement indépendant de la fonctionnalité asynchrone.&lt;/p&gt;

&lt;p&gt;Pas de code qui se chevauche.&lt;/p&gt;

&lt;p&gt;Basculement entre les fonctionnalités&lt;br&gt;
Comme il s'agit d'arborescences de travail, changer de contexte est facile.&lt;/p&gt;

&lt;p&gt;Dans mon application Darkwood locale :&lt;/p&gt;

&lt;p&gt;Le paquet est normalement chargé via Composer.&lt;br&gt;
J'ai temporairement lié le paquet à l'arborescence de travail correspondante.&lt;br&gt;
Cache vidé.&lt;br&gt;
Une exception contrôlée a été déclenchée.&lt;br&gt;
Je pourrais alors tester chaque fonctionnalité indépendamment.&lt;/p&gt;

&lt;p&gt;Passer de la fonctionnalité A à la fonctionnalité B est uniquement nécessaire :&lt;/p&gt;

&lt;p&gt;Modification du lien symbolique&lt;br&gt;
Nettoyage du cache&lt;br&gt;
Rafraîchissant&lt;br&gt;
Pas de fusion. Pas de rebasage. Aucun conflit.&lt;/p&gt;

&lt;p&gt;Nos réalisations&lt;br&gt;
Nous avons maintenant :&lt;/p&gt;

&lt;p&gt;Deux demandes de fusion indépendantes&lt;br&gt;
Deux agents d'IA isolés Aucun conflit de fichiers&lt;br&gt;
Séparation claire des préoccupations&lt;br&gt;
Ces modifications ont été publiées dans :&lt;/p&gt;

&lt;p&gt;👉 v1.0.2 &lt;a href="https://github.com/darkwood-com/ia-exception-bundle/releases/tag/v1.0.2" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/ia-exception-bundle/releases/tag/v1.0.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette version introduit :&lt;/p&gt;

&lt;p&gt;Améliorations de l'interface utilisateur pour le rendu des exceptions d'IA&lt;br&gt;
Chargement de l'analyse IA asynchrone&lt;br&gt;
Séparation architecturale améliorée pour les développements futurs&lt;br&gt;
Quand cela va-t-il se rompre ?&lt;br&gt;
Le développement parallèle fonctionne mieux lorsque les problèmes sont :&lt;/p&gt;

&lt;p&gt;Clairement séparés&lt;br&gt;
Cibler différentes couches&lt;br&gt;
Ne pas modifier les mêmes fichiers&lt;br&gt;
Si deux problèmes se modifient :&lt;/p&gt;

&lt;p&gt;Le même service&lt;br&gt;
Le même modèle Twig&lt;br&gt;
La même manette&lt;br&gt;
Vous rencontrerez des conflits de fusion plus tard.&lt;/p&gt;

&lt;p&gt;Le développement parallèle de l'IA nécessite une décomposition adéquate des tâches.&lt;/p&gt;

&lt;p&gt;Considérations relatives à la production&lt;br&gt;
Si vous poussez plusieurs branches :&lt;/p&gt;

&lt;p&gt;Vous pourriez rencontrer des conflits de ports au niveau local.&lt;br&gt;
Les environnements de prévisualisation peuvent nécessiter une configuration.&lt;br&gt;
Les fonctionnalités asynchrones peuvent nécessiter la persistance du contexte.&lt;br&gt;
Ces problèmes sont gérables, mais doivent être pris en compte.&lt;/p&gt;

&lt;p&gt;Pourquoi c'est puissant&lt;br&gt;
La véritable valeur ne réside pas dans le modèle d'IA.&lt;/p&gt;

&lt;p&gt;C'est:&lt;/p&gt;

&lt;p&gt;Isolement&lt;br&gt;
Orchestration&lt;br&gt;
Contrôle du contexte&lt;br&gt;
Les arborescences de travail Git nous permettent de faire évoluer les sessions de codage IA sans chaos.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Le développement parallèle de l'IA ne consiste pas à exécuter davantage de modèles.&lt;/p&gt;

&lt;p&gt;Il s'agit d'isoler correctement le contexte.&lt;/p&gt;

&lt;p&gt;Avec:&lt;/p&gt;

&lt;p&gt;Arbres de travail Git&lt;br&gt;
Agents de curseur&lt;br&gt;
Expérience utilisateur Symfony&lt;br&gt;
Décomposition propre des problèmes&lt;br&gt;
Vous pouvez faire évoluer en toute sécurité des systèmes complexes sans compromettre vos propres modifications.&lt;/p&gt;

&lt;p&gt;Références&lt;br&gt;
Ensemble d'exceptions IA du référentiel &lt;a href="https://github.com/darkwood-com/ia-exception-bundle" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/ia-exception-bundle&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Version 1.0.2 &lt;a href="https://github.com/darkwood-com/ia-exception-bundle/releases/tag/v1.0.2" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/ia-exception-bundle/releases/tag/v1.0.2&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arbres de travail Git pour agents de codage IA parallèles Upsun &lt;a href="https://devcenter.upsun.com/posts/git-worktrees-for-parallel-ai-coding-agents/" rel="noopener noreferrer"&gt;https://devcenter.upsun.com/posts/git-worktrees-for-parallel-ai-coding-agents/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Arbres de travail Git : La puissance des agents parallèles de Cursor DEV.to &lt;a href="https://dev.to/arifszn/git-worktrees-the-power-behind-cursors-parallel-agents-19j1"&gt;https://dev.to/arifszn/git-worktrees-the-power-behind-cursors-parallel-agents-19j1&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configuration des arborescences de travail de la documentation du curseur &lt;a href="https://cursor.com/fr/docs/configuration/worktrees" rel="noopener noreferrer"&gt;https://cursor.com/fr/docs/configuration/worktrees&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>git</category>
      <category>php</category>
      <category>productivity</category>
    </item>
    <item>
      <title>🤖 Comment rendre Darkwood prêt pour les agents</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Thu, 12 Feb 2026 07:55:32 +0000</pubDate>
      <link>https://dev.to/matyo91/comment-rendre-darkwood-pret-pour-les-agents-3ial</link>
      <guid>https://dev.to/matyo91/comment-rendre-darkwood-pret-pour-les-agents-3ial</guid>
      <description>&lt;p&gt;Les sites web ne sont plus seulement consommés par les humains.&lt;/p&gt;

&lt;p&gt;Elles sont analysées, résumées, classées et interprétées par des agents d'IA.&lt;/p&gt;

&lt;p&gt;Les moteurs de recherche ont constitué la première vague. Les agents utilisant LLM représentent la seconde.&lt;/p&gt;

&lt;p&gt;Récemment, j'ai décidé d'auditer darkwood.com et d'y apporter des améliorations concrètes afin de le rendre plus compréhensible et plus explicite pour les systèmes d'IA.&lt;/p&gt;

&lt;p&gt;Cet article explique ce qui a changé et pourquoi.&lt;/p&gt;

&lt;p&gt;Pourquoi optimiser pour les agents IA ?&lt;br&gt;
Le référencement traditionnel se concentre sur les signaux de classement.&lt;/p&gt;

&lt;p&gt;Les agents d'IA fonctionnent différemment.&lt;/p&gt;

&lt;p&gt;Ils:&lt;/p&gt;

&lt;p&gt;Analyser la structure&lt;br&gt;
Extraire l'intention&lt;br&gt;
Suivre les liens comme des chemins de décision&lt;br&gt;
Classer les types de pages&lt;br&gt;
Évaluer le niveau de confiance&lt;br&gt;
Si votre site web est ambigu, la compréhension d'un agent devient probabiliste et fragile.&lt;/p&gt;

&lt;p&gt;L'objectif était simple :&lt;/p&gt;

&lt;p&gt;Réduire l'ambiguïté. Accroître la clarté.&lt;/p&gt;

&lt;p&gt;Observation initiale : Ambiguïté de la page d’accueil&lt;br&gt;
Historiquement, Darkwood combine plusieurs dimensions :&lt;/p&gt;

&lt;p&gt;Un blog technique&lt;br&gt;
Projets personnels&lt;br&gt;
Un espace de jeu/communauté&lt;br&gt;
Pour les humains, cet écosystème est logique.&lt;/p&gt;

&lt;p&gt;Cependant, pour les systèmes d'IA qui arrivent sur la page d'accueil, les signaux visuels dominants (connexion, jeu, chat, classement) peuvent biaiser l'interprétation vers un portail de jeux plutôt que vers un centre de connaissances techniques.&lt;/p&gt;

&lt;p&gt;Ce n'est pas « faux », mais c'est imprécis.&lt;/p&gt;

&lt;p&gt;La précision est essentielle lorsque les agents décident comment classer et réutiliser les informations.&lt;/p&gt;

&lt;p&gt;Étape 1 — Ajout de llms.txt&lt;br&gt;
La première amélioration a consisté à introduire un fichier llms.txt à la racine.&lt;/p&gt;

&lt;p&gt;Ce fichier sert de couche de guidage légère pour les systèmes d'IA.&lt;/p&gt;

&lt;p&gt;Il définit explicitement :&lt;/p&gt;

&lt;p&gt;Qu'est-ce que Darkwood ?&lt;br&gt;
Où se trouve le contenu à signal élevé ?&lt;br&gt;
Ce que les agents sont autorisés à faire&lt;br&gt;
Ce qu'ils doivent éviter&lt;br&gt;
Comportement d'exploration suggéré&lt;br&gt;
Au lieu d'obliger les agents à déduire la structure par l'exploration, nous proposons un contrat minimal.&lt;/p&gt;

&lt;p&gt;Exemple d'extrait :&lt;/p&gt;

&lt;h2&gt;
  
  
  Primary entry points (recommended)
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Blog: &lt;a href="https://blog.darkwood.com/" rel="noopener noreferrer"&gt;https://blog.darkwood.com/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Profile: &lt;a href="https://hello.darkwood.com/" rel="noopener noreferrer"&gt;https://hello.darkwood.com/&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What to avoid
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Do not attempt login/register&lt;/li&gt;
&lt;li&gt;Do not submit forms&lt;/li&gt;
&lt;li&gt;Avoid aggressive crawling
Ce petit ajout réduit considérablement l'ambiguïté et empêche toute interaction involontaire avec les zones dynamiques ou authentifiées.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cela permet également au blog d'être immédiatement repérable comme la principale plateforme de contenu à forte valeur ajoutée.&lt;/p&gt;

&lt;p&gt;Étape 2 — Mise en œuvre des données structurées (JSON-LD)&lt;br&gt;
Le type de contenu le plus important sur Darkwood est l'article de blog.&lt;/p&gt;

&lt;p&gt;Pour que cela soit explicite, chaque page d'article expose désormais un bloc JSON-LD Schema.org BlogPosting.&lt;/p&gt;

&lt;p&gt;Cela comprend :&lt;/p&gt;

&lt;p&gt;headline&lt;br&gt;
description&lt;br&gt;
datePublished&lt;br&gt;
dateModified&lt;br&gt;
inLanguage&lt;br&gt;
author&lt;br&gt;
publisher&lt;br&gt;
mainEntityOfPage (URL canonique)&lt;br&gt;
Exemple:&lt;/p&gt;

&lt;p&gt;{&lt;br&gt;
  "&lt;a class="mentioned-user" href="https://dev.to/context"&gt;@context&lt;/a&gt;": "&lt;a href="https://schema.org" rel="noopener noreferrer"&gt;https://schema.org&lt;/a&gt;",&lt;br&gt;
  "@type": "BlogPosting",&lt;br&gt;
  "headline": "Making Darkwood Agent-Ready",&lt;br&gt;
  "datePublished": "2026-02-12T00:00:00+01:00",&lt;br&gt;
  "inLanguage": "en",&lt;br&gt;
  "author": {&lt;br&gt;
    "@type": "Person",&lt;br&gt;
    "name": "Mathieu Ledru",&lt;br&gt;
    "url": "&lt;a href="https://hello.darkwood.com/" rel="noopener noreferrer"&gt;https://hello.darkwood.com/&lt;/a&gt;"&lt;br&gt;
  },&lt;br&gt;
  "publisher": {&lt;br&gt;
    "@type": "Organization",&lt;br&gt;
    "name": "Darkwood",&lt;br&gt;
    "url": "&lt;a href="https://darkwood.com/" rel="noopener noreferrer"&gt;https://darkwood.com/&lt;/a&gt;"&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
Pourquoi c'est important :&lt;/p&gt;

&lt;p&gt;Les agents n'ont plus besoin de deviner le type de page&lt;br&gt;
Les métadonnées de publication deviennent fiables&lt;br&gt;
L'alignement canonique est explicite&lt;br&gt;
Le contexte linguistique est clair&lt;br&gt;
Les données structurées renforcent la confiance dans les systèmes de raisonnement automatisés.&lt;/p&gt;

&lt;p&gt;Cela réduit l'entropie interprétative.&lt;/p&gt;

&lt;p&gt;Ce qui a changé techniquement&lt;br&gt;
La mise en œuvre requise :&lt;/p&gt;

&lt;p&gt;Ajout d'un fichier statique llms.txt à la racine du domaine&lt;br&gt;
Garantie d'une diffusion correcte en texte brut&lt;br&gt;
Injection de JSON-LD dans les modèles d'articles&lt;br&gt;
Alignement des URL canoniques&lt;br&gt;
Normalisation du format de date ISO-8601&lt;br&gt;
Aucune nouvelle dépendance n'a été introduite. Aucune modification de l'interface utilisateur n'a été nécessaire.&lt;/p&gt;

&lt;p&gt;Les modifications sont minimes, mais structurelles.&lt;/p&gt;

&lt;p&gt;Pourquoi c'est important&lt;br&gt;
L'optimisation pour les agents d'IA ne consiste pas à suivre les tendances.&lt;/p&gt;

&lt;p&gt;Il s'agit de :&lt;/p&gt;

&lt;p&gt;Énoncer clairement son intention&lt;br&gt;
Réduire l'ambiguïté&lt;br&gt;
Rendre le contenu interprétable par machine&lt;br&gt;
Définir explicitement les limites&lt;br&gt;
Les sites web s'intègrent de plus en plus à des écosystèmes automatisés.&lt;/p&gt;

&lt;p&gt;La clarté n'est plus une option.&lt;/p&gt;

&lt;p&gt;Détails de mise en œuvre&lt;br&gt;
Vous pouvez consulter l'implémentation exacte dans la demande d'extraction correspondante :&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/darkwood-com/darkwood-com/pull/106" rel="noopener noreferrer"&gt;https://github.com/darkwood-com/darkwood-com/pull/106&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🧑‍💻 Codeur vs Vibe codeur</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Wed, 11 Feb 2026 09:22:32 +0000</pubDate>
      <link>https://dev.to/matyo91/codeur-vs-vibe-codeur-3phj</link>
      <guid>https://dev.to/matyo91/codeur-vs-vibe-codeur-3phj</guid>
      <description>&lt;p&gt;Pendant longtemps, la distinction entre un bon développeur et un développeur médiocre se faisait sur des critères classiques : lisibilité du code, architecture, performances, tests. Ces critères restent valables. Mais ils ne suffisent plus à décrire ce qui est en train d’émerger.&lt;/p&gt;

&lt;p&gt;Avec l’arrivée d’outils comme Cursor, une autre posture devient visible : celle du vibe codeur.&lt;/p&gt;

&lt;p&gt;Ce n’est pas un nouveau métier. Ce n’est pas non plus “coder avec de l’IA”. C’est un déplacement du centre de gravité.&lt;/p&gt;

&lt;p&gt;Le codeur : le code comme point d’entrée&lt;br&gt;
Le codeur “classique” travaille dans un environnement où :&lt;/p&gt;

&lt;p&gt;les fichiers sont centraux&lt;br&gt;
l’arborescence est la carte du territoire&lt;br&gt;
l’IDE est un instrument de précision&lt;br&gt;
La logique est la suivante :&lt;/p&gt;

&lt;p&gt;Le problème est compris → le code est écrit → le résultat émerge&lt;/p&gt;

&lt;p&gt;Dans cette posture :&lt;/p&gt;

&lt;p&gt;le code est la source de vérité&lt;br&gt;
l’outil (IDE, AI, terminal) est un accélérateur&lt;br&gt;
l’intention est traduite manuellement en structure&lt;br&gt;
Cette approche est robuste, déterministe, efficace sur des problèmes bien définis. Elle reste indispensable.&lt;/p&gt;

&lt;p&gt;Le vibe codeur : l’intention comme point d’entrée&lt;br&gt;
Avec les IDE augmentés par l’IA, une autre posture apparaît.&lt;/p&gt;

&lt;p&gt;Dans Cursor, un simple détail devient révélateur : le fait de placer l’agent AI à gauche et les fichiers à droite.&lt;/p&gt;

&lt;p&gt;Ce changement n’est pas cosmétique.&lt;/p&gt;

&lt;p&gt;Il traduit une inversion :&lt;/p&gt;

&lt;p&gt;l’interface principale devient conversationnelle&lt;br&gt;
les fichiers deviennent une projection&lt;br&gt;
le code n’est plus le point de départ, mais le résultat&lt;br&gt;
Le raisonnement devient :&lt;/p&gt;

&lt;p&gt;J’exprime une intention → je valide une direction → le code s’aligne&lt;/p&gt;

&lt;p&gt;Ce qui change réellement&lt;br&gt;
La différence ne se situe pas dans :&lt;/p&gt;

&lt;p&gt;le langage&lt;br&gt;
le framework&lt;br&gt;
la qualité syntaxique&lt;br&gt;
Elle se situe dans ce qui guide l’action.&lt;/p&gt;

&lt;p&gt;Le vibe codeur ne “lâche” pas la technique. Il la retarde volontairement.&lt;/p&gt;

&lt;p&gt;Le code devient une conséquence, pas une preuve&lt;br&gt;
Dans une approche vibe :&lt;/p&gt;

&lt;p&gt;on ne prouve plus la compétence par la complexité du code&lt;br&gt;
on la prouve par la cohérence du résultat&lt;br&gt;
le code est jetable, réécrivable, ajustable&lt;br&gt;
Ce qui compte :&lt;/p&gt;

&lt;p&gt;la clarté de l’intention&lt;br&gt;
la vitesse de convergence&lt;br&gt;
la capacité à corriger le tir sans attachement excessif à l’implémentation&lt;br&gt;
Le code cesse d’être un artefact sacré. Il devient un support de matérialisation.&lt;/p&gt;

&lt;p&gt;Cursor n’est pas la cause, c’est le révélateur&lt;br&gt;
Important : Cursor ne crée pas le vibe coding.&lt;/p&gt;

&lt;p&gt;Il le rend visible.&lt;/p&gt;

&lt;p&gt;Il expose :&lt;/p&gt;

&lt;p&gt;une mémoire de contexte persistante&lt;br&gt;
une continuité d’intention&lt;br&gt;
un espace où la pensée précède la structure&lt;br&gt;
Le changement de layout (agent à gauche, fichiers à droite) agit comme un révélateur cognitif :&lt;/p&gt;

&lt;p&gt;ce n’est plus le code qui guide la pensée, c’est la pensée qui guide le code.&lt;/p&gt;

&lt;p&gt;Le codeur et le vibe codeur ne s’opposent pas&lt;br&gt;
Ils ne sont pas concurrents. Ils sont complémentaires.&lt;/p&gt;

&lt;p&gt;le codeur excelle dans la stabilisation&lt;br&gt;
le vibe codeur excelle dans l’exploration&lt;br&gt;
l’un solidifie&lt;br&gt;
l’autre oriente&lt;br&gt;
Dans les systèmes complexes, les deux sont nécessaires. Mais ignorer l’émergence du vibe coding, c’est manquer une mutation majeure : celle où l’intention devient la primitive principale du développement.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
Le vibe codeur ne remplace pas le codeur. Il déplace simplement le centre de gravité :&lt;/p&gt;

&lt;p&gt;du code vers l’intention&lt;br&gt;
de l’implémentation vers l’expérience&lt;br&gt;
de l’outil vers le flux cognitif&lt;br&gt;
Le code reste indispensable. Il n’est simplement plus le point de départ.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>career</category>
      <category>discuss</category>
      <category>programming</category>
    </item>
    <item>
      <title>⚙️ FOSDEM 2026 : signaux structurels de l’écosystème open source</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Sun, 01 Feb 2026 19:15:57 +0000</pubDate>
      <link>https://dev.to/matyo91/fosdem-2026-signaux-structurels-de-lecosysteme-open-source-16do</link>
      <guid>https://dev.to/matyo91/fosdem-2026-signaux-structurels-de-lecosysteme-open-source-16do</guid>
      <description>&lt;p&gt;IMG_4396.jpg&lt;br&gt;
FOSDEM 2026 a marqué ma première participation en présentiel à l'événement, limitée aux sessions du samedi. Ce qui frappe immédiatement, c'est son ampleur : des dizaines de sessions parallèles, des centaines de conférences et une nécessité constante de faire des choix. On comprend très vite que FOSDEM ne se prend pas à la légère ; sans préparation, la densité même du contenu devient vite étouffante.&lt;/p&gt;

&lt;p&gt;Une seule journée sur place a suffi pour comprendre que le véritable défi n'est pas l'accès à l'information, mais sa sélection. Choisir les salles à privilégier, les conférences à suivre en direct ou en différé, et quand utiliser le système de chat de la conférence, fait partie intégrante de l'expérience. Cet article reflète cette première impression, en combinant observations directes et données techniques issues des sessions suivies.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Discours d'ouverture et souveraineté numérique
Le discours d'ouverture de FOSDEM 2026 a abordé la question de la souveraineté numérique. Un concept central introduit était celui de « logiciels libres et open source en temps de guerre, de pénurie et d'IA (adversaire) » ou de location stratégique d'ordinateurs », décrivant la transition progressive du secteur vers des stratégies privilégiant le cloud et la facilité d'utilisation au détriment de l'autonomie. Ce modèle renforce les dépendances structurelles aux plateformes propriétaires, exposant les utilisateurs et les organisations à des modifications unilatérales, des interruptions de service ou des contraintes imposées par des politiques spécifiques.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;D'un point de vue systémique, la chaîne d'approvisionnement logicielle est apparue comme une surface d'attaque majeure. Une entreprise européenne moyenne dépendant de dizaines de milliers de composants logiciels, l'infrastructure moderne ressemble de plus en plus à une tour de Jenga : stable jusqu'à ce qu'un seul bloc, souvent invisible, soit retiré. Des incidents tels que la porte dérobée XZ et des stratégies d'infiltration similaires à long terme illustrent comment les faiblesses de la chaîne d'approvisionnement sont exploitées de manière asymétrique au fil du temps.&lt;/p&gt;

&lt;p&gt;Plutôt que de proposer des réponses axées sur la réglementation, le discours d'ouverture a mis l'accent sur la structure organisationnelle comme enjeu technique fondamental. Plus précisément, les organisations à responsabilité limitée dotées de missions d'intérêt public explicites ont été présentées comme une alternative structurelle aux modèles axés sur le capital-risque, où les incitations à la sortie à court terme entrent souvent en conflit avec l'intégrité de l'infrastructure à long terme.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Échelle, densité et nécessité de préparation
FOSDEM 2026 a réuni plus de 8 000 participants et proposé plus de 1 000 conférences réparties dans 65 salles de développement, ce qui en fait l'un des rassemblements techniques open source les plus importants d'Europe. Ma première participation, limitée à la première journée, a suffi à mettre en évidence une contrainte récurrente : FOSDEM ne se prête pas à une approche opportuniste.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Le nombre important de sessions parallèles rend la prise de décision en temps réel inefficace. Tirer pleinement profit de l'événement nécessite une préparation en amont, notamment l'identification préalable des thématiques, des intervenants et des domaines techniques. Sans cela, la conférence se transforme rapidement en un exercice de changement constant de contexte plutôt qu'en un moment d'apprentissage ciblé.&lt;/p&gt;

&lt;p&gt;Cette densité se reflète dans l'écosystème numérique de FOSDEM. La plateforme de chat officielle, fonctionnant sous Matrix/Element et accessible via chat.fosdem.org, prolonge les discussions au-delà des salles physiques. Elle sert de plateforme de coordination pour les modifications de dernière minute, les suivis techniques et les échanges asynchrones, un complément essentiel lorsque la présence physique seule ne suffit pas.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;L'évolution des outils plutôt que le battage médiatique
Plusieurs sessions ont confirmé une tendance plus générale : l’innovation significative dans l’open source se situe actuellement au niveau des outils de base, et non au niveau des nouveautés de la couche produit.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les discussions autour de Git v3 se sont concentrées sur les contraintes de mise à l'échelle extrême, notamment pour les dépôts contenant des dizaines de millions de références. L'adoption du backend reftable permet des mises à jour atomiques et des vues de référence cohérentes, palliant ainsi les limitations persistantes des systèmes de fichiers. Les recherches sur le découpage par blocs défini par le contenu pour les objets volumineux laissent également entrevoir la réintégration de fonctionnalités auparavant externalisées vers des systèmes comme Git LFS.&lt;/p&gt;

&lt;p&gt;Git&lt;/p&gt;

&lt;p&gt;De même, les sessions Webview ont mis l'accent sur la portabilité et la spécification comportementale plutôt que sur de nouvelles abstractions. Les ingénieurs documentent de plus en plus les divergences entre les plateformes, notamment entre Android et iOS, afin de définir des bases stables pour le contenu web intégré. L'intérêt porté au moteur Servo témoigne d'une volonté de disposer de composants découplés et performants, indépendants des moteurs monolithiques du système d'exploitation.&lt;/p&gt;

&lt;p&gt;Webview&lt;/p&gt;

&lt;p&gt;Dans les deux cas, l'accent est mis sur la maintenance, la prévisibilité et l'échelle, et non sur la perturbation.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Systèmes appliqués soumis aux contraintes du monde réel
La présentation de Botronics a illustré comment l'ingénierie appliquée se confronte aux contraintes physiques. Concevoir un chariot de golf autonome grand public avec un prix cible d'environ 5 000 € implique des compromis constants entre fonctionnalités, fiabilité et coût.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Les principales décisions techniques ont été dictées par la réalité opérationnelle :&lt;/p&gt;

&lt;p&gt;La migration vers Zenoh pour la communication de mémoire partagée a permis de réduire l'utilisation du processeur d'environ 10 %, améliorant ainsi l'efficacité thermique et énergétique. * Balena a été adopté pour les mises à jour OTA afin d'éviter la complexité opérationnelle liée à la maintenance d'images Yocto personnalisées sur un parc d'appareils. * L'exploitation en environnements extérieurs non contrôlés a orienté les efforts vers une localisation robuste et une détection d'obstacles par vision par ordinateur, en évitant délibérément les systèmes de capteurs coûteux tels que le LiDAR.&lt;br&gt;
Il ne s'agissait pas d'un discours sur l'innovation pour l'innovation, mais sur la discipline de l'ingénierie sous contrainte.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Boucles de rétroaction directe : le cas Joplin
Joplin stand&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;L'un des atouts structurels de FOSDEM demeure l'accès direct aux responsables de la maintenance. Les échanges avec Laurent Cozic, créateur de Joplin, et Greg Lagarde, responsable marketing chez Joplin, ont permis de mieux comprendre l'évolution du projet, notamment celle de l'application web open source Joplin, actuellement en version bêta.&lt;/p&gt;

&lt;p&gt;Ces échanges permettent d'obtenir des retours d'information qui vont au-delà des outils de suivi des problèmes, notamment concernant les modèles de synchronisation, la cohérence interplateforme et les pratiques d'utilisation réelles. Cela rejoint les précédents articles de Darkwood qui présentent Joplin comme un outil quotidien de gestion des connaissances, notamment :&lt;/p&gt;

&lt;p&gt;Introduction à Joplin&lt;br&gt;
Automatisation de la création de notes dans Joplin&lt;br&gt;
Cette interaction a renforcé le positionnement de Joplin en tant que système de gestion autonome des connaissances, où le contrôle des données, des formats et des flux de travail demeure primordial. Vous pouvez en avoir un aperçu sur la chaîne YouTube.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Automatisation, IA et mentalité de chaîne d'outils
Les discussions sur l'IA lors du FOSDEM ont été remarquablement pragmatiques. Plutôt que de présenter l'IA comme un substitut cognitif, plusieurs conversations ont fait écho à la mise en garde du discours d'ouverture concernant la délégation de la pensée elle-même, parfois décrite comme un chemin vers la « démence numérique ».&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;L’attention s’est plutôt portée sur l’IA comme outil d’augmentation des infrastructures :&lt;/p&gt;

&lt;p&gt;Utilisation de plugins tels que Jarvis pour une assistance contextuelle dans les notes. * Exploration des intégrations basées sur MCP pour connecter les systèmes de notes à des modèles de langage locaux ou auto-hébergés. * Maintien des charges de travail d'IA locales, conteneurisées et auditables, en évitant les dépendances opaques aux solutions SaaS.&lt;br&gt;
Dans cette perspective, l'IA est considérée comme une couche de nettoyage prenant en charge des tâches répétitives ou structurelles plutôt que comme une source de vérité faisant autorité.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Écosystème, campus et réalité physique
La présence des distributions fondamentales Ubuntu, Debian, Nix à FOSDEM souligne la nature stratifiée de l'écosystème open source. Ces projets constituent le socle sur lequel repose l'innovation de plus haut niveau.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ubuntu Nix&lt;/p&gt;

&lt;p&gt;Le campus Solbosch de l’Université Libre de Bruxelles (ULB), situé à environ 30 minutes du centre de Bruxelles en métro et en bus, offre un pendant physique idéal à cette structure à plusieurs niveaux : vaste, décentralisé et parfois complexe à parcourir. Son ampleur souligne la nécessité d’une circulation intentionnelle, tant physique qu’intellectuelle, tout au long de l’événement.&lt;/p&gt;

&lt;p&gt;Au-delà des conférences et des stands, FOSDEM sert également de point de convergence pour des rencontres informelles et directes. Ces échanges informels font souvent émerger des problématiques de gouvernance, des orientations de projets à long terme et des tensions au sein de l'écosystème qui sont rarement abordées lors de présentations formelles.&lt;/p&gt;

&lt;p&gt;ULB&lt;/p&gt;

&lt;p&gt;Conclusion&lt;br&gt;
FOSDEM 2026 confirme une évolution majeure au sein de l'open source : un passage d'une innovation fragmentée à des infrastructures intégrées, résilientes et souveraines. Aujourd'hui, les travaux les plus importants se concentrent sur des domaines souvent considérés comme peu attrayants : l'outillage, la maintenance, la gouvernance et la gestion des dépendances.&lt;/p&gt;

&lt;p&gt;Tirer profit d'un tel écosystème exige de la préparation, de la sélectivité et une bonne compréhension de celui-ci. FOSDEM ne récompense pas la consommation passive. Il valorise ceux qui l'abordent comme un système à appréhender, et non comme un événement auquel participer.&lt;/p&gt;

</description>
      <category>community</category>
      <category>devjournal</category>
      <category>opensource</category>
      <category>techtalks</category>
    </item>
    <item>
      <title>🎮 Comprendre l’ECS : la brique invisible derrière les jeux modernes</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 13 Oct 2025 09:30:13 +0000</pubDate>
      <link>https://dev.to/matyo91/comprendre-lecs-la-brique-invisible-derriere-les-jeux-modernes-1a1e</link>
      <guid>https://dev.to/matyo91/comprendre-lecs-la-brique-invisible-derriere-les-jeux-modernes-1a1e</guid>
      <description>&lt;p&gt;Quand on conçoit un jeu, surtout un jeu tactique ou systémique comme Darkwaar, on se retrouve vite à jongler entre :&lt;/p&gt;

&lt;p&gt;des entités (joueurs, ennemis, objets, cases),&lt;br&gt;
des comportements (mouvement, attaque, effet),&lt;br&gt;
et des systèmes (rendu, IA, collisions, effets de statut...).&lt;br&gt;
Les approches orientées objet classiques finissent vite par créer des hiérarchies trop profondes : Player extends Character extends Entity extends Drawable extends Object… Résultat : une usine à gaz.&lt;/p&gt;

&lt;p&gt;C’est là qu’intervient l’ECS — Entity Component System.&lt;/p&gt;

&lt;p&gt;⚙️ L’idée de base&lt;br&gt;
L’ECS part d’un principe simple :&lt;/p&gt;

&lt;p&gt;séparer les données, le comportement, et l’exécution.&lt;/p&gt;

&lt;p&gt;| Élément | Rôle | Exemple | | ------------- | ------------------------------------------- | --------------------------------------------------------- | | Entity | Identifiant unique | #23 = Guerrier sur la case (3,2) | | Component | Données brutes (pas de logique) | Position(3,2), Vie(10), Attaque(3) | | System | Comportement (agit sur certains composants) | SystemeDeMouvement, SystemeDeCombat, SystemeDeRendu |&lt;/p&gt;

&lt;p&gt;L’ECS ne remplace pas la programmation orientée objet — il la déstructure pour la rendre évolutive. Au lieu d’écrire ce que fait chaque classe, on définit comment les données interagissent.&lt;/p&gt;

&lt;p&gt;🧩 Exemple concret&lt;br&gt;
Prenons un exemple simplifié en GDScript (Godot) :&lt;/p&gt;

&lt;h1&gt;
  
  
  Composant Position
&lt;/h1&gt;

&lt;p&gt;class_name CPosition&lt;br&gt;
extends Resource&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/export"&gt;@export&lt;/a&gt; var q:int&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/export"&gt;@export&lt;/a&gt; var r:int&lt;/p&gt;

&lt;h1&gt;
  
  
  Composant Vie
&lt;/h1&gt;

&lt;p&gt;class_name CVie&lt;br&gt;
extends Resource&lt;br&gt;
&lt;a class="mentioned-user" href="https://dev.to/export"&gt;@export&lt;/a&gt; var hp:int = 10&lt;/p&gt;

&lt;h1&gt;
  
  
  Système de rendu
&lt;/h1&gt;

&lt;p&gt;extends Node&lt;br&gt;
const CPosition = preload("res://components/CPosition.gd")&lt;/p&gt;

&lt;p&gt;func process_system(dt):&lt;br&gt;
    for entity in get_entities_with([CPosition]):&lt;br&gt;
        var pos = entity.get_component(CPosition)&lt;br&gt;
        draw_unit(pos.q, pos.r)&lt;br&gt;
Ici :&lt;/p&gt;

&lt;p&gt;l’entité ne “fait” rien — elle contient des composants ;&lt;br&gt;
les systèmes se déclenchent sur les entités qui possèdent un certain ensemble de composants.&lt;br&gt;
C’est une approche data-driven : tout est piloté par les données.&lt;/p&gt;

&lt;p&gt;🧮 Pourquoi c’est puissant&lt;br&gt;
L’ECS n’est pas juste un design pattern à la mode. C’est une approche structurante qui résout trois problèmes majeurs :&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Évolutivité
Tu peux ajouter de nouveaux comportements sans casser les anciens :&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Ajouter un composant CInvisible suffit pour qu’un système “Rendu” ignore ton entité.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Rejeu et simulation&lt;br&gt;
Tu peux rejouer une partie en appliquant la même séquence d’événements, car tout l’état du jeu est pur data, sérialisable, diffable et testable.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Performance&lt;br&gt;
Les ECS modernes (comme Flecs, EnTT ou Unity DOTS) stockent les données en mémoire contiguë. Le CPU adore ça :&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;moins d’appels, moins de cache-miss, plus de vitesse.&lt;/p&gt;

&lt;p&gt;🧱 Dans Darkwaar 5&lt;br&gt;
Darkwaar 5 repose sur un ECS léger en GDScript, sans moteur externe. L’objectif est d’avoir :&lt;/p&gt;

&lt;p&gt;un monde (World) central,&lt;br&gt;
des entités simples (un Node par personnage ou objet),&lt;br&gt;
des composants (Resource) pour les données,&lt;br&gt;
des systèmes (Node) pour la logique.&lt;br&gt;
Exemple simplifié :&lt;/p&gt;

&lt;h1&gt;
  
  
  GameRoot.gd
&lt;/h1&gt;

&lt;p&gt;@onready var world := $World&lt;/p&gt;

&lt;p&gt;func _ready():&lt;br&gt;
    var unit = world.create_entity()&lt;br&gt;
    unit.add_component(CPosition.new())&lt;br&gt;
    unit.add_component(CVie.new())&lt;br&gt;
Chaque frame :&lt;/p&gt;

&lt;p&gt;le World passe sur les systèmes actifs ;&lt;br&gt;
les systèmes parcourent les entités qui les concernent ;&lt;br&gt;
et la logique s’exécute sur les données brutes.&lt;br&gt;
Cette séparation permet d’ajouter facilement :&lt;/p&gt;

&lt;p&gt;un système de buffs (effets temporaires),&lt;br&gt;
un système de résolution de combat,&lt;br&gt;
ou un système de puzzle pour les niveaux.&lt;br&gt;
🧩 ECS ≠ magie&lt;br&gt;
L’ECS ne fait pas “mieux” qu’une approche orientée objet : il fait plus simple à maintenir.&lt;/p&gt;

&lt;p&gt;Mais il y a un coût : il faut penser en flux de données, pas en hiérarchie d’objets.&lt;/p&gt;

&lt;p&gt;Pas de “Player.move()”, mais un SystemMouvement qui lit les CPosition et CVitesse.&lt;br&gt;
Pas de “Enemy.attack()”, mais un SystemCombat qui lit les CCombat et CVie.&lt;br&gt;
C’est un changement de paradigme — mais une fois compris, tout devient plus clair.&lt;/p&gt;

&lt;p&gt;🧭 Ce que Darkwood en retient&lt;br&gt;
Chez Darkwood, l’ECS n’est pas qu’une architecture de jeu. C’est une façon de penser la modularité :&lt;/p&gt;

&lt;p&gt;Dans Darkwaar, il structure le gameplay et les puzzles.&lt;br&gt;
Dans Uniflow, il inspire la logique des “flows” de données.&lt;br&gt;
Dans Flow, il sert de base pour la composition visuelle d’automatisations.&lt;br&gt;
Même combat : séparer les données, les comportements et la logique d’exécution.&lt;/p&gt;

&lt;p&gt;🔮 Et après ?&lt;br&gt;
La prochaine étape pour Darkwaar 5 :&lt;/p&gt;

&lt;p&gt;intégrer l’ECS au système de carte isométrique ;&lt;br&gt;
lier chaque case à une entité ;&lt;br&gt;
et synchroniser les composants entre la vue (haut) et le HUD (bas).&lt;br&gt;
Cela posera les fondations d’un moteur tactique isométrique open-source, pensé pour la génération procédurale, les puzzles et les systèmes émergents.&lt;/p&gt;

&lt;p&gt;🧩 Ressources&lt;br&gt;
ECS FAQ – Sander Mertens (Flecs)&lt;br&gt;
Zeste de Savoir – L’Entity Component System&lt;br&gt;
Bevy Engine – ECS in Rust&lt;br&gt;
Unity DOTS documentation&lt;/p&gt;

</description>
      <category>architecture</category>
      <category>gamedev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 Uniflow 1.1.18</title>
      <dc:creator>Mathieu Ledru</dc:creator>
      <pubDate>Mon, 06 Oct 2025 09:33:59 +0000</pubDate>
      <link>https://dev.to/matyo91/uniflow-1118-3oi5</link>
      <guid>https://dev.to/matyo91/uniflow-1118-3oi5</guid>
      <description>&lt;p&gt;✨ Darkwood Update : Uniflow 1.1.18 &amp;amp; les prototypes Darkwaar intégrés sur uniflow.io&lt;/p&gt;

&lt;p&gt;🧩 Uniflow 1.1.18 – Le nouveau composant HtmlFlow&lt;br&gt;
La version 1.1.18 d’Uniflow introduit un nouveau composant clé : HtmlFlow. Il permet désormais d’afficher directement du contenu HTML stocké dans une variable de contexte — que ce soit un fragment de texte, un rendu visuel ou même une iframe générée dynamiquement par un autre flow.&lt;/p&gt;

&lt;p&gt;Ce composant, développé la semaine dernière, marque une étape importante dans la philosophie Flow Based Programming d’Uniflow : rendre les flows autonomes, visuels et interactifs, sans dépendre d’une interface externe.&lt;/p&gt;

&lt;p&gt;⚙️ Exemple minimal&lt;br&gt;
// JavascriptFlow&lt;br&gt;
const iframe = &lt;code&gt;&amp;lt;iframe frameborder="0"&lt;br&gt;
  src="https://itch.io/embed-upload/15043973?color=333333"&lt;br&gt;
  allowfullscreen&lt;br&gt;
  width="640"&lt;br&gt;
  height="380"&amp;gt;&lt;br&gt;
  &amp;lt;a href="https://darkwoodcom.itch.io/darkwaar1"&amp;gt;Play Darkwaar1 on itch.io&amp;lt;/a&amp;gt;&lt;br&gt;
&amp;lt;/iframe&amp;gt;&lt;/code&gt;;&lt;/p&gt;

&lt;p&gt;context.gameHtml = iframe;&lt;br&gt;
return context;&lt;/p&gt;

&lt;p&gt;// HtmlFlow → Variable = gameHtml&lt;br&gt;
Ici, le JavascriptFlow crée une iframe (par exemple vers un jeu itch.io) et la stocke dans gameHtml. Le HtmlFlow récupère cette variable et l’affiche directement, sans iframe interne, grâce à un rendu sécurisé côté client.&lt;/p&gt;

&lt;p&gt;🔒 Un rendu HTML sécurisé&lt;br&gt;
Le HtmlFlow n’est pas un simple dangerouslySetInnerHTML. Il applique un filtrage DOM personnalisé, spécialement conçu pour autoriser les intégrations (iframe, markup simple) tout en bloquant les attaques XSS ou les injections CSS.&lt;/p&gt;

&lt;p&gt;Parmi les règles appliquées :&lt;/p&gt;

&lt;p&gt;Suppression des balises dangereuses (script, object, embed, form, button, etc.)&lt;br&gt;
Suppression des attributs on* (ex. onclick) et style&lt;br&gt;
Vérification stricte des URLs (https: ou relatives uniquement)&lt;br&gt;
Nettoyage des iframe : seuls les attributs sûrs (src, width, height, frameborder, allowfullscreen, sandbox) sont conservés&lt;br&gt;
Ajout automatique d’un sandbox sécurisé sur les iframes&lt;br&gt;
Protection SSR : pas d’exécution côté serveur&lt;br&gt;
Mémoïsation et limites de taille pour éviter les rendus excessifs&lt;br&gt;
Ces garde-fous garantissent un équilibre entre flexibilité et sécurité, idéal pour intégrer des visualisations ou des jeux sans compromettre la stabilité du flow.&lt;/p&gt;

&lt;p&gt;🎮 Darkwaar – Vers un puzzle game jouable&lt;br&gt;
En parallèle, l’univers Darkwaar continue de prendre forme. J’ai commencé plusieurs prototypes de puzzle games, jouables directement sur itch.io, explorant différentes mécaniques :&lt;/p&gt;

&lt;p&gt;Placement stratégique sur une grille,&lt;br&gt;
Tour par tour et gestion des pions,&lt;br&gt;
Résolution par logique (trouver le prochain coup gagnant).&lt;br&gt;
Ces prototypes me permettent d’itérer rapidement sur le gameplay avant de stabiliser une version principale. L’objectif à court terme : un puzzle jouable au format web, accessible à tous depuis itch.io.&lt;/p&gt;

&lt;p&gt;🌐 Uniflow × Darkwaar – Intégration native via HtmlFlow&lt;br&gt;
Grâce au nouveau composant HtmlFlow, j’ai pu intégrer directement les quatre projets Darkwaar dans Uniflow. Chacun des prototypes est désormais visible depuis un flow dédié sur uniflow.io/flows.&lt;/p&gt;

&lt;p&gt;Cette intégration montre concrètement comment Uniflow peut servir de hub créatif : les flows deviennent des modules capables d’orchestrer, d’afficher et d’héberger des créations interactives — ici, des jeux Darkwaar — dans un même environnement.&lt;/p&gt;

&lt;p&gt;💡 Cette approche ouvre la voie à un espace où automatisation et création ludique se rejoignent. Chaque prototype Darkwaar est un flow, et chaque flow peut devenir une expérience jouable.&lt;/p&gt;

&lt;p&gt;🔗 Liens utiles&lt;br&gt;
🧩 Uniflow 1.1.18 — Lire la release sur GitHub&lt;br&gt;
✨ Article technique complet — HtmlFlow sur le blog Uniflow&lt;br&gt;
🎮 Prototypes Darkwaar — Disponible sur uniflow.io/flows&lt;br&gt;
🌑 Darkwood — darkwood.com&lt;br&gt;
🔮 Et après ?&lt;br&gt;
Les prochaines versions d’Uniflow continueront d’explorer la dimension visuelle et interactive des flows :&lt;/p&gt;

&lt;p&gt;presets d’intégration sécurisée (itch.io, YouTube, dashboards),&lt;br&gt;
composants de visualisation avancés,&lt;br&gt;
et connexion naturelle entre automatisation, jeu et création artistique.&lt;br&gt;
Darkwaar, de son côté, suivra ce mouvement. L’objectif reste le même : construire un univers cohérent où la programmation, l’imagination et le jeu se rencontrent.&lt;/p&gt;

&lt;p&gt;✍️ Mathieu Ledru Darkwood – Automate. Create. Play. Music&lt;/p&gt;

&lt;p&gt;🎁 Je propose des séances de coaching gratuites de 30 minutes pour aider les créateurs comme vous à automatiser leurs processus et à gagner du temps ⏱️&lt;/p&gt;

&lt;p&gt;👉 Réservez votre séance gratuite ici : &lt;a href="https://www.bonzai.pro/matyo91/lp/4471/je-taide-a-automatiser-tes-process" rel="noopener noreferrer"&gt;https://www.bonzai.pro/matyo91/lp/4471/je-taide-a-automatiser-tes-process&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merci de votre lecture ! Créons ensemble des workflows intelligents, rapides et automatisés 💻⚡&lt;/p&gt;

</description>
      <category>html</category>
      <category>news</category>
      <category>showdev</category>
      <category>javascript</category>
    </item>
  </channel>
</rss>
