Frontend & Product Engineer
Selected projects in product development, design systems, AI applications, and creative web work.
- Frontend: React, Next.js, TypeScript, Tailwind
- AI: OpenAI Realtime, Voxtral, LLM output checks, evaluation
- Systems: Storybook, Orval, TanStack React Query, Zustand
- Delivery: GitHub Actions, Playwright E2E, AWS, PHP
- Creative: Framer Motion, Three.js / React Three Fiber
AI patient simulation for psychotherapy training.
RawTherapy lets therapists practise difficult conversations with simulated patients, by text or live voice, in English, German, and Spanish. Each patient has a life story, beliefs, and a way of talking, and reacts to how the therapist approaches them. I designed and built the product, including patient behaviour, the conversation interface, and reply checks.
- Demo
- On request
- My role
- Product design and full-stack development, including the React interface, simulation engine, real-time voice, AI quality checks, and evaluation workflow
- Stack
- React, TypeScript, Fastify, PostgreSQL with pgvector, Redis, OpenAI Realtime API, Voxtral, Playwright
Staff scheduling and workforce management.
Ordio helps businesses schedule staff and manage daily work. I worked on the scheduling and workforce screens, turning complex business rules into forms and views together with the PHP backend team. I also set up how changes are tested and released, with GitHub Actions, Playwright, and AWS Amplify.
- Live
- ordio.com
- My role
- Scheduling and workforce interfaces, automated testing, and release workflows
- Stack
- Next.js, React, TypeScript, GitHub Actions, Playwright, Docker, AWS Amplify
Redesigning REMONDIS NEOS.
NEOS replaced DATAFLEET, the older software REMONDIS used for city-cleaning operations. It worked, but the interface was too small, and key functions were hard to find or hidden. I redesigned it from concept to code: I ran user tests with city-cleaning staff, shaped a clear user journey in Figma, and built it in React. Staff now need fewer clicks for their daily tasks, and their feedback confirmed it.
- My role
- Concept, UX/UI design, and frontend development
- Process
- User tests with city-cleaning staff, concept and design in Figma, built in React
- Stack
- Figma, Next.js, React, Storybook, Tailwind CSS, TanStack React Query
An image-led campaign website for Leica Q.
I helped build the Leica Q campaign site for Virtue Worldwide, using image order, responsive layouts, and subtle motion to put the photography at the centre.
- Type
- Visual campaign / branded experience
- My role
- Frontend development, responsive layouts, and image presentation
An interactive journey along the Balkan refugee route.
For the VICE newsroom, I designed and built an interactive story that follows the Balkan route from Lesbos to Berlin. Readers move across a map of Europe, open city pages with articles, photos, and 3D terrain, and see the harsh conditions people face on their way, from winter cold in the mountains to summer heat. The site is in English and German.
- Type
- Editorial project for the VICE newsroom
- My role
- Design and frontend development
- Stack
- Next.js, React, TypeScript, Tailwind CSS, next-intl, Framer Motion, React Three Fiber
A portfolio for interactive experiments, photography, and design.
I designed and built my personal website to bring together photography, design, and interactive experiments.
- Projects
- Costa Nostra, Valencia Street, Orgullo, LIM, and other editorial and experimental photo series
- My role
- Design and frontend development
- Stack
- Next.js, React, TypeScript, Tailwind CSS, Framer Motion, Three.js, React Three Fiber, Vercel
How I work.
Find the real problem first
I start with the people using the product and what slows them down, then decide what to build.
Own it from idea to release
I take features from concept and design through code, testing, and deployment.
Automate the boring parts
I set up tests, preview builds, and release pipelines so changes ship with fewer manual steps.
Use AI, then check its output
I connect AI models to real products and add checks that catch replies that go off track.





