back to the résumé

How the Ask box works

The Ask box answers questions about my background using Markdown files I've written. It doesn't search the web.

your browser │ question + a verification token ▼ Cloudflare edge ──tunnel──▶ nginx ──▶ a small TypeScript service │ corpus + system prompt ▼ the model ──streamed back──▶

A small TypeScript service, built with Hono and Node, runs on a VPS behind a Cloudflare Tunnel. It sends the question and my background files to the model, then streams the answer back.

Source material

All the files currently fit in the model's context window, so each question gets the full set. I considered searching for relevant excerpts first (RAG), and might still try it as an experiment, but sending everything is simpler for now.

The files are split into core/ and detail/, so I can add retrieval for the detail files if the collection gets too large or expensive to send.

The prompt tells the model to answer from those files, say when something isn't covered, and ignore requests to override those rules. It can still make mistakes, and the answers depend on how well I've written the source material.

Usage limits

To limit abuse and keep costs manageable:

The server checks each Turnstile token's hostname and action as well as its validity.

Model selection

I can change the model or provider in a config file without restarting the service. Requests already in progress finish with the model they started on.

Clients can only request configured aliases, which keeps them from selecting arbitrary models at my expense.

Agent access

An MCP server at ask.anthonyrizk.me/mcp exposes ask_about_anthony, a tool that uses the same files and prompt as the web box.

You can add it to Claude or another MCP client to ask about my background from there. Setup instructions.

Each request is independent, just like in the web box. Your agent keeps the conversation context and can ask follow-up questions.

The MCP endpoint is public and doesn't use Turnstile. It has stricter rate limits, a question-length limit, a generation deadline, and a daily spending cap below the website's. That lets it stop accepting agent requests while leaving budget for visitors using the Ask box.

Testing

I use thirteen test questions to check response time, answer length, and expected facts across models. Five check that the model declines unsupported or unrelated questions, including requests to invent an employer or ignore its instructions.

Those checks catch specific errors. I also read answers side by side to judge their accuracy, tone, and usefulness.