I'm a full-stack developer from Bengaluru, India who builds with React, Node.js, Express, MongoDB and PostgreSQL, and I've spent the last few months going deep on how AI backends actually work: embeddings, vector search, RAG, conversation memory, streaming and structured LLM output.
I like building things end to end and shipping them. Every project below is live, deployed on free-tier infrastructure, and has a README that explains the why behind the decisions, not just the features.
const shiv = {
role: "Full-Stack Developer",
basedIn: "Bengaluru, India ๐ฎ๐ณ",
education: "B.Tech CSE, Lovely Professional University (2024)",
stack: ["TypeScript", "React", "Node.js", "Express", "PostgreSQL", "MongoDB"],
ai: ["RAG", "Embeddings", "pgvector", "SSE streaming", "Structured output + Zod"],
nowLearning: ["BullMQ + Redis", "Agents & tool calling", "Vitest + Supertest", "Docker"],
consistency: "300+ day GitHub streak ยท 100+ days of DSA",
openTo: ["Full-Stack", "AI Backend", "Frontend"],
};|
Upload a PDF, chat with it, get quizzed on it. An AI backend built from scratch to understand how AI products work under the hood. No LangChain, no LLM SDK: just Express, Postgres and plain HTTP calls to Gemini, so every piece is visible.
|
flowchart LR
A[๐ PDF upload] --> B[Parse text]
B --> C[~500-word chunks]
C --> D[Gemini embeddings<br/>3072-dim]
D --> E[(Postgres + pgvector)]
Q[๐ฌ Question] --> F[Embed question]
F --> E
E -->|top-3 by cosine distance| G[Prompt: chunks + last 8 turns]
G --> H[Gemini]
H -->|streamed over SSE| U[โ๏ธ React UI]
- ๐ Ingestion pipeline: PDF โ text โ chunks โ Gemini embeddings (3072-dim) โ pgvector, each chunk tagged with its document
- ๐ RAG chat over one PDF or all of them, with the source passages (and which file they came from) shown under every answer
- ๐งต Conversation memory in Postgres: the last 8 turns go into every prompt, and a page refresh resumes the same chat
- โก Live streaming over SSE, parsed by hand from Gemini's raw byte stream with an async generator
- ๐ Quiz generation with Gemini's structured-output mode, validated with Zod, retried once on bad output, options shuffled in code, graded in the browser
- โ๏ธ Deployed on free tier: API on Render, frontend on Vercel, Postgres on Neon
๐ Engineering decisions worth knowing
- Validate the model like any untrusted client. Every quiz goes through a Zod schema before it's used. The model was valid 17/17 times in testing, so it's insurance, and a gallery of deliberately broken replies proves what it catches.
- Valid isn't the same as good. Across 50 generated questions the correct answer landed unevenly (one slot 36%, another 10%), so options are shuffled in code (FisherโYates) after validation instead of trusting the model's habits.
- Retry once, then fail honestly. Two attempts max, then a clean
502. Never an endless loop. - Errors travel inside the stream. Once an SSE response starts, its status code is already sent, so failures go out as an in-band
errorevent. - Readable errors. A failed vector query from Drizzle dumps all 3072 embedding numbers. A small helper prints just the message, the underlying cause, and the line in the codebase where it broke.
- Routes โ services โ repositories. Only repositories touch SQL, and services never touch
req/res, so the same pipelines can later run inside a background worker.
โณ The API is on Render's free tier, so the first request after it's been idle can take up to a minute while it wakes up.
๐ฌ CinegraphAI movie, TV & anime recommender
|
โ๏ธ TaskForgeSecured REST API + React task manager
|
๐ฅ BharatDietPersonalized nutrition for real Indian food
|
๐ BiteSwiftSwiggy-style food delivery app
|
| Project | What it is | Stack | Links |
|---|---|---|---|
| ๐ Portfolio | 6 themes (WCAG AA checked), live GitHub dashboard with a contribution calendar, project case studies, 33 UI experiments, contact form via a Netlify Function | React, Vite, Tailwind v4, Framer Motion | Live ยท Code |
| ๐ BookVerse | Book discovery with debounced search by title, author or genre, trending lists and detailed book pages | React, Tailwind CSS, Open Library API | Live ยท Code |
| ๐บ๏ธ Where Is Your Country | One of my early builds for exploring countries of the world | JavaScript | Live |
| Languages |
|
| Frontend |
|
| Backend & Data |
|
| DevOps & Tools |
|
| AI & Libraries | |
| Learning now |
- Understand it, then build the smallest real version. DocMind has no framework doing the interesting parts on purpose, so I know what RAG, streaming and structured output look like underneath.
- Treat model output as untrusted input. Validate it with a schema, cross-check it against real data, and never let a hallucinated result reach the user.
- Secrets stay on the server. API keys live behind a proxy or backend, never in the browser bundle.
- Ship it, then document the why. Every project is deployed and has a README that explains the tradeoffs, including known limitations.
- Free-tier first. Render, Vercel, Netlify, Neon, Firebase and Cloudflare Workers, no card required.
I'm open to Full-Stack and AI Backend roles. If you're building something with LLMs, APIs or real users, I'd love to talk.


