The box under the headline on this site is not a mailto with better styling. It is a working AI agent: it knows what I build, it remembers your conversation, and if typing gets slow you can ask it to call you: the voice on the phone is the same brain, mid-thought, not a second bot starting over.
This post is the thinking behind that choice, because the choice is the portfolio. Anyone can write "I build AI agents" on a landing page. The only proof that survives contact with a visitor is the agent itself.
A contact form is a queue
Every agency site ends the same way: a form, a promise to "get back to you within two business days," and silence. The visitor does the work: they summarise their problem into a textarea, guess what information I need, and wait. The form's real function is to move my convenience ahead of theirs.
An agent inverts that. You ask the awkward question at 23:40, "what would this roughly cost," "can this even work with our stack," "are you just a wrapper around ChatGPT," and you get a straight answer now, from something that has actually read what I do. If the answer is worth a conversation with the human, thirty minutes on my calendar is one click away. If it isn't, you just saved us both an email thread.
What it actually does
- It chats without a signup. No account, no cookie wall before the first answer. First words typically land in under a second.
- It remembers. Make an account and the conversation survives the visit: come back a week later and it picks up where you stopped, instead of greeting you like a stranger.
- It talks. One tap escalates the chat to a real phone-style call. Same agent, same memory: what you typed five minutes ago is context on the call. Switch language mid-call and it follows.
- It writes things down. After a real conversation it can produce a scope note, a private write-up at an unguessable link, made to be forwarded to the colleague who wasn't in the room.
The knowledge under all of this lives in plain files in the same repository as the site. The services grid you scroll past and the pitch the agent gives you are read from one registry, so they cannot drift apart:
// One source of truth, two readers.
export const SERVICES = [
{ id: 'agents', title: 'AI agents', pitch: '…' },
{ id: 'voice', title: 'Voice AI', pitch: '…' },
// …the grid renders these; the agent's instructions quote them.
]
That is not a trick, it is the whole method: when the copy changes, the agent changes in the same commit. A chatbot that contradicts the page it sits on is worse than no chatbot.
What it deliberately refuses
An agent on a public page spends real money on every reply, so it has a budget checked before each turn, not a vibe. When a ceiling is reached it says so and stops. When you are out of free call minutes, it tells you when they come back instead of pretending the button is broken. No dark pattern where the "upgrade" dialog is the only door out of every refusal.
It also does not pretend to be me. It says what it is, it escalates to a human when the question deserves one, and the write-ups that matter carry my pen or say plainly that they are still waiting for it. A visitor should never wonder whether an AI just promised them an architecture.
Eat your own cooking
Here is the uncomfortable question for anyone selling AI services: if an agent is good enough for your clients, why isn't one answering your own front door?
Mine is. It runs on the same patterns I ship for clients: one agent brain behind text and voice, retrieval over files that live next to the code, budgets enforced server-side, evals before launch. When something breaks, I am the first user to feel it. That feedback loop is the least glamorous and most valuable part of the whole build.
If you want to see how it holds up, don't take this post's word for it. Close the tab menu, scroll up, and ask it something awkward.

