[{"data":1,"prerenderedAt":625},["ShallowReactive",2],{"projects":3},[4,48,92,138,172,204,250,332,359,392,438,503,549,590],{"id":5,"title":6,"body":7,"description":11,"extension":14,"heroImages":15,"highlights":19,"meta":29,"navigation":30,"overview":31,"path":32,"role":33,"seo":34,"stack":35,"stem":43,"tagline":44,"type":45,"year":46,"__hash__":47},"projects\u002Fprojects\u002Ff1-onboard-analyzer.md","F1 Onboard Video Analyzer",{"type":8,"value":9,"toc":10},"minimark",[],{"title":11,"searchDepth":12,"depth":12,"links":13},"",2,[],"md",[16,17,18],"\u002Fresources\u002Fimg\u002Ff1-analyzer\u002Fdashboard.png","\u002Fresources\u002Fimg\u002Ff1-analyzer\u002Fdetection.png","\u002Fresources\u002Fimg\u002Ff1-analyzer\u002Ftimeline.png",[20,23,26],{"title":21,"description":22},"Multi-Modal Analysis","Combined visual, audio, and telemetry analysis achieving 94% accuracy in event detection across diverse racing conditions.",{"title":24,"description":25},"Real-time Processing","Optimized pipeline processing 1080p video at 2x real-time speed using GPU acceleration and efficient frame sampling strategies.",{"title":27,"description":28},"Comprehensive Event Detection","Identifies 15+ event types including yellow\u002Fred flags, pitstops, overtakes, DRS zones, and safety car deployments with precise timestamps.",{},true,"Developed an AI system that automatically analyzes Formula 1 onboard videos to detect and timestamp events like pitstops, flags, overtakes, and incidents using computer vision and deep learning.","\u002Fprojects\u002Ff1-onboard-analyzer","ML Engineer & Data Scientist",{"title":6,"description":11},[36,37,38,39,40,41,42],"Python","TensorFlow","OpenCV","YOLO","FFmpeg","FastAPI","PostgreSQL","projects\u002Ff1-onboard-analyzer","AI-powered analysis of F1 onboard footage to detect and timestamp key racing events.","Personal",2025,"X6n6m2O_J9Eskiiab1LZBjSsFj4rSFqwPlBz_4WN_xM",{"id":49,"title":50,"body":51,"description":56,"extension":14,"heroImages":65,"highlights":68,"meta":78,"navigation":30,"overview":79,"path":80,"role":81,"seo":82,"stack":83,"stem":88,"tagline":89,"type":45,"year":90,"__hash__":91},"projects\u002Fprojects\u002Fgame-of-life.md","Conway's Game of Life Simulator",{"type":8,"value":52,"toc":63},[53,57,60],[54,55,56],"p",{},"A Game of Life I made with JavaFX. You get a grid of cells and some buttons: Play (it becomes Pause), Increment to do one generation, Clear, and Randomize to fill the board with random cells. A speed choice (Slow, Medium, Fast) changes the time between two generations, and a counter shows the generation number.",[54,58,59],{},"The rules are the 4 classic ones. A live cell with fewer than 2 or more than 3 neighbors dies, a live cell with 2 or 3 neighbors stays alive, and a dead cell with exactly 3 neighbors becomes alive. The edges of the board are walls, there is no wrapping. Each cell has an age, and the color changes when a cell survives more than one generation, so you can see what is new and what is stable.",[54,61,62],{},"I wrote unit tests with JUnit for the board, the cells, the directions and the states. There is also an INFECTED state in the code, with its own color, but I didn't do the logic for it yet.",{"title":11,"searchDepth":12,"depth":12,"links":64},[],[66,67],"\u002Fresources\u002Fimg\u002Fgame-of-life\u002Fsimulation.png","\u002Fresources\u002Fimg\u002Fgame-of-life\u002Fevolution.png",[69,72,75],{"title":70,"description":71},"Age of the cells","The color of a live cell changes when it survives more than one generation.",{"title":73,"description":74},"Unit tests","The board, the cells, the directions and the states are tested with JUnit.",{"title":76,"description":77},"Infection","There is an INFECTED state in the code with its own color, but the logic is still a TODO.",{},"A Game of Life with a JavaFX interface: a grid of cells, play and pause, step by step, random start and three speeds.","\u002Fprojects\u002Fgame-of-life","Developer",{"title":50,"description":56},[84,85,86,87],"Java","JavaFX","Maven","JUnit","projects\u002Fgame-of-life","Conway's Game of Life made with JavaFX.",2024,"c8kuPEBMITXDAwF241VjwqAGNRzvN-JbG2OihtRckN4",{"id":93,"title":94,"body":95,"description":99,"extension":14,"heroImages":111,"highlights":114,"meta":124,"navigation":30,"overview":125,"path":126,"role":127,"seo":128,"stack":129,"stem":134,"tagline":135,"type":136,"year":46,"__hash__":137},"projects\u002Fprojects\u002Fgraph-visualizer.md","Interactive Graph Visualization",{"type":8,"value":96,"toc":109},[97,100,103,106],[54,98,99],{},"I worked on this project with another student during my studies at the IUT de Bordeaux. We started from code provided for the course, including a Java Swing interface, and worked on the graph structures and the algorithms behind the drawing.",[54,101,102],{},"We used two ways to store a graph: adjacency lists and an adjacency matrix. Both have the same interface, so the rest of the program can use either one. This made the difference between the two more concrete for me, because the same operation does not involve the same work depending on how the graph is stored.",[54,104,105],{},"For the drawing, I worked on an algorithm based on forces. The idea is to treat the links like springs: connected nodes attract each other, while the nodes push each other apart. A small force pulls them towards the centre, and their movements get smaller over the iterations. We also added automatic sizing, so each node grows according to the space around it.",[54,107,108],{},"For me, this project was about connecting the data structures we saw in class to something visible. A graph is easier to understand when you can see how its nodes and links fit together.",{"title":11,"searchDepth":12,"depth":12,"links":110},[],[112,113],"\u002Fresources\u002Fimg\u002Fgraph\u002Fc-graph.png","\u002Fresources\u002Fimg\u002Fgraph\u002Fgraph.png",[115,118,121],{"title":116,"description":117},"Graph structures","Two ways to store the same graph: adjacency lists and an adjacency matrix using BitSet.",{"title":119,"description":120},"Node placement","Connected nodes attract each other, while the nodes push each other apart to spread out the drawing.",{"title":122,"description":123},"Node size","The size of each node adjusts to the space available around it.",{},"A school project where we worked on graph data structures and algorithms to make a network easier to read.","\u002Fprojects\u002Fgraph-visualizer","Developer · Group Project",{"title":94,"description":99},[84,130,131,132,133],"Swing","Git","Graph Algorithms","Data Structures","projects\u002Fgraph-visualizer","Drawing graphs with Java, from data structures to node placement.","Education","yXA3Bhhv0BePMuvpP_fqMdZ84PKeXpOz2tOm3y_mN4U",{"id":139,"title":140,"body":141,"description":11,"extension":14,"heroImages":145,"highlights":149,"meta":159,"navigation":30,"overview":160,"path":161,"role":162,"seo":163,"stack":164,"stem":169,"tagline":170,"type":136,"year":90,"__hash__":171},"projects\u002Fprojects\u002Fhealth-website.md","Health & Well-Being Platform",{"type":8,"value":142,"toc":143},[],{"title":11,"searchDepth":12,"depth":12,"links":144},[],[146,147,148],"\u002Fresources\u002Fimg\u002Fnine\u002Fhome.png","\u002Fresources\u002Fimg\u002Fnine\u002Fmobile.png","\u002Fresources\u002Fimg\u002Fnine\u002Fcontact.png",[150,153,156],{"title":151,"description":152},"Responsive Architecture","Implemented a mobile-first approach with breakpoints optimized for various devices, ensuring consistent user experience across platforms.",{"title":154,"description":155},"Accessibility Compliance","Achieved WCAG 2.1 Level AA compliance with semantic HTML, ARIA labels, and keyboard navigation support.",{"title":157,"description":158},"Performance Optimization","Optimized loading times through image compression, lazy loading, and efficient CSS\u002FJS bundling, achieving 90+ Lighthouse scores.",{},"Developed a responsive health and wellness platform for a fictional health tech company, focusing on user-centric design and modern web technologies.","\u002Fprojects\u002Fhealth-website","Full-stack Developer & UI\u002FUX Designer",{"title":140,"description":11},[165,166,131,167,168],"HTML5","CSS3","Responsive Design","Figma","projects\u002Fhealth-website","From Personal to Responsive Website - A comprehensive health tech solution.","Gz214a3vieuVSxHZ4Z858np7vi7-JBOsJggvAyc0s_I",{"id":173,"title":174,"body":175,"description":11,"extension":14,"heroImages":179,"highlights":183,"meta":193,"navigation":30,"overview":194,"path":195,"role":196,"seo":197,"stack":198,"stem":201,"tagline":202,"type":136,"year":90,"__hash__":203},"projects\u002Fprojects\u002Fjava-workshop.md","Interactive Java Workshop",{"type":8,"value":176,"toc":177},[],{"title":11,"searchDepth":12,"depth":12,"links":178},[],[180,181,182],"\u002Fresources\u002Fimg\u002Fjpo\u002F2d-array.png","\u002Fresources\u002Fimg\u002Fjpo\u002Fmethod.png","\u002Fresources\u002Fimg\u002Fjpo\u002Fnetbeans.png",[184,187,190],{"title":185,"description":186},"Adaptive Learning Path","Developed a flexible curriculum that automatically adjusted difficulty based on participant progress, ensuring engagement for all skill levels.",{"title":188,"description":189},"Interactive Teaching Tools","Created 10+ interactive JavaFX demonstrations that visualized programming concepts in real-time, improving concept retention by 60%.",{"title":191,"description":192},"Engagement Success","Achieved 85% participant completion rate with overwhelmingly positive feedback, contributing to a 20% increase in program applications.",{},"Designed and delivered an interactive Java programming workshop for prospective students during university Open House Day.","\u002Fprojects\u002Fjava-workshop","Workshop Designer & Technical Instructor",{"title":174,"description":11},[84,85,199,200],"Educational Design","Interactive Learning Tools","projects\u002Fjava-workshop","Introduction to Computer Science - An educational experience for Open House Day.","h3omGm809WfLZceJhiOISl1z_1e4ZWHxGGSip4DqExw",{"id":205,"title":206,"body":207,"description":211,"extension":14,"heroImages":223,"highlights":227,"meta":237,"navigation":30,"overview":238,"path":239,"role":81,"seo":240,"stack":241,"stem":246,"tagline":247,"type":45,"year":248,"__hash__":249},"projects\u002Fprojects\u002Flaravel-ai-seeder.md","Laravel AI Database Seeder",{"type":8,"value":208,"toc":221},[209,212,215,218],[54,210,211],{},"This is a Laravel package to fill a database with test data written by an AI instead of random words. For now it is only the base, the generation part is not written yet.",[54,213,214],{},"What exists: the service provider, a facade (AiSeeder), a config file, and the classes that read this config. In the config you choose a driver. I put two: OpenAI (gpt-4o-mini by default) and a local one that points to a local server (mistral by default). For each one you can set the batch size and how many requests run at the same time.",[54,216,217],{},"For the models, there is an abstract class called AiModelDefinition. For each model you describe its fields and, if needed, a context text to help the AI understand what the data should look like. A Faker instance is also available in each definition.",[54,219,220],{},"On the tooling side, Pint checks the code style and PHPUnit runs on GitHub Actions. The only test is a placeholder for now, and the namespace is still the Vendor placeholder.",{"title":11,"searchDepth":12,"depth":12,"links":222},[],[224,225,226],"\u002Fresources\u002Fimg\u002Fai-seeder\u002Fconfig.png","\u002Fresources\u002Fimg\u002Fai-seeder\u002Fgeneration.png","\u002Fresources\u002Fimg\u002Fai-seeder\u002Fresults.png",[228,231,234],{"title":229,"description":230},"Two drivers","The config has OpenAI (gpt-4o-mini by default) and a local one (mistral by default), each with a batch size and a max concurrency.",{"title":232,"description":233},"Model definitions","An abstract class where you describe the fields of a model and a context text for the AI.",{"title":235,"description":236},"Tooling","Pint for the code style and PHPUnit on GitHub Actions.",{},"The base of a Laravel package to fill a database with data written by an AI instead of random words. The generation part is not written yet.","\u002Fprojects\u002Flaravel-ai-seeder",{"title":206,"description":211},[242,243,244,245],"PHP","Laravel","Faker","PHPUnit","projects\u002Flaravel-ai-seeder","A Laravel package to seed a database with AI generated data.",2026,"9ZAnftwRLhWJdWxotsVaCtefxHbXzZvT7HpBO-BbMtc",{"id":251,"title":252,"body":253,"description":257,"extension":14,"heroImages":302,"highlights":303,"meta":313,"navigation":30,"overview":314,"path":315,"role":316,"seo":317,"stack":318,"stem":328,"tagline":329,"type":330,"year":248,"__hash__":331},"projects\u002Fprojects\u002Fmcp-grid-decision-support.md","MCP Servers for a Power Grid",{"type":8,"value":254,"toc":300},[255,258,261,264,274,277,280,283,294,297],[54,256,257],{},"I did this project during my internship at Jade Hochschule in Wilhelmshaven, Germany, from April to June 2026. The team works on a decision support tool for the people who run the power grid. When the grid is too loaded, they need to find the risks fast, try some switching options and check what happens after. My part was to see if an LLM can help with that when it can ask questions to the grid data and run simulations.",[54,259,260],{},"The grid data comes as CGMES files, the standard format used between grid operators in Europe. They are big XML files, not easy to use directly. The team already had a tool called GridPIM that loads them into a Neo4j graph database and builds a Pandapower network from it, so I started from that. I also added an Apache Jena Fuseki triple store, to query the same data with SPARQL.",[54,262,263],{},"Then I built two MCP servers in Python, so the LLM can use all of this as tools:",[265,266,267,271],"ul",{},[268,269,270],"li",{},"The first one talks to Neo4j and Pandapower. The model can get a summary of the grid, list buses, lines, transformers, switches and generators, then create a scenario, open or close switches, run an AC power flow, look for bottlenecks and compare two scenarios.",[268,272,273],{},"The second one talks to Fuseki and only reads the ontology.",[54,275,276],{},"In both there is a tool to run a raw query (Cypher or SPARQL) when the other tools are not enough. I did not use RAG, because it loses the structure of the grid. A question like \"what is connected to this line\" needs the real graph.",[54,278,279],{},"The data of the real operators is confidential, so we tested on the MiniGrid T1 from ENTSO-E, which is public. It is also why a local model matters: with a cloud model, the grid data leaves the company. So I compared two local Qwen 3.6 models running on Ollama with Qwen 3.6 Plus and Claude Sonnet 4.6 in the cloud.",[54,281,282],{},"I ran three experiments:",[265,284,285,288,291],{},[268,286,287],{},"Does the model need the schema of the graph? I tried with no schema, with a tool to get it, and with the schema given at the start. Giving it at the start helped the smaller models not get lost.",[268,289,290],{},"20 questions in 5 categories (connectivity, topology, generation, simulation, grid state), with no tools, with one server or with both.",[268,292,293],{},"An N-1 test: for each of the 9 lines, open its switches, run the bottleneck analysis and give the result in JSON.",[54,295,296],{},"What I got is that the tools matter more than the model. Without tools, the models can answer almost nothing. Claude got up to 45%, but I think it is because MiniGrid T1 is on the internet and was in its training data. With the tools, the local Qwen 3.6 27B got 85 to 90% and Claude Sonnet 4.6 got 90 to 95%. On the N-1 test, Qwen 27B was right on 8 lines out of 9, Qwen 35B-A3B on 9 out of 9 and Claude on 6 out of 9. The tools gave the right data every time. The mistakes came from the model counting the violations wrong when writing the JSON. Giving both servers at the same time did not help either, the models started to use the wrong one.",[54,298,299],{},"So a local model can do this job if the tools are good, and this is what the team wanted to know. We wrote a paper about it, and it was accepted at the BCS SGAI 2026 conference in Cambridge.",{"title":11,"searchDepth":12,"depth":12,"links":301},[],[],[304,307,310],{"title":305,"description":306},"Two MCP servers","One for the Neo4j graph and the Pandapower simulation, one for the ontology in Fuseki with SPARQL.",{"title":308,"description":309},"Local models work","With good tools, a local Qwen 3.6 27B got 85 to 90% on 20 grid questions. Claude Sonnet 4.6 got 90 to 95%.",{"title":311,"description":312},"Paper","Accepted at the BCS SGAI 2026 conference, Peterhouse College, Cambridge.",{},"My internship at Jade Hochschule: I built MCP servers so an LLM can query power grid data and run simulations, and we tested if a local model can do the job. We wrote a paper about it.","\u002Fprojects\u002Fmcp-grid-decision-support","AI Software Engineer Intern",{"title":252,"description":257},[36,319,320,321,322,323,324,325,326,327],"MCP","Neo4j","Cypher","Apache Jena Fuseki","SPARQL","Pandapower","Ollama","Qwen","Claude","projects\u002Fmcp-grid-decision-support","Letting an LLM ask questions to a power grid and run simulations.","Work","cvJXUwECl80Tag9Z7ARDs2bLdcYGKTOC08p3d3rabuY",{"id":333,"title":334,"body":335,"description":339,"extension":14,"heroImages":345,"highlights":347,"meta":348,"navigation":30,"overview":349,"path":350,"role":81,"seo":351,"stack":352,"stem":356,"tagline":357,"type":45,"year":90,"__hash__":358},"projects\u002Fprojects\u002Fmcts-visualizer.md","MCTS Algorithm Visualizer",{"type":8,"value":336,"toc":343},[337,340],[54,338,339],{},"I used the Monte Carlo Tree Search algorithm in a school project and I wanted to see what it really does while it runs. So I started a visualizer. The idea comes from another project called mcts-viz.",[54,341,342],{},"The goal is to show the tree for a game of Tic-tac-toe and see how the algorithm builds it. At the moment the repo is only the base: a Vue 3 and Vite project with Sass, and a page that says Hello World. The visualization is not done yet.",{"title":11,"searchDepth":12,"depth":12,"links":344},[],[346],"\u002Fresources\u002Fimg\u002Fmcts\u002Finterface.jpg",[],{},"A visualizer for the Monte Carlo Tree Search algorithm, made to understand what it does while it runs. Only the base of the project exists for now.","\u002Fprojects\u002Fmcts-visualizer",{"title":334,"description":339},[353,354,355],"Vue 3","Vite","Sass","projects\u002Fmcts-visualizer","Visualization of the MCTS algorithm applied to Tic-tac-toe.","3BgsTqlWX1VU_MasV0RdmfeVSGK4vjCJExcJ9cjoj_A",{"id":360,"title":361,"body":362,"description":11,"extension":14,"heroImages":366,"highlights":369,"meta":379,"navigation":30,"overview":380,"path":381,"role":382,"seo":383,"stack":384,"stem":389,"tagline":390,"type":136,"year":46,"__hash__":391},"projects\u002Fprojects\u002Fobject-oriented-game-development.md","IAcademy Of Doom Development Project",{"type":8,"value":363,"toc":364},[],{"title":11,"searchDepth":12,"depth":12,"links":365},[],[367,368],"\u002Fresources\u002Fimg\u002Fcsharp\u002Fgame-running.jpeg","\u002Fresources\u002Fimg\u002Fcsharp\u002Finterface.jpeg",[370,373,376],{"title":371,"description":372},"Conception Objet (UML)","Création de diagrammes de classes UML pour modéliser le code existant et concevoir les modifications structurelles pour les nouvelles fonctionnalités (e.g., salles optionnelles et actions).",{"title":374,"description":375},"Implémentation de Nouvelles Logiques","Ajout de la fonctionnalité d'achats de salles et d'actions, et implémentation de l'algorithme d'orientation des proto-IA pour optimiser leur déplacement.",{"title":377,"description":378},"Améliorations IHM","Amélioration de l'ergonomie par la mise en œuvre du glisser-déplacer pour le placement\u002Freplacement des salles et par la refonte de l'affichage des informations (dialogues plutôt que listing).",{},"Analyse, conception et développement orienté objets d'un jeu existant (IAcademy Of Doom) en C#, se concentrant sur les nouvelles fonctionnalités et l'amélioration de l'interface humain-machine.","\u002Fprojects\u002Fobject-oriented-game-development","Développeur Orienté Objets & Concepteur IHM",{"title":361,"description":11},[385,386,387,388],"C#","Développement Orienté Objets","UML","Interfaces Graphiques (IHM)","projects\u002Fobject-oriented-game-development","Développement Objet C# - Amélioration d'un jeu de simulation\u002Fdéfense existant.","VyglYZhcmZiqmmRe9PLhxEF3AVb9cCNLb-JXjg_fNGc",{"id":393,"title":394,"body":395,"description":399,"extension":14,"heroImages":411,"highlights":415,"meta":425,"navigation":30,"overview":426,"path":427,"role":81,"seo":428,"stack":429,"stem":435,"tagline":436,"type":45,"year":248,"__hash__":437},"projects\u002Fprojects\u002Fpytorch-bottleneck.md","PyTorch Data Opti.",{"type":8,"value":396,"toc":409},[397,400,403,406],[54,398,399],{},"When I trained small CNNs like a ResNet18, I noticed the GPU was under 40% most of the time. The model was not the problem, the GPU was just waiting for data. The way I see it, the CPU is the kitchen assistant who prepares the ingredients, and the GPU is the expensive chef. If the assistant is too slow, the chef stands there doing nothing.",[54,401,402],{},"My guess was that the normal synchronous loading creates small stops, because of Python and the GIL. So I made a benchmark to test it, and I looked at the time of each batch, not only the average. The average hides these stops, but you see them in the jitter.",[54,404,405],{},"Then I tried the optimizations one by one, to know what each one really changes: async loading, prefetching and caching in memory. I think a stable speed matters as much as a high speed when you train for a long time.",[54,407,408],{},"At the end, the GPU went from 38% to more than 90% usage. For me this project was about understanding what is really happening between the framework and the hardware.",{"title":11,"searchDepth":12,"depth":12,"links":410},[],[412,413,414],"\u002Fresources\u002Fimg\u002Fbottlenecks\u002Fthroughput-bench.png","\u002Fresources\u002Fimg\u002Fbottlenecks\u002Fgpu-utilization.png","\u002Fresources\u002Fimg\u002Fbottlenecks\u002Flatency-jitter.png",[416,419,422],{"title":417,"description":418},"GPU usage","From under 40% to around 94% by loading and prefetching the data in the background.",{"title":420,"description":421},"Speed","3 times more images per second, by finding what was slowing the CPU and the bus and going around it.",{"title":423,"description":424},"Jitter","I made a small tool to see how much the loading time changes from one batch to another, to keep the training steady.",{},"Why my GPU was waiting for data when I trained small CNNs, and how I went from 38% to over 90% GPU usage.","\u002Fprojects\u002Fpytorch-bottleneck",{"title":394,"description":399},[36,430,431,432,433,434],"PyTorch","CUDA","Performance Profiling","Matplotlib","NumPy","projects\u002Fpytorch-bottleneck","Hardware Efficiency Research - Eliminating GPU starvation in Deep Learning pipelines.","rqEmcYcU8KAGz3AT1FfzQ2rGo-hTSJAsS_yrWwH-jnc",{"id":439,"title":440,"body":441,"description":475,"extension":14,"heroImages":476,"highlights":479,"meta":489,"navigation":30,"overview":490,"path":491,"role":81,"seo":492,"stack":493,"stem":500,"tagline":501,"type":45,"year":248,"__hash__":502},"projects\u002Fprojects\u002Frelais-solidaire.md","Relais Solidaire",{"type":8,"value":442,"toc":473},[443,454,457,460,463,466],[54,444,445,446,453],{},"I live in Bordeaux, and the fires in Gironde this summer made me want to build something useful. The fire in Saumos alone covered 42,000 hectares, with 37,296 hectares destroyed, according to the ",[447,448,452],"a",{"href":449,"rel":450},"https:\u002F\u002Fwww.gironde.gouv.fr\u002FActualites\u002FCommuniques-de-presse\u002FCommuniques-de-presse-2026\u002FSeptembre-2026\u002FLe-feu-de-Saumos-est-desormais-eteint\u002F%28theme%29\u002F98",[451],"nofollow","Gironde prefecture's report from September 2026",". That is what gave me the idea for Relais Solidaire.",[54,455,456],{},"My starting point was a simple question: if I want to donate something, how do I know what is needed and where to bring it? I wanted to make a place where fire stations and reception centres could say what they are missing, so people could check before bringing things that might already be available.",[54,458,459],{},"The app shows the stations by department, with the ones involved in an active emergency put first. Each station can list what it needs, the quantity and how urgent it is. When a request is fulfilled, it can be marked as done. I also added an admin space to check registrations before a station appears publicly.",[54,461,462],{},"I built it with Nuxt, Vue and TypeScript, with Prisma and MySQL for the data. The screenshots show the app running locally with sample data, so the requests shown are examples.",[54,464,465],{},"I haven't published it yet because I still don't know if it would really be useful. I think the idea makes sense, but I would want to talk to the people working in these stations and centres before putting it online. For me, making the app was one part of the project. Finding out if it solves a real problem is the part I still need to do.",[54,467,468],{},[447,469,472],{"href":470,"rel":471},"https:\u002F\u002Fgithub.com\u002FBetaNow\u002FRelaisSolidaire",[451],"Source code on GitHub",{"title":11,"searchDepth":12,"depth":12,"links":474},[],"I live in Bordeaux, and the fires in Gironde this summer made me want to build something useful. The fire in Saumos alone covered 42,000 hectares, with 37,296 hectares destroyed, according to the Gironde prefecture's report from September 2026. That is what gave me the idea for Relais Solidaire.",[477,478],"\u002Fresources\u002Fimg\u002Frelais-solidaire\u002Fhome.jpg","\u002Fresources\u002Fimg\u002Frelais-solidaire\u002Fstation.jpg",[480,483,486],{"title":481,"description":482},"Local needs","People can browse by department and see what each verified station or reception centre is asking for.",{"title":484,"description":485},"Urgent requests","Stations can list quantities, set the urgency and mark a request as fulfilled when they have enough.",{"title":487,"description":488},"Still a prototype","I haven't published the app yet. I want to know if it would really help the people who would use it.",{},"I live in Bordeaux. After the fires in Gironde, I built an app to help people find where their donations could be useful.","\u002Fprojects\u002Frelais-solidaire",{"title":440,"description":475},[494,495,496,497,498,499],"Nuxt","Vue","TypeScript","Tailwind CSS","Prisma","MySQL","projects\u002Frelais-solidaire","Helping people see what fire stations and reception centres actually need.","tJkotk7WaFsUFQw6qFajIRPV5fE1thSaQm4zrVUm_gU",{"id":504,"title":505,"body":506,"description":510,"extension":14,"heroImages":534,"highlights":538,"meta":539,"navigation":30,"overview":540,"path":541,"role":81,"seo":542,"stack":543,"stem":546,"tagline":547,"type":45,"year":90,"__hash__":548},"projects\u002Fprojects\u002Fscala-pipeline.md","ScalaPipeline Framework",{"type":8,"value":507,"toc":532},[508,511,514],[54,509,510],{},"ScalaPipeline is a data pipeline framework I want to build in Scala. The idea is to read data from a source, apply some transformations and checks, then write the result somewhere else, with types so that the compiler catches the mistakes.",[54,512,513],{},"The work is on the dev branch. I added sources and outputs for CSV, JSON and XML, and transformations to filter data, change fields and group records. The tests show how to use them, for example by grouping people by name and city, counting their emails and calculating their average age. It is still in development. Monitoring, logs and parallel processing are among the things I want to add next.",[54,515,516,517,521,522,526,527,531],{},"I also added a test that reads a CSV, filters out people under 18, cleans and renames fields, then writes JSON. It checks the saved file against the exact records I expect. Another test checks that a transformation error stops the pipeline before it writes anything. On 8 October 2026, all 24 tests passed with ",[518,519,520],"code",{},"sbt test",". You can read the ",[447,523,525],{"href":524},"\u002Fresources\u002Fdocs\u002Fscala-pipeline-integration-test.scala","integration test"," and the ",[447,528,530],{"href":529},"\u002Fresources\u002Fdocs\u002Fscala-pipeline-tests.txt","test output",".",{"title":11,"searchDepth":12,"depth":12,"links":533},[],[535,536,537],"\u002Fresources\u002Fimg\u002Fscala-pipeline\u002Fintegration-intellij.png","\u002Fresources\u002Fimg\u002Fscala-pipeline\u002Ftest-results-intellij.png","\u002Fresources\u002Fimg\u002Fscala-pipeline\u002Faggregation-intellij.png",[],{},"The start of a data pipeline framework in Scala: read data from a source, transform and check it, then write it somewhere else.","\u002Fprojects\u002Fscala-pipeline",{"title":505,"description":510},[544,545],"Scala 3","sbt","projects\u002Fscala-pipeline","A data pipeline framework built with Scala.","4urGnWElaOkvvwgeuiS81gcW0-4teGJgbXHlDmwUloc",{"id":550,"title":551,"body":552,"description":556,"extension":14,"heroImages":568,"highlights":571,"meta":581,"navigation":30,"overview":582,"path":583,"role":81,"seo":584,"stack":585,"stem":587,"tagline":588,"type":45,"year":90,"__hash__":589},"projects\u002Fprojects\u002Fsnake-ai.md","Snake AI with Deep Q-Learning",{"type":8,"value":553,"toc":566},[554,557,560,563],[54,555,556],{},"This is a Snake game with an AI that learns to play it by itself. I made the game with Pygame, then I added the agent with PyTorch.",[54,558,559],{},"The AI does not see the screen. At each step it gets 11 values: if there is danger straight, to the right or to the left, the direction the snake is going (4 values), and where the food is compared to the head (4 values). The network is small: 11 inputs, one hidden layer of 256 neurons and 3 outputs, which are go straight, turn right and turn left.",[54,561,562],{},"It learns with Q-learning. After each move the agent trains on what just happened, and at the end of each game it trains on a random batch of 1000 moves taken from a memory of the last 100 000. The reward is +10 when the snake eats and -10 when it dies. At the start it plays a lot of random moves, and less and less as the number of games goes up.",[54,564,565],{},"After each game it saves the model, the scores and the graph, so I can stop the training and start it again later.",{"title":11,"searchDepth":12,"depth":12,"links":567},[],[569,570],"\u002Fresources\u002Fimg\u002Fsnake-ai\u002Fgameplay.png","\u002Fresources\u002Fimg\u002Fsnake-ai\u002Ftraining.png",[572,575,578],{"title":573,"description":574},"Small network","11 inputs, one hidden layer of 256 neurons and 3 outputs: go straight, turn right, turn left.",{"title":576,"description":577},"Replay memory","After each game it trains on a random batch of 1000 moves taken from the last 100 000.",{"title":579,"description":580},"Training you can resume","The model, the scores and the graph are saved after each game, so I can stop and start again later.",{},"A Snake game made with Pygame and an AI made with PyTorch that learns to play it alone with Q-learning.","\u002Fprojects\u002Fsnake-ai",{"title":551,"description":556},[36,430,434,586,433],"Pygame","projects\u002Fsnake-ai","A neural network trained with Q-learning that plays Snake.","P7RaoJTi2DQqGqSVIyX_D6q0tSpmWyb1tH3jAdi4IcU",{"id":591,"title":592,"body":593,"description":597,"extension":14,"heroImages":609,"highlights":612,"meta":613,"navigation":30,"overview":614,"path":615,"role":616,"seo":617,"stack":618,"stem":622,"tagline":623,"type":136,"year":90,"__hash__":624},"projects\u002Fprojects\u002Fstrategic-audit.md","Oracle Strategic Analysis",{"type":8,"value":594,"toc":607},[595,598,601],[54,596,597],{},"I worked on this analysis of Oracle with a group during my studies. We looked at how the company works, from software development and sales to finance and research, then at the market around it.",[54,599,600],{},"We used PESTEL and Porter's five forces to understand what can help Oracle grow and what can make things harder, like competition in the cloud market and changing regulations. For me, this was a way to look beyond the technology and understand the business decisions behind it.",[54,602,603],{},[447,604,606],{"href":605},"\u002Fresources\u002Fdocs\u002Fanalyse-oracle.pdf","Read the full Oracle analysis (PDF)",{"title":11,"searchDepth":12,"depth":12,"links":608},[],[610,611],"\u002Fresources\u002Fimg\u002Fsme\u002F1st-page.png","\u002Fresources\u002Fimg\u002Fsme\u002Fintro.png",[],{},"A group project from my studies, looking at how Oracle works and what shapes its strategy.","\u002Fprojects\u002Fstrategic-audit","Business Analysis · Group Project",{"title":592,"description":597},[619,620,621],"Business Analysis","PESTEL","Porter's Five Forces","projects\u002Fstrategic-audit","Understanding Oracle's business and the market around it.","XqdH_MxY_qrJR1u7Hpz9lOcCvOeCN0ZRxoX9dEukRAA",1792408577142]