<?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: HappyToDev</title>
    <description>The latest articles on DEV Community by HappyToDev (@happytodev).</description>
    <link>https://dev.to/happytodev</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F471700%2F56696747-6ee2-47cb-b65d-ba87375678f9.png</url>
      <title>DEV Community: HappyToDev</title>
      <link>https://dev.to/happytodev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/happytodev"/>
    <language>en</language>
    <item>
      <title>Quoi de neuf les devs ? #186 — Épuisés par l'IA, les devs inventent leurs parades</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Mon, 03 Aug 2026 16:04:40 +0000</pubDate>
      <link>https://dev.to/happytodev/quoi-de-neuf-les-devs-186-epuises-par-lia-les-devs-inventent-leurs-parades-4ami</link>
      <guid>https://dev.to/happytodev/quoi-de-neuf-les-devs-186-epuises-par-lia-les-devs-inventent-leurs-parades-4ami</guid>
      <description>&lt;p&gt;&lt;em&gt;Votre dose d'infos tech infusée par un dev pour les devs — Numéro du 3 août 2026&lt;/em&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  EDITO
&lt;/h2&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Hello chère développeuse, cher développeur, sysadmin, ops, sre, DevRel, sécu 👋&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;Salut les amis,&lt;/p&gt;

&lt;p&gt;Il y a un an, on nous vendait le dev x10 : l'IA allait décupler notre productivité, nous laisser la partie créative, et nous, on allait regarder la machine produire du code en sirotant un café. Un an plus tard, un mot nouveau émerge sur les forums : la &lt;strong&gt;vibecoding fatigue&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Cette semaine, The Conversation publie une enquête passionnante sur ce phénomène. Un ingénieur la résume en une image qui m'a marqué :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;C'est comme mettre ta bougie de productivité sur un lance-flammes ; tu vas plus vite, mais tu brûles beaucoup plus d'énergie. &lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Une étude de mars 2026, menée sur 1 488 personnes, baptise le phénomène l'&lt;em&gt;AI brain fry&lt;/em&gt; : un tiers de fatigue de décision en plus, &lt;strong&gt;39 % d'erreurs graves en plus&lt;/strong&gt;, et une envie de démissionner qui passe de 25 % à 34 %. &lt;/p&gt;

&lt;p&gt;Et devinez qui sont les premiers touchés ? &lt;/p&gt;

&lt;p&gt;Nous. Les ingénieurs qui pilotent déjà plusieurs systèmes d'IA à la fois. &lt;/p&gt;

&lt;p&gt;Les chercheurs les appellent « le canari dans la mine » : notre fatigue annonce celle des autres métiers du langage — journalistes, juristes, traducteurs.&lt;/p&gt;

&lt;p&gt;Ce que j'aime dans cette enquête, c'est qu'elle ne se contente pas de décrire le malaise. Elle documente les &lt;strong&gt;parades&lt;/strong&gt; que les devs les plus en pointe inventent : faire un brouillon écrit avant de lancer l'outil, se réapproprier le code ligne par ligne au lieu de juste valider, et surtout &lt;strong&gt;refuser certaines tâches&lt;/strong&gt; — les choix d'architecture, les zones à risque, celles qui donnent du sens au métier. Les lignes rouges que l’IA ne devrait pas franchir… pour le moment.&lt;/p&gt;

&lt;p&gt;Ça résonne fort avec l'invité de cette semaine. &lt;strong&gt;Cyril Beaufrère&lt;/strong&gt; — Directeur des Infrastructures France chez KION Group, et créateur de la newsletter RudeOps — nous rappelle que la qualité numéro un d'un dev, c'est la curiosité. Et il ajoute quelque chose d'essentiel : &lt;em&gt;ne pas se prendre au sérieux&lt;/em&gt;, garder un équilibre, et laisser le temps faire son travail. Des conseils précieux quand la machine accélère tout, justement.&lt;/p&gt;

&lt;p&gt;Et pendant ce temps, ailleurs dans l'actu : Claude Mythos casse un schéma de signature post-quantique en 60 heures (relativisons : ce n'est pas le crypto-apocalypse, c'est un paramètre de défi), et 240 bases de données françaises sont diffusées par des pirates. Je vous en parle en rubrique Le coin des Lecteurs.&lt;/p&gt;

&lt;p&gt;Bref, l'heure n'est plus à la course à la vitesse à tout prix. Elle est à l'apprentissage d'un nouvel équilibre.&lt;/p&gt;

&lt;p&gt;Et vous, ressentez-vous la vibe coding fatigue, ou êtes-vous encore en phase d’euphorie amoureuse avec votre ou vos agents ? Partagez cela dans les commentaires que l'on puisse voir la tendance et en discuter avec un peu d’autodérision entre humains (merci Cyril pour l’inspiration 😉).&lt;/p&gt;

&lt;p&gt;— Fred&lt;/p&gt;




&lt;h2&gt;
  
  
  L'invité de la semaine
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F07bayjiqftt9ew27ind6.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F07bayjiqftt9ew27ind6.jpg" alt="Photo de Cyril Beaufrere" width="400" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cette semaine, je reçois &lt;strong&gt;Cyril Beaufrère&lt;/strong&gt;, Directeur des Infrastructures pour la France chez KION Group (environ 40 000 personnes), où il pilote les équipes LAN/WAN, serveurs et support. Un parcours de 25 ans dans l'IT, démarré dans un autre millénaire en 1998 à la hotline d'Easynet — le Far West des débuts d'internet grand public — avant d'enchaîner presse, téléphonie, comparateur de prix, pub, mutuelle… et une aventure de cofondateur avec FamiHero, marketplace de services à la famille rachetée par O2 Care Service. Il est aussi le créateur de la newsletter &lt;strong&gt;RudeOps&lt;/strong&gt;, sa « liturgie » du lundi, assumée avec humour et mauvaise foi. Un autodidacte qui vit ce métier comme une passion.&lt;/p&gt;

&lt;p&gt;Voici ses conseils si vous débutez dans le métier :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;De la curiosité, avant tout, et l'envie de construire des choses : voir un projet émerger et se concrétiser à travers du code, c'est ce qu'il y a de plus gratifiant au monde. Il faut aussi de la pugnacité pour ne pas lâcher quand ça résiste. En 2026, on a absolument tout à portée de main pour nourrir cette curiosité et progresser. Si tu n'es pas curieux, tu seras un mauvais dev, c'est aussi simple que ça.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Cette dernière phrase elle sonne comme une punchline, mais elle est tellement vraie !&lt;/p&gt;

&lt;p&gt;Merci Cyril pour cette super interview !&lt;/p&gt;

&lt;h2&gt;
  
  
  Au menu cette semaine
&lt;/h2&gt;

&lt;p&gt;Voici quelques uns des sujets que nous aborderons dans ce numéro : &lt;/p&gt;

&lt;p&gt;✅ Claude Mythos : un algorithme post-quantique cassé en 60 heures&lt;/p&gt;

&lt;p&gt;✅ La "vibecoding fatigue" : quand l'IA épuise les développeurs&lt;/p&gt;

&lt;p&gt;✅ 240 bases de données françaises diffusées par des pirates&lt;/p&gt;

&lt;p&gt;✅ Le dev est mort, vive le dev ! — la tribune de Stéphane Philippart&lt;/p&gt;

&lt;p&gt;✅ Self-hoster son serveur mail en 2026, c'est possible (et le spam est réglé)&lt;/p&gt;

&lt;p&gt;✅ dcg : le garde-fou contre les commandes destructrices de vos agents IA&lt;/p&gt;

&lt;p&gt;✅ CPX 2.0 : l'équivalent de npx pour PHP&lt;/p&gt;

&lt;p&gt;✅ La semaine des patchs sécurité : PHP 8.5.9, Node.js, Firefox, VS Code&lt;/p&gt;

&lt;p&gt;✅ L'interview intégrale de Cyril Beaufrère (RudeOps)&lt;/p&gt;




&lt;h2&gt;
  
  
  &lt;strong&gt;Auto promo !&lt;/strong&gt; 🚀
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Un grand merci aux personnes qui me soutiennent déjà !&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si cette newsletter vous apporte de la valeur, vous pouvez l'aider dès aujourd'hui avec &lt;strong&gt;un abonnement à seulement 9 €/an.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ce tarif est verrouillé à vie pour ceux qui s'abonnent maintenant, même si le prix augmente plus tard.&lt;/p&gt;

&lt;p&gt;Abonnez-vous maintenant pour faire la meilleure affaire et me soutenir 👇 !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.itanea.fr/qdnldsubscribe" rel="noopener noreferrer"&gt;Je vous soutiens pour 9€/an&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Merci d'avance 💜&lt;/p&gt;




&lt;h2&gt;
  
  
  Mes sponsors permanents
&lt;/h2&gt;

&lt;p&gt;Un grand merci à mes sponsors qui soutiennent cette newsletter 💜&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjndw8lekthr6s3tx9vqf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fjndw8lekthr6s3tx9vqf.png" width="800" height="569"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Clever Cloud&lt;/strong&gt; — Entreprise française fondée en 2010, spécialisée dans le Platform as a Service (PaaS). Elle conçoit et opère des solutions d'automatisation pour l'hébergement, le déploiement et la gestion continue d'applications, de sites web et de bases de données.&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Découvrir Clever Cloud&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyldzdfz6qcn1llezi91q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyldzdfz6qcn1llezi91q.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;StackX&lt;/strong&gt; — Le bouclier technologique anti-stress 24/7 pour vos projets LAMP : quoiqu'il arrive, vous ne serez plus jamais seul.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Frais d'installation offerts avec le code HappyToDev (valeur 145€)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.itanea.fr/scalarx" rel="noopener noreferrer"&gt;Découvrir StackX&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;👉 Comme &lt;strong&gt;Clever Cloud et StackX&lt;/strong&gt;, affichez ici votre pub. Visibilité maximale pour votre entreprise garantie ! 🚀&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.itanea.fr/sponsorpermanent/?utm_source=nl" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Se renseigner pour devenir sponsor&lt;/a&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  AU PROGRAMME DE CE NUMÉRO
&lt;/h2&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;




&lt;h2&gt;
  
  
  LE COIN DES LECTEURS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnc2pg5pd8wldrrccmx4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnc2pg5pd8wldrrccmx4y.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette rubrique, des articles intéressants bien sûr dans notre domaine… ou presque !&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Claude casse un algo post-quantique en 60 heures
&lt;/h3&gt;

&lt;p&gt;Anthropic a publié un billet de recherche qui a fait du bruit : son modèle &lt;strong&gt;Claude Mythos Preview&lt;/strong&gt; a trouvé en 60 heures une faiblesse dans &lt;strong&gt;HAWK-256&lt;/strong&gt;, un paramètre de défi post-quantique que deux ans de relecture humaine n'avaient pas repérée. L'attaque fait passer le coût d'une récupération de clé de 2^64 à 2^38 opérations. Le modèle a aussi découvert une attaque 200 à 800 fois plus rapide contre AES-128 réduit à 7 tours, baptisée « le pont de Möbius ». Précisions importantes : ce sont des versions de défi non déployées, aucun système en production n'est touché. Korben fait le tri entre l'exploit réel et les titres alarmistes.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://korben.info/claude-casse-un-algo-post-quantique-en-60-heures.html" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  La "vibecoding fatigue" : épuisés par l'IA, les développeurs inventent leurs parades
&lt;/h3&gt;

&lt;p&gt;Une enquête de The Conversation, signée Morgan Blangeois (Université Clermont Auvergne), documente la lassitude d'un genre nouveau née des outils d'IA qui produisent beaucoup, très vite, et qu'il faut valider sans relâche. L'article s'appuie sur l'étude &lt;em&gt;AI brain fry&lt;/em&gt; (mars 2026) et détaille les trois parades que les devs les plus en pointe inventent : faire un brouillon avant de lancer l'outil, se réapproprier le travail ligne par ligne, et refuser certaines tâches. Une lecture indispensable en cet été 2026.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://theconversation.com/la-vibecoding-fatigue-epuises-par-lia-les-developpeurs-informatiques-inventent-leurs-propres-parades-281365" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Mon point de vue :&lt;/strong&gt;  je travaille énormément avec l'intelligence artificielle sur de nombreux projets et parfois plusieurs projets par jour en même temps. &lt;/p&gt;

&lt;p&gt;Personnellement, je ne ressens pas d'épuisement psychologique tel que peut le décrire cet article mais plutôt quelque chose comme une frustration de ne pas pouvoir encore aller plus vite.&lt;/p&gt;

&lt;p&gt;Car l'IA aujourd'hui ouvre des perspectives qui nous étaient absolument impossibles à imaginer il y a encore quelques temps. &lt;/p&gt;

&lt;p&gt;Par exemple, hier soir avec deux prompts dans Open Code, j'ai pu créer un jeu minimaliste, vraiment minimaliste, je l'avoue, une sorte de Pac-Man qui mixe avec Mario sous Godot, le moteur de jeux vidéo. &lt;/p&gt;

&lt;p&gt;Auparavant réaliser ce proof of concept qu'a réalisé l'IA hier soir, ça m'aurait peut-être pris une semaine parce que le développement de jeux vidéo ce n'est pas mon domaine.  Et là en deux prompts et environ 15 minutes une première version jouable était disponible.&lt;/p&gt;

&lt;p&gt;Alors évidemment, ce n'est pas le jeu vidéo du siècle, rien de spécial. Les graphismes sont rétro, l’intelligence des ennemis est très relative. Mais soyez indulgent pour un projet généré en 15 minutes.&lt;/p&gt;

&lt;p&gt;L'IA nous met à portée de réalisation des projets qu'on n'aurait même pas imaginés commencer à développer par manque de compétence, par manque de temps, par découragement. &lt;/p&gt;

&lt;p&gt;Et donc aujourd'hui on a aussi ce Brain Fry parce que on a tous ces milliards d'idées de projets qu'on avait en tête, qu'on mettait de côté parce qu'on se disait que c’était impossible à réaliser techniquement, que ça prendrait beaucoup trop de temps, etc. et qui maintenant sont à portée de main. Et forcément, en tant que passionné, on souhaite les réaliser.&lt;/p&gt;

&lt;p&gt;Et je pense que c'est plutôt ça, en tout cas pour ma part, qui fatigue beaucoup parce qu'il faut pouvoir faire le tri dans tout ce que l'on a dans nos têtes et qu'on avait envie de développer depuis des années, &lt;/p&gt;

&lt;p&gt;Si vous êtes développeur depuis longtemps comme moi et passionné, chaque jour il y a au moins un ou deux projets qui me passent par la tête donc vous imaginez en 20-25 ans ce qui a pu passer dans ma tête ! Et aujourd'hui j'ai l'impression que tous ces projets mis de côté dans une zone obscure de ma mémoire reviennent en flot comme des assaillants pour dire “hé je peux être mis en production là maintenant tout de suite en deux temps, trois mouvements”. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Avant de me faire jeter en pâture, je ne remets pas en cause la souffrance réelle que peut provoquer cette “vibecoding fatigue”, je donne simplement mon point de vue et mon ressenti.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Voilà, mes cinquante cents sur le sujet.  &lt;/p&gt;

&lt;p&gt;Le test de jeu vidéo en question 👇&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9vg4uwbne2duhnpqolro.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F9vg4uwbne2duhnpqolro.gif" alt="PacMinions ;-)" width="720" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Les 2 prompts :&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwkh7wn8n0likk647vkyu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwkh7wn8n0likk647vkyu.png" alt="Prompt initial" width="593" height="563"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fgngt2mbvfl3cjq7zdy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0fgngt2mbvfl3cjq7zdy.png" alt="L'impatience" width="800" height="155"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  240 bases françaises diffusées par des pirates
&lt;/h3&gt;

&lt;p&gt;ZATAZ a mis au jour une opération coordonnée : en quelques heures, plusieurs pirates ont publié &lt;strong&gt;240 bases de données attribuées à des organisations françaises&lt;/strong&gt;, couvrant des incidents survenus depuis 2022. Environ 90 % des fuites étaient déjà connues, mais d'autres fichiers proviennent de compromissions restées discrètes. Le Service de veille de ZATAZ a repéré 9 pseudonymes différents, des publications synchronisées au même jour et à la même heure, et l'hypothèse de courtiers en données criminelles. Une piqûre de rappel : une fuite ancienne conserve une valeur opérationnelle longtemps après son vol initial.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.zataz.com/240-bases-francaises-diffusees-par-des-pirates/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Le dev est mort, vive le dev !
&lt;/h3&gt;

&lt;p&gt;Stéphane Philippart (aka wilda) publie une réflexion posée, sans boule de cristal, sur l'impact de l'IA sur notre métier. Son postulat : peu de chances de pouvoir lutter contre cette évolution mais cela ne veut pas dire qu’il ne faut plus rien controller. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;L'IA est là et lutter contre semble un pari risqué, tout comme se laisser submerger et ne plus rien contrôler.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Il reprend sa métaphore de l'ébéniste, interroge la notion de qualité (une app bien pensée pour ses utilisateurs vaut une app parfaitement codée), et prédit surtout que le métier va se transformer plutôt que disparaître — comme l'agriculteur de 1906 n'a pas grand-chose à voir avec celui de 2026. Une lecture apaisante et lucide.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://philippart-s.github.io/blog/2026-08-01-dev-is-dead/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  You should self-host your mail server
&lt;/h3&gt;

&lt;p&gt;Christian Haschek prend le contre-pied du dogme « tout se self-host, sauf le mail ». En 2026, c'est à nouveau possible, même depuis chez soi (IP fixe non blacklistée, pas de CGNAT, PTR configurable). La grosse nouveauté : &lt;strong&gt;le spam est devenu un problème réglé&lt;/strong&gt; grâce à un plugin de rspamd qui utilise un LLM local (Gemma 4 12B) pour classifier les mails. Le guide couvre SPF/DKIM/DMARC, docker-mailserver, et l'entretien de sa machine. Idéal pour les défenseurs de la souveraineté numérique.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://blog.haschek.at/2026/you-should-selfhost-your-mail.html" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  How fast is C++26's std::hive?
&lt;/h3&gt;

&lt;p&gt;Daniel Lemire, expert en performance, s'attaque au conteneur star de C++26 : &lt;code&gt;std::hive&lt;/code&gt;, une structure de données qui permet d'insérer et de supprimer des éléments sans invalider les pointeurs. Benchmarks à l'appui, il compare ses performances aux conteneurs classiques et répond à la question qui tue : est-ce vraiment plus rapide ? Le billet a déclenché une &lt;a href="https://x.com/lemire/status/2083962166084804902" rel="noopener noreferrer"&gt;belle discussion&lt;/a&gt; (Jarred Sumner de Bun s'y est invité). Un régal pour les amateurs de micro-optimisations.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://lemire.me/blog/2026/08/02/how-fast-is-c26s-stdhive/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Quand l'IA élève le niveau de l'ingénierie logicielle
&lt;/h3&gt;

&lt;p&gt;HackerNoon explore comment l'IA déplace le niveau de référence de l'ingénierie logicielle : flux de travail des développeurs, infrastructure, gouvernance, recrutement, et le rôle grandissant du jugement humain. Une synthèse utile pour comprendre où la valeur se déplace dans la chaîne de développement — et pourquoi les plateformes d'ingénierie doivent évoluer.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://hackernoon.com/what-happens-to-your-engineering-platform-when-ai-raises-the-baseline" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  MINI-SPONSORS
&lt;/h2&gt;

&lt;p&gt;Un grand merci à mes mini-sponsors pour leur soutien à cette newsletter :&lt;br&gt;&lt;br&gt;
&lt;strong&gt;LBKE d'Éric Burel&lt;/strong&gt;, &lt;strong&gt;Lavicon de DKP&lt;/strong&gt;, &lt;strong&gt;Plumber&lt;/strong&gt; et &lt;strong&gt;Writizzy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F75rfgapk6xnputqqyu52.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F75rfgapk6xnputqqyu52.png" width="799" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Découvrez &lt;a href="https://go.itanea.fr/minisponsorlbke" rel="noopener noreferrer"&gt;la formation LangChain éligible CPF de LBKE&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://go.itanea.fr/minisponsorlavicon" rel="noopener noreferrer"&gt;Lavicon&lt;/a&gt; : Générez vos icônes stylées et uniques. Coupon -20%&lt;/strong&gt; : &lt;strong&gt;HAPPY2DEV&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://go.itanea.fr/minisponsorplumber" rel="noopener noreferrer"&gt;Plumber-CLI&lt;/a&gt;&lt;/strong&gt; : Vérifiez si vos pipelines CI/CD GitLab sont percés (open source)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://go.itanea.fr/minisponsorwritizzy" rel="noopener noreferrer"&gt;Writizzy&lt;/a&gt;&lt;/strong&gt; : Lancez votre blog et votre newsletter en 5 minutes. -20% pour 3 mois &lt;strong&gt;HAPPY20&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vous aussi devenez mini-sponsor et mettez en avant votre entreprise pendant 52 numéros (~1an) pour 397€ =&amp;gt; &lt;a href="mailto:happytodev@ik.me?subject=mini-sponsor"&gt;contactez moi&lt;/a&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  LE TOUR DES RÉSEAUX
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhf098jn2pzzqdd253sk0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhf098jn2pzzqdd253sk0.png" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette rubrique, je vous présente les infos que j'ai trouvé intéressantes au cours de la semaine sur les différents réseaux sociaux.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Deus ex Silicium — La réparation électronique, le guide ultime
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2082409771265585217-887" src="https://platform.twitter.com/embed/Tweet.html?id=2082409771265585217"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2082409771265585217-887');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2082409771265585217&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Le roi de la microscopie électronique et de l'ingénierie inverse prépare donc un guide pratique de réparation d'appareils, accessible à celles et ceux qui ne sont pas calés en électronique. De quoi se préparer à un nouveau gros format de la chaîne, dans la lignée de ses vidéos d'analyse de puces au microscope électronique.&lt;/p&gt;

&lt;p&gt;Vous attendez quoi pour vous abonner ?&lt;/p&gt;




&lt;h3&gt;
  
  
  Denis (zwindler.fr) — La souffrance psychique au travail
&lt;/h3&gt;


&lt;blockquote class="bluesky-embed"&gt;
&lt;p&gt;Créer une mission d’information au Sénat intitulée « La souffrance psychique au travail : un défi sociétal et collectif à relever », c’était bien trouvé. Cela faisait sérieux, plein de bonne volonté. Allez soyons fou : je dirais même que c’était humain.&lt;/p&gt;— &lt;a href="https://bsky.app/profile/did:plc:oxslbmjeqfhddwb5eac3knqm?ref_src=embed" rel="noopener noreferrer"&gt;Denis (@zwindler.fr)&lt;/a&gt; &lt;a href="https://bsky.app/profile/did:plc:oxslbmjeqfhddwb5eac3knqm/post/3ms462ragms2x?ref_src=embed" rel="noopener noreferrer"&gt;2026-08-02T14:12:02.209Z&lt;/a&gt;
&lt;/blockquote&gt;


&lt;p&gt;Derrière l'ironie, un vrai sujet, y compris dans les métiers de la tech. La souffrance psychique au travail — burn-out, pression des délais, charge mentale, isolement — est un sujet bien réel pour beaucoup d'équipes dev et ops. Denis égratigne avec son humour habituel la méthode qui consiste à créer une mission d'information pour exister sur le sujet… sans rien changer sur le terrain voire essayer de masquer qu’elle a existé. &lt;/p&gt;

&lt;p&gt;On pourrait en sourire si le sujet n’était pas aussi sérieux.&lt;/p&gt;




&lt;h3&gt;
  
  
  Camille Roux — dcg, le garde-fou des agents IA
&lt;/h3&gt;


&lt;blockquote class="bluesky-embed"&gt;
&lt;p&gt;dcg : un hook qui intercepte les commandes destructives avant qu'un agent IA ne les exécute, `git reset --hard`, `rm -rf`, `DROP TABLE`, avec une explication et une alternative plus sûre. Compatible Claude Code, Codex, Gemini CLI, Cop...
https://github.com/Dicklesworthstone/destructive_command_guard&lt;/p&gt;— &lt;a href="https://bsky.app/profile/did:plc:5aumv6xsxxacaerhrubj322g?ref_src=embed" rel="noopener noreferrer"&gt;Camille Roux (@camilleroux.com)&lt;/a&gt; &lt;a href="https://bsky.app/profile/did:plc:5aumv6xsxxacaerhrubj322g/post/3mrwvr5tgwg25?ref_src=embed" rel="noopener noreferrer"&gt;2026-07-31T12:00:12.463Z&lt;/a&gt;
&lt;/blockquote&gt;


&lt;p&gt;Camille Roux partage &lt;code&gt;dcg&lt;/code&gt; (destructive command guard), un hook qui intercepte les commandes destructives avant qu'un agent IA ne les exécute — &lt;code&gt;git reset --hard&lt;/code&gt;, &lt;code&gt;rm -rf&lt;/code&gt;, &lt;code&gt;DROP TABLE&lt;/code&gt; — avec une explication et une alternative plus sûre pour chacune. Compatible Claude Code, Codex, Gemini CLI et Copilot. À installer avant de laisser vos agents en liberté.&lt;/p&gt;


&lt;h3&gt;
  
  
  Hugo Lassiège — Les vrais chiffres des indie hackers
&lt;/h3&gt;


&lt;blockquote class="bluesky-embed"&gt;
&lt;p&gt;Très proche (voire identique) que les chiffres que je citais dans ma dernière vidéo. 

Oui, la grande majorité des indie hackers (86%) ne dégage pas de revenu significatifs.

Mais ca empêche pas d'essayer :)&lt;/p&gt;— &lt;a href="https://bsky.app/profile/did:plc:g3tbzu5tcz4evra4mf5wa67c?ref_src=embed" rel="noopener noreferrer"&gt;Hugo Lassiège (@eventuallycoding.com)&lt;/a&gt; &lt;a href="https://bsky.app/profile/did:plc:g3tbzu5tcz4evra4mf5wa67c/post/3mqu34m4pos2j?ref_src=embed" rel="noopener noreferrer"&gt;2026-07-17T15:32:53.264Z&lt;/a&gt;
&lt;/blockquote&gt;


&lt;p&gt;Hugo revient sur les chiffres de sa dernière vidéo : 86 % des indie hackers ne dégagent pas de revenus significatifs. De quoi tempérer les fantasmes de revenus passifs générés par l'IA… sans pour autant renoncer à l'essentiel : la joie de construire et d'apprendre. Un post qui dégonfle gentiment la hype de l'été.&lt;/p&gt;


&lt;h3&gt;
  
  
  Alexandre Daubois — CWE vs CVE, ne les confondez plus
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2083813825229226425-263" src="https://platform.twitter.com/embed/Tweet.html?id=2083813825229226425"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2083813825229226425-263');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2083813825229226425&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Alexandre Daubois (CTO de Les-Tilleuls.coop, équipes Symfony et FrankenPHP) remet les pendules à l'heure : un CWE, c'est une classe de faiblesse (OS command injection, XSS, SQLi…), un CVE, c'est une vulnérabilité concrète avec une version et un patch. Une seule CWE est à la racine de milliers de CVE. Indispensable pour ne pas perdre une conversation sécurité.&lt;/p&gt;




&lt;h2&gt;
  
  
  DEV PRATIQUE
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rp4qpuknq71y8zp1p4g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F8rp4qpuknq71y8zp1p4g.png" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Ressources concrètes pour tous les devs (web, DevOps, sécu, game, embarqué…)&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📘 Web Dev
&lt;/h3&gt;

&lt;h4&gt;
  
  
  CPX 2.0 — Le npx de PHP, maintenant first-party
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;cpx&lt;/code&gt; exécute une commande depuis n'importe quel package Composer sans l'installer dans votre projet — le &lt;code&gt;npx&lt;/code&gt; de l'écosystème PHP. La version 2.0, désormais développée par l'équipe Laravel et présentée par Taylor Otwell à la Laracon US, privilégie les binaires locaux du projet, laisse tomber les alias codés en dur au profit d'aliases que vous définissez, et gère même des gists et un REPL (&lt;code&gt;cpx tinker&lt;/code&gt;). La cerise : une sortie JSON quand un agent IA pilote le terminal.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://laravel-news.com/cpx-the-composer-package-executor-for-php" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  The TALL Stack — Pourquoi ça fait sens pour vos produits internes
&lt;/h4&gt;

&lt;p&gt;Appventura défend une position rafraîchissante : pour un back-office ou un panneau d'admin, sortir d'emblée une architecture SPA + API, c'est souvent payer de la complexité trop tôt. Le TALL Stack (Tailwind, Alpine, Laravel, Livewire) permet de construire des interfaces dynamiques dans une seule application, sans dupliquer les règles métier entre serveur et client. Un plaidoyer argumenté pour la simplicité — et la liste des cas où un SPA reste, lui, la bonne réponse.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://appventura.com/en/insights/tall-stack-internal-products" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🛠️ DevOps
&lt;/h3&gt;

&lt;h4&gt;
  
  
  dmr — Docker Model Runner, version standalone
&lt;/h4&gt;

&lt;p&gt;k33g explique comment utiliser &lt;code&gt;dmr&lt;/code&gt;, la version autonome de Docker Model Runner : un binaire unique qui embarque le démon d'inférence et le CLI complet (&lt;code&gt;run&lt;/code&gt;, &lt;code&gt;pull&lt;/code&gt;, &lt;code&gt;ls&lt;/code&gt;, &lt;code&gt;rm&lt;/code&gt;, &lt;code&gt;ps&lt;/code&gt;…), sans Docker Desktop ni moteur Docker. Juste un processus HTTP. Il expose une API compatible OpenAI, sert vos modèles locaux, et pousse même des métriques au format Prometheus. Parfait pour les homelabers et les entreprises qui interdisent Docker Desktop.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://k33g.org/p/20260731-dmr-standalone" rel="noopener noreferrer"&gt;Lire le guide&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🖥️ Électronique
&lt;/h3&gt;

&lt;h4&gt;
  
  
  TongDou — Le petit robot de bureau à radar
&lt;/h4&gt;

&lt;p&gt;Hackaday présente TongDou, un « gremlin de bureau » open source construit par Wang. &lt;/p&gt;

&lt;p&gt;Pour la petite histoire (triste), il l’a crée suite à un décès dans sa famille afin que son espace de travail soit plus vivant.&lt;/p&gt;

&lt;p&gt;Un ESP32-S3 pour cerveau dans un châssis en laiton, un écran OLED pour visage, deux roues motorisées, et surtout un radar 24 GHz + une IMU (Inertial Measurement Unit =&amp;gt; ce qui lui donne le sens de l’équilibre et du mouvement) pour percevoir son espace. &lt;/p&gt;

&lt;p&gt;Les fichiers de conception sont publiés sur GitHub pour que d'autres makers construisent le leur. &lt;/p&gt;

&lt;p&gt;» &lt;a href=""&gt;Voir le projet&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  T'AS TON POPCORN ?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsq52rm82wbb1io5h3939.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fsq52rm82wbb1io5h3939.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette section, je vous propose de bien vous caller dans votre siège gamer, votre canapé ou votre lit pour visionner quelques vidéos dénichées ici et là.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Faut-il encore savoir coder pour vibe coder ? - Nicolas Grenié
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Nicolas Grenié, Developer Advocate chez SLNG.ai, passé par Typeform, alias "Monsieur BuildShit", raconte au Studio Devoxx France comment le vibe coding a changé sa façon de construire des logiciels.  &lt;/p&gt;

&lt;p&gt;Dans cette conversation, il l'assume : "quand je vibe code, je regarde le code ? Presque jamais". Prototypes lancés depuis la maternité, générateur d'icônes à 15 000 utilisateurs, faille de sécurité corrigée en une soirée. Et quand un exec veut shipper le proto en prod le lendemain, qui tranche ?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/joOgIwRivIA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  The most interesting "hack" in history... — Fireship
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Fireship décortique le hack de Hugging Face qui a secoué l'actualité de la semaine. Qui sont les auteurs, ce qu'ils cherchaient, et pourquoi cet incident a fait trembler toute la communauté open source. Du Fireship pur jus : synthétique, percutant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/KOpTWx1Eou4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  Apprendre Rust #4 : L'Emprunt et les Références — Graven
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Quatrième épisode de la série d'apprentissage de Rust de Graven, consacré au cœur du langage : l'emprunt et les références. Le tutoriel qui va (enfin) vous réconcilier avec le borrow checker et la gestion de la mémoire à la Rust.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/CrNojg7K3Pg"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  Recreating ITS — Computerphile
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Computerphile s'intéresse à l'équipe Obsolescence Guaranteed qui fait tourner des DEC PDP de plusieurs décennies sur un simple Raspberry Pi. Une plongée dans l'ITS, le système de temps partagé du MIT, entre rétro-computing et émulation. Nostalgique et très technique.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/cDKPbMaLTA4"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h3&gt;
  
  
  The Codeberg Situation — ThePrimeagen
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;ThePrimeagen analyse la décision de Codeberg d'interdire les projets d'IA générative sur sa forge. Au programme : la pression sur le matériel et les coûts d'infrastructure, les risques de rupture dans la communauté open source, et le débat plus large sur la place de l'IA dans les forges. Un sujet chaud et clivant.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/h3DlwC1nex0"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Comment soutenir cette newsletter ?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Un immense merci aux 27 personnes qui ont déjà sauté le pas 💜&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si la newsletter vous apporte de la valeur, vous pouvez me soutenir dès aujourd’hui avec &lt;strong&gt;un abonnement annuel à seulement 9 €/an à vie&lt;/strong&gt;. Vous aurez alors accès à tous les contenus exclusifs (en cours de préparation).&lt;/p&gt;

&lt;p&gt;Offre exceptionnelle et limitée dans le temps → Plus vous attendez, plus le prix augmentera pour les futurs abonnés lors de l’ajout des contenus exclusifs.&lt;/p&gt;

&lt;p&gt;C’est le meilleur moment pour verrouiller ce tarif à vie.&lt;/p&gt;

&lt;p&gt;Merci d’avance💜&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuvyeoavfk32svwdpbr2.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhuvyeoavfk32svwdpbr2.gif" width="500" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href=""&gt;Je vous soutiens pour 9€/an&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Des alternatives pour me soutenir ?&lt;/strong&gt; Bien sûr ! &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Votre prochaine commande Amazon avec ++&lt;strong&gt;&lt;a href="https://go.itanea.fr/amznl" rel="noopener noreferrer"&gt;mon lien d'affiliation&lt;/a&gt;&lt;/strong&gt;++&lt;/li&gt;
&lt;li&gt;Abonnez-vous à OpenCode Go pour 5 $ et bénéficiez de 5 $ supplémentaires grâce à &lt;a href="https://go.itanea.fr/opencode" rel="noopener noreferrer"&gt;mon lien de parrainage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;J’utilise Starlink à la maison et j’en suis plus que satisfait. Si cela vous tente &lt;a href="https://starlink.com/residential?referral=RC-5072169-18924-69&amp;amp;app_source=share" rel="noopener noreferrer"&gt;profitons chacun d’un mois gratuit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://fr.tuto.com/?aff=4Cx6BPp" rel="noopener noreferrer"&gt;Découvrez des milliers de tutos gratuits&lt;/a&gt; dans de nombreux domaine avec l’équipe géniale de Tuto&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  METS TON CASQUE !
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatjqf56cr9gngots3egd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fatjqf56cr9gngots3egd.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette rubrique, je vous propose des podcasts en anglais et en français sur notre monde de dev.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Tronche de Tech — Cassandre Notton : l'IA quantique
&lt;/h3&gt;

&lt;p&gt;Il y a deux semaines Mathieu à poste l'épisode de Tronche de Tech consacré au &lt;strong&gt;Machine Learning quantique&lt;/strong&gt;. Cassandre Notton, ingénieure chez Quandela, construit des IAs qui n'utilisent ni GPU, ni TPU, ni CPU… mais des QPU (processeurs quantiques). Au-delà de la promesse, elle démêle ce qui marche déjà de ce qui relève encore de la recherche. Et le clou : faire tourner son propre algorithme sur une vraie machine quantique est possible dès aujourd'hui (cloud.quandela.com). &lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/episode/6FjCTWDXPSRNxeg2Pkt7R0" width="100%" height="232px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://youtu.be/pE7WrI-UBHY" rel="noopener noreferrer"&gt;Écouter sur YouTube&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Silver Bullet Security Podcast #159 — Melanie Mitchell (en anglais)
&lt;/h3&gt;

&lt;p&gt;Gary McGraw (BIML) reçoit Melanie Mitchell, professeure au Santa Fe Institute, pour une conversation passionnante sur l'état réel de l'IA : les progrès surprenants depuis les années 90, la question de savoir si les concepts émergent vraiment de l'échelle des données, extrapoler vs interpoler, l'intelligence « en escalier » (jagged intelligence), et pourquoi les modèles sont meilleurs pour donner des réponses que pour poser des questions. À conseiller à toutes les personnes anglophiles — et à tout le monde sur la sécurité de l'IA.&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://open.spotify.com/embed/episode/0pUnuIcvGlAusPS3KL9yp6" width="100%" height="232px"&gt;
&lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  LES SORTIES DE LA SEMAINE
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp49t3gs1qc9wqu8qgaso.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fp49t3gs1qc9wqu8qgaso.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette rubrique, je vous mets en avant les mises à jour de logiciel que nous sommes susceptibles d'utiliser dans notre quotidien de développeurs.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Firefox 153.0.1 — 28 juillet 2026
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Correction d'un &lt;strong&gt;crash au démarrage sur Windows&lt;/strong&gt; après une mise à jour incomplète (Bug 2056926).&lt;/li&gt;
&lt;li&gt;Correction de l'&lt;strong&gt;audio qui jouait en silence&lt;/strong&gt; sur certains sites de streaming après pause/reprise (Bug 2053586).&lt;/li&gt;
&lt;li&gt;Amélioration du &lt;strong&gt;pointer lock&lt;/strong&gt; (le curseur reste dans la fenêtre) pour les jeux et contenus immersifs.&lt;/li&gt;
&lt;li&gt;Fix du chargement de « View Page Source » sur les documents &lt;code&gt;blob:&lt;/code&gt; et &lt;code&gt;srcdoc&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;» &lt;a href="https://www.mozilla.org/en-US/firefox/153.0.1/releasenotes/" rel="noopener noreferrer"&gt;Voir la release note&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  MySQL 9.7.2 — 28 juillet 2026
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;SOURCE_RETRY_COUNT=0&lt;/code&gt; est désormais traité de façon cohérente comme « reconnexions illimitées » : le réplicat ne s'arrête plus après une coupure transitoire.&lt;/li&gt;
&lt;li&gt;Le défaut de &lt;code&gt;thread_pool_max_unused_threads&lt;/code&gt; passe de 2 à 32.&lt;/li&gt;
&lt;li&gt;Optimiseur : les &lt;code&gt;LEFT JOIN&lt;/code&gt; avec conditions &lt;code&gt;OR&lt;/code&gt; peuvent maintenant utiliser un index range scan re-planifié au lieu d'un full scan.&lt;/li&gt;
&lt;li&gt;Fix de &lt;code&gt;JSON_VALUE()&lt;/code&gt; avec &lt;code&gt;RETURNING DATETIME&lt;/code&gt; et de fuites mémoire à l'upgrade depuis la 8.x.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;» &lt;a href="https://dev.mysql.com/doc/relnotes/mysql/9.7/en/news-9-7-2.html" rel="noopener noreferrer"&gt;Voir la release note&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Node.js — Trois releases sécurité le même jour (29 juillet 2026)
&lt;/h3&gt;

&lt;p&gt;Les trois branches (22.x LTS, 24.x LTS et 26.x Current) sont corrigées en même temps contre le même lot de 11 vulnérabilités, dont 3 classées « High » :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-56846 / CVE-2026-56848&lt;/strong&gt; (http2) : comptabilité mémoire des headers de session, gestion des &lt;code&gt;rst_stream&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-58043&lt;/strong&gt; (permission model) : plus d'octroi de permissions pour les nœuds « radix split ».&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;CVE-2026-58045&lt;/strong&gt; (zlib) : buffers d'écriture out-of-bounds désormais rejetés avec une erreur.&lt;/li&gt;
&lt;li&gt;Dependencies HTTP mises à jour (llhttp 9.4.3, undici 7.29.0 / 8.9.0 / 6.28.0 selon la branche).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;» &lt;a href="https://nodejs.org/en/blog/release/v24.18.1" rel="noopener noreferrer"&gt;Node 24.18.1 (LTS)&lt;/a&gt; · &lt;a href="https://nodejs.org/en/blog/release/v26.5.1" rel="noopener noreferrer"&gt;Node 26.5.1&lt;/a&gt; · &lt;a href="https://nodejs.org/en/blog/release/v22.23.2" rel="noopener noreferrer"&gt;Node 22.23.2 (LTS)&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Visual Studio Code 1.131 — 29 juillet 2026
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Sous-agents en cours&lt;/strong&gt; : visibilité du modèle utilisé, du temps d'exécution et de l'outil appelé, sans ouvrir leur conversation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dictée intégrée (expérimental)&lt;/strong&gt; dans le chat, l'éditeur et le terminal via un modèle Nemotron &lt;strong&gt;offline&lt;/strong&gt; — l'audio reste sur la machine, sans extension Speech.&lt;/li&gt;
&lt;li&gt;Nouvel &lt;strong&gt;éditeur Markdown « hybride »&lt;/strong&gt; dans la fenêtre Agents : visualisation, édition et commentaires actionnables par l'agent.&lt;/li&gt;
&lt;li&gt;Réarchitecture « agent host » (process dédié, protocole AHP) alignée avec le Copilot CLI.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;» &lt;a href="https://code.visualstudio.com/updates/v1_131" rel="noopener noreferrer"&gt;Voir la release note&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Prometheus 3.13.2 — 29 juillet 2026
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Correctifs de sécurité : bump &lt;code&gt;golang.org/x/text&lt;/code&gt; (CVE-2026-56852) et &lt;code&gt;google.golang.org/grpc&lt;/code&gt; (GHSA-hrxh-6v49-42gf).&lt;/li&gt;
&lt;li&gt;Bugfix PromQL : le fichier du « active query tracker » est désormais préalloué pour éviter les crashes &lt;strong&gt;SIGBUS&lt;/strong&gt; quand le disque de données est plein.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;» &lt;a href="https://github.com/prometheus/prometheus/releases/tag/v3.13.2" rel="noopener noreferrer"&gt;Voir la release note&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Mise à jour de sécurité pour toutes les branches de PHP 8 — 30 juillet 2026 (release sécurité)
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2083547918389084287-544" src="https://platform.twitter.com/embed/Tweet.html?id=2083547918389084287"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2083547918389084287-544');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2083547918389084287&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;h2&gt;
  
  
  L'invité de la semaine — L'interview intégrale
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cyril Beaufrère — Directeur des Infrastructures France chez KION Group, créateur de RudeOps&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqridq73j717opx4pglg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fnqridq73j717opx4pglg.png" alt="CleanShot 2026 08 03 at 17 05 59" width="788" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Propos recueillis par HappyToDev&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Peux-tu te présenter ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je m'appelle Cyril Beaufrère et je travaille dans l'informatique depuis un peu plus de 25 ans. Mes débuts sont presque le fruit du hasard : à la fin des années 90, j'ai commencé comme hotliner chez un fournisseur d'accès à internet (Easynet). Passionné d'informatique depuis toujours, j'ai progressivement évolué vers des postes à plus grande responsabilité, jusqu'à occuper aujourd'hui la fonction de Directeur des Infrastructures pour la France chez KION Group. Ce parcours, je le dois beaucoup à la chance d'avoir été entouré de collègues plus brillants que moi, dont j'ai énormément appris. En dehors du travail, je suis passionné de littérature, de jeux vidéo et de plein d'autres trucs !&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Quelle est ta spécialité ? Quel est ton langage préféré ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Je suis spécialisé dans les architectures, qu'elles soient monolithiques ou à base de microservices, et j'ai une bonne expertise sur tout ce qui touche aux systèmes, au CI/CD et, plus largement, à tout ce qu'englobe le DevOps et GNU/Linux. Côté langage, je dois avouer que j'ai toujours été un très mauvais dev, mais celui que j'apprécie par-dessus tout c'est Python : il me permet d'arriver à un résultat correct sans trop d'efforts, grâce à son immense écosystème de librairies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Es-tu un reconverti ? (as tu travaillé dans un autre domaine que l'IT précédemment)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oui, je suis un reconverti. J'ai d'abord travaillé un peu dans l'hôtellerie avant de bifurquer vers l'informatique, un peu par hasard, avec ce fameux job de hotliner chez Easynet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Quelles études as-tu suivies ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A la fin de ma troisième, j'ai été mis sur une voie de garage, on m'a orienté vers un CAP/BEP en hôtellerie (que j'ai obtenu). Je n'ai donc jamais passé le BAC et je suis donc ce qu'on appelle un autodidacte comme il en existe beaucoup dans l'informatique. Avec le recul, je ne regrette pas de ne pas avoir suivi d'études classiques : ça m'a obligé à apprendre sur le terrain, par la pratique et par curiosité, plutôt que par les diplômes. Dans ce métier, c'est souvent la passion et la capacité à apprendre vite qui font la différence, bien plus qu'un parcours académique et je crois que ça m'a rendu plus débrouillard et plus curieux que si j'avais suivi une voie toute tracée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Comment as-tu démarré dans le monde pro ? Stage, alternance, emploi direct ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;J'ai démarré directement en CDI, chez Easynet. Je ne remercierai jamais assez le CTO de l'époque de m'avoir embauché et fait confiance : j'ai commencé à la hotline avant de la structurer et d'en prendre la tête. Pour resituer, c'était en 1998, chez un fournisseur d'accès à internet, une des toutes premières startups du secteur. C'était le Far West, on assistait en direct aux balbutiements d'internet grand public, tout était à inventer, et l'énergie était complètement folle. Anecdote amusante : en arrivant chez Easynet, je me disais qu'il faudrait bien, à un moment, que je trouve un "vrai" taffe sans imaginer une seconde que cette boîte allait être le déclencheur de toute ma carrière.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Et maintenant tu en es où ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Aujourd'hui, je n'ai toujours pas de plan de carrière et j'ai toujours l'impression d'avoir 25 ans, surtout, j'ai le sentiment que tous les possibles restent ouverts. J'ai, comme d'habitude, une cinquantaine de side projects en cours, dont la moitié va probablement mourir en cours de route. Je ne me pose plus trop de questions sur le boulot en tant que tel : ce qui compte pour moi, c'est d'être épanoui dans ma vie perso et tout ce qui va avec. En gros, je fonctionne à l'instinct, et je me dis que le reste suivra bien.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7. Sur ton profil Linkedin, on peut lire que tu es le créateur de la newsletter RudeOps.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;En tant que confrère de newsletter, je sais que ce n'est pas facile de faire grossir et de continuer à intéresser son public. Tu nous raconte l'histoire de RudeOps, les succès, les difficultés et éventuellement son avenir ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L'histoire de RudeOps tient en réalité à une rencontre entre deux évidences : la veille techno fait partie de mon métier et je suis d'une curiosité presque maladive. À cela s'ajoute le goût de l'écriture (mon rêve ultime serait de publier un roman). Au commencement, il n'y avait qu'une envie simple, celle de partager ce que je glanais dans ma veille. Le reste a suivi, de lui-même, comme suivent les choses qu'on ne force pas.&lt;/p&gt;

&lt;p&gt;Et c'est devenu au fil du temps une liturgie parce que chaque lundi, sans faute, je m'astreins à faire paraître un numéro. Il y faut de la discipline et de la constance. Mais je n'écris pas pour plaire à qui que ce soit, j'écris pour le plaisir un peu coupable de régurgiter ma veille avec toute la mauvaise foi dont je suis capable, et un humour et des références qui ne font rire que moi.&lt;/p&gt;

&lt;p&gt;Quant aux difficultés, la vraie contrainte, c'est le temps. Mon travail et ma vie perso en dévorent déjà beaucoup, et il faut composer avec cette frustration diffuse qu'on ressent à voir certains occuper tout l'espace à coup de dizaines de publications quotidiennes sur LinkedIn, portés par l'algorithme plus que par le fond. À l'inverse, rien ne me touche autant que les mails de lecteurs qui me disent, simplement, que ce que je fais leur plait.&lt;/p&gt;

&lt;p&gt;Pour l'avenir, je n'ai pas de pression particulière, sinon celle de continuer à y prendre du plaisir. Je ne cherche ni à soigner une image, ni à prouver quoi que ce soit, je laisse simplement RudeOps évoluer à son rythme, petit à petit, sans objectif précis et au grès de mes envies.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aujourd'hui tu es infrastructure director. Peux-tu nous dire en quoi consiste ce métier ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Concrètement, je suis responsable des infrastructures du groupe pour la France. Je pilote des équipes qui gèrent le LAN/WAN, les serveurs et le support technique. Rien de très sexy ni de glamour là-dedans, c'est assez classique pour un grand groupe, avec ses contraintes et ses avantages…&lt;/p&gt;

&lt;p&gt;Ce qui est nouveau pour moi, en revanche, c'est la taille de la structure : c'est la première fois que je travaille dans un groupe aussi important, environ 40 000 personnes. C'est stimulant d'échanger avec des collègues de toutes les nationalités et de travailler avec eux au quotidien, mais c'est aussi frustrant, parce qu'un groupe de cette taille génère une latence de dingue sur à peu près tout.&lt;/p&gt;

&lt;p&gt;Pour l'instant, ça m'amuse et j'ai le sentiment d'y apporter de la valeur. Le jour où ce ne sera plus le cas, j'irai voir ailleurs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tu as été cofondateur de FamiHero qui a d'ailleurs été racheté par O2 Care Service. Tu nous raconte un peu l'aventure en tant que Cofondateur ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ce que tu es as retiré de positif?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Les écueils à éviter ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;L'aventure FamiHero a commencé depuis mon salon, avant qu'on ne passe par un incubateur puis qu'on lève des fonds auprès d'un investisseur renommé de la place parisienne, après avoir frappé à pas mal de portes. C'était une marketplace de services à la famille, avec plusieurs verticales : baby-sitting, ménage, repassage, soutien scolaire, entre autres. L'histoire est longue, et faite de hauts et de bas, tout le temps, mentalement c'est épuisant, et parfois stressant, surtout quand on a de la pub TV qui passe le soir et qu'on voit les load-balancers tenir la charge tout en sachant qu'on n'a que très peu de marge.&lt;/p&gt;

&lt;p&gt;Ce que j'en retire de positif, c'est d'abord un plaisir assez rare : pouvoir décider de tout, tout le temps, toucher à tout et choisir sa propre direction en assumant ses erreurs comme ses succès. Ça vaut aussi côté technique : dans une petite structure, on ne peut pas se cacher derrière un comité ou un process, il faut trancher vite sur le choix des outils, accepter de la dette technique en connaissance de cause pour aller plus vite, et parfois faire soi-même ce qu'on n'aurait normalement pas dû faire faute de budget pour recruter. Ça m'a confirmé que c'est ce que j'aime, que je suis bien plus à l'aise quand je ne suis pas bridé. Mais ce que j'en retire surtout, c'est que seul, on ne fait rien, il faut être bien entouré.&lt;/p&gt;

&lt;p&gt;Côté écueils, ce n'est pas très glamour à raconter, mais en B2C tout repose sur les coûts d'acquisition. Il faut vraiment les avoir à l'œil et bien choisir son modèle économique dès le départ. Avec le recul, se concentrer uniquement sur le B2C n'était pas suffisant au vu de ces coûts d'acquisition, il aurait fallu mettre autant d'efforts sur le B2B, qui offre des cycles de vente plus longs mais des clients plus rentables et plus fidèles dans la durée.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tu es passé dans différents secteurs (presse, téléphonie, comparateur de prix, pub, mutuelle; etc…), est ce que cela impliquait de te réinventer à chaque fois ou pas ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oui, se réinventer, à chaque fois. Le piège, ce serait d'arriver en se disant "tiens, j'ai fait ça la dernière fois, je vais refaire pareil" : ça m'est déjà arrivé et ça a été une erreur. Chaque secteur a sa propre logique, ses propres contraintes, ses propres codes, et vouloir plaquer une recette qui a marché ailleurs c'est souvent passer à côté de ce qui fait la spécificité du métier.&lt;/p&gt;

&lt;p&gt;Ma méthode, si on peut appeler ça comme ça, c'est de toujours commencer par comprendre le métier avant de passer à la technique. La technique, elle, s'adapte mais le métier lui, il faut le saisir en profondeur pour savoir quels problèmes on essaie vraiment de résoudre. Et pour ça, il faut être curieux, tout le temps, de tout, curieux des gens qui nous entourent, parce que ce sont eux qui portent l'expertise métier qu'on n'a pas encore, curieux du business et de la façon dont il évolue, des dynamiques de marché, de la concurrence. C'est cette curiosité permanente qui permet de se réinventer sans repartir de zéro à chaque fois, on garde une méthode, mais on change de terrain de jeu.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tu habites aux alentours de Paris (précises si besoin), qu'apprécies tu dans cette ville ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;J'habite dans une charmante ville des Yvelines. Ce que j'apprécie ? Honnêtement, je l'échangerais bien contre une ville du sud de la France, avec piscine. D'ailleurs, si vous avez une offre de job qui va dans ce sens, je suis tout à fait disposé à l'étudier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;8. Tu as d'autres passions ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Grand fan de littérature, impossible pour moi de m'endormir sans mon heure de lecture, même quand il est très tard. Grand fan de jeux vidéo aussi. Le reste du temps se partage entre la photo, la guitare, mes potes et ma famille.&lt;/p&gt;

&lt;p&gt;Et je pense que c'est important de le dire : avoir un bon équilibre, c'est essentiel. Si on ne fait que de l'IT dans sa vie c'est un vrai problème d'équilibre, même si dans mon cas, ce métier reste une passion à part entière.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;9. Peut-on te voir dans des conf ou des meetups ? Sinon où peut on te suivre ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Surtout pas, non, je manque de talent (et de temps) pour ça. J'essaierai peut-être un jour, j'ai sans doute deux ou trois trucs à dire, mais ce n'est pas mon focus pour l'instant. Le plus simple pour me suivre, c'est via RudeOps, ou sur LinkedIn.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;10. Est-ce que ton métier correspond finalement à tes attentes, tes rêves ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le métier en général, oui, il correspond à mes attentes. Après, sur un plan plus nuancé, je me pose pas mal de questions. Est-ce que ce que je fais sert vraiment à quelque chose, à la société (je parle bien de la société civile pas de l'entreprise). Est-ce que c'est un "vrai métier", au fond ? Ce genre de questions me traverse régulièrement l'esprit sans avoir de réponse définitive.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;11. Quels conseils donnerais-tu à celles et ceux qui débutent dans les métiers de l'IT et plus spécifiquement dans le dev ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;De la curiosité, avant tout, et l'envie de construire des choses : voir un projet émerger et se concrétiser à travers du code, c'est ce qu'il y a de plus gratifiant au monde. Il faut aussi de la pugnacité pour ne pas lâcher quand ça résiste. En 2026, on a absolument tout à portée de main pour nourrir cette curiosité et progresser. Si tu n'es pas curieux, tu seras un mauvais dev, c'est aussi simple que ça.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;12. Nouvelle question 2026 - IA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Utilises-tu l'IA dans ton travail ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Oui, clairement, et même à la maison sur mon homelab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesquelles utilises tu ? et quelle est actuellement ta préférée ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;J'ai testé pas mal de modèles comme Codex, ChatGPT, quelques modèles open source (Llama, Mistral...). Mais depuis quelques mois, je suis surtout sur Claude Code, qui correspond exactement à ce que je recherche que ce soit pour du dev pur intégré directement dans mon IDE, ou pour des projets perso sur mon homelab, c'est devenu mon outil du quotidien.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Que lui confies-tu principalement comme tâches ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ça va du simple prompt pour me faire une synthèse de mes emails, jusqu'à des agents qui m'alertent quand des logs ont un comportement chelou.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Comment vois-tu l'évolution de l'IA dans 5 ans ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Comme quelque chose d'excitant et de terrifiant à la fois. Excitant, parce que les barrières à l'entrée tombent les unes après les autres, et que ça facilite énormément les tests et les POC, les itérations rapides, l'apprentissage. Effrayant, parce que tout finit par tourner autour de ça, et que ça pose de vraies questions de ressources, de propriété intellectuelle et de vérification de l'information.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;13. Quels sont tes 3 outils les plus utilisés dans ton quotidien de dev ? (cela peut être ce que tu veux du moment que c'est relié à ton quotidien de dev : livre, site internet, mug, logiciel, etc.) ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Alors, je ne suis pas vraiment un "vrai" dev, mais j'utilise beaucoup GitLab, Neovim et/ou VSCode. Et sinon, mon term de cœur c'est Ghostty.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;14. Un autre sujet que tu aimerais mettre en avant ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;J'ai beaucoup parlé de curiosité et je pense sincèrement que c'est la qualité numéro un pour devenir un bon dev. Mais s'il y a une chose qui manque souvent à nos métiers, c'est de ne pas trop se prendre au sérieux. On a tendance, dans l'IT, à se regarder le nombril, à sacraliser nos outils, nos méthodologies, nos débats de chapelle (tabs vs spaces, vim vs le reste du monde...). Un peu d'autodérision ne ferait pas de mal et ça rendrait sans doute nos métiers plus vivants et plus accessibles.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;15. Le mot de la fin ?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Le mot de la fin, je voudrais le tourner vers Kavinsky, qui vient de nous quitter beaucoup trop tôt. On ne le connaissait pas vraiment, et c'est bien ça le plus beau : il n'a jamais cherché la lumière, toujours planqué derrière ses lunettes noires, laissant sa musique parler à sa place. "Nightcall" a mis près d'une décennie à devenir l'hymne qu'on connaît, sans qu'il n'ait jamais forcé le trait ni couru après le buzz. Il y a là une vraie leçon d'humilité et de patience : faire les choses bien, sans se soucier de la reconnaissance immédiate, et laisser le temps faire son travail. C'est un peu ce que j'essaie de faire à mon échelle, avec RudeOps comme avec le reste de mes projets : construire tranquillement, sans calcul, et trouver son équilibre en chemin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Questions bonus&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ta meilleure anecdote dans ton travail :&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Un rm -rf sur /etc, sur un système central, lors de mon tout premier vrai job d'admin et qui a paralysé toute ma boîte. J'ai appris à utiliser tar en 24 heures. Disons que ça forge le caractère.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ton livre préféré :&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;J'en ai trop pour n'en citer qu'un, mais cette fois je vais dire "&lt;a href="https://amzn.to/4w47R1y" rel="noopener noreferrer"&gt;La Conjuration des imbéciles&lt;/a&gt;", de John Kennedy Toole.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ton jeu vidéo préféré :&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Pareil, j'en ai trop, mais mon cœur penche pour DCS (Digital Combat Simulator).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ton film ou ta série préféré(e) :&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;The Office bien évidemment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ton livre tech préféré :&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;"&lt;a href="https://amzn.to/44VaeZv" rel="noopener noreferrer"&gt;The Phoenix Project&lt;/a&gt;", de Gene Kim, Kevin Behr et George Spafford. C'est un roman qui raconte l'histoire de Bill, un manager IT propulsé malgré lui à la tête d'un projet informatique au bord du gouffre, et qui découvre au fil du récit les grands principes du DevOps (flux, feedback, l'amélioration continue etc…). J'aime ce bouquin parce qu'il transforme des concepts qu'on trouve habituellement arides en une histoire qu'on suit avec plaisir, et parce que je m'y suis reconnu à plus d'une reprise dans mon propre quotidien d'infra.&lt;/p&gt;




&lt;h2&gt;
  
  
  LA CAISSE À OUTILS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93qptdjgs934ekys3vyh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F93qptdjgs934ekys3vyh.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette rubrique, je vous présente des outils qui peuvent vous aider dans votre quotidien de dev.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Murmure
&lt;/h3&gt;

&lt;p&gt;L'outil de dictée par IA qui tourne &lt;strong&gt;100 % sur votre machine&lt;/strong&gt; : basé sur un modèle NVIDIA Parakeet v3, il retranscrit votre voix en texte, sans envoyer l'audio nulle part. 25 langues européennes, pas de tracking, pas de compte, et pas besoin de GPU. Plus de 28 000 téléchargements, et 3× plus rapide que la frappe. &lt;/p&gt;

&lt;p&gt;Note de votre humble serviteur 😉  Franchement j'ai testé Murmure, j'écris d'ailleurs ce commentaire avec, et c'est assez bluffant. Ça marche très très bien. Ça comprend quand il faut supprimer les hésitations, ajouter des virgules, faire la ponctuation. Franchement, essayez-le, vous allez ganger un temps de dingue, c’est 100% gratuit, local first. Que du bon&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.murmure.app/" rel="noopener noreferrer"&gt;Voir le site&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  SketchForge
&lt;/h3&gt;

&lt;p&gt;Un logiciel de modélisation 3D qui tourne &lt;strong&gt;localement dans votre navigateur&lt;/strong&gt;, sans compte ni service externe. Approche WYSIWYG avec des formes primitives, un mode sketch 2D (extrusion/révolution), et surtout un export au format STEP pour importer vos créations dans d'autres logiciels de CAO. Un peu l'esprit de Tinkercad, mais en 100 % local.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://github.com/Formsmith746/SketchForge-3D" rel="noopener noreferrer"&gt;Voir le projet&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  DBStan
&lt;/h3&gt;

&lt;p&gt;Un package Laravel qui fournit une analyse détaillée et des insights sur votre schéma de base de données : tables, index, relations, redondances potentielles. Pratique pour auditer la santé d'une base qui grossit sans que personne ne sache pourquoi.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://madewithlaravel.com/dbstan" rel="noopener noreferrer"&gt;Voir sur MadeWithLaravel&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  uPlot
&lt;/h3&gt;


&lt;blockquote class="bluesky-embed"&gt;
&lt;p&gt;🏖️🐻 Les logiciels libres de l'été, jour 43

uPlot : des graphiques de séries temporelles très rapides dans seulement 50 Ko&lt;/p&gt;— &lt;a href="https://bsky.app/profile/did:plc:oklkinuievllgvhrv2nia4gu?ref_src=embed" rel="noopener noreferrer"&gt;Bearstech (@bearstech.com)&lt;/a&gt; &lt;a href="https://bsky.app/profile/did:plc:oklkinuievllgvhrv2nia4gu/post/3ms4mmijg2l2f?ref_src=embed" rel="noopener noreferrer"&gt;2026-08-02T18:32:29.000Z&lt;/a&gt;
&lt;/blockquote&gt;



&lt;h2&gt;
  
  
  CONFÉRENCES ET ÉVÉNEMENTS À VENIR
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fetlsem4ls8jfr0geuftc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fetlsem4ls8jfr0geuftc.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Dans cette rubrique, je vous présente les conférences et événements à venir dans les prochaines semaines&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  State of the Map - 28 au 30/08/26 - Paris
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;State of the Map is the annual event for all mappers and OpenStreetMap users. In 2026 the State of the Map conference will be taking place in Paris and online. It will be a three day conference packed with talks, workshops, discussion rounds and more.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;» &lt;a href="https://2026.stateofthemap.org/" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  JUG Summer Camp — 4 septembre 2026 — La Rochelle
&lt;/h3&gt;

&lt;p&gt;L'incontournable camp d'été du Java User Group français. Une journée de conférences techniques autour de Java, JVM, architectures modernes, cloud et devops.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.jugsummercamp.org/" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  PHP×Tokyo — 11 septembre 2026 — Tokyo
&lt;/h3&gt;

&lt;p&gt;Le meetup PHP×Tokyo fait sa rentrée le 11 septembre à Shibuya avec des talks PHP &amp;amp; Laravel, du networking, et un appel à speakers ouvert. Si vous êtes de passage au Japon, foncez.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://bsky.app/profile/phpxtky.bsky.social/post/3mrk7z3rep22x" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  dotJS + dotAI — 17-18 septembre 2026 — Paris
&lt;/h3&gt;

&lt;p&gt;Les célèbres conférences parisiennes dédiées à JavaScript (dotJS) et à l’IA (dotAI), avec des speakers internationaux de haut niveau.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.dotjs.io/" rel="noopener noreferrer"&gt;dotJS&lt;/a&gt; · &lt;a href="https://www.dotai.io/" rel="noopener noreferrer"&gt;dotAI&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Paris Web — 24-25 septembre 2026 — Paris
&lt;/h3&gt;

&lt;p&gt;Le rendez-vous des professionnel·les du web francophone célèbre sa 21ᵉ édition avec un nouveau format de 2 jours sur le thème « L'intelligence du web » : accessibilité, qualité, design et technique, avec 34 conférences et ateliers.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.paris-web.fr" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  WAX — 1er octobre 2026 — Marseille (Stade Vélodrome)
&lt;/h3&gt;

&lt;p&gt;La conférence qui réunit les communautés techniques dans un cadre exceptionnel. Au programme : cloud, DevOps, IA et retours d'expérience. &lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.waxconf.fr/" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Volcamp — 1er-2 octobre 2026 — Clermont-Ferrand
&lt;/h3&gt;

&lt;p&gt;La conférence tech au cœur des volcans d'Auvergne : deux jours de talks autour de Java, du cloud, de l'IA et de la craft, organisés par Geek&amp;amp;Terroir au Hall 32.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.volcamp.io" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Bdx I/O — 29-30 octobre 2026 — Bordeaux
&lt;/h3&gt;

&lt;p&gt;La conférence bordelaise qui monte. Deux jours de conférences et d'ateliers autour du développement, du cloud et de l'IA. &lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.bdxio.fr" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Capitole du Libre — 14-15 novembre 2026 — Toulouse
&lt;/h3&gt;

&lt;p&gt;L'événement du logiciel libre en Occitanie, gratuit sur inscription : 100+ conférences et ateliers, village associatif, install party et initiation au code, à l'ENSEEIHT.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://capitoledulibre.org" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  DevFest Toulouse — 19 novembre 2026 — Labège (31)
&lt;/h3&gt;

&lt;p&gt;Le plus grand événement tech de la région toulousaine, organisé par le GDG Toulouse. Pour sa 10ᵉ édition : 1 200 attendus et 46 talks au Diagora.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://devfesttoulouse.fr/" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Open Source Experience — 9-10 décembre 2026 — Paris (Porte de Versailles)
&lt;/h3&gt;

&lt;p&gt;Le salon européen de l'open source (6ᵉ édition), dédié à la souveraineté numérique, la résilience et l'innovation : 130 conférences et 90 exposants, co-localisé avec DevOps REX.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.opensource-experience.com/" rel="noopener noreferrer"&gt;En savoir plus&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Merci Aurélie
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Je tiens à souligner ici le super travail d'Aurélie Vache&lt;/strong&gt; qui tient depuis plus de 7 ans un &lt;a href="https://github.com/scraly/developers-conferences-agenda" rel="noopener noreferrer"&gt;github&lt;/a&gt; qui donne toutes les informations pour les conférences à venir.&lt;/p&gt;

&lt;p&gt;Il y a même un site associé : &lt;a href="https://developers.events" rel="noopener noreferrer"&gt;developers.events&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  OFFRES D'EMPLOI
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Des employeurs qui cherchent des développeurs. Offres sourcées et récentes.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Développeur PHP Symfony — Webnet — Août 2026
&lt;/h3&gt;

&lt;p&gt;Lieu : Lille — télétravail fréquent (3 à 4 j/semaine)&lt;/p&gt;

&lt;p&gt;Webnet (ESN web/mobile, 200 collaborateurs) recrute un développeur PHP Symfony. Stack : PHP 8.x, Symfony 6, CI (Jenkins, GitLab CI), ElasticSearch, Docker, MariaDB/PostgreSQL. Rémunération : 33-37K. CDI.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.welcometothejungle.com/fr/companies/webnet/jobs/developpeur-php-symfony-lille_lille_WEBNE_Px5MPQ7" rel="noopener noreferrer"&gt;Voir l'offre sur Welcome to the Jungle&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Développeur Expérimenté Java Fullstack F/H — Accenture — Août 2026
&lt;/h3&gt;

&lt;p&gt;Lieu : Saint-Herblain (Nantes) — 2 j sur site / 3 j télétravail&lt;/p&gt;

&lt;p&gt;Accenture France recrute un développeur Java fullstack. Stack : Java, Spring (Core, Boot, Batch, Security), Apache Kafka, architectures API/microservices. Minimum 2 ans d'expérience. CDI.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.welcometothejungle.com/fr/companies/accenture-france/jobs/developpeur-experimente-java-fullstack-f-h_saint-herblain" rel="noopener noreferrer"&gt;Voir l'offre sur Welcome to the Jungle&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Software Engineer Full Stack (NestJS / Angular) — Dougs — Août 2026
&lt;/h3&gt;

&lt;p&gt;Lieu : Bron (Lyon) — télétravail total possible&lt;/p&gt;

&lt;p&gt;Dougs (cabinet d'expertise comptable tech, 450 collaborateurs) recrute pour sa Squad Operations. Stack : Node.js/TypeScript, NestJS, Angular, SQL, GCP, méthode Shape Up. 50-55K €. CDI.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.welcometothejungle.com/fr/companies/dougs/jobs/software-engineer-full-stack-nestjs-angular-squad-operations-h-f_bron_DOUGS_7ZNM0ak" rel="noopener noreferrer"&gt;Voir l'offre sur Welcome to the Jungle&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  4. Développeur Node JS — Niji — Août 2026
&lt;/h3&gt;

&lt;p&gt;Lieu : Rennes&lt;/p&gt;

&lt;p&gt;Niji (ESN transformation digitale) recrute un développeur Node.js. Stack : Node.js et/ou ReactJS, approche DevSecOps ; découverte de GraphQL, MongoDB/CouchDB, Kibana, Jenkins, Kafka. Minimum 4 ans d'expérience. CDI.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://fr.linkedin.com/jobs/view/d%C3%A9veloppeur-node-js-f-h-at-niji-4413397713" rel="noopener noreferrer"&gt;Voir l'offre sur LinkedIn&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  5. Ingénieur Plateforme DevOps — Thales — Août 2026
&lt;/h3&gt;

&lt;p&gt;Lieu : Rennes — habilitation défense requise&lt;/p&gt;

&lt;p&gt;Thales (pôle d'excellence Cyber) recrute un ingénieur plateforme DevOps. Stack : Linux, CI/CD (GitLab CI, Jenkins, CircleCI, Azure DevOps), Kubernetes/Docker Swarm, GCP/AWS/Azure, Terraform, Ansible, scripting Python/Bash, monitoring Prometheus/Grafana/ELK. Minimum 4 ans d'expérience. CDI.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://fr.linkedin.com/jobs/view/ing%C3%A9nieur-plateforme-devops-at-thales-4365152471" rel="noopener noreferrer"&gt;Voir l'offre sur LinkedIn&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  LES DEMANDES DE STAGES, ALTERNANCES ET JOBS
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jjwruvfi4edx3ic7d4y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3jjwruvfi4edx3ic7d4y.png" width="800" height="537"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Ici je vous présente les demandes de stages, d'alternances et de jobs, des personnes qui m'ont contactées.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Aux devs, si vous souhaitez passer dans cette rubrique gratuitement, contactez-moi en DM sur Twitter (happytodev), sur LinkedIn (Frédéric Blanc) ou par email &lt;a href="mailto:happytodev@ik.me"&gt;happytodev@ik.me&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Pas de nouvelles demandes cette semaine — la rubrique vous est ouverte !&lt;/em&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  LES NEWSLETTERS QUE JE RECOMMANDE
&lt;/h2&gt;
&lt;h3&gt;
  
  
  RudeOps n°78 — 20 juillet 2026
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Publié le 20 juillet 2026 par Cyril Beaufrère&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dernier numéro avant la pause d'été, et il démarre fort : après la recommandation de la CNIL assimilant le pixel de tracking email à un cookie, RudeOps a purement et simplement supprimé le sien — pas de case à cocher ni d'usine à gaz, coupé le fil, point. La pépite de la semaine : un face-à-face savoureux entre &lt;strong&gt;Karpenter&lt;/strong&gt; et &lt;strong&gt;cluster-autoscaler&lt;/strong&gt; sur l'infra OVH (spoiler : le vétéran sans paillettes gagne aux points). Au menu aussi : un guide pour construire son propre exporter de métriques K8s, &lt;strong&gt;Freshdock&lt;/strong&gt; (successeur de WatchTower en Rust), &lt;strong&gt;pgsavvy&lt;/strong&gt; (client PostgreSQL en TUI façon lazygit), comment la FSF bloque les botnets avec reaction, la réponse de Linus Torvalds sur l'IA dans le noyau Linux, et un outil de mémoire locale pour vos agents de code.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.rudeops.com/newsletters/2026-07-20" rel="noopener noreferrer"&gt;Lire la newsletter RudeOps&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  La veille des Ours n°116 — Mesure de l'impact de l'IA
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Publié le 31 juillet 2026 par Bearstech&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Dans ce numéro, Bearstech part d'une litote : l'IA est loin d'être une technologie frugale, mais on manque encore de données fiables pour mesurer son impact réel. Le fil rouge : &lt;strong&gt;l'Arcep lance une consultation publique&lt;/strong&gt; (ouverte jusqu'au 30 septembre) pour collecter des données environnementales directement auprès des fournisseurs d'IA générative — électricité, eau, émissions, sur tout le cycle de vie. Au menu aussi : les (re)découvertes open source (Teable, Portabase, Tauri, Typer, Alacritty) et l'annonce de dotAI 2026.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://fr.linkedin.com/pulse/mesure-de-limpact-lia-la-veille-des-ours-n116-bearstech-u5cje" rel="noopener noreferrer"&gt;Lire la veille&lt;/a&gt;&lt;/p&gt;


&lt;h3&gt;
  
  
  Veille #67 de Camille Roux
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Publié le 1er août 2026&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;38 articles lus, triés et commentés. Au sommaire : &lt;strong&gt;Cursor Router&lt;/strong&gt; (sélection automatique du modèle par requête, 31 à 52 % d'économies annoncées sur les requêtes Auto), la &lt;strong&gt;spec MCP du 28 juillet&lt;/strong&gt; qui passe à un core stateless avec une auth OAuth 2.0 native, et &lt;strong&gt;Kimi K3&lt;/strong&gt; en open source (2,8 trillions de paramètres, 1 million de tokens de contexte). Camille précise qu'il part en vacances à la montagne et n'est pas sûr de publier la veille en août — à savourer.&lt;/p&gt;

&lt;p&gt;» &lt;a href="https://www.camilleroux.com/cursor-router-choisit-votre-modele-mcp-devient-stateless-kimi-k3-1m-tokens-veille-67/" rel="noopener noreferrer"&gt;Lire la veille&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  UN PEU D'HUMOUR !
&lt;/h2&gt;

&lt;p&gt;Il est temps de sourire et de se détendre un peu.&lt;/p&gt;
&lt;h3&gt;
  
  
  Quand je lis certains posts de ma timeline
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2083961657139638713-839" src="https://platform.twitter.com/embed/Tweet.html?id=2083961657139638713"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2083961657139638713-839');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2083961657139638713&amp;amp;theme=dark"
  }



&lt;/p&gt;




&lt;h3&gt;
  
  
  vibe coding vs vibe debugging
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2083466517379952822-734" src="https://platform.twitter.com/embed/Tweet.html?id=2083466517379952822"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2083466517379952822-734');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2083466517379952822&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Le côté « building part flies by » puis « tu vieillis de dix ans à comprendre ce que l'IA a réellement fait » (comme dit un commentaire). Résumé parfait de l'expérience vibe coding en 2026.&lt;/p&gt;




&lt;h3&gt;
  
  
  Junior developer vs production
&lt;/h3&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2083404495120478621-254" src="https://platform.twitter.com/embed/Tweet.html?id=2083404495120478621"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2083404495120478621-254');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2083404495120478621&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Une vidéo Tom &amp;amp; Jerry de circonstance : le junior qui déploie en prod, ça finit toujours comme ça. 50K vues et un commentaire légendaire : « the switch happens the exact second you open devtools ».&lt;/p&gt;




&lt;h2&gt;
  
  
  #LaPetiteInfoDuJour
&lt;/h2&gt;

&lt;p&gt;Avec l'autorisation d'&lt;strong&gt;Olivier Poncet&lt;/strong&gt; (&lt;a href="https://bsky.app/profile/ponceto91.bsky.social" rel="noopener noreferrer"&gt;@ponceto91.bsky.social&lt;/a&gt;), je republie &lt;strong&gt;#LaPetiteInfoDuJour&lt;/strong&gt; prise au hasard ou pas dans celles de la semaine.&lt;/p&gt;

&lt;p&gt;C'est bon pour votre culture générale.&lt;/p&gt;

&lt;p&gt;Merci Olivier pour ce rendez-vous quotidien !&lt;/p&gt;

&lt;h3&gt;
  
  
  Johann Jakob Scheuchzer — 2 août 1672
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://x.com/ponceto91/status/2083859099482259857" rel="noopener noreferrer"&gt;https://x.com/ponceto91/status/2083859099482259857&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🤝 Comment soutenir cette newsletter ?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Un immense merci à celles et ceux qui soutiennent déjà cette newsletter 💜&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Si la newsletter vous apporte de la valeur, vous pouvez me soutenir dès aujourd'hui avec &lt;strong&gt;un abonnement annuel à seulement 9 €/an à vie&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://go.itanea.fr/qdnldsubscribe" rel="noopener noreferrer"&gt;Je vous soutiens pour 9€/an&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Des alternatives pour me soutenir ?&lt;/strong&gt; Bien sûr ! &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Votre prochaine commande Amazon avec ++&lt;strong&gt;&lt;a href="https://go.itanea.fr/amznl" rel="noopener noreferrer"&gt;mon lien d'affiliation&lt;/a&gt;&lt;/strong&gt;++&lt;/li&gt;
&lt;li&gt;Abonnez-vous à OpenCode Go pour 5 $ et bénéficiez de 5 $ supplémentaires grâce à &lt;a href="https://go.itanea.fr/opencode" rel="noopener noreferrer"&gt;mon lien de parrainage&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;J’utilise Starlink à la maison et j’en suis plus que satisfait. Si cela vous tente &lt;a href="https://starlink.com/residential?referral=RC-5072169-18924-69&amp;amp;app_source=share" rel="noopener noreferrer"&gt;profitons chacun d’un mois gratuit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://fr.tuto.com/?aff=4Cx6BPp" rel="noopener noreferrer"&gt;Découvrez des milliers de tutos gratuits&lt;/a&gt; dans de nombreux domaine avec l’équipe géniale de Tuto&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  LE MOT DE LA FIN
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;J'espère que cette newsletter vous plaît. Je vous invite encore une fois à vous y abonner — c'est le meilleur soutien que vous puissiez m'apporter.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Vous recevrez cette newsletter directement dans votre boîte email le lundi.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://quoi-de-neuf-les-devs.happyto.dev/subscribe" class="crayons-btn crayons-btn--primary" rel="noopener noreferrer"&gt;Subscribe now&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;N'hésitez pas à la partager autour de vous avec vos collègues et sur les réseaux sociaux. Cela m'aide vraiment et ne vous coûte rien.&lt;/p&gt;




&lt;p&gt;Sur ce, je vous souhaite une excellente semaine et un bel été !&lt;/p&gt;

&lt;p&gt;Happy Coding à toutes et à tous&lt;/p&gt;

&lt;p&gt;À bientôt&lt;/p&gt;

&lt;p&gt;Fred&lt;/p&gt;

</description>
    </item>
    <item>
      <title>🇫🇷 Framework Heroes News : la veille sur les frameworks pour la semaine 2024/40</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Tue, 08 Oct 2024 16:14:19 +0000</pubDate>
      <link>https://dev.to/happytodev/framework-heroes-news-la-veille-sur-les-frameworks-pour-la-semaine-202440-clf</link>
      <guid>https://dev.to/happytodev/framework-heroes-news-la-veille-sur-les-frameworks-pour-la-semaine-202440-clf</guid>
      <description>&lt;h2&gt;
  
  
  Edito
&lt;/h2&gt;

&lt;p&gt;Et voici, votre condensé de la veille sur les frameworks de la semaine 40, du 30 septembre au 06 octobre 2024.&lt;/p&gt;

&lt;p&gt;Pour cette première semaine d'octobre, les contributeurs de Framework Heroes n'ont pas chômé.&lt;/p&gt;

&lt;h2&gt;
  
  
  Catégorie Games
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Godot XR Update - October 2024
&lt;/h3&gt;

&lt;p&gt;Cet article détaille les avancées dans le support XR de Godot, incluant des améliorations en suivi de mouvement, pass-through, et la collaboration avec Meta pour optimiser l'expérience sur les appareils Quest.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://godotengine.org/article/godot-xr-update-oct-2024/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Catégorie web
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security Tip : Auto-secure Cookies FTW
&lt;/h3&gt;

&lt;p&gt;Où on y découvre que Laravel a mis à jour le comportement des cookies pour qu'ils soient automatiquement sécurisés en correspondant au protocole de la requête (HTTP/HTTPS).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://securinglaravel.com/security-tip-auto-secure-cookies-ftw/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  A Guide to Laravel Pipelines | Ash Allen Design
&lt;/h3&gt;

&lt;p&gt;où l'on apprends comment utiliser la classe Pipeline de Laravel pour décomposer des flux de travail complexes en processus isolés et ciblés, facilitant ainsi la gestion et le test des pipelines dans les applications Laravel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ashallendesign.co.uk/blog/laravel-pipeline" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  LangCountry launches v4
&lt;/h3&gt;

&lt;p&gt;La version 4 de Laravel LangCountry introduit des macros Carbon pour une mise en forme directe des dates selon les spécifications linguistiques et géographiques.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://laravel-news.com/langcountry-launches-v4" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Laravel Roundup - October
&lt;/h3&gt;

&lt;p&gt;Le "Laravel Roundup" d'octobre couvre les dernières nouvelles et mises à jour dans la communauté Laravel, incluant des outils, des packages récemment publiés, et des événements comme des meetups.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://laravel-news.com/laravel-roundup-october" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Lunar - Headless E-Commerce for Laravel
&lt;/h3&gt;

&lt;p&gt;Lunar est un package open-source pour Laravel qui introduit des fonctionnalités de commerce électronique headless modernes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://lunarphp.io/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Laravel Form Request and Data Validation Tutorial
&lt;/h3&gt;

&lt;p&gt;Cet article explore comment utiliser les Form Requests de Laravel pour gérer la validation des données et l'autorisation dans une application web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devdojo.com/inspector/laravel-form-request-and-data-validation-tutorial" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Laravel Herd v1.11 Adds Forge Integration, Dump Updates, and More
&lt;/h3&gt;

&lt;p&gt;La version 1.11 de Laravel Herd introduit une intégration avec Laravel Forge, des améliorations pour le débogage, et permet le partage de configurations de projet.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://laravel-news.com/laravel-herd-1-11-0" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Security Tip: Stop Using MD5 and SHA-1!
&lt;/h3&gt;

&lt;p&gt;Cet article recommande d'arrêter d'utiliser les algorithmes MD5 et SHA-1 pour des raisons de sécurité, suggérant plutôt l'adoption de solutions plus sécurisées et performantes pour la vérification d'intégrité et la cryptographie.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://securinglaravel.com/security-tip-stop-using-md5-and-sha-1/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  React Best Practices Every Developer Should Know
&lt;/h3&gt;

&lt;p&gt;Cet article présente une compilation des meilleures pratiques pour les développeurs React, visant à améliorer la qualité et la maintenabilité du code.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.freecodecamp.org/news/react-best-practices-ever-developer-should-know/" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Building a Google Meet Clone with Next.js and Tailwind CSS - Part Two
&lt;/h3&gt;

&lt;p&gt;Cet article explore la deuxième partie de la création d'un clone de Google Meet, en utilisant Next.js pour la structure et Tailwind CSS pour le style, avec l'intégration de fonctionnalités comme le chat et le partage d'écran.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://tropicolx.hashnode.dev/building-a-google-meet-clone-with-nextjs-and-tailwindcss-part-two" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Introduction to Laravel Data V3
&lt;/h3&gt;

&lt;p&gt;Cet article introduit la version 3 du package Laravel Data de Spatie, qui simplifie la création et la gestion des objets de données dans Laravel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://spatie.be/docs/laravel-data/v3/introduction" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Serverless Search with Laravel and Typesense
&lt;/h3&gt;

&lt;p&gt;Cet article explore comment intégrer une fonctionnalité de recherche serverless dans une application Laravel en utilisant Typesense pour une recherche rapide et efficace.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://laravel-news.com/serverless-search-laravel-typesense" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Laravel Auth Routes Tutorial
&lt;/h3&gt;

&lt;p&gt;Ce tutorial explique comment configurer et utiliser les routes d'authentification fournies par Laravel pour gérer l'inscription, la connexion et la réinitialisation de mot de passe des utilisateurs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://devdojo.com/inspector/laravel-auth-routes-tutorial" rel="noopener noreferrer"&gt;Lire l'article&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Et voilà pour les news de la semaine passée.&lt;/p&gt;

&lt;p&gt;N'oubliez pas que Framework Heroes est fait pour vous et par vous. À ce titre, il a besoin de votre participation. &lt;/p&gt;

&lt;h3&gt;
  
  
  Comment ?
&lt;/h3&gt;

&lt;p&gt;Simplement en venant &lt;a href="https://go.itanea.fr/fhndev2" rel="noopener noreferrer"&gt;partager de temps à autres des news&lt;/a&gt; sur vos frameworks préférés.&lt;/p&gt;

</description>
      <category>godot</category>
      <category>laravel</category>
      <category>security</category>
    </item>
    <item>
      <title>Newsletter "What's up devs ?" is born !</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Sun, 16 Jun 2024 21:35:38 +0000</pubDate>
      <link>https://dev.to/happytodev/newsletter-whats-up-devs-is-born--pl9</link>
      <guid>https://dev.to/happytodev/newsletter-whats-up-devs-is-born--pl9</guid>
      <description>&lt;p&gt;Hi devs, &lt;/p&gt;

&lt;p&gt;You may know that I publish a weekly French dev newsletter called "&lt;a href="https://happytodev.substack.com" rel="noopener noreferrer"&gt;Quoi de neuf les devs ?&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But today, I'm delighted to announce that its English version is born.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's called &lt;strong&gt;"&lt;a href="https://go.itanea.fr/wud1" rel="noopener noreferrer"&gt;What's up devs?&lt;/a&gt;"&lt;/strong&gt; and it's in the same spirit as its French sister: to give you the latest development news every week.&lt;/p&gt;

&lt;p&gt;I'll try to keep the same rhythm as the French version, so I'll publish it every Friday. Occasionally, the newsletter may be published on Saturday, depending on how tired I am ;-)&lt;/p&gt;

&lt;p&gt;So I leave you with this newsletter, which I'm very proud to present to you.&lt;/p&gt;

&lt;p&gt;I hope you enjoy reading it as much as I enjoyed writing it.&lt;/p&gt;

&lt;p&gt;Don't hesitate to give your opinion on the topics and content. I'll be reading your comments very carefully to improve this newsletter.&lt;/p&gt;

&lt;p&gt;In this first issue, we'll be talking about&lt;br&gt;&lt;br&gt;
✅ Go, &lt;br&gt;
✅ PostgreSQL, &lt;br&gt;
✅ CSS, &lt;br&gt;
✅ HTTP/3, &lt;br&gt;
✅ Laravel, &lt;br&gt;
✅ Python, &lt;br&gt;
✅ SQLite&lt;br&gt;
and much more...&lt;/p&gt;

&lt;p&gt;Take care and see you next friday !!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>newsletter</category>
      <category>developers</category>
    </item>
    <item>
      <title>LinKeeper - Lesson 03 - Tests and ressources</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Sun, 28 Apr 2024 08:56:38 +0000</pubDate>
      <link>https://dev.to/happytodev/linkeeper-lesson-03-tests-and-ressources-50m6</link>
      <guid>https://dev.to/happytodev/linkeeper-lesson-03-tests-and-ressources-50m6</guid>
      <description>&lt;p&gt;In this episode, we're going to take FilamentPHP a step further.&lt;/p&gt;

&lt;p&gt;But first, we're going to set up our testing environment.&lt;/p&gt;

&lt;p&gt;To do this, we're going to use PestPHP. PestPHP is already present because it was installed at the same time as Laravel.&lt;/p&gt;

&lt;p&gt;To get to grips with Pest, we're going to create two very simple tests. Once we have the basics down, we can develop the rest of our application based on the tests.&lt;/p&gt;

&lt;p&gt;What we'll be looking at today : &lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;
Prior configuration of Pest

&lt;ul&gt;
&lt;li&gt;Using SQLite for testing&lt;/li&gt;
&lt;li&gt;Refresh the database for each test&lt;/li&gt;
&lt;li&gt;Load a default account before each test&lt;/li&gt;
&lt;li&gt;Remove the tests provided by default by PestPHP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Checking the administration home page

&lt;ul&gt;
&lt;li&gt;Running the test&lt;/li&gt;
&lt;li&gt;Correct the 403 error&lt;/li&gt;
&lt;li&gt;Run the test again&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
Testing the user profile

&lt;ul&gt;
&lt;li&gt;Run the tests&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
a user can see the list of links associated with them

&lt;ul&gt;
&lt;li&gt;Let's create our tests for the Links page&lt;/li&gt;
&lt;li&gt;Let's create the Links page&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Conclusion &lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Prior configuration of Pest
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Using SQLite for testing
&lt;/h3&gt;

&lt;p&gt;In order to separate your application's database from the one used for testing, we're going to modify the &lt;code&gt;phpunit.xml&lt;/code&gt; file located at the root of your project.&lt;/p&gt;

&lt;p&gt;Simply uncomment the following two lines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;env name="DB_CONNECTION" value="sqlite"/&amp;gt; --&amp;gt;&lt;/span&gt;
        &lt;span class="c"&gt;&amp;lt;!-- &amp;lt;env name="DB_DATABASE" value=":memory:"/&amp;gt; --&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;        &lt;span class="nt"&gt;&amp;lt;env&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"DB_CONNECTION"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;"sqlite"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;env&lt;/span&gt; &lt;span class="na"&gt;name=&lt;/span&gt;&lt;span class="s"&gt;"DB_DATABASE"&lt;/span&gt; &lt;span class="na"&gt;value=&lt;/span&gt;&lt;span class="s"&gt;":memory:"&lt;/span&gt;&lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will allow Pest, which is a PHPUnit overlay, to use SQLite as its database engine and use it directly in memory.&lt;/p&gt;

&lt;h3&gt;
  
  
  Refresh the database for each test
&lt;/h3&gt;

&lt;h3&gt;
  
  
  Load a default account before each test
&lt;/h3&gt;

&lt;p&gt;We're going to be doing a lot of work with FilamentPHP administration. So to avoid repeating for each test that we want to connect with a registered user, we'll simply tell Pest that for each test, it will act as if it were connected with the user with id #1. &lt;/p&gt;

&lt;p&gt;To make this user ex&lt;/p&gt;

&lt;p&gt;To do this, we'll edit the &lt;code&gt;tests\TestCase.php&lt;/code&gt; file and add the following &lt;code&gt;setUp&lt;/code&gt; function:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;parent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;setUp&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;actingAs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So before each test is run, the &lt;code&gt;actingAs&lt;/code&gt; function will define the user with id #1 as the logged-in user. Here it's my HappyToDev account.&lt;/p&gt;

&lt;h3&gt;
  
  
  Remove the tests provided by default by PestPHP
&lt;/h3&gt;

&lt;p&gt;When you install Pest, it provides you with two default tests: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;tests\Feature\ExampleTest.php&lt;/li&gt;
&lt;li&gt;tests\Unit\ExampleTest.php&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can delete them or keep them for inspiration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Checking the administration home page
&lt;/h2&gt;

&lt;p&gt;In this test, we'll go to the &lt;code&gt;/admin&lt;/code&gt; page to check that&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an HTTP 200 code is received&lt;/li&gt;
&lt;li&gt;we can see 'Dashboard' on the page&lt;/li&gt;
&lt;li&gt;we can see the name of our application 'LinKeeper' on the page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll start by creating a test file using Artisan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan pest:test GeneralAdminPageTest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, the tests created will be stored directly in the &lt;code&gt;tests\Feature&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;Here are the contents of the file :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Config&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'can view admin page'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/admin'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$response&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertSee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Dashboard'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertSee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;Config&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'APP_NAME'&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explanation: &lt;/p&gt;

&lt;p&gt;We ask for get access to the &lt;code&gt;/admin&lt;/code&gt; page and we get the response.&lt;/p&gt;

&lt;p&gt;In this response, we check that we do indeed have an HTTP 200 code, that in the HTML code returned we do indeed have the word &lt;code&gt;Dashboard&lt;/code&gt; and that we do indeed see the name of the application defined in our &lt;code&gt;.env&lt;/code&gt; file, in this case &lt;code&gt;LinKeeper&lt;/code&gt;. To do this, use the &lt;code&gt;config()&lt;/code&gt; helper.&lt;/p&gt;

&lt;h3&gt;
  
  
  Running the test
&lt;/h3&gt;

&lt;p&gt;To run the test, at the root of your project, run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./vendor/bin/pest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Normally you should get a 403 error, so your test will not pass.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4avad67wcaybgdjwn0lg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4avad67wcaybgdjwn0lg.png" alt="Error 403" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Correct the 403 error
&lt;/h3&gt;

&lt;p&gt;To correct this, you need to read the &lt;a href="https://filamentphp.com/docs/3.x/panels/installation#allowing-users-to-access-a-panel" rel="noopener noreferrer"&gt;FilamentPHP documentation&lt;/a&gt; which indicates that when you go into production, you need to modify the &lt;code&gt;User&lt;/code&gt; model to avoid hitting a wall with the 403 error.&lt;/p&gt;

&lt;p&gt;I'll leave it to you to implement the necessary changes so that your test can pass.&lt;/p&gt;

&lt;p&gt;If you encounter the slightest difficulty, let me know in the comments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the test again
&lt;/h3&gt;

&lt;p&gt;If you have correctly made the changes requested in the documentation, you should get this result when you run your tests.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ipkk9zxo1sgd6dugy4o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ipkk9zxo1sgd6dugy4o.png" alt="Test OK" width="800" height="398"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the user profile
&lt;/h2&gt;

&lt;p&gt;We saw in lesson 2 that we normally have access to the user's profile. Let's set up a test to check this.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan pest:test UserProfileTest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and add the following code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'has user profile page'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;actingAs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/admin/profile'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertStatus&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertSee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Profile'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertSee&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Save changes'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will allow us to check that when I'm logged in with the user with id #1 (my user) I do indeed get an HTTP 200 code when I go to the &lt;code&gt;/admin/profile&lt;/code&gt; page and I can see the words: 'Profile' and 'Save changes'.&lt;/p&gt;

&lt;p&gt;This is a very simple test, but it validates that the user does indeed have access to this page.&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the tests
&lt;/h3&gt;

&lt;p&gt;As before, run the appropriate command in your terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./vendor/bin/pest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and you should get the following result:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0n9xpuc5g3c2gicip9y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0n9xpuc5g3c2gicip9y.png" alt="Tests OK" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now that we've taken our first steps with tests, we'll be able to take a test-driven development approach using PestPHP throughout this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  a user can see the list of links associated with them
&lt;/h2&gt;

&lt;p&gt;This is the next stage in the development of our application.&lt;/p&gt;

&lt;p&gt;As we are using FilamentPHP for the backend, a number of features are being developed by the FilamentPHP teams and the aim here will not be to test how well Filament works as I have no doubt that this has been tested extensively.&lt;/p&gt;

&lt;p&gt;To view the list of links, the user will have a &lt;code&gt;Links&lt;/code&gt; link in the dashboard menu and this link, by FilamentPHP convention, will lead to an &lt;code&gt;admin/links&lt;/code&gt; address.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's create our tests for the Links page
&lt;/h3&gt;

&lt;p&gt;Let's create a new test, using artisan :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan pest:test PageLinksTest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;First of all, we want to make sure that the page is accessible.&lt;/p&gt;

&lt;p&gt;To do this, we're going to add the following code to our &lt;code&gt;PageLinksTest&lt;/code&gt; file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nf"&gt;it&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"can access the user's links page and see 'Links' on the page"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nv"&gt;$response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/admin/links'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="nv"&gt;$response&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertOk&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;assertSeeText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Links'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This code will ask PestPHP to load the &lt;code&gt;/admin/links&lt;/code&gt; page and to check firstly that the page returns the HTTP code 200 and then to ensure that the word 'Links' is present in the page.&lt;/p&gt;

&lt;p&gt;You can run the tests with the &lt;code&gt;--filter&lt;/code&gt; option to execute only the test that matches the regex passed in parameter (&lt;a href="https://pestphp.com/docs/filtering-tests#content---filter" rel="noopener noreferrer"&gt;see doc&lt;/a&gt;). For example with : &lt;/p&gt;

&lt;p&gt;&lt;code&gt;./vendor/bin/pest --filter "links page"&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;PestPHP will only run our last test because 'links page' is present in its description.&lt;/p&gt;

&lt;p&gt;This avoids having to run all the tests each time, especially when you have to iterate several times when setting up your test.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uzr0c2tly5d7g2z5o3w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2uzr0c2tly5d7g2z5o3w.png" alt="Tests KO" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The test fails and that's normal because the Links page doesn't exist at the moment.&lt;/p&gt;

&lt;p&gt;But now that the test is here and has failed, it tells us exactly what to do: &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Expected response status code [200] but received 404.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We were expecting an HTTP 200 code and instead we get a 404, which means that the requested page doesn't exist. &lt;/p&gt;

&lt;p&gt;We simply need to create it.&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's create the Links page
&lt;/h3&gt;

&lt;p&gt;The 'Links' page will be a FilamentPHP administration page. It will therefore be a resource.&lt;/p&gt;

&lt;p&gt;If I take the definition from the tutorial provided with PestPHP : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In Filament, resources are static classes used to build CRUD interfaces for your Eloquent models. They describe how administrators can interact with data from your panel using tables and forms.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;We therefore understand that each Eloquent model will be associated with a resource in FilamentPHP.&lt;/p&gt;

&lt;p&gt;It is therefore time to create our resource associated with our Link model, which is itself linked to our 'links' table in our database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:filament-resource Link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In our application tree, under &lt;code&gt;app/Filament/Resources&lt;/code&gt;, we can see a &lt;code&gt;LinkResource&lt;/code&gt; directory and a &lt;code&gt;LinkResource.php&lt;/code&gt; file. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0e2r4l594titrnwehto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz0e2r4l594titrnwehto.png" alt="Arborescence Filament Resources" width="512" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;LinkResource&lt;/code&gt; directory itself has a &lt;code&gt;Pages&lt;/code&gt; sub-directory which contains the &lt;code&gt;CreateLink.php&lt;/code&gt;, &lt;code&gt;EditLink.php&lt;/code&gt; and &lt;code&gt;ListLinks.php&lt;/code&gt; files. We'll talk about these later in this tutorial, so don't worry about these extra files for now.&lt;/p&gt;

&lt;p&gt;FilamentPHP, via this Artisan command, will generate the following skeleton for you:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;App\Filament\Resources&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Filament\Resources\LinkResource\Pages&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Filament\Resources\LinkResource\RelationManagers&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;App\Models\Link&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Filament\Forms&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Filament\Forms\Form&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Filament\Resources\Resource&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Filament\Tables&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Filament\Tables\Table&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\Builder&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Eloquent\SoftDeletingScope&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;LinkResource&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Resource&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;?string&lt;/span&gt; &lt;span class="nv"&gt;$model&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;protected&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;?string&lt;/span&gt; &lt;span class="nv"&gt;$navigationIcon&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'heroicon-o-rectangle-stack'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;form&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Form&lt;/span&gt; &lt;span class="nv"&gt;$form&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Form&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$form&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="c1"&gt;//&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;table&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Table&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Table&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;columns&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="c1"&gt;//&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;filters&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="c1"&gt;//&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;actions&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="nc"&gt;Tables\Actions\EditAction&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bulkActions&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="nc"&gt;Tables\Actions\BulkActionGroup&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                    &lt;span class="nc"&gt;Tables\Actions\DeleteBulkAction&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
                &lt;span class="p"&gt;]),&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getRelations&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="c1"&gt;//&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;static&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;getPages&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'index'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Pages\ListLinks&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'create'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Pages\CreateLink&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/create'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'edit'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Pages\EditLink&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;route&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/{record}/edit'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's not worry about that for the moment. But let's run our test again:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;./vendor/bin/pest &lt;span class="nt"&gt;--filter&lt;/span&gt; &lt;span class="s2"&gt;"links page"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can see that this time our test is green.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xb44qt2080ztinc3ws8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8xb44qt2080ztinc3ws8.png" alt="Tests OK" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we go to the &lt;code&gt;admin/links&lt;/code&gt; page, we can see that the page does exist (HTTP code 200) and that it does indeed say &lt;strong&gt;'Links'&lt;/strong&gt;. This is why our test turns green.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw63ujncufjdh05d2io2y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw63ujncufjdh05d2io2y.png" alt="Page admin/links" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;However, we soon realise that something isn't quite right. There seem to be records but nothing is visible in the table that shows us the links.&lt;/p&gt;

&lt;p&gt;This is normal, we'll need to configure our resource file.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;We'll stop here for episode 3.&lt;/p&gt;

&lt;p&gt;In this chapter, we started doing TDD for our application development and touched on resources in FilamentPHP.&lt;/p&gt;

&lt;p&gt;In the next episode, we'll continue our testing strategy with PestPHP and get to know FilamentPHP's resources better.&lt;/p&gt;

&lt;p&gt;As usual, I look forward to your comments below.&lt;/p&gt;

&lt;p&gt;See you soon.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Linkeeper - Lesson 02 - Start playing with Filament</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Wed, 10 Apr 2024 16:15:15 +0000</pubDate>
      <link>https://dev.to/happytodev/linkeeper-a-linktree-alternative-with-laravel-and-filament-lesson-02-start-playing-with-filament-4n32</link>
      <guid>https://dev.to/happytodev/linkeeper-a-linktree-alternative-with-laravel-and-filament-lesson-02-start-playing-with-filament-4n32</guid>
      <description>&lt;p&gt;Ok, now your application is set.&lt;/p&gt;

&lt;p&gt;We can dive in something more concrete.&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;an user can signin, login, logout and manage his account&lt;/li&gt;
&lt;li&gt;
a link has a name, a status (published or not) and obviously a link

&lt;ul&gt;
&lt;li&gt;Let's think about table schema&lt;/li&gt;
&lt;li&gt;Let's migrate&lt;/li&gt;
&lt;li&gt;Define model and relationship&lt;/li&gt;
&lt;li&gt;
We need fake datas to plays with

&lt;ul&gt;
&lt;li&gt;The factories&lt;/li&gt;
&lt;li&gt;The seeder&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;



&lt;p&gt;What we need to manage our links.&lt;/p&gt;

&lt;p&gt;Remember what I said in the first part : &lt;/p&gt;

&lt;blockquote&gt;
&lt;ul&gt;
&lt;li&gt;an user can signin, login, logout and manage his account&lt;/li&gt;
&lt;li&gt;a user can see a list of their links&lt;/li&gt;
&lt;li&gt;an user can add, edit or delete a link&lt;/li&gt;
&lt;li&gt;an user can have a shareable link to share his links with the world&lt;/li&gt;
&lt;li&gt;a link has a name, a status (published or not) and obviously a link. May be we will add some options later.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  an user can signin, login, logout and manage his account
&lt;/h2&gt;

&lt;p&gt;This is done with Filament. In fact, no completely, we can login, logout but not register or even manage our own account.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6qm92bcpnywky1s4al9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6qm92bcpnywky1s4al9.png" alt="Signin view" width="800" height="727"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;But, you will see it's very easy to add register and profile page for users.&lt;/p&gt;

&lt;p&gt;In &lt;code&gt;app/Providers/Filament/AdminPanelProvider.php&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh2ru1xnud0vunw8tq38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flh2ru1xnud0vunw8tq38.png" alt="Path to AdminPanelProvider.php" width="584" height="354"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;you have to add only 2 lines under login() function call to implement both functionnalities :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;AdminPanelProvider&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PanelProvider&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;panel&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Panel&lt;/span&gt; &lt;span class="nv"&gt;$panel&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;Panel&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$panel&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'admin'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;login&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="c1"&gt;// Lesson 2 : here we add registration and profile page&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;registration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c1"&gt;// registration&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;profile&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;      &lt;span class="c1"&gt;// profile management&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;colors&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="s1"&gt;'primary'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Color&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nc"&gt;Amber&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;discoverResources&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;app_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Filament/Resources'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'App\\Filament\\Resources'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;discoverPages&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;app_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Filament/Pages'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'App\\Filament\\Pages'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;pages&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="nc"&gt;Pages\Dashboard&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;discoverWidgets&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;app_path&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Filament/Widgets'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;'App\\Filament\\Widgets'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;widgets&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="nc"&gt;Widgets\AccountWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;Widgets\FilamentInfoWidget&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;middleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="nc"&gt;EncryptCookies&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;AddQueuedCookiesToResponse&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;StartSession&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;AuthenticateSession&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;ShareErrorsFromSession&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;VerifyCsrfToken&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;SubstituteBindings&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;DisableBladeIconComponents&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
                &lt;span class="nc"&gt;DispatchServingFilamentEvent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;authMiddleware&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
                &lt;span class="nc"&gt;Authenticate&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go back to your login page : &lt;code&gt;http://linkeeper.com/admin/login&lt;/code&gt; and you will see&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3274bw47b1gvcs59fm5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fx3274bw47b1gvcs59fm5.png" alt="Signin page with register link" width="800" height="762"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;that the link for signup has been added.&lt;/p&gt;

&lt;p&gt;If you login, you will see under your menu the new sub menu 'Profile'&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvvd09d3qj7sr2q59ukj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwvvd09d3qj7sr2q59ukj.png" alt=" " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It allows you to edit your nickname,  your e-mail address and change your password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw5hvzh55vbyfsbc52m3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmw5hvzh55vbyfsbc52m3.png" alt=" " width="800" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So, after this very cool step we can check the first functionnality : &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ an user can signin, login, logout and manage his account&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an user can add, edit or delete a link&lt;/li&gt;
&lt;li&gt;an user can have a shareable link to share his links with the world&lt;/li&gt;
&lt;li&gt;a link has a name, a status (published or not) and obviously a link. May be we will add some options later.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  a link has a name, a status (published or not) and obviously a link
&lt;/h2&gt;

&lt;p&gt;I know it is not in the order of the list, but first it's me writing, second I need to define table &lt;code&gt;links&lt;/code&gt; and its fields before an user can add link, right ?&lt;/p&gt;

&lt;p&gt;So let me do this ! 🤣&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's think about table schema
&lt;/h3&gt;

&lt;p&gt;Ok, what will be the fields in our table &lt;code&gt;links&lt;/code&gt; ?&lt;/p&gt;

&lt;p&gt;Of course an &lt;code&gt;id&lt;/code&gt;, an &lt;code&gt;url&lt;/code&gt;, a short &lt;code&gt;description&lt;/code&gt;, a &lt;code&gt;published&lt;/code&gt; status (published or not), a &lt;code&gt;user_id&lt;/code&gt; foreign key and finally the classicals &lt;code&gt;created_at&lt;/code&gt; and &lt;code&gt;updated_at&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;user_id&lt;/code&gt; is to define the relationship between a user and a link.&lt;/p&gt;

&lt;p&gt;In fact, we can resume this relation by :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a user can have 0, 1 or many links&lt;/li&gt;
&lt;li&gt;a link (unique by its &lt;code&gt;id&lt;/code&gt;) belongs to one and only one user&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why we use a one-to-many relationship.&lt;/p&gt;

&lt;p&gt;What do you thing, is something missing ? Tell me in the comment if you think I forgot something.&lt;/p&gt;

&lt;p&gt;Ok, now we have to prepare the migration for &lt;code&gt;links&lt;/code&gt; table.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:migration create_links_table
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe2824mexb8q2fr00bkt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwe2824mexb8q2fr00bkt.png" alt=" " width="800" height="70"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have to edit this migration to add fields to the table. So, let's edit the migration file&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;

&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Migrations\Migration&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Database\Schema\Blueprint&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kn"&gt;use&lt;/span&gt; &lt;span class="nc"&gt;Illuminate\Support\Facades\Schema&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Migration&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="cd"&gt;/**
     * Run the migrations.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'links'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Blueprint&lt;/span&gt; &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;id&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'url'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'description'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;nullable&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;foreignId&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;constrained&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;onDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'cascade'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="nv"&gt;$table&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;timestamps&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="cd"&gt;/**
     * Reverse the migrations.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;down&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;dropIfExists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'links'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Let's migrate
&lt;/h3&gt;

&lt;p&gt;Ok, it's time to migrate. For that, we can use (again) Artisan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remember if you make something wrong or you want to modify immediately the schema, you can rollback your migration with :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;rollback&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And if you want to see the status of your migrations, you can use :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="n"&gt;php&lt;/span&gt; &lt;span class="n"&gt;artisan&lt;/span&gt; &lt;span class="n"&gt;migrate&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look at this screenshot captured before running the last migration.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf2v2tzlf2ba3l9yba3t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxf2v2tzlf2ba3l9yba3t.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can see two things : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;first the migration for the &lt;code&gt;links&lt;/code&gt; table was not run already&lt;/li&gt;
&lt;li&gt;second the three first migrations was launched in the same sequence : the sequence number [1]&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Define model and relationship
&lt;/h3&gt;

&lt;p&gt;The next step is to define the &lt;code&gt;Link&lt;/code&gt; model and adapt &lt;code&gt;User&lt;/code&gt; model.&lt;/p&gt;

&lt;p&gt;We will use again Artisan :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:model Link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfdmp8zwp3xvv04xmebs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfdmp8zwp3xvv04xmebs.png" alt=" " width="800" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we have to tell the model that a link belongs to an user.&lt;/p&gt;

&lt;p&gt;Add this function to the model class &lt;code&gt;Link&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;belongsTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To finish with the model, we have to update the model &lt;code&gt;User&lt;/code&gt; by adding it a function &lt;code&gt;links&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;links&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;hasMany&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  We need fake datas to plays with
&lt;/h3&gt;

&lt;p&gt;After defining our database schema, let's do something very important.&lt;/p&gt;

&lt;p&gt;Create fake datas to play with. Please do not use production datas from your database during development.&lt;br&gt;
For many reasons such as ethics, confidentiality and security. We are professionals, so let's act accordingly.&lt;/p&gt;
&lt;h4&gt;
  
  
  The factories
&lt;/h4&gt;

&lt;p&gt;By default Laravel comes with &lt;code&gt;User&lt;/code&gt; factory, so we just need to create a &lt;code&gt;Link&lt;/code&gt; factory.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:factory Link
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In the generated &lt;code&gt;definition&lt;/code&gt; function we put this code :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;array&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'url'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;url&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'description'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;sentence&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'published'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;fake&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;];&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Factories use Faker to generate fake datas but very close to real datas.&lt;/p&gt;

&lt;p&gt;In this code, we generate :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an url&lt;/li&gt;
&lt;li&gt;a description based on a sentence of 5 words. In fact, as I let the second parameter of &lt;code&gt;sentence&lt;/code&gt; method by default (true), sentence will generate sentences with approximately 5 words. It could be four, five, six or even seven words.&lt;/li&gt;
&lt;li&gt;true or false for the &lt;code&gt;published&lt;/code&gt; field with a minimum true percentage of 80%&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  The seeder
&lt;/h4&gt;

&lt;p&gt;Laravel comes with &lt;code&gt;database/seeders/DatabaseSeeder.php&lt;/code&gt; &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdv63g7jmzuqb9jofvh20.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdv63g7jmzuqb9jofvh20.png" alt="Path to DatabaseSeeder.php" width="584" height="492"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We have to edit it to use our factory.&lt;/p&gt;

&lt;p&gt;Here it is the code :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="cd"&gt;/**
     * Seed the application's database.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
            &lt;span class="s1"&gt;'name'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Happytodev'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'email'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'happytodev@gmail.com'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'email_verified_at'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;now&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
            &lt;span class="s1"&gt;'password'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Hash&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Password*'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="s1"&gt;'remember_token'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Str&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;random&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="p"&gt;]);&lt;/span&gt;

        &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;each&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="nc"&gt;Link&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;factory&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nb"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;rand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
                    &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'user_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
            &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Some explanations :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First I create my own user to connect easily each time with my own email&lt;/li&gt;
&lt;li&gt;Second part does this

&lt;ul&gt;
&lt;li&gt;create 10 fake users&lt;/li&gt;
&lt;li&gt;for every user create between 2 and 10 links, during the creation we told that the &lt;code&gt;user_id&lt;/code&gt; fiels must be filled with the current created &lt;code&gt;user-&amp;gt;id&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And now, the magic could begin.&lt;/p&gt;

&lt;p&gt;Let's go back in your terminal, and launch simply this command :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan db:seed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtpnnyw793fuibqibihi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvtpnnyw793fuibqibihi.png" alt="Seeding database" width="798" height="136"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go into your DB viewer, and check the tables &lt;code&gt;users&lt;/code&gt; and &lt;code&gt;links&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You should see something like that : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;users&lt;/code&gt; table&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwcdnbm1hs3tn3x5r6qy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwcdnbm1hs3tn3x5r6qy.png" alt="Users table" width="800" height="249"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;links&lt;/code&gt; table&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagfg85t03wym6rl5w8i4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fagfg85t03wym6rl5w8i4.png" alt="Links table" width="800" height="632"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you want to check everything works fine, we can go a walk in Tinker.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan tinker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Tinker will let us to play with our datas and check the relationship is currently working.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User::find(6)-&amp;gt;links()-&amp;gt;get(['id', 'url', 'published', 'user_id']);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we ask to find every link for the user with id = 6. We ask too to get only interesting fields.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foatqw2v70x4nqhq8o16j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foatqw2v70x4nqhq8o16j.png" alt="Tinker query results" width="799" height="583"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seeing these results, we can improve immediately something.&lt;/p&gt;

&lt;p&gt;What if, we only want the published links ?&lt;/p&gt;

&lt;p&gt;So you can do it like this :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;gt; User::find(6)-&amp;gt;links()-&amp;gt;where('published', 1)-&amp;gt;get(['id', 'url', 'published', 'user_id']);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;But there is a better way to do this and don't repeat yourself later. We can use Scopes.&lt;/p&gt;

&lt;p&gt;A scope can add a bunch of query to your query. Scopes can be global or local. I let you consult &lt;a href="https://laravel.com/docs/11.x/eloquent#query-scopes" rel="noopener noreferrer"&gt;the documentation&lt;/a&gt; to see more.&lt;/p&gt;

&lt;p&gt;Here we will use a local scope.&lt;/p&gt;

&lt;p&gt;Go to your &lt;code&gt;link&lt;/code&gt; model and add this function :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;    &lt;span class="cd"&gt;/**
     * Scope a query to only include published links.
     */&lt;/span&gt;
    &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="n"&gt;scopePublished&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;Builder&lt;/span&gt; &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nv"&gt;$query&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;where&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'published'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, if in Tinker we use the following query :&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;User::find&lt;span class="o"&gt;(&lt;/span&gt;6&lt;span class="o"&gt;)&lt;/span&gt;-&amp;gt;links&lt;span class="o"&gt;()&lt;/span&gt;-&amp;gt;published&lt;span class="o"&gt;()&lt;/span&gt;-&amp;gt;get&lt;span class="o"&gt;([&lt;/span&gt;&lt;span class="s1"&gt;'id'&lt;/span&gt;, &lt;span class="s1"&gt;'url'&lt;/span&gt;, &lt;span class="s1"&gt;'published'&lt;/span&gt;, &lt;span class="s1"&gt;'user_id'&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;we will obtain only the published links from user with id = 6.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc2gxinb0av40mmo3fpoe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc2gxinb0av40mmo3fpoe.png" alt="Tinker query using scope" width="800" height="521"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And voilà, we can cross this point in our list :&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ an user can signin, login, logout and manage his account&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a user can see a list of their links&lt;/li&gt;
&lt;li&gt;an user can add, edit or delete a link&lt;/li&gt;
&lt;li&gt;an user can have a shareable link to share his links with the world&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;✅ a link has a name, a status (published or not) and obviously a link. May be we will add some options later.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Well, we'll stop here for today.&lt;/p&gt;

&lt;p&gt;In this longer chapter, we saw introduction to : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;how to add functionnality to login page in Filament&lt;/li&gt;
&lt;li&gt;models&lt;/li&gt;
&lt;li&gt;factory&lt;/li&gt;
&lt;li&gt;seeder&lt;/li&gt;
&lt;li&gt;Tinker&lt;/li&gt;
&lt;li&gt;scopes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;As usual, I wait for your comments below.&lt;/p&gt;

&lt;p&gt;See you.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>filament</category>
      <category>php</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Linkeeper - Lesson 01 - Installation</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Wed, 10 Apr 2024 15:00:00 +0000</pubDate>
      <link>https://dev.to/happytodev/linkeeper-a-linktree-alternative-with-laravel-and-filament-lesson-01-installation-3na3</link>
      <guid>https://dev.to/happytodev/linkeeper-a-linktree-alternative-with-laravel-and-filament-lesson-01-installation-3na3</guid>
      <description>&lt;p&gt;In this little serie, we will learn the basics about Laravel through a little application &lt;strong&gt;LinKeeper&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It goal is to keep your links and share them to the world.&lt;/p&gt;

&lt;p&gt;So, what we need ?&lt;/p&gt;

&lt;p&gt;We have to bring solutions to these definitions : &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an user can signin, login, logout and manage his account&lt;/li&gt;
&lt;li&gt;a user can see a list of their links&lt;/li&gt;
&lt;li&gt;an user can add, edit or delete a link&lt;/li&gt;
&lt;li&gt;an user can have a shareable link to share his links with the world&lt;/li&gt;
&lt;li&gt;a link has a name, a status (published or not) and obviously a link. May be we will add some options later.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The purpose here is to discover the basic concepts of Laravel and FilamentPHP. &lt;/p&gt;

&lt;p&gt;In this serie, I will use Laravel 11 and FilamentPHP 3.&lt;/p&gt;

&lt;p&gt;Let's go and beginning with the very basic : the install&lt;/p&gt;



&lt;ul&gt;
&lt;li&gt;
Installing Laravel

&lt;ul&gt;
&lt;li&gt;Launch install with Laravel Installer&lt;/li&gt;
&lt;li&gt;Laravel is installed 🎉&lt;/li&gt;
&lt;li&gt;Check the install&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
FilamentPHP install

&lt;ul&gt;
&lt;li&gt;Create a first user&lt;/li&gt;
&lt;li&gt;Check the install&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Change the name of application&lt;/li&gt;
&lt;/ul&gt;



&lt;h2&gt;
  
  
  Installing Laravel
&lt;/h2&gt;

&lt;p&gt;As every Laravel project, we have to launch the laravel install.&lt;/p&gt;

&lt;p&gt;If you have the laravel installer it's as easy as type &lt;code&gt;laravel new linkeeper&lt;/code&gt; in your favorite terminal.&lt;/p&gt;

&lt;p&gt;If you prefer &lt;strong&gt;composer&lt;/strong&gt;, just use this command instead &lt;code&gt;composer create-project laravel/laravel linkeeper&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Follow theses steps, which consisting to keep default choices and click enter three times 😉.&lt;/p&gt;

&lt;h3&gt;
  
  
  Launch install with Laravel Installer
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0wdg2axdm0ap58rswe1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd0wdg2axdm0ap58rswe1.png" alt=" " width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh60of4shtatfn6h0aujf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fh60of4shtatfn6h0aujf.png" alt=" " width="800" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3igfo4q2x30ux4lf6fgu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3igfo4q2x30ux4lf6fgu.png" alt=" " width="799" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Laravel is installed 🎉
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg93yt41em82iuzjl1izq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg93yt41em82iuzjl1izq.png" alt=" " width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As we have choose sqlite as database there is no more configuration needed, except &lt;code&gt;APP_NAME&lt;/code&gt;, &lt;code&gt;APP_TIMEZONE&lt;/code&gt; if you want.&lt;/p&gt;

&lt;p&gt;For more simplicity, I let the language setting with default value. Feel free to change it if you need.&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the install
&lt;/h3&gt;

&lt;p&gt;Personnaly, I work on Mac with Herd. I can check &lt;a href="http://linkeeper.test" rel="noopener noreferrer"&gt;http://linkeeper.test&lt;/a&gt; on my browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy24tx1r07a3l0a9jrpt6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy24tx1r07a3l0a9jrpt6.png" alt=" " width="800" height="566"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Everything seems ok !&lt;/p&gt;

&lt;p&gt;If you need to work with &lt;code&gt;https&lt;/code&gt;, it's perfectly possible with Herd in a single click.&lt;/p&gt;

&lt;p&gt;Go to Herd settings, choose 'Sites' tab and search for your current url. Here : &lt;code&gt;linkeeper.test&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Look for the lock and click on it to activate https.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpljg79uxsrb2dsrrogw2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpljg79uxsrb2dsrrogw2.png" alt=" " width="799" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43h6inu9d35bkg0zf3eo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F43h6inu9d35bkg0zf3eo.png" alt=" " width="799" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Easy, peasy ! No ?&lt;/p&gt;

&lt;h2&gt;
  
  
  FilamentPHP install
&lt;/h2&gt;

&lt;p&gt;Now, we have to install FilamentPHP. Sincerely, you don't need me for these steps, you just have to look at the incredible documentation of Laravel and Filament.&lt;/p&gt;

&lt;p&gt;But, if you are already here, let's keep forwarding together 🤣&lt;/p&gt;

&lt;p&gt;So, just copy / paste the 'Get Started' tutorial :&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 filament/filament:&lt;span class="s2"&gt;"^3.2"&lt;/span&gt; &lt;span class="nt"&gt;-W&lt;/span&gt;

php artisan filament:install &lt;span class="nt"&gt;--panels&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let the default choice when Filament ask for id : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhril0xcfyidi8cv4mto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhril0xcfyidi8cv4mto.png" alt=" " width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And voilà! Filament is installed.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a first user
&lt;/h3&gt;

&lt;p&gt;We need an user to start play with Filament.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan make:filament-user
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here too, answer questions for your name, email and password.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdh4lt53gw9ofkfks4fly.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdh4lt53gw9ofkfks4fly.png" alt=" " width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Check the install
&lt;/h3&gt;

&lt;p&gt;Let's go to the link provided to ensure that everything is ok.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg016xqdeekj4ftm047s0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg016xqdeekj4ftm047s0.png" alt=" " width="800" height="708"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enter your credentials and if everything is ok, you will see something like that : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5je5w47q1pz7k283mjwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5je5w47q1pz7k283mjwg.png" alt=" " width="799" height="249"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Change the name of application
&lt;/h2&gt;

&lt;p&gt;As you can see in the top left corner the name of the app is "Laravel", let's change this for "LinKeeper".&lt;/p&gt;

&lt;p&gt;Open your project in your favorite IDE or if you prefer for this minor change, type &lt;code&gt;nano .env&lt;/code&gt;in your terminal.&lt;/p&gt;

&lt;p&gt;You just have to change the &lt;code&gt;APP_NAME&lt;/code&gt; key : &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvas4lbahg6qgmun6nbr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbvas4lbahg6qgmun6nbr.png" alt=" " width="752" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your name has spaces, you have to use the quote for your name.&lt;/p&gt;

&lt;p&gt;ctrl + x to exit, say 'yes' when nano asked you if you want to save your file and confirm the name of the file (.env) by pressing return key.&lt;/p&gt;

&lt;p&gt;Your &lt;code&gt;.env&lt;/code&gt; file is now saved, you can reload your page and you will see the name of the app changed in the top left corner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faitesaoxaatn0qu60sm8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faitesaoxaatn0qu60sm8.png" alt=" " width="798" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This is the end of this first part. In the next episode, we'll see how to start playing with Filament and models.&lt;/p&gt;

&lt;p&gt;Don't hesitate to comment if you have question or if you see a mistake.&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>filament</category>
      <category>php</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Quoi de neuf les devs ? #80 avec l'interview de Gabin Aurèche</title>
      <dc:creator>HappyToDev</dc:creator>
      <pubDate>Tue, 09 Apr 2024 10:05:06 +0000</pubDate>
      <link>https://dev.to/happytodev/quoi-de-neuf-les-devs-80-avec-linterview-de-gabin-aureche-2oih</link>
      <guid>https://dev.to/happytodev/quoi-de-neuf-les-devs-80-avec-linterview-de-gabin-aureche-2oih</guid>
      <description>&lt;p&gt;Hello à toutes et à tous 😉,&lt;/p&gt;

&lt;p&gt;J'ai le plaisir de vous partager le nouveau numéro de "Quoi de neuf les devs ?" sorti samedi dernier.&lt;/p&gt;

&lt;p&gt;J'y recevais &lt;a class="mentioned-user" href="https://dev.to/gabinaureche"&gt;@gabinaureche&lt;/a&gt;, il est dev et donne également très régulièrement des conseils sur les structures d’entreprise, sur l’argent en entreprise. &lt;/p&gt;

&lt;p&gt;Comme chaque semaine, vous retrouverez les autres rubriques avec toujours le plein d’actualité sur le monde du dev.&lt;/p&gt;

&lt;p&gt;Cette semaine, parmi tous les sujets abordés, on parlera entre autres de&lt;br&gt;
✅ Go, &lt;br&gt;
✅ QR Code,&lt;br&gt;
✅ Redis, &lt;br&gt;
✅ Side project, &lt;br&gt;
✅ Email, &lt;br&gt;
✅ FFmpeg,&lt;br&gt;
✅ et bien d’autres sujets encore&lt;/p&gt;

&lt;p&gt;Bonne lecture!&lt;/p&gt;

&lt;p&gt;Si le contenu vous plait et que vous souhaitez me soutenir, abonnez vous et rejoignez plus de 1700 pros de l'IT d'ores et déjà abonné.e.s.&lt;/p&gt;

&lt;p&gt;PS : Quel.le dev souhaiteriez vous voir interviewé.e dans un prochain numéro ?&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>newsletter</category>
      <category>interview</category>
    </item>
  </channel>
</rss>
