I design reusable architectures and tools to meet shared needs, and I support teams in their development. Developer since 2011, I later specialized in Symfony and TypeScript.
I design reusable architectures and tools to meet shared needs, and I support teams in their development. Developer since 2011, I later specialized in Symfony and TypeScript.
Development and maintenance of the Symfony monolith behind the vehicle delivery platform.
Technical guidance of a Symfony / React squad on the management software for associations.
Team management and delivery of critical features, with direct involvement in incidents.
Managed a team of up to 6 people (backend, frontend).
Led the technical side of a major AWS migration: -45% infrastructure costs.
Modernised the stack and improved performance: Core Web Vitals (CLS reduced to 0.0), backend optimisation.
Introduced ADRs (Architecture Decision Records) to trace and document structural choices.
Cross-team technical reference for a growing team: mentoring and architectural consistency.
Structured the first squad in six months with the Head of Engineering: its way of working and rituals were used as the model for moving to four squads, in a development team that grew fourfold.
Technical responsibility for 750g.com and Académie du Goût.
Symfony content and SEO bundle for 750g.com (~8M visits/month): typed documents, customisable fields, hierarchical inheritance and URLs decoupled from the database.
Technical lead of the asynchronous rebuild of the payment funnel on both sites for PSD2 (Académie du Goût: ~700k visits/month).
Industrialised code practices (code reviews, quality).
Backend development of the e-commerce platform.
Rewrote an ORM to abstract SQL and NoSQL databases, local or remote; compatible with MySQL, MongoDB and Redis.
Designed and led the migration of a legacy system (Zend) to Symfony.
Set up CI/CD pipelines to automate and secure deployments.
Grew from consultant to technical lead, with responsibility for architecture and for how development was organised.
Matching algorithm between job offers and candidates based on weighted proximity: thousands of profiles, more than 20 technical and behavioural skills scored from 0 to 5.
Led the migration from the in-house framework to the Symfony ecosystem.
Put the 'Sans CV' (no resume) solution for Pôle Emploi into production.
Development of business applications and internal tools, Symfony migrations and R&D projects for large accounts.
Designed and built a high-performance internal tool (Node.js, WebSocket).
Development and maintenance of the payment modules.
Created, on my own initiative, a client/project tracking tool shared between teams, with real-time updates (Node.js 0.8, WebSockets).
Optimisation and maintenance of the processors for the Proxy module (Regex / C# / XML).
M2IRT (Bac+5)
Audit of an existing information system.
Consulting on information system strategy.
Design and implementation of IT systems and networks.
Project management in France and internationally.
Management of intercultural teams and change management.
IT business development and client management.
Entrepreneurship and development of innovative activities.
JSX to HTML rendering engine in TypeScript, with no React and no client-side JavaScript.
Dependency-free rendering engine with typed props and attributes.
Escaped output and filtered URLs by default; the test suite is itself checked by mutation testing.
Deferred fragments and streaming, precompilation, Vite plugin and ESLint rules.
CSS customization for Firefox's native vertical tabs: full-height Chrome-like layout, with no imposed colors.
The tabs panel reaches the top of the window; the navigation bar only takes the remaining area.
The active Firefox theme is followed, illustrated with the official Mozilla themes.
Interactive installer: detects the Firefox profiles (deb, snap, flatpak) and offers to pick one.
Typed translation library in TypeScript, dependency-free and under 500 bytes compressed.
Translation keys are autocompleted.
A misspelled parameter in a translation is a compile error, not a production bug.
Works in the browser and on Node.js, with no configuration.