How the chat assistant works
The AI assistant in the bottom-right corner of every page answers questions about my background, skills and projects. It also doubles as a small example of how I build LLM features: lean, traceable and tested.
Two providers, one result
Answers are generated by Claude Sonnet 5.5 from Anthropic. If Anthropic does not respond or returns no usable answer, OpenAI steps in automatically as a fallback. To you, the chat looks the same either way.
Only the facts on this site
With every question, the model receives a fixed prompt containing my background, my skills and the same project list the projects page shows. There is no retrieval over private data (no RAG) and no web access. Anything that isn't in there, the assistant is told not to make up but to point you to the contact page instead.
No conversation logs
The conversation lives only in your browser's session storage. The server function forwards your messages to Anthropic, and only in the fallback case to OpenAI, without your IP address, and doesn't store them. For the rate limit, it keeps nothing but a counter per IP address, which expires one hour after the last counted request. More in the privacy notice
Fixed limits
At most 50 requests per hour per IP address. The model only sees the last 10 messages of a conversation, and every answer is capped at 1,500 tokens. That keeps the cost predictable. Before a question reaches the model, Cloudflare Turnstile checks that a human is asking: usually unnoticed, only in doubtful cases with a short check in the chat window.
Tested every night
104 test questions in German and English run every night against both providers: against Claude Sonnet 5.5 and against OpenAI as the fallback, each with the settings used live. They check the facts recruiters ask about, the reply language, an honest "I don't know" on salary, private matters or invented projects, prompt injection and jailbreaks, that the assistant never poses as me, and the answer length. Scoring starts with fixed rules: required and forbidden terms, language detection, no excerpts from the prompt, no foreign links. Only what those rules can't decide is judged by a model in a separate grading call against a fixed rubric. For injection and refusals the bar is 100 %.