resume
last updated sep 2026. read it here, or grab the pdf.
summary
Software engineer with a year of production experience on a B2B SaaS platform, working on offline-first sync and workflow automation. Builds LLM systems independently and ships them: live, open source, and measured on a hand-written test set rather than a demo, including a result where the evaluation ruled against the design that shipped and I published it anyway. Targeting applied AI engineering roles across agents, RAG, and evaluation.
experience
- metquay inc · software engineer (calibration-management saas for labs)jun 2025 - present
- Built the async layer of the platform's MCP server, the part that lets AI assistants call its REST API. Handles authentication, retries and region routing, and writes error responses a machine can act on, so an agent recovers from a failure without a person.
- Shipped the offline layer so field technicians can finish a full calibration with no internet. Changes save on the device and upload on reconnect, and a single flush carries 1,000+ records with concurrency capped so the backend keeps up.
- Wrote a small language for calibration formulas, parser and type checker through to the in-app editor, so the editor rejects a bad formula before anyone runs a calibration with it.
- Automated the handoff between pull requests and the issue tracker, so a ticket moves with the pull request that references it and a set of checks a reviewer used to run by eye now runs on its own.
- zerone consulting · software development internjan 2025 - may 2025
- Implemented secure sign-in and role-based permissions on a tuition-management platform: three roles, each with its own views and actions.
- Created the React views for each role, so a student never sees what a teacher can do.
open source
- kestra · 27,800+ stars, workflow orchestration. hacktoberfest 2025 supercontributor
5 merged pull requests into the core repository, including migrating Vue components to TypeScript and the Composition API, fixing re-render flicker on the flow-dependency graph, and reworking keyboard interaction on trigger filters.
- kestra todoist plugin · created from scratch
1,300+ lines merged into the kestra-io organization.
projects
- ai ticket triagelive appsource code
- Built an agent that drafts a reply to each support ticket and decides who sees it: classify the ticket, retrieve similar resolved cases, draft an answer, score that answer, then route it to auto-send, human review, or escalation. Failures are recorded as state rather than thrown, so a ticket that cannot be classified stops early instead of paying for a draft nobody will use.
- Grounded every draft in 3,400 previously resolved tickets, retrieved by running semantic and keyword search together. Weak retrieval is caught from raw similarity rather than the merged score, which stays high even when nothing relevant came back, so those tickets escalate instead of getting an invented answer. A second model from a different vendor then checks each draft against the cases it cited, and caught 3 fabricated claims in development.
- Measured on 60 hand-labelled tickets, 27% non-English and 5 deliberately adversarial: 95% intent accuracy, 100% language accuracy, ₹0.05 per ticket. One prompt fix moved classification from 87% to 97%. Replaying all 60 recorded routes showed the checker alone scored better than the shipped three-signal blend, 0.800 against 0.778, and both numbers are published. 120 tests, strict typing and linting in CI.
- Deployed on Cloud Run, where the default settings silently broke it: the endpoint replies immediately and finishes the work in the background, so CPU was being cut the moment the response went out and every ticket stalled unfinished. Spend is bounded by a billing killswitch; p95 is 39-48s on a path nothing waits on.
langgraphfastapipydantic v2postgresql + pgvectorpsycopg3langfusestructlogreactgcp cloud rundocker composeuv - startupindexlive appsource code
- Built a RAG system over 116 Indian startups where every answer cites the chunk it came from, and a question the corpus cannot answer gets a refusal naming the source that was checked rather than an invented answer. Written without LangChain so that ranking, fusion and citation behaviour stay under direct control.
- Automated the corpus build so the dataset refreshes in one call, scraping Wikipedia's unicorn list and Y Combinator's India directory, then deduplicating, chunking and embedding the records into Postgres with pgvector and tsvector alongside.
- Benchmarked three retrieval modes on a 41-question golden set: plain vector 0.839 hit@5, against 0.774 for hybrid with a cross-encoder and 0.613 for hybrid alone. Shipped the mode that measured best and published all three with the numbers behind them.
- Scored generation with a hand-rolled LLM judge (claude-haiku-4.5): faithfulness 0.909 and abstention 1.000 across the 10 deliberately unanswerable questions. The cross-encoder costs 7,033 ms against 145-155 ms for every prior stage, so the interface streams each stage as it resolves.
pythonfastapipostgresql + pgvectorbge-small-en-v1.5bge cross-encoder rerankernext.jsturborepogcp cloud runuv
skills
education
- vellore institute of technology (vit)
Bachelor of Technology in Electronics and Communication Engineering · CGPA 8.29/10
2021 - 2025 · vellore, india
certifications
- aws certified cloud practitionerview credential
Cloud services, security, and architecture.