An AI chatbot that recommends essential oils from the brand's own catalogue and knowledge base, in compliant language.
Terra is a chat assistant on TrueTerra Oils' site. Customers describe what they need; Terra recommends products and explains how to use them, answering only from TrueTerra's own product data — a knowledge base of 2,446 articles plus the product catalogue. Every answer follows strict FDA-compliant wording. Built with retrieval-augmented generation (OpenAI embeddings and MongoDB Atlas vector search), a Node.js and Express API, and a React and TypeScript chat interface.
- Year
- 2026
- Stack
- React · TypeScript · Node.js
(How it works)
Animated illustration of the real flow, with sample data — not a live system.
(What I built)
- 01Chat assistant 'Terra' that recommends products
- 02Answers from 2,446 articles and the product catalogue
- 03FDA-compliant wording on every answer
- 04Conversation history per user
- 05Fast repeat answers with an in-memory cache
Process
(Problem → what I did)- 01
Problem
Turning 2,446 Markdown files into a searchable knowledge base.
What I did
- Built an ingestion pipeline that chunks the text and generates OpenAI embeddings.
- 02
Problem
Every answer had to use FDA-compliant language.
What I did
- Wrote system prompts with strict compliance rules and the brand's voice.
- 03
Problem
Recommending the right products from a large catalogue.
What I did
- Parsed the product catalogue spreadsheet into structured MongoDB documents for semantic matching.
Show all 5 stepsShow less
- 04
Problem
Keeping context across several conversation threads per user.
What I did
- Stored conversations per user, with TanStack Query managing state in the app.
- 05
Problem
Answering fast from a large vector database.
What I did
- Added an in-memory cache with a time limit, so repeated searches skip the database.
The product
5 screens from the real product. Click any screen to see it full size.
(Shipped)
Terra is live on chat.trueterraoils.com: customers can ask about the whole catalogue and 2,446 articles in plain conversation, and every answer stays inside the brand's compliance rules.

