Automate a manual process that's slowing growth
Syncing tools, managing orders, recurring exports: every hour spent on a repetitive task is an hour wasted. A well-designed connector pays for itself within months.
Portfolio
17 years of fullstack experience: PHP/Symfony, React, legacy migrations, custom tools. Each project below starts with a concrete problem from a business leader or team, and ends with a measurable result.
What I build
These situations come up repeatedly with SMEs. They are not inevitable.
Syncing tools, managing orders, recurring exports: every hour spent on a repetitive task is an hour wasted. A well-designed connector pays for itself within months.
A custom tool adapts to your unique process, where the generic one forces you to adapt to it. CRM, ERP, dashboards: designed for you, not for everyone.
High-performance showcase site, community platform, member area: local customers expect to find your business online, easily, without friction.
PHP 5.6 → 8.3, Drupal → static, Symfony 2 → 7: successful migrations without service interruption or full rewrite. Your business continuity comes first.
The problem: The flat PHP 5.6 application had become impossible to maintain. Obsolete PHP versions were no longer supported, and direct database access exposed the platform to SQL injection vulnerabilities.
What I did: In two stages. First, security: update to PHP 8.3 and replacement of direct queries with PDO prepared statements, eliminating SQL injection risks. Then progressive refactoring via the Strangler Fig Pattern: modern Symfony + React. Working pages remain intact; each new feature is rewritten in the new stack. Service continuity is guaranteed at every step.
The problem: An e-merchant was already managing their sales site and logistics via a specialised SaaS. By opening Sellermania as an additional sales channel, each incoming order required manual entry in the logistics SaaS: repetitive, error-prone, and incompatible with growing volumes.
What I did: API connector between Sellermania and the logistics SaaS: each order placed on Sellermania is automatically forwarded without manual intervention. Built-in deduplication to guarantee idempotency of cron flows.
The problem: A client's custom ERP (contact, contract, and property management) had accumulated critical technical debt: obsolete Create React App, zero TypeScript, zero tests. A full rewrite would have blocked business features for months.
What I did: Progressive migration via the Strangler Fig Pattern: new
Vite/TypeScript/RTK Query stack coexisting in the same bundle as the legacy code, without touching it.
Three technical challenges solved with custom Vite plugins: unified Redux store between both stacks,
JSX in legacy .js files, per-page feature flags for instant production toggle.
Vitest test infrastructure and architecture documentation delivered to the internal team.
The problem: A historic garden with a slow, expensive Drupal site: no internal technical team, blocked updates, catastrophic performance.
What I did: Migration to a bilingual Eleventy static site, SEO-optimised, automatically deployed via GitHub Actions. Custom content management module added: event scheduling is entered dynamically and generated as static pages at each deployment.
Other work
Exploratory or sector-specific projects illustrating other facets of my work.
Freelance · Business tool · POC
Replace Excel and generic tools (invoicing, client tracking, timekeeping) with a monorepo: Next.js showcase site + custom Symfony CRM with DDD/CQRS patterns. Client management, quotes, time tracking and invoicing in a single tool adapted to the real process.
✓ DDD/CQRS reference architecture · In development
Sport · React prototype
Cyclists were using Google Maps to find training climbs, a generic tool poorly suited to the task. React app with the Google Elevation API to search for climbs by precise gradient on an interactive map.
✓ Specialised tool vs generic, functional MVP
Your project
A costly legacy, a manual process to automate, a generic tool that no longer fits. Tell me about your problem in a few lines. I reply within 24 hours.