The assistant
It reads my code before it answers, shows you which lines it read, and cannot send or book anything without your click. This sheet is the whole design, including what it will not do.
Path of a question
- 1 / sessionThe browser asks for an anonymous session token. Only its hash is stored, so a leaked row cannot be replayed.
- 2 / contextThe browser keeps the conversation and sends its recent turns with each question. The API trims them to its own limits and stores none of it.
- 3 / toolsThe model may search and read indexed source, move you around this site, draft a message, write a document, or read calendar availability. Tool results are labelled untrusted data.
- 4 / answerTokens stream back as they arrive, with the tool calls that ran, their timings, and the source ranges read.
- 5 / your moveAnything outward-facing waits for you: a message is sent, and a call is booked, only when you press the button.
Tools it can call
| Tool | What it does |
|---|---|
| search_knowledge | Hybrid full-text and vector search over the indexed repositories. |
| read_source | A bounded window of one indexed file, at most 200 lines. |
| list_files | The indexed file list of one repository. |
| show_section | Move you to one of 19 named places on this site. |
| prepare_contact | Draft a message for you to review. It cannot send. |
| create_artifact | Write a Markdown brief, comparison or diagram you can download. |
| get_availability | Read real free slots from Google Calendar. |
| propose_booking | Offer one slot for you to confirm. It cannot book. |
How the code index works
An indexing job clones a pinned commit of each allowed repository, skips vendored, generated, binary, oversized and credential-shaped files, then splits the rest into overlapping sixty-line windows with their detected symbols. Each window is embedded and stored alongside a PostgreSQL full-text index.
A search runs both halves and fuses them by reciprocal rank, so an exact identifier and a described behaviour both find the right file. Every citation names the repository, path, line range and commit, and links to that exact revision on GitHub.
The indexer reads every public repository on the account, skipping forks, archives and anything vendored, generated or binary. It never downloads a file it will not index, and it re-embeds only the windows whose text changed since the last run. Nothing private is touched, and no repository outside that account is ever fetched.
Your data
- storedThe conversation stays in your browser. The server keeps the hash of an anonymous session token, and for 24 hours a copy of each answer, filed under a hash of the whole conversation so an identical conversation is answered without a new model call. For each answer it also records how it went, never what it said: timings, token counts, cost, which tools ran and whether it came from the cache. No account, no name, no tracking cookie.
- deletedClear chat erases the conversation from your browser. On the server, a session goes seven days after last use, a cached answer after 24 hours, a contact draft within the hour, and the per-answer timing records after 90 days. Generated documents expire after seven days and their files are deleted with them.
- sharedMessage text goes to OpenRouter and the model provider it routes to. A message you send goes to Resend. A call you book becomes an event in Jim's Google Calendar. Nothing else leaves.
- bot checkOpening the assistant or sending the contact form runs Cloudflare Turnstile once, which reads browser signals to tell people from scripts. Its script loads when you reach for the assistant or open the contact form, never on a page view.
- never loggedMessage bodies, contact text and credentials stay out of the server logs.
What it will not do
Built with
Astro and a React island on the front, Hono on Node with an OpenAPI schema on the back, PostgreSQL with pgvector for sessions and retrieval, OpenRouter for the model and embeddings, Cloudflare R2 for generated documents, Resend for mail, and the Google Calendar API for scheduling. The API documents itself; every route, event and error shape is in the generated specification.
The reference is public: api.soyebjim.me/docs, with the raw schema at /openapi.json. Sending a request from that page returns 403. Every /v1 route checks the calling origin against this site, and the documentation is served from a different one, so the refusal is the check working rather than a fault.