Reach out via email
Chat agent about me

Portfolio Chat is a chat agent I built for my own site. Anyone who lands here can ask it about me and get a real answer. It knows my professional background, the work I've done and the projects in this lab.
I didn't want it to feel like a random chat box stuck in a corner. The idea is that it works like a person who knows me well and can point you in the right direction.
A portfolio makes people do the work. They open a page, scroll through projects, and try to piece together who I am and what I actually do. Most visitors don't have the time for that, and some don't know what to look for.
So I wanted to flip it. You ask a question, and you get an answer. You can find out what I do, how I work, and what I've built, and if it feels like a fit you can reach me right there without hunting for a contact page.
That last part matters to me most. The goal is for the chat to lead somewhere, whether that's getting to know me better or starting a conversation with me.
The agent doesn't guess. It looks things up first. I split my own content into small chunks, turned each chunk into an embedding with OpenAI's text-embedding-3-small, and stored them in Supabase using pgvector.
When you send a message, it goes through the same process. Your question becomes an embedding, and Supabase finds the chunks that are closest in meaning using cosine similarity. The top matches are handed to the model along with your question, so the answer is built from what I've actually written about myself.
A short core profile of me is added every time, whatever you ask. That way the basics are always there, even when your question doesn't match any chunk well.
Follow-up questions needed some care. If you say "tell me more" or "what are those", that message alone means nothing to a search. So the lookup is built from your last few messages, which lets a follow-up keep the context of the conversation.
Each visitor can send 50 messages an hour. That limit is tracked per IP with Upstash, and it stops one person from running up costs or hammering the agent. If someone hits it, they get a friendly message and my email instead of an error.
I also made sure one broken piece doesn't take the chat down. If the rate limiter is down, people can still chat. If the lookup fails, the chat keeps going with the core profile alone. It's less sharp in that case, but it still works.
The best way to understand it is to talk to it. Ask what I do, ask about a lab project, or ask how to get in touch. It lives at chat.rtstic.dev.