AVAILABLE FOR HIRE · REMOTE / ON-SITE / RELOCATION

Software developer
who measures
everything.

I'm Raja Sodani. I build search that answers in milliseconds, queues that never lose a message, and LLM pipelines that erase weeks of manual work. All in production, for enterprise legal teams at ICICI Bank, Bajaj Finserv, and Emcure Pharma.

// the short version

Intern → full time in 6 months at Provakil. I own the search layer, the messaging infra, and the LLM pipelines on a legal tech platform used by 15K+ people daily.

// search

<1s

across 500K+ legal documents, down from minutes

// reliability

0.01%

upload error rate, down from ~1%, a 100× improvement

// messaging

100K+

WhatsApp notifications a month, with DLQs and idempotent retries

// llm pipelines

2wk→6h

client onboarding via hybrid Elasticsearch + LLM matching over 3Cr+ cases

// education

B.Tech CSE, LNMIIT Jaipur
2021 - 2025

01Play with my work

Don't take the resume's word for it. These widgets simulate the systems I run in production: break the queue, out-spam my rate limiter, race the search index, and feed garbage to the LLM pipeline.

QueueViz simulates: RabbitMQ notification service

Messages flow from the API through the exchange to consumers. Kill a consumer and watch retries route to the dead letter queue, then watch it heal and drain. Nothing gets lost.

API
worker-1
worker-2
worker-3
delivered 0 retried 0 in DLQ 0 ● all consumers healthy

RateLimit Arena simulates: API gateway token bucket

Every API I ship is rate limited. You get a bucket of 10 tokens, refilling 2 per second. Spam the button as fast as you can. Once you run dry it's 429s, and the backend never feels a thing. Try to beat the bucket.

tokens 10/10 200 OK 0 429 0 bucket full. fire away

    SearchLab simulates: Elasticsearch legal search

    One query, two engines racing over 500,000 documents: a naive full scan vs the inverted index I actually run. Typos welcome, try bnak.

    tokenize inverted index BM25 score rank
    ⚡ with inverted index
    idle
    🐌 naive full scan
    idle

      ExtractLab simulates: LLM document template engine

      Pick a document (including a garbled OCR scan) and run it through the extraction pipeline. When the model returns invalid data, schema validation catches it and retries with feedback. That loop is how my production template engine survives 40+ client formats.

      
                
      chunk prompt claude validate schema
      // structured output appears here. Hit “Run pipeline”

      02Work

      Every card is a real production system. Click one for the story: the problem, what I built, and what changed.

      Software Developer

      Provakil Technologies · Pune

      Jul 2025 - Present

      Own the search, messaging, and LLM infrastructure on an enterprise legal platform used by 15K+ people daily.

      min → <1s

      Elasticsearch search service across 500K+ legal documents, for 15K+ daily users

      Lawyers were waiting minutes per query across a growing corpus of case files, long enough that many kept side spreadsheets instead of trusting the platform.

      A dedicated Elasticsearch service with custom analyzers, filtered queries, and relevance tuning for legal citations and case metadata.

      Sub-second results across 500K+ documents for 15K+ daily users. Search went from the platform's biggest complaint to its selling point.

      2wk → 6h

      Hybrid Elasticsearch + LLM onboarding pipeline over a 3Cr+ case dataset

      Every new enterprise client meant 2 weeks of an ops team manually matching records against a 3Cr+ (30M+) case dataset. Onboarding was the bottleneck on revenue.

      A hybrid pipeline: Elasticsearch does fast candidate matching at scale, then an LLM resolves the ambiguous cases a human used to eyeball.

      Onboarding dropped to ~6 hours, a ~95% reduction. Go-live in a day instead of a month.

      1wk → 1d

      LLM template engine parsing 40+ client document formats with zero per-client code

      Every client formats legal documents differently. Supporting a new client's templates took an engineer a week of hand-written parsing rules.

      An LLM powered template engine that reads a client's documents and derives the structure itself, no per-client parsing code.

      40+ client formats supported; new client setup collapsed from a week to 1 day.

      agentic

      Claude based agent that reviews every PR and closes small debug tickets on its own

      Senior engineers were losing hours to routine PR review and a steady drip of small debug tickets.

      A Claude based agentic workflow that reviews every PR automatically and picks up small, well-scoped tickets end to end: reproduce, fix, open a PR.

      Routine review happens on every PR without waiting for a human. Senior time goes to the hard problems.

      −90%

      Manual reporting eliminated via a real time analytics dashboard for 7K+ users

      Client-facing teams compiled usage and case reports by hand, every reporting cycle, for thousands of users.

      A React.js real time analytics dashboard fed by live platform data.

      7K+ users self-serve their numbers; manual reporting overhead down ~90%.

      20+

      Production incidents handled as first responder · mentoring 2 interns

      When production breaks on a platform lawyers rely on for court deadlines, minutes matter and someone has to own it end to end.

      A first responder habit: triage, communicate, fix, write the postmortem. Plus onboarding docs and mentoring so the next person is faster.

      20+ incidents resolved, and 2 interns growing into engineers who can take the pager.

      ElasticsearchNode.jsClaude APIRedisReactVue

      Software Developer Intern

      Provakil Technologies · Pune

      Jan 2025 - Jun 2025

      Promoted to full time in 6 months.

      100K+/mo

      WhatsApp notification microservice: RabbitMQ DLQs, retries, idempotency

      Court hearing alerts cannot be lost. A missed notification can mean a missed hearing, and the old flow had no retry story and no failure visibility.

      A RabbitMQ backed microservice with dead letter queues, exponential retries, and idempotency keys so retried sends never duplicate.

      100K+ (1L+) messages a month with full failure visibility, owned end to end as an intern.

      1% → 0.01%

      Upload error rate, by unifying MinIO + AWS S3 behind one storage service

      Some clients run on-prem (MinIO), some in cloud (S3). Two storage code paths meant inconsistent behavior and ~1% upload errors on legal documents.

      One storage abstraction with a single API and uniform retry and validation logic, backend chosen per deployment.

      Upload error rate cut ~100×, to under 0.01%, on documents that legally cannot go missing.

      on-prem

      Docker deployments for enterprise clients who keep legal data in-house

      Banks and pharma clients will not let legal data leave their own infrastructure, so cloud-only deployment was a dealbreaker.

      Per-client isolated Docker deployments, configured and debugged remotely and on site.

      Enterprise deals stayed on the table that cloud-only competitors could not serve.

      RabbitMQNode.jsS3 / MinIODocker

      React Developer Intern

      Celebal Technologies · Jaipur

      May 2024 - Jul 2024
      5+ modules

      Reusable React components with Context API and useReducer, adopted across teams

      Five interconnected modules were each rebuilding the same UI state logic in slightly different ways.

      Reusable React components with shared Context API and useReducer patterns.

      Adopted across 5+ modules. My first taste of writing code other teams depend on.

      ReactContext API

      03Projects

      Things I build after hours, mostly tools I wished existed at work.

      live

      Finance Tracker

      snap a receipt → logged, categorized, budgeted

      Full stack AI finance app. 15+ REST APIs with rate limiting and pagination holding <200ms p98; Gemini OCR reads receipts and categorizes spend; Inngest crons ship monthly reports and budget alerts.

      Next.js 15PostgreSQLPrismaGeminiInngest
      open source

      QueueScope

      x-ray vision for RabbitMQ

      CLI + dashboard for RabbitMQ observability: watches dead letter queues, diffs message payloads, and replays failures one keypress at a time. Born from running 100K+ msgs/month in production.

      TypeScriptRabbitMQCLI
      open source

      PromptPipe

      LLM calls that fail gracefully

      A tiny TypeScript library for production LLM workflows: provider fallbacks (Claude → GPT → Gemini), schema-validated outputs, retries with backoff, and per-call cost tracking.

      TypeScriptClaude APIZod
      experiment

      CaseGraph

      case law as a network

      Citation graph explorer for Indian case law: ingests judgments, extracts citation edges, and ranks precedent influence. Graph queries served from precomputed adjacency lists in Redis at sub-100ms.

      Node.jsElasticsearchRedisD3
      full stack

      Stock Portfolio Platform

      market API dies → prices keep flowing

      Stock tracker built for upstream failure: Upstox API with Yahoo Finance fallback and last-known-price caching. MongoDB time series schema with indexed range queries cut view responses ~25%.

      ReactNode.jsMongoDBChart.js

      currently open to new roles

      Need someone who ships
      measurable results?

      Search that got 100× faster. Onboarding that got 95% shorter. Error rates cut 100×. If your team has problems like these, I'd love to hear about them.