Every developer portfolio in 2026 has an AI chatbot. Most of them are a fetch to somebody's API with a system prompt that says "You are a helpful assistant representing [name]" — which means latency, token bills, and the occasional confident lie about your own résumé.
I wanted the ChatGPT experience without any of that. So RajeshGPT is scripted, and it's honest about it: ask it something off-script and it says so, then offers to hand your exact message to the human.
The whole brain is one pure function
The entire "model" lives in one TypeScript file: replyTo(input) — a pure function with no React, no IO, and full unit-test coverage. The pipeline:
1. Intent matching by keyword score
Every intent (projects, pricing, hiring, stack, contact…) has phrases worth 2 points and single words worth 1, matched on word boundaries. Highest score wins; ties break by a priority list ordered by actionability — someone asking "price of a project" wants pricing, not projects.
2. Scripted replies in a mini-markdown dialect
Each intent maps to hand-written copy: paragraphs, bullet lists, bold spans. The renderer even tolerates an unclosed ** mid-stream, so emphasis appears live while the answer types out instead of popping in at the end.
3. Chips instead of inline links
No answer dead-ends. Every reply ships with chips — either a link ("View all projects") or a follow-up question the matcher is guaranteed to understand. There's a unit test that asserts every suggested prompt actually resolves. The chat is a conversion funnel wearing a costume.
The theatre is the point
The "AI feel" comes from stagecraft, not intelligence:
- A 650 ms thinking pause before the answer appears
- Word-by-word streaming at ~28 ms per word (instant if you prefer reduced motion)
- A stop button while it streams, exactly where you'd expect it
- A disclaimer that flips the trope: "RajeshGPT is scripted and can make mistakes. The human is more reliable — talk to him."
None of that needed a model. It needed setTimeout, setInterval, and respect for prefers-reduced-motion.
Hallucinations: solved by not having any
❌ LLM chatbot on a portfolio
Pay per token to risk your bot inventing a job you never had, at 2–4s latency.
✅ Scripted chat
Zero cost, instant answers, and it can only say what you wrote. The fallback is a feature: unknown questions get carried, verbatim, into the contact form.
The fallback is my favorite part. When the matcher scores nothing, RajeshGPT admits it's the scripted version and offers a chip that opens /contact?message=<your exact question> — prefilled. Off-script questions become leads.
What shipped this week
The chat just grew a memory it never had: the sidebar's "Recent" list now behaves like saved ChatGPT conversations. Click one and it replays a scripted case study — Consently (DPDPA consent platform), Redactn (enterprise PII redaction), CommentLikeMe (an AI LinkedIn engine that's processed 1M+ tokens) — as a chat transcript, complete with the typing theatre. Type a project's name and you get the same story.
Deep links work too: /?q=what's his tech stack walks in and asks the question for you.
Steal this
If you're building a portfolio in 2026: the chat UI is a genuinely better information architecture than a wall of sections — people ask for exactly what they want, and every answer can end in a call to action. You don't need an LLM to ship it. You need:
- A pure, testable
matchIntent()— phrases score higher than words, ties break by intent priority - Reply copy that ends in chips, never in silence
- Streaming, a thinking beat, and reduced-motion support
- A fallback that converts instead of apologizing
The site is open in your other tab — go ask it something. If it doesn't know the answer, that's a feature. The human replies within 24 hours.