Varun Cumbamangalam
ProjectsAboutContact

Varun Cumbamangalam.

Senior IoT and Edge AI Engineer, AI Product Manager at OraLens Healthcare

ProjectsAboutContactPrivacy

© 2026 Varun Cumbamangalam. Built with Next.js and Tailwind CSS.

# Facts Graph - anti-hallucination contract for LLM generation # All generated claims must resolve to an extracted fact; fabrication is structurally impossible. @dataclass class FactsGraph: skills: set[str] roles: list[RoleFact] # title, company, dates, bullets education: list[EducationFact] achievements: list[str] # quantified results only def verify_claim(self, claim: str) -> bool: """Returns True only if claim is grounded in an extracted fact.""" tokens = set(claim.lower().split()) grounded = ( tokens & self.skills or any(r.matches_tokens(tokens) for r in self.roles) or any(e.matches_tokens(tokens) for e in self.education) ) return bool(grounded) def assert_grounded(self, text: str) -> None: sentences = [s.strip() for s in text.split(".") if s.strip()] violations = [s for s in sentences if not self.verify_claim(s)] if violations: raise HallucinationError(f"Ungrounded claims detected: {violations}")
All Projects
BackendAI/MLDevOps

Ummidvar - AI Job Application Agent

An India-first job application agent with explainable scoring, tailored applications, reply tracking, and sponsorship signals.

View on GitHub
Ummidvar - AI Job Application Agent main screen
286

Tests Passing

6,600+

Lines of Code

11

Modular Packages

Tech Stack

PythonFastAPIPlaywrightClaudeOpenAIOllamaDockerPostgreSQLReact

The problem

Applying to jobs properly - writing tailored cover letters, tracking applications, following up - takes hours per application. Most people either apply carelessly or burn out from the volume. There was no tool that handled the tedious parts intelligently while keeping the human in control and never putting words in their mouth they didn't actually say.

The challenge

Job searching at scale means applying to dozens of roles with individually tailored materials - a process that takes hours per application done properly. The hard problems: aggregating and deduplicating jobs across 7+ platforms without keyword noise; scoring each role against a resume using a meaningful composite algorithm rather than shallow keyword overlap; generating cover letters that sound like the user wrote them - not an LLM - while never fabricating experience (anti-hallucination via a Facts Graph); submitting through real ATS systems (Greenhouse, Lever, Ashby, Workday) using browser automation that can pause on CAPTCHAs and hand off to the user instead of breaking; tracking email replies to classify interviews, rejections, and ghosting; and layering in visa-sponsorship intelligence for international job seekers across UK, AU, NZ, CA, and EU registries. The system also had to be India-first in design (Naukri integration, INR salary handling) while supporting multi-profile, multi-preference search.

Architecture & System Design

Multi-board job discovery engine ranks opportunities by skills match, role level, location fit, and compensation. Fact-grounded generation prevents hallucinated experience claims - all content references verified resume data. Browser automation submits applications through major ATS systems. Email integration tracks application replies (offers, interviews, rejections). Visa sponsorship eligibility checker across 5 countries. Modular architecture with pluggable LLM backend.

Full system schematic available upon request

11 modular Python packages orchestrated by a FastAPI REST API. The `core` package defines pure domain models (Job, BaseResume, FactsGraph, Application, MatchScore) with no I/O - a clean domain layer. `discovery` wraps python-jobspy for multi-board aggregation with deduplication. `scoring` implements a 100-pt composite: skills overlap (0-40, Jaccard), title/seniority (0-20), location fit (0-15), salary alignment (0-10), semantic similarity (0-15) - every score is explainable. `tailoring` uses deterministic Facts Graph extraction to build an anti-hallucination contract before calling any LLM, ensuring generated text only references verified experience. `humanizer` applies a style-preserving rewrite pass that strips AI tell-tale patterns. `adapters` provides Playwright-backed ATS submit flows for Greenhouse, Lever, Ashby, Workday, and LinkedIn, with a HITL blocker queue that snapshots state on CAPTCHA/MFA and resumes from checkpoint. `replies` ingests Gmail/IMAP and classifies responses (offer, interview, rejection, ghost). `sponsorship` bundles 5 live government registries. `referrals` ingests LinkedIn CSV exports, scores connection strength, and drafts intro messages. LLM backend is fully pluggable: TemplateLLM (zero-dep default), Ollama, OpenAI, Anthropic, or any compatible API - swapped via env var.

Results

Ummidvar is production-deployable via Docker Compose in a single command. The codebase spans 6,600+ lines across 11 packages with 286 passing tests (unit + integration) covering every major component - Facts Graph extraction, composite scoring, LLM adapters, ATS submission adapters, reply classifier, sponsorship registry loaders, and referral finder. The discovery layer aggregates and deduplicates from LinkedIn, Indeed, Glassdoor, ZipRecruiter, Google Jobs, Naukri, and direct career pages. The Playwright engine handles Greenhouse, Lever, Ashby, Workday, and LinkedIn ATS flows with HITL blocker queue for CAPTCHAs. The sponsorship layer cross-references 5 government registries (UK · AU · NZ · CA · EU) live, refreshed weekly via GitHub Actions. Apache-2.0 licensed for future hosted-tier expansion.

Gallery & Demos

Application Tracker Dashboard

Application Tracker Dashboard

Kanban board showing job applications across stages: Discovered, Ranked, Tailored, Applied, Interview Scheduled, Offer Received, and Rejected.

Click any image or video to expand · ← → keys navigate

Personal Project

More from Personal Project

Ummidvar - Autonomous Job Agent

Product vision and feature scoping for Ummidvar - an autonomous, multi-profile job application agent. Defined the 11-package modular architecture from a product perspective, prioritised the anti-hallucination Facts Graph as a non-negotiable product constraint, and scoped visa-sponsorship intelligence for 5 international markets.

PRD AuthoringFeature PrioritisationMulti-Persona Design

Sylars Work Manager - Agent Operations Workspace

End-to-end ownership

A self-hosted workspace for assigning repository work to AI agents with exact-SHA project context, isolated task environments, progress steering, and explicit human approval gates.

TypeScriptNode.jsDocker Compose

Watchdog - Multi-cloud Observability Control Plane

End-to-end ownership

A privacy-minimised observability and safe-operations control plane spanning AWS, Azure, GCP, container hosts, registry storage, incidents, and exact human-approved cleanup plans.

TypeScriptNext.jsAWS Lambda

RenderBoard AI - Interior Design Rendering Platform

End-to-end ownership

An AI interior-design workspace: upload a floor plan, confirm rooms and scale, place furniture, approve each room, then render path-traced and diffusion images into a presentation board. Runs on Azure with scale-to-zero GPU workers.

FastAPICeleryRedis

BidWave - Freelance Opportunity Engine

End-to-end ownership

A self-hosted pipeline that scrapes four freelance platforms, de-duplicates listings, ranks fit with a TF-IDF prefilter and an LLM rerank, drafts proposals, and holds every application in a human approval queue.

FastAPISQLAlchemySQLite

LoadCell - Strength Machine Controller

End-to-end ownership

A local-first Android app that drives personally owned Aroleap-compatible strength hardware over Bluetooth LE: set resistance, run custom plans, count reps from the machine's own telemetry, and keep every set even if the process dies.

KotlinJetpack ComposeBluetooth LE

Swadhika Studios - Editorial Interior Portfolio

End-to-end ownership

A calm, editorial website for an interior-design and turnkey-delivery studio, built around full-bleed project photography, deliberate typography, and unhurried motion.

HTMLCSSJavaScript

BidWave - Freelance Opportunity Intelligence

Product Owner

A self-hosted opportunity engine that aggregates freelance listings, ranks fit in two stages, drafts tailored proposals, and keeps application decisions under human control.

Product DiscoveryPRD AuthoringRICE Prioritisation

Atelier CRM - Studio Readiness & Delivery

Product Owner

A status-first CRM for boutique interior-design studios, connecting client approvals, procurement readiness, installation milestones, and project delivery in one operating view.

Workflow ResearchStatus ModelPRD Authoring

Interested in this work?

I can walk through the architecture and code during an interview.

Get in Touch All Projects