RaphaelMontico.fr
Next.js, FastAPI, PostgreSQL, pgvector, RAG, Gemini, Langfuse, AWS S3, CloudFront, App Runner
RaphaelMontico.fr is my personal portfolio, designed as an "AI-native" project: beyond the classic presentation of my background and projects, all site content (pages, experiences, projects) is indexed to be queried via a RAG (Retrieval Augmented Generation) chatbot.
This site serves as both a showcase and an experimentation ground for me to implement an end-to-end AI architecture: content ingestion, semantic search, retrieval-augmented generation, and cloud deployment of a decoupled frontend / AI backend system.
Features
- Bilingual portfolio (FR/EN) presenting my background, professional experiences, and personal projects
- AI assistant backend (RAG) capable of answering natural language questions about my profile, projects, and technical choices, relying on the actual site content (streaming responses) — chat interface integration currently being finalized on the frontend side
- Semantic search API across all content (pages, experiences, projects), beyond a simple keyword search
- Response generation via the Gemini language model
- Full traceability (observability) of the RAG pipeline with Langfuse: end-to-end traces from user query to streamed response, cost and latency tracking
Architecture & Technologies
- Frontend: Next.js (App Router), TypeScript, Tailwind CSS 4, next-intl (i18n), MDX content (
gray-matter+next-mdx-remote), static export - Backend: FastAPI, SQLAlchemy async + asyncpg, Alembic
- Database: PostgreSQL + pgvector for embedding storage
- AI: Gemini embeddings, Gemini LLM, streaming responses (SSE)
- Observability: Langfuse (SDK v4, based on OpenTelemetry) for tracing LLM calls and the RAG pipeline
- Infrastructure: static frontend on S3 + CloudFront, containerized backend on AWS (API Gateway/App Runner), ingestion and CI/CD pipeline via GitHub Actions
Key Points
- Design of a decoupled architecture: the frontend remains 100% static, with all AI logic (retrieval, LLM call, embeddings) residing in a separately deployed backend
- Implementation of a dedicated ingestion pipeline transforming the site's MDX content into chunks and then into embeddings stored in pgvector
- Implementation of an LLM provider abstraction interface allowing models to be changed without impacting the rest of the system
- Implementation of a complete CI/CD pipeline (lint, tests, build, frontend/backend deployment, re-ingestion on content change)
- Integration of Langfuse to trace the entire RAG pipeline, including the propagation of OpenTelemetry trace context through streaming responses (a delicate point specifically handled to avoid breaking the trace tree)