Case study
My Personal Website
A portfolio, a publishing space, and a continuously evolving technical playground.

I have been building personal websites since my first years studying web development. Each version reflects a different stage of my journey: from discovering frontend development and visual design to building full-stack applications, AI systems and production infrastructure.
Today, mathislambert.fr is more than an online résumé. It is the central place where I can present what I build, document the decisions behind my projects and publish thoughts that need more space than a LinkedIn post.
Several versions, one continuous project
The website has been rebuilt multiple times as my skills and expectations evolved.
- The first versions were relatively simple HTML, CSS and JavaScript portfolios created while I was studying Multimedia and Internet Technologies. Their main purpose was to gather my projects and start building a personal identity online.
- The second version introduced a more deliberate visual direction and a clearer project-oriented structure. It was still mostly a showcase, but it taught me how navigation, hierarchy and presentation influence the way people explore a portfolio.
- Website 3.0 moved to PHP, reusable includes and JSON-backed project collections. Content became easier to maintain, and the website started behaving more like a small application than a collection of static pages.
- The current generation started in February 2025 as a complete technical restart. Its first iteration, completed around August, used a Vite and React frontend connected to a FastAPI backend, MongoDB and Qdrant. It also introduced semantic retrieval, RAG and a conversational assistant able to answer questions about my experience and projects.
- The latest version consolidates everything into a single Next.js application. Public pages, API routes, editorial tools, analytics and authentication now live in the same codebase, reducing maintenance overhead and making the platform easier to evolve.
What the website is today
The current platform is built with Next.js, React and TypeScript, with MongoDB as its main data store and S3-compatible storage for media.
A protected administration interface, secured with NextAuth, lets me manage projects, technical notes, professional experiences and résumé content without editing files or redeploying the application. The editor supports Markdown, syntax highlighting, mathematical notation and Mermaid diagrams, giving me enough flexibility to publish actual engineering notes rather than simplified blog posts.

The website also generates résumé exports and records privacy-conscious usage analytics. For a personal project, content operations matter more than they initially seem: reducing the friction involved in publishing is what keeps the website alive over time.
It also includes a built-in assistant called Nexia. Instead of returning a generic summary, it answers questions using my projects, notes and résumé as its knowledge base, then directs visitors towards the most relevant content. The chat streams responses through SSE and connects to my external ML API, where tool-calling and retrieval workflows ground the answers in my own data rather than relying on the model’s memory.
The source code is available in the GitHub repository.
Shipped like a real service
The application is containerized using a multi-stage Docker build and Next.js standalone output. Tagged releases trigger a GitHub Actions pipeline that builds the image, pushes it to GHCR and deploys it behind Traefik on my self-hosted Raspberry Pi infrastructure.
Website activity, assistant usage and résumé exports are recorded in MongoDB, while the surrounding container stack is monitored through Grafana. This gives me enough visibility to understand how the website is used and investigate issues without turning a personal project into a full observability platform.
The main lesson from rebuilding it several times is simple: maintainability is a feature. Splitting the frontend and backend gave me useful flexibility at first, but moving to Next.js made iteration faster and deployments more boring - in the best possible way.
A public workshop
My goal is not to freeze the website into a finished portfolio. It should remain a well-maintained workshop: stable enough to represent me professionally, but flexible enough to test a new interaction, publish an engineering note or expose a project that does not fit inside a traditional résumé.
It now acts as the long-form companion to my GitHub and LinkedIn profiles. Those platforms show activity and milestones, while this website gives me the space to explain the work itself: what succeeded, what broke, the decisions I made and what I learned while building it.
Built with
- Vite
- React
- TypeScript
- MongoDB
- Qdrant
- OpenRouter
- gpt-oss-120B
- FastAPI
- Python
- LLMs
- Embeddings
- Framer Motion