Rasveda Labs Case study · Portfolio

ingredients.help

Food additives, in plain language

Know what’s really in your food.

Look up any additive and read it in plain language — then drop two or more into the Laboratory to see how they actually interact. Some pairings are risky, some are helpful, and where nobody knows yet, the answer is an honest “unknown” — never a comforting guess.

Role
Product · Content · Full-stack engineering
Stack
Next.js 14 · React 18 · TypeScript · Supabase
Status
Working MVP
The idea

A label you can actually read.

The back of a food package is a wall of E-numbers and chemistry. Most “is this bad for me?” answers online are either fear-mongering or hand-waving. ingredients.help sits in the middle: a hand-curated catalog of food additives, each explained across five plain-language sections — Origin, Usage, Safety, Properties and Regulation — with real ADI values, IARC classifications and regulatory notes, written for a person, not a chemist.

But an ingredient rarely acts alone. The product’s real question is what happens when additives meet — and that’s the Laboratory.

The founding principle

No data never means “safe.” When a combination isn’t in the evidence, the app says unknown — out loud.

What it does

Four things, done honestly.

01

Plain-language catalog

30 curated additives (E-numbers) across 8 categories — preservatives, sweeteners, colorants, thickeners, acidulants, antioxidants, emulsifiers, flavor enhancers — each with formula, concern level, aliases and the five-section explainer. Pages are statically generated.

02

The Laboratory

Add two or more additives, press Analyze, and a deterministic engine checks 20 documented interaction rules — surfacing the single highest-risk finding, from harmful reactions to intentional beneficial synergies. Your bench persists locally between visits.

03

Search that doesn’t guess

An exact-match resolver for names, E-numbers and synonyms sits on top of fuzzy search, so “sorbate” returns an honest ambiguous (E200 vs E202) rather than silently picking one. Typo-tolerant, never over-confident.

04

Save & revisit

Sign in (optional) to save combinations and keep a recently-viewed history — each saved analysis frozen as an immutable snapshot, so it stays explainable even after the rules are updated.

The Laboratory

Two additives in. One clear verdict out.

Every result rides a four-step risk meter — Low → Moderate → Elevated → High — plus a distinct state for “unknown.” Two real examples the engine actually encodes:

Sodium benzoate E211 Ascorbic acid E300 · vitamin C
Can form benzene High

Together, and especially with heat or light, benzoate and vitamin C can react to form benzene, a known carcinogen. Condition-gated, but flagged even when conditions are unstated — at reduced confidence.

Guar gum E412 Xanthan gum E415
Synergistic thickening Beneficial

Not every interaction is a warning. These two gums reinforce each other, giving more viscosity together than apart — an intended pairing, and the meter says so plainly.

Under the hood

Built to stay honest.

A

Deterministic rule engine

A pure, unit-tested function evaluates 20 rules with pair, set and category scopes. Same inputs → same verdict, every time. No model in the loop, no black box — the reasoning is inspectable.

B

Conditions, weighted

Rules can be gated on heat, pH, light or personal sensitivity. When context is missing, a gated rule still surfaces — at halved confidence — so a real risk is never silently hidden.

C

Immutable, versioned snapshots

Every analysis stamps its engineVersion and rulesVersion and freezes the ingredients it used. Old saved results stay explainable even after the rulebook moves on.

D

Ambiguity over guessing

The name resolver returns exact, ambiguous or none — the seam a future label-scanner will lean on to avoid confidently misreading a package.

Design language

Soft laboratory.

Warm paper, ink-green text and a calm sage-and-mint accent — clinical enough to feel trustworthy, soft enough to feel human. Headings in Fraunces, body in Inter. The risk scale is a fixed, color-blind-considered ramp from sage to clay so a verdict reads the same way every time.

Paper · #F7F5EE Sage · #5C8E54 Mint · #A8D5BA Ink · #1F2A24
  • Fraunces + Inter
  • Paper & ink-green
  • Sage / mint accent
  • Fixed risk ramp
  • Hand-drawn beaker mark
The build

Stack.

Next.js 14 (App Router · React 18) with TypeScript and Tailwind. The catalog and engine run fully client-side with no backend required; Supabase is optional, adding email/password accounts, saved combinations and view history. Zustand persists the Laboratory bench, Fuse.js powers fuzzy search, and Vitest covers the deterministic core. There is no AI in the product today — label OCR and generated explanations are deliberately marked as future work, not shipped as claims.

Next.js 14React 18TypeScript Tailwind CSSZustandFuse.js Supabase (optional)Vitest
Status
Working MVP

Real core, honest roadmap.

The catalog, search, Laboratory and the deterministic engine all work today, with the interaction core covered by unit tests. Accounts and saved history are wired through Supabase. What’s not built yet — and isn’t pretended to be:

  • Label OCR / photo scanning of ingredient lists
  • AI-generated explanations and barcode lookup
  • Product comparison and dietary-preference filtering
  • User settings (the table exists; the UI is still to be wired)

Choose with knowledge, not guesswork.

Back to the portfolio