03 / Java · Spring Boot · NestJS · PostgreSQL
Solid foundations behind it all.
Behind an interface are data to organise and operations to verify. I build APIs and tools with relational databases, validation and tests for the behaviours that matter.
APIs and data
Aerides uses Java and Spring Boot for bookings with transactional locks and WebSocket updates. Covershift exposes a NestJS API documented with OpenAPI, with Zod contracts shared with the React frontend. Matchday connects a React site and an Angular back-office to an Express API with PostgreSQL. qrinventory uses FastAPI and SQLModel for items, containers and QR labels.
Databases and ORMs
I use PostgreSQL, NeonDB, Supabase, MySQL and Drizzle ORM to organise data and connect it to applications. In Covershift, Postgres Row Level Security policies decide what each user can see, with constraints and triggers as the last line of defence. StudyBuddy v2 uses SQLite with Drizzle, with vector search (sqlite-vec) and full-text search (FTS5) in the same file.
Tests and deployment
I use Vercel to deploy web projects and GitHub Actions for CI/CD pipelines. Covershift has over 380 tests and a single required check that gathers tests, CodeQL, gitleaks and Trivy; qrinventory runs in Docker, over HTTPS via Caddy and Let’s Encrypt; Matchday runs checks in GitLab CI and is deployed on Vercel with Neon.
Where I put it into practice
Aerides
A multi-tenant web app for organising gaming sessions: role-based slots, a FIFO waitlist and automatic promotion without overbooking. Java and Spring Boot APIs, a bilingual Angular frontend, WebSocket updates, email and per-group permissions.
Read the case study ↗Matchday
A simulated sports betting platform with real fixtures from Europe’s top five leagues, odds generated by the app and fictitious credits. A TypeScript monorepo with a React site, an Express API on PostgreSQL and an Angular back-office, tested with Vitest and Cypress and deployed on Vercel.
Read the case study ↗Covershift
A multi-tenant platform for scheduling shifts and swapping them between colleagues, with manager approval and certification checks. A TypeScript monorepo with a NestJS API, a React web app and shared Zod contracts; data access is enforced by Postgres Row Level Security on Supabase. Over 380 tests, including Playwright e2e and accessibility checks.
Read the case study ↗qrinventory
A self-hosted inventory of physical objects with QR codes: every item and container has a label that opens its page when scanned with a phone. A FastAPI and SQLModel API on SQLite, nested containers with cycle protection, PDF label sheets and a camera scanner. It runs in Docker on a home PC, over HTTPS with Caddy and Let’s Encrypt, without opening any router ports.
View project card ↗StudyBuddy v2
A local-first AI study tutor: every downloaded online course becomes a Socratic tutor that cites the exact minute of the video. Hybrid retrieval (sqlite-vec + BM25, RRF fusion, GPU cross-encoder), LLM-graded quizzes, SM-2 review, explorable concept maps and eval sets to measure prompts. In daily use.
Read the case study ↗