The previous lead developer ran out of time. What he left behind was a running production app on an outdated React pages router setup, with no documentation, and a registration flow that was fundamentally broken — you could create an account, but the confirmation email never arrived, resetting your password was impossible, and half the data you filled in during registration was never saved. I took it over solo.
The first priority was auth. Login partially worked, but account creation didn't: confirmation emails weren't sent, password reset was broken, and user data wasn't being saved correctly via the Strapi API. I debugged the entire flow, rewrote it to the correct Strapi implementation, and tested everything on staging before pushing to production — always late at night when usage was low.
Then came the incremental modernisation. Instead of replacing everything at once — too risky for a live platform — I chose a gradual approach: every new feature or component I built would replace the old CSS with Tailwind at the same time. The app router migration I did in one go, planned and executed outside production hours. The codebase got progressively more modern without users noticing anything.
Before I became less available, I took a student under my wing. I walked him through the codebase, am building documentation in Storybook and ZeroHeight, and am still available when he gets stuck. The handover is a process, not a moment.
The registration flow used Strapi incorrectly — causing missing confirmation emails, broken password reset, and lost user data. Fully rewritten to the correct API implementation and tested on staging before every production deploy.
A full Next.js router migration on a live platform. Carefully planned, tested on staging, and executed in one night outside production hours. Zero downtime, zero complaints.
Too risky to rewrite everything at once. Every component I touched got Tailwind replacing old CSS. The codebase gets progressively better over time.
Performance (78) and Accessibility (89) are actively being improved. The lower scores come from legacy images in old components that haven't been migrated yet — this is work in progress.
"Luuk picked up a codebase nobody understood anymore and turned it into something the whole team can build on."
— Team YoungPWR
Staging is not a luxury, it's a requirement. Every change on a live platform — no matter how small — went through staging first. That prevented multiple production incidents.
Incremental refactoring beats a big bang rewrite. Every component I touched was left better than I found it. Over time that adds up.
Knowledge transfer doesn't start on your last day. By starting documentation and mentoring early you make sure the project doesn't depend on one person — including yourself.