Bonjour, je suis

Nicolas Rodriguez

Développeur PHP/Symfony

À propos de moi

Développeur PHP / Symfony autodidacte, je conçois des applications web métier sur mesure : back-offices, outils de gestion, e-commerce, formulaires métier et intégrations d'API.

J'ai commencé à coder par curiosité en 2020, puis je me suis formé sérieusement à partir de 2023. Aujourd'hui, je développe des projets complets en Symfony et j'élargis mon champ d'action vers l'automatisation avec n8n et l'intégration d'IA pour répondre à des problématiques métier complexes. Celles où un workflow intelligent fait gagner des heures, voire transforme un processus entier.

Je travaille en tant qu'entreprise individuelle sur des projets variés, et je suis également ouvert aux opportunités en CDI au sein d'une équipe partageant ce goût pour les solutions concrètes et bien construites.

Curieux, rigoureux et persévérant, j'aime comprendre ce que je fais, améliorer mes pratiques et construire des solutions simples pour des besoins réels.

Contactez-moi

Mes Compétences

Front-end
HTML CSS JavaScript Boostrap TWIG Tailwind Chart.js
Back-end
PHP Symfony MySQL Doctrine
Outils
Git GitHub Docker Claude Composer Gitlab VPS linux

Mes Projets

Résidence Itylon — Site vitrine et outils de gestion

Résidence Itylon — Site vitrine et outils de gestion

Application web pour la Résidence Itylon, composée d’un site vitrine destiné aux visiteurs et d’un back-office sécurisé pour l’équipe. Le site présente les maisons, les activités, les tarifs et les services de la résidence. L’administration permet aussi de gérer les contenus, le planning des réservations et le service de commande de petits-déjeuners. Fonctionnalités Côté public Pages de présentation de la résidence, des maisons, des activités et des services Pages de tarifs, de contact, de mentions légales et de politique de confidentialité Liste et pages de détail pour les maisons et les activités Mise en avant des maisons et activités sélectionnées dans l’administration Sitemap XML pour le référencement des pages publiques Cache HTTP public sur les pages vitrines Contact Formulaire de contact avec validation côté serveur Vérification anti-robot reCAPTCHA v3 Limitation du nombre de tentatives Envoi des messages par email avec Symfony Mailer Commande de petit-déjeuner Formulaire de commande avec choix des produits, quantités et maison Calcul du montant de la commande à partir du catalogue Paiement par Stripe Payment Element Création de la commande après confirmation du paiement Confirmation du paiement également traitée par webhook Stripe Reçu PDF téléchargeable Calcul automatique de la date de livraison au lendemain Horaires configurables, fermeture du service et gestion des jours fériés Administration Accès au back-office protégé par authentification et rôle ROLE_ADMIN Modification des informations de la résidence et du contenu de la page contact Gestion des maisons, activités, services et tarifs Gestion des photos : import, suppression, réorganisation et choix de photos principales Téléversement d’images avec contrôle du type et de la taille des fichiers Gestion du catalogue de petits-déjeuners, des prix et de la disponibilité des produits Gestion des commandes : commandes payées en ligne ou en espèces, édition et annulation Configuration des horaires de commande et de livraison, des jours spéciaux et de l’adresse destinataire des emails Planning des réservations Vue mensuelle des réservations organisées par maison Création, modification et suppression de réservations depuis le back-office Déplacement et redimensionnement des réservations dans le planning Vérification des conflits de dates lors des changements Documents et statistiques Génération PDF des reçus, bons de commande fournisseur et fiches de préparation Agrégation des quantités à commander par produit Envoi manuel ou planifié des documents par email Envoi automatique déclenché par Symfony Scheduler, traité par un worker Messenger Statistiques mensuelles et annuelles : chiffre d’affaires, coûts, marge et nombre de commandes Génération et téléchargement d’un QR code pour accéder au service de commande Sécurité et automatisation Protection du back-office par Symfony Security et le rôle ROLE_ADMIN Vérification serveur des paiements et validation des webhooks Stripe Protection des formulaires et actions d’administration par CSRF Vérification reCAPTCHA et rate limiting sur le formulaire de contact Pipeline CI/CD GitHub Actions avec analyse statique, tests et déploiement après validation

AgentWatch — veille RSS analysée et notée par IA

AgentWatch — veille RSS analysée et notée par IA

Application de veille qui collecte des articles depuis des flux RSS et utilise une chaîne d'analyse IA pour en faciliter la lecture. AgentWatch centralise les sources, les résumés, les tags et plusieurs scores afin d'aider à repérer les articles utiles pour apprendre, créer du contenu ou identifier des opportunités professionnelles. Présentation Ce projet permet de : Gérer ses sources de veille dans une interface unique Collecter les nouveaux articles avec des workflows n8n Obtenir des titres reformulés ou traduits et des résumés en français Classer les articles avec un vocabulaire de tags maîtrisé Consulter plusieurs critères de valeur et ajuster les notes manuellement Modifier les consignes d'analyse depuis l'application Fonctionnalités Sources et collecte Création, édition, activation et désactivation des sources RSS Configuration de la priorité et des tags d'une source Collecte périodique avec un workflow n8n Normalisation des éléments reçus et filtrage temporel des nouvelles publications Détection des doublons à partir des URL et des empreintes des articles API interne pour échanger les sources, les éléments à traiter et les analyses Analyse et classification Pipeline d'analyse en plusieurs étapes avec un modèle Ollama Génération d'un titre en français et d'un résumé de lecture Attribution de tags issus du vocabulaire de l'application Notes de pertinence, potentiel professionnel, apprentissage et potentiel de contenu Calcul d'une note finale et conservation d'une justification Enregistrement du modèle ayant produit l'analyse Administration des prompts utilisés par les traitements Consultation et ajustements Tableau de bord affichant les dix articles analysés les plus récents Page détaillée avec lien vers la publication d'origine Lecture du résumé, de la justification et des tags Modification manuelle des scores par curseurs Réinitialisation des notes ajustées vers les valeurs de l'analyse Gestion centralisée des tags et de leur réutilisation Sécurité et contrôle Échanges des endpoints internes protégés par l'en-tête X-Internal-Token Validation des données reçues par les endpoints de collecte et d'analyse Séparation des résultats IA et des corrections manuelles de l'utilisateur Analyse locale possible via Ollama Périmètre Le projet couvre la collecte, l'analyse et la consultation de la veille. La sélection quotidienne entièrement automatisée et l'apprentissage des préférences à partir des retours utilisateur constituent des évolutions distinctes du pipeline présent.

Gestion Trièves Connect

Gestion Trièves Connect

Application Symfony 7.1 de gestion d'inventaire et d'étiquetage pour la boutique Trièves Connect, avec lecture de codes-barres, génération d'étiquettes imprimables et export Excel. Présentation Ce projet permet de : Scanner les codes-barres des produits via une douchette pour enregistrer prix et quantité. Générer et imprimer des étiquettes produits. Réaliser un inventaire par scan des articles en stock. Exporter le catalogue complet au format Excel. Fonctionnalités Étiquetage Scan de codes-barres via douchette pour alimenter la liste d'étiquetage. Génération et impression des étiquettes produits. Inventaire Scan des produits enregistrés pour saisir les quantités en stock. Produits & Services Ajout, édition et listing des produits et services. Gestion des catégories de produits. Export du catalogue complet au format Excel. Clients & Crédits d'impression Gestion des clients : ajout, édition, suppression. Suivi du solde de crédits d'impression par client. Ajout ou débit de crédits depuis la fiche client. Impression d'une carte de crédits d'impression au format étiquette. Décompte automatique des crédits lors d'une impression. Authentification Accès sécurisé via Symfony Security. Sauvegarde temporaire en session des listes d'étiquetage et d'inventaire (effacées à la fermeture du navigateur).

Frictio Audit — de l’entretien client au devis d’automatisation

Frictio Audit — de l’entretien client au devis d’automatisation

Application métier locale pour préparer des audits, exploiter les entretiens et construire des propositions d'automatisation. Frictio Audit accompagne le passage des besoins exprimés par une petite entreprise à un plan d'action documenté, chiffré et exportable. Présentation Ce projet permet de : Centraliser les entreprises, leurs contacts et leurs audits Préparer un entretien avec un guide structuré et imprimable Transcrire un enregistrement et relier les constats à leurs sources Construire une analyse de processus assistée par IA Chiffrer des solutions à partir de briques d'automatisation réutilisables Produire des devis Word et sauvegarder les données de travail Fonctionnalités Clients et préparation des audits Recherche d'entreprises via l'API publique Recherche d'entreprises Préremplissage des informations légales et modification manuelle Gestion des contacts, notes, liens, secteurs et statuts Recherche et filtres dans la liste des clients Création d'audits rattachés à une entreprise Guides d'entretien versionnés, conservés sous forme d'instantané pour chaque audit Vue A4 imprimable avec déroulé, questions et clôture de l'entretien Audio, transcription et analyse Import d'un enregistrement avec recueil de l'accord nécessaire Validation du format et de la taille du fichier, jusqu'à 500 Mo Transcription asynchrone avec un service Whisper local Lecture de l'audio et navigation vers les passages horodatés Correction manuelle de la transcription Extraction assistée d'un service blueprint à partir de l'entretien Rattachement des éléments analysés aux passages justificatifs Modification manuelle des résultats et conservation de versions Fournisseur distant de transcription configurable en complément du traitement local Chiffrage et propositions Catalogue de briques d'automatisation réutilisables Paramétrage du temps de développement et des coûts récurrents Calculs de marge et de seuil de rentabilité Trois modèles de proposition : réalisation sur mesure, abonnement et abonnement mutualisé Configuration de l'entreprise émettrice, du taux horaire, de la TVA et des conditions Gestion des devis avec numérotation et états Export Word éditable pour finaliser la proposition commerciale Sauvegardes Export ZIP de la base SQLite et des enregistrements associés Restauration avec sauvegarde préalable des données en place Confidentialité Transcription et analyse exécutables localement avec Whisper et Ollama Absence de transmission à un fournisseur externe lorsque les services locaux sont sélectionnés Application conçue pour un usage local ; l'accès réseau doit être contrôlé par l'environnement d'hébergement

Mykanban

Mykanban

Application kanban, pensée pour un usage individuel quotidien. Un seul board, colonnes configurables, tâches avec tags / importance / urgence automatique, drag & drop, et synchronisation persistante en base de données. Stack technique Backend : PHP 8.2+, Symfony 7.4, Doctrine ORM 3 API : API Platform 4 (JSON-LD / OpenAPI) exposée sous /api/v1 Base de données : MySQL 8.x (installation locale / VPS — pas de Docker) Frontend : Twig, AssetMapper + Importmap, Stimulus, Symfony UX Turbo, Tailwind CSS (via symfonycasts/tailwind-bundle, sans Node.js) Auth : Symfony Security (form_login + remember_me 15j, CSRF) + JWT pour l'API Tests : PHPUnit 13 Qualité : GrumPHP + PHP Parallel Lint Fonctionnalités Board & tâches 1 seul board, colonnes configurables (statuts personnalisables, réordonnables) Tâches avec tags obligatoires (multi-sélection, filtre AND), importance (1–5), urgence automatique selon le temps écoulé jusqu'à la deadline Définition de la deadline : durée (1–9) + unité (jour/mois) ou date/heure directe Tri : manuel (drag & drop) ou automatique (smart, urgence auto, importance, deadline) Drag & drop desktop sur le board ; sur mobile (< lg ou tactile < 1280px), boutons ← / → sur les cartes pour changer de colonne Sur mobile : une seule colonne affichée à la fois, navigation par swipe horizontal Cartes teintées par un dégradé basé sur la couleur de leur premier tag Badge Urgent affiché uniquement quand l'urgence automatique atteint 4 ou 5

WatchLess — analyse de vidéos YouTube et synthèse par sujet

WatchLess — analyse de vidéos YouTube et synthèse par sujet

Application Symfony qui transforme des vidéos YouTube en comptes rendus structurés et en synthèses thématiques. WatchLess récupère les transcriptions, analyse les contenus avec un modèle de langage et rassemble plusieurs vidéos autour d'un objectif de veille, d'apprentissage ou de décision. Présentation Ce projet permet de : Construire une bibliothèque de vidéos et de sujets Lire une analyse structurée avant de consacrer du temps à une vidéo complète Comparer plusieurs sources dans une synthèse transversale Adapter les comptes rendus à l'objectif poursuivi Réutiliser les connaissances sous forme de contenus éditoriaux Exécuter la chaîne de transcription et d'analyse avec des outils locaux Fonctionnalités Bibliothèque et organisation Ajout de vidéos à partir de liens YouTube classiques, courts ou Shorts Normalisation des URL et détection des doublons par identifiant vidéo Affichage du titre, de la miniature et de l'état du traitement Recherche dans la bibliothèque et pagination Création de sujets regroupant plusieurs vidéos Association d'une même vidéo à plusieurs sujets Objectifs dédiés : général, veille, apprentissage, projet, décision, comparaison ou inspiration Transcription et analyse Récupération des sous-titres disponibles, avec priorité aux pistes manuelles Repli sur la transcription Whisper lorsque les sous-titres sont absents Conservation de la transcription avant l'appel au modèle de langage Traitement des longues transcriptions par découpage et synthèse hiérarchique Génération d'un compte rendu en Markdown Exécution asynchrone et actualisation de l'état dans l'interface Affichage des erreurs par étape et possibilité de relancer un traitement Conservation du compte rendu précédent si une nouvelle génération échoue Synthèse et réutilisation Synthèse croisée dès que plusieurs vidéos du sujet sont analysées Analyse des transcriptions sources pour dégager convergences, nuances et pistes d'action Références aux vidéos dans le texte de synthèse Signalement des résultats à actualiser après un changement d'objectif Génération séparée de formats éditoriaux : publication, newsletter, article de blog ou résumé court Conservation de versions pour les productions éditoriales Sécurité et confidentialité Validation des liens YouTube et protection CSRF des actions Rendu Markdown avec filtrage du HTML et des liens dangereux Traitement local possible avec Whisper et Ollama Fournisseur distant compatible OpenAI configurable : les textes nécessaires à l'analyse lui sont alors transmis Application personnelle sans authentification intégrée : le contrôle d'accès à une exposition distante relève de son hébergement

Michel — assistant vocal spécialisés pour OpenClaw

Michel — assistant vocal spécialisés pour OpenClaw

Interface vocale et visuelle pour piloter plusieurs agents OpenClaw depuis un poste local. Développé dans la continuité du projet Jarvis, Michel combine transcription locale, synthèse vocale, sessions d'agents séparées et contrôle des actions sensibles. Le projet est une adaptation du dépôt open source openclaw-vocal-assistants. Présentation Ce projet permet de : Échanger avec les agents à la voix ou au clavier Choisir un assistant spécialisé selon la tâche Consulter les réponses détaillées tout en recevant une réponse vocale concise Suivre les outils utilisés, le modèle actif et l'avancement des tâches Garder la reconnaissance et la synthèse vocales sur le poste local Demander une validation humaine avant certaines actions externes Fonctionnalités Interaction vocale et interface Interface française avec visualisation animée de l'activité vocale Mode push-to-talk et mode mains libres activable Détection de parole et reconnaissance du nom de l'assistant Fenêtre de suivi permettant de poursuivre une conversation après l'activation Arrêt de la lecture vocale par commande et annulation distincte d'une tâche Saisie au clavier en complément de la voix Transcription qui conserve les nombres et lecture vocale adaptée Personnalisation des avatars et des voix Équipe d'agents Michel pour la coordination générale Michel Écrit pour la rédaction, les emails et l'agenda Michel Compile pour les tâches techniques et les dépôts Michel Explore pour la recherche et la veille Michel Organise pour les plans et l'organisation Michel Vérifie pour les contrôles et les tests Michel Construit pour la réalisation de code Sessions séparées et suivi de plusieurs tâches en parallèle Historique de conversation par agent et par journée Réponse vocale brève accompagnée d'un contenu détaillé dans l'interface Pilotage et suivi Connexion au gateway OpenClaw par WebSocket Affichage des traces d'outils, durées, délégations et modèle utilisé Signalement des limites, erreurs de quota ou changements de fournisseur Accès à des fenêtres de navigation lorsque la tâche le demande Gestion de notes, rappels et minuteurs dans les outils de l'assistant Scénarios d'évaluation et propositions d'amélioration soumises à validation Contrôle et confidentialité Reconnaissance vocale locale avec Whisper.cpp Synthèse vocale locale avec Supertonic ou Piper Actions externes soumises aux règles d'autorisation configurées dans OpenClaw Validation humaine des changements de règles ou de mémoire concernés Services vocaux locaux et séparation des sessions d'agents Modèles de raisonnement configurables via OpenAI, Anthropic ou Ollama : l'exécution locale de l'audio ne signifie pas que tous les échanges avec les modèles restent sur le poste

Kdos-Graphie

Kdos-Graphie

Boutique e-commerce Symfony 8 dédiée aux créations graphiques personnalisées, avec une vitrine publique, un panier, un tunnel de commande, et une interface d'administration complète pour gérer le catalogue et les commandes. Présentation Ce projet permet de : Afficher un catalogue de produits organisés par catégories avec images. Gérer un panier d'achat en session avec gestion des personnalisations. Traiter les commandes via un formulaire de commande avec emails transactionnels. Envoyer les messages du formulaire de contact via Symfony Mailer, protégé par reCAPTCHA v3. Gérer les comptes utilisateurs : inscription, connexion, récupération de mot de passe. Piloter tout le contenu depuis un back-office admin sécurisé. Fonctionnalités Côté boutique Page d'accueil avec mise en avant des produits. Catalogue produits filtré par catégorie. Panier d'achat en session avec fichiers de personnalisation. Tunnel de commande : formulaire client, récapitulatif, email de confirmation. Formulaire de contact avec envoi d'email et protection reCAPTCHA v3. Inscription, connexion et récupération de mot de passe par email. Côté administration Authentification admin : /admin/login. Tableau de bord admin. CRUD produits : création, édition, suppression, upload d'images. CRUD catégories : création, édition, suppression, réordonnancement. Gestion des commandes : suivi du statut, envoi de rappel de paiement, lien de paiement, archivage. Notification admin asynchrone à la réception d'une commande payée. Paramètres du site (SiteSetting). Commande console pour initialiser le compte administrateur. Sécurité Accès /admin réservé au rôle ROLE_ADMIN. Protection CSRF sur les actions sensibles. reCAPTCHA v3 sur le formulaire de contact. Authentification Symfony Security. Récupération de mot de passe via token signé (symfonycasts/reset-password-bundle).

StoryMaker

StoryMaker

Application Symfony 7.2 de génération d'histoires personnalisées pour enfants. L'utilisateur remplit un formulaire (âge, prénom, contexte, longueur, style de narration, langue) ; StoryMaker génère le texte puis la version audio via OpenAI, et expose un téléchargement ZIP regroupant les deux fichiers. Présentation Ce projet permet de : Saisir les paramètres d'une histoire via un formulaire (âge, prénom, contexte, longueur, style, langue). Générer une histoire en texte via OpenAI (modèle gpt-4-turbo par défaut). Générer la version audio TTS via OpenAI (modèle tts-1 par défaut). Exécuter ces appels en arrière-plan via Symfony Messenger pour ne pas bloquer le navigateur. Suivre le statut de génération sans recharger la page (Turbo + endpoint dédié). Télécharger l'histoire finalisée (texte + audio) sous forme de ZIP. Nettoyer automatiquement les anciennes histoires et fichiers audio générés. Fonctionnalités Côté utilisateur Page d'accueil unique avec le formulaire de génération d'histoire. Validation des paramètres (âge positif ≤ 18, longueur du nom, contexte, choix de style, langue). Soumission qui place un StoryMessage en file Messenger. Mise à jour automatique de l'UI quand l'histoire passe à isDone = true. Téléchargement de l'histoire complète au format ZIP : story.txt + audio.mp3. Support multilingue : français et anglais. Trois styles de narration : journal intime, troisième personne, lettre. Trois longueurs : courte, moyenne, longue. Côté technique Flux principal : Controller → Service → Repository/Entity. Pipeline de génération asynchrone : StoryMessage dispatché par HomeController. StoryMessageHandler orchestre TextGenerationService puis AudioGenerationService. Statut de la Story mis à jour à chaque étape (status, isDone). ApiCallLock + ApiCallLockRepository : verrou applicatif pour limiter les appels concurrents à OpenAI. StoryCleanupService : nettoyage périodique des anciennes histoires et fichiers audio. ZipService : assemblage texte + audio pour le téléchargement. Sécurité Pas d'authentification utilisateur active à ce stade (symfony/security-bundle installé mais non utilisé). La clé API OpenAI doit rester dans .env.local, jamais commitée. Les fichiers audio générés (public/var/audio/) sont publics : penser à la confidentialité si le projet est exposé publiquement.

On en discute autour d'un Café ?

Contact

Stack technique