rithik.ghantasala
← Work/Full-Stack2026

AIDE

LLM schema profiling behind a typed service contract

A lightweight master-data tool that infers each column's semantic type from sample values, flags primary match-key candidates, and returns a confidence score with reasoning. Three services in a strict chain (React client, a Spring Boot proxy, and a Python profiler), with real CI running tests in all three languages.

Verified: each of these is checkable in the repository

3
languages tested in one CI pipelineVitest, JUnit with MockMvc, Pytest, on every push
1
typed endpoint contract between tiersPOST /profile-schema, columns in, typed inferences out
01The problem

Identity resolution starts with knowing what your columns mean, and that knowledge is usually locked in someone's head. Column names lie, and sample values are more honest than schemas.

02How it works

The client parses CSVs locally and sends column names with sample values through a Spring Boot proxy to a Python profiler, which asks a model to infer a semantic type, a confidence score between zero and one, whether the column is a plausible match key, and its reasoning. The middle tier exists so the browser never holds a model credential.

03Decisions worth defending

Why it is built this way

  1. 01A proxy tier so the client holds no credentials

    The browser talks to Spring Boot, which talks to the profiler. It is an extra hop that exists purely so no API key reaches the client.

  2. 02Return confidence and reasoning, not just a label

    A semantic type with a confidence score and an explanation can be reviewed. A bare label has to be trusted or discarded.

  3. 03Test all three tiers in one pipeline

    Vitest, JUnit with MockMvc, and Pytest run on every push. This is the only one of my repos with CI covering multiple languages, and it is the one that made me stop hand-verifying the contract.

04What I took from it
Three languages behind one endpoint made me care about the contract rather than the implementations. Once Vitest, JUnit and Pytest all ran on every push, the tier boundary was the thing being tested, and I stopped hand-verifying that the proxy and the profiler still agreed on the shape of a response.
05Stack
TypeScriptReactViteJavaSpring BootPythonFastAPIClaudeLangChainCloud RunDocker

Next project

Campus Vitality

Student insurance platform, built by a team of five