Backend & infrastructure
The services behind the experiences — APIs, dashboards, persistence, and keeping it all running when the network is missing or thousands of people arrive at once.
Technologies: Node.js, PHP, MySQL, PostgreSQL, MongoDB, Prisma, Redis, AWS, Google Cloud, Docker, Kubernetes, GitHub Actions, Jenkins, Vercel
I started doing backends very early in my career, building PHP/MySQL websites back in the 2000s. Since then I've designed and implemented plenty of REST APIs in many languages (PHP, JavaScript, Python), services, dashboards and data storage at scale. I've built infrastructure serving millions of users.
WISE Surveys (2013)
This survey platform's backend was built in PHP and used a combination of MySQL and JSON files for data. I built an API for client-server communication, and a dashboard that allowed authors to compile and download data reports from the surveys.
Communication wasn't guaranteed. When doing research out in the field without internet access, the app collected locally and synchronised when it could. In online studies run through the browser, incremental backups were submitted on every step the participant took, so a crash or disconnection wouldn't cause data loss.
Sensitive data shaped the schema. A participant's entries had to be linkable across surveys without being identifiable, so identification and cross-referencing ran through strict protocols rather than shared keys, and anything held on the device was encrypted in case it was lost.
Scaling came later. When the platform started having thousands of concurrent participants and dozens of teams uploading and using assets in surveys, I hit various scaling issues. I moved all the assets to S3, made the API lighter and improved how assets were delivered.
The app supported survey bundles, where studies that ran on-site could run a self-contained build with no need to download content.
In 2025 I started moving the backend from a single VM to GCP with Docker, and the API from PHP to Node.js and MongoDB.
For client deployment I used Fastlane for iOS and wrote custom post-process scripts to upload the WebGL build.
Hyperspace (2014)
Hyperspace started as a platform for serious games in education. My first backend challenge was around gamification. We identified the user through the SCORM integration and allowed saving the state and performing multiple attempts. I created an API in PHP with MySQL for data. The platform was designed early for authoring experiences, so all content was stored server-side. I created a gamification engine supporting tasks, achievements and rewards. It had an API where every action the user took on the client was recorded, and course managers could track progress and generate reports.
As the platform kept growing we built several dashboards where clients could author their own experiences by choosing from our 3D templates, uploading their models, creating their characters, dialogues and tasks, and designing the rules that defined the user experience. Some authoring tools ran on the frontend, where clients could design the 3D environment, place characters and define interactions. Others ran on the backend, where clients uploaded and managed content, turned features on and off, and managed users and reports.
We transitioned from vanilla PHP to Laravel for the dashboards, deployed with Docker and later Kubernetes, with MariaDB running on a cluster. Several databases hit millions of rows. We implemented Varnish and Redis for caching, and Horizon queues for data ingestion. We had events where our services were hit by thousands of attendees in less than a second.
Our development and deployment pipelines changed many times over the years. Today we have agents generating specs and code suggestions from a product manager's request. When a feature is implemented, another agent submits a PR with a Jira issue describing it. When approved, CI (Jenkins) runs all our gates — tests, coverage, audits — and finally deploys the new build to our production environment. Another agent generates changelogs and updates documentation.
Somebody AI (2025)
This conversational avatar platform has many components. It was the first time I set up a monorepo where all packages shared dependencies and pipelines.
The avatar production pipeline runs on a GPU-powered VM on GCP. We use it on demand and only have one instance. I deployed and maintained the pipeline.
The frontend app is built on React (TypeScript) and uses Clerk for auth.
The API is built with Node.js, TypeScript, Hono and MongoDB. It has its OpenAPI definition and uses codegen to generate API clients for TypeScript and Python.
It also has a voice service built in Python that handles communication through WebSockets with AI providers for real-time audio conversations (OpenAI, Gemini...).
I built a very complete CI workflow with GitHub Actions, with many gates for code quality, testing and coverage.
The repo has a pre-commit hook which runs some gates before allowing a commit: Biome for linting, Knip for dependencies, jscpd for duplicates, typechecks, tests and coverage thresholds, cached by Turbo. For PRs, I also run an audit to detect vulnerabilities.
All packages deploy as Docker images through Google Artifact Registry using WIF (Workload Identity Federation) for auth.
ResponsiveVoice (2014)
This text-to-speech library, being a relatively self-contained JavaScript package, didn't need much backend. But it did have one component worth mentioning.
What started as a fallback ended up being one of the most used services in the product. The library provided text-to-speech by running the embedded services on devices and in browsers (native voices), but I added a fallback for when they weren't available: a very small service in PHP that acted as a gateway between real-time TTS providers and the client.
The library reached 90M monthly users, which meant heavy traffic on the voice service delivering audio files. We had to cache and store very large numbers of them, with all the management logic involved.
Kodo Booking (2026)
For this small booking app I wanted to try simple deployments on Vercel, and to use technologies I hadn't touched before.
The app is built using Next.js, Auth.js and Prisma with PostgreSQL.
Where I've used it
- Kodo Booking (2026)
- Somebody AI (2025)
- ChatMapper (2015)
- Hyperspace (2014)
- ResponsiveVoice (2014)
- WISE Surveys (2013)