This portfolio
The site you are reading: a Next.js front end, an Express API and MongoDB, in English, French and Arabic, with an administration area that manages every word on it. Built, tested and deployed to a VPS end to end.

Built with
- TypeScript
- Next.js
- React
- Tailwind CSS
- shadcn/ui
- Radix UI
- TanStack Query
- React Hook Form
- Zod
- Node.js
- Express
- MongoDB
- Mongoose
- JSON Web Tokens
- Docker
- Docker Compose
- Caddy
- Vitest
- Playwright
- GitHub Actions
- Linux
Role
Everything: the design, the frontend, the API, the database, the tests, the deployment.
The problem
Three languages, one of them read right to left, and every word on the page stored rather than written in the code — so that adding a language is content and configuration, never a schema change.
Approach
Every stored string is a map keyed by locale with only the default required, and the layout uses logical properties throughout rather than left and right. The alternative — a column per language — was rejected because it makes a fourth language a migration instead of a folder.
Outcome
Live on a VPS behind a reverse proxy with automatic TLS, the administration area on a host of its own, and a test suite of over 1,500 cases that runs on every push.