One React component, two modes. A collapsed hero input embedded in the page, and a full conversation overlay it expands into. No separate widgets.
By Stefan Heißenberg
Get to know me faster.
Fifteen years designing digital products across agencies, consulting, startups, and enterprise. Ask questions and find out directly what you need to know.
You just talked to it.
Here’s how it works —and how you’d fork it for yourself.
One React component, a twelve-file knowledge base, and a request path you can read in a single glance.
It’s open-source, EU-region by default, and built on opinionated defaults instead of configuration. Clone it, point it at your own story, ship it on a hobby plan. Everything below is real and verified against the repo.
Five things you can fork.
Most projects give you one thing worth copying. This one gives you five — each lifts out on its own.
Visual identity lives entirely in CSS custom properties on data-theme blocks. One data-theme on the host recolors the whole page — chat hero and docs together — with no theme branching in component code.
Per-company calibration files live in Upstash, matched by keyword, lifecycle-gated so withdrawn applications drop out automatically. The public component never carries your private targeting.
A method for writing those context files in your own voice — without leaking who you’re applying to. Context entries live in Upstash and are matched at runtime — the count changes as applications move through their lifecycle.
The component handles its own embedding; the host only controls layout. Drop it into any page and it brings its own everything.
How it works, end to end.
A single request, left to right. No vector database — the whole knowledge base fits in the context window.
<Chat /> — three lines of markup.ctx:* keys in Upstash, injects the matched company file if one fires.Integrate it in four steps.
Concrete, in order, with the real shapes. The host page is the punchline.
- 1
Fork & install
Clone the repo,
npm install. Standard Next.js app — nothing exotic. - 2
Set your environment
ANTHROPIC_API_KEY, Upstash Redis URL + token, Langfuse keys.Env vars must not be wrapped in quotes — Next.js fails open silently if they are.
- 3
Pick or write a theme
Pass the
themeprop; or add adata-themeblock of CSS variables for your own identity. - 4
Embed it
The host page is this short →
import { Chat } from "@/components/chat/Chat";
<section
style={{ ["--chat-hero-min-height-desktop"]: "100dvh" }}>
<Chat theme="dark-tokyo" />
</section>The proof, not the pitch.
Behavioral facts, all verified against the repo. No best-in-class adjectives.
Boundary testing, company context, factual accuracy, persona adherence, response quality, safety & jailbreak. Run as a CI gate.
Redis and Langfuse both in Frankfurt. No third-party ad trackers.
Every conversation traced in Langfuse, grouped into session replays.
A sliding window per IP, enforced on the API route before any model call.
Vercel Hobby, Upstash free tier, Langfuse Hobby, a Haiku-class model.
Prompt-stuffed knowledge base with caching. Simpler, cheaper, and the whole story fits in context.
This stands on the foundation of Santiago Fernández’s cv-santiago — the dual-mode chat idea and the thin-embed pattern started there. Forked forward, themed, and extended.