Kaveen Hyacinth · full-stack engineer · AI-native products · Colombo

Most AI features never make it past the demo.

I'm a full-stack engineer. I take the AI part of a product, like the chat, the search or the assistant, and build it properly: the UI, the API, the prompts, the evals, on whichever TypeScript backend fits (Next.js, Express or NestJS), over REST or GraphQL.

Hi, I'm Scout. Scroll, it's a story.
the demo
Works on my laptop
prompt.txt
one happy path
streaming uiauthyour dataevalscostedge cases
this part is my job
the product
Used by real people
traced · evaluated
fails gracefully
ch.01the foundation

Before AI, there was a lot of product.

Five years, four teams, four countries. Fintech screens that couldn’t be wrong, visual builders that had to feel simple, platforms that had to scale with the team. That’s the part of the job AI doesn’t replace. It’s the part AI depends on.

5+
Years shipping
20+
Modules launched at Blott
4
Countries worked across
  1. 2017–2021 · UK / LK

    BSc (Hons) Software Engineering · University of Plymouth

    Foundation year at NSBM, then a First Class degree. Went straight from graduation into shipping.

  2. 2021 · CabbageApps · Sri Lanka

    Fintech, web and mobile.

    Learned that money UIs have zero tolerance for "almost right". React and React Native, from associate to engineer.

  3. 2022 · Appspotr · Sweden

    Visual builders for app logic.

    Led Structure Builder 2.0 and Logic Builder, with drag-and-drop flows and logic blocks. Turns out designing workflows is great practice for designing agent pipelines.

  4. 2023 · Inisev · Switzerland

    Backend services, then a team to lead.

    NestJS and AWS backend services part-time; full-time, led the frontend team migrating a large platform to server-rendered Vue and Nuxt.

  5. 2025–now · Blott · UKcurrent

    Senior Software Engineer.

    Architected a React, Next.js and TypeScript B2B operations platform: 20+ modules for field workflows, on a frontend built to scale with data-heavy tooling.

ch.02the shift

Then every product wanted to talk back.

Users started expecting to ask, not click. Teams wanted assistants, summaries, search that understands. Calling a model turned out to be the easy part. It’s an API. The hard part is everything around it, and that’s ordinary full-stack work done carefully.

ops-platform / assistantillustration
Which jobs in the north region slipped this week, and why?
●tool · searchJobs({ region: "north", status: "late" })
Three jobs slipped. Two were waiting on parts job-218 job-224, one was rescheduled by the customer job-231
streamed via AI SDK·sources cited·trace → Langfuse or similar
the job, honestly
  • Integrate model APIs: Anthropic, OpenAI and AWS Bedrock from TypeScript, behind the Vercel AI SDK so the provider stays swappable.
  • Design and tune prompts: versioned, reviewed, tested against real inputs.
  • Build agent pipelines: tool calling, multi-step flows, orchestration with limits.
  • Wire up RAG: embeddings and retrieval over your own data, with citations.
  • Trace and evaluate: Langfuse or an alternative like Braintrust/LangSmith for traces, datasets and evals before anything ships.
  • Keep it secure and responsible: prompt-injection defences, PII redaction, least-privilege tools, human sign-off before writes, and evals for refusals and bias.
not my lane (yet)
training modelsPython ML stacksSelf-hosted open models

I’d rather tell you here than in the interview.

“The model is an API call. The product is everything around it.”

the working theory
ch.03how one ships

Anatomy of an AI feature, the way I build it.

Six steps, any TypeScript backend. Scroll, and the diagram fills in as we go.

request path01 / 06
Screen React · useChat
step 01 / 06

Start at the screen, not the model.

What does the user actually need to do faster? Most of the work is deciding where AI belongs, and where a plain button is better. Then a streaming UI with real loading, error and empty states.

ReactNext.jsstreaming UI
// app/assistant/page.tsx
const { messages, sendMessage } = useChat();
step 02 / 06

Pick a provider. Don’t marry it.

The Vercel AI SDK gives one interface over Anthropic and OpenAI, so switching models is a config change, not a rewrite. Streaming, retries and timeouts live in a normal API handler: a Next.js route, an Express endpoint or a NestJS controller. Stream it over SSE, or through a GraphQL subscription if that’s your API style.

Vercel AI SDKAnthropic APIOpenAI API
// assistant.controller.ts
const result = streamText({
  model: anthropic(MODEL),
  messages,
});
return result.toUIMessageStreamResponse();
step 03 / 06

Treat prompts like code.

Prompts get versions, reviews and a label for what’s live. I iterate on them against saved real inputs instead of vibes, and roll back when a change makes things worse.

Langfuse promptsBraintrustLangSmithtemplates
// lib/prompts.ts
const prompt = await langfuse.getPrompt('triage', undefined,
  { label: 'production' });
step 04 / 06

Give it the right context.

RAG over the product’s own data: chunk, embed, store in Postgres with pgvector (or a document store like MongoDB), retrieve the few things that matter. Answers carry the ids of what they used, so the UI can show sources.

embeddingspgvectorPostgreSQLMongoDB
// lib/retrieve.ts
const docs = await retrieve(query, { k: 5 });
// pgvector · cosine · return ids to cite
step 05 / 06

Let it use tools, within limits.

Agent pipelines are typed functions the model can call, a hard cap on steps, and a human confirmation before anything writes. Orchestration is mostly careful plumbing.

tool callingmulti-stepguardrails
// assistant.service.ts
tools: { searchJobs, createTicket },
stopWhen: stepCountIs(5),
step 06 / 06

Measure before you trust it.

Every request is traced. A dataset of real cases runs as evals before a prompt or model change ships, so “it feels better” becomes a number. Then it ships behind a flag.

Langfuse tracesBraintrustLangSmithdatasetsevals
// instrumentation.ts
experimental_telemetry: { isEnabled: true },
// → traces, datasets, evals in Langfuse or an alternative like Braintrust/LangSmith
ch.06to be continued

The next chapter needs a product.

I'm looking for a full-stack role on a team building AI-native products, somewhere I can own a feature from the database schema to the streaming UI, and make it trustworthy.

or press ~ and type contact