Back to the portfolio

my own tool

Portfolio assistant

A chatbot that cannot invent my experience

In productionLive on this site

The chat waiting in the corner of this page. It answers only with what this portfolio says: the corpus is generated at build time from the very sources that render the site, travels whole inside the prompt, and there is nothing else. It runs on a Cloudflare Worker with abuse limits, guardrails against prompt injection, and two models racing to answer first.

repeated question
0.9s
fresh question
3.8s
monthly cost
$0
  • It cannot claim anything this site no longer says: the corpus is generated at build time from the very sources that render the site, so publishing is the only way to change what the assistant knows.
  • Two layers against prompt injection. The system ignores instructions arriving inside the question, and an output filter removes any link or address that is not mine before it reaches the screen — even when the model was talked into offering one.
  • That filter survives streaming, which is the hard part: a link can only be judged whole, so nothing is published until the word after it has begun. The property is checked against every possible cut of the text rather than a chosen one.
  • When the first model takes longer than four seconds, the second starts alongside it and whichever answers first wins. The mean fell from 8.3s to 3.8s and the worst case from 13.0s to 5.8s.
  • A repeated question comes back from cache in under a second without spending any provider quota, and publishing the site invalidates the entries by itself because the corpus is part of the key.
  • Zero cost and no card: Workers, Durable Objects on SQLite, AI Gateway and the Google AI Studio free tier.

My role: I designed and built all of it — the widget, the endpoint, the guardrails, the measurements that decided every setting, and the ADR explaining why.