lupsakko.com

how this works

The second brain, and the choices behind it

The interesting part of this site is a chatbot that answers questions about me. Building it well meant making real engineering decisions — and being able to defend them. That's the point of this page: the bot both tells you about me and shows you how I work.

  1. 01

    You ask a question

    The chat UI streams your question to a server route. Nothing about the model or my data touches the browser — the API key and the context live server-side only.

  2. 02

    The gate runs first — and fails closed

    Before any model call, the route checks that you're verified, rate-limits per person, and caps input length. An unauthorized or over-limit request never reaches the model, so it never costs anything.

  3. 03

    A fixed context, cached as one frozen prefix

    My whole background is assembled into a single context block and cached. Every question reuses the same cached prefix — which is what makes it fast and cheap, and why the answers stay grounded in the same source of truth.

  4. 04

    The model answers — only from what it's given

    It's instructed to answer strictly from the provided background, to say when it doesn't know rather than invent, and to stay on script. A test suite checks exactly that on every change.

why not RAG?

The obvious-sounding move is retrieval — chunk everything, embed it, fetch the relevant bits per question. I deliberately didn't. One person's background fits comfortably in a modern context window, and handing the model the whole thing gives sharper, less fragmented answers than retrieving three chunks and hoping the right one made the cut — for less moving machinery.

The content is kept in clean, separate files, so if the corpus ever outgrows the context window, adding retrieval is a small, isolated change rather than a rewrite. Reaching for the fancier tool wouldn't have made the answers better here — knowing when not to is the actual signal.

Try it — ask the second brain