Skip to content

Open to product engineering opportunities

I build systems that survive production.

Close to four years of production experience in Python, distributed systems and AWS spanning API gateway modernization, service migration, messaging and database performance. Most of my work is making large service estates predictable: standard patterns, reliable delivery, and enough observability to answer questions at 2am.

role
Backend Software Engineer
experience
close to 4 years
core stack
Python · Go · JS · Java 21 · C++ · AWS · Kong · Kafka · PostgreSQL · Kubernetes
Nayan Kumar, Backend Software Engineer

Nayan Kumar

Bengaluru, India

Engineering impact

Services & packages
175Standardized across 6 Kubernetes clusters in an enterprise API estate.Prudential API modernization
Labeling cost avoided
$40KUp to $40K in labeling costs saved through a custom batch workflow plugin built for an external research team.Modenx batch workflow
Annual AWS reduction
$50K+Recurring yearly cloud spend removed through infrastructure and workload optimization.Modenx cloud optimization
UI development time cut
40%Across 3+ internal teams, via a centralized design system shipped as a versioned private package.Kalvium design system

Console

Ask the site a question

The same facts as the sections below, in the form I would actually type them.

nayan@engineeringread only
nayan@engineering:~$

Selected engineering work

Three roles, and the systems behind the numbers

Open a case study for the problem, the decision and what changed.

BDIPlus Labs

Software Engineer 2

June 2025 - Present · Bengaluru, India

Backend and platform work across a regulated enterprise API estate and an internal product. Most of my time goes to making a large number of services behave like one coherent system.

  • Python
  • Java 21 / Spring Boot
  • Go
  • Kong
  • PostgreSQL
  • Kubernetes
  • AWS
  • Dynatrace
  • Artifactory
Client · PrudentialAPI modernization across a 175-service estateStandardizing how an enterprise builds, deploys, secures and observes services, so 175 of them stop being 175 different decisions.
services & packages
175
clusters
6
primary runtimes
2

The problem

A large service estate had grown one team at a time. Every service shaped its own request and response contracts, its own audit logging, its own internal dependencies, and its own approach to authentication and rate limiting. Deployment and testing were per-team rituals rather than a shared workflow, which made governance, review and migration expensive in a regulated environment.

What I built

  • Kong API Gateway authentication, authorization and rate limiting for client-exposed services, rolled out across 175 services in 6 clusters with per-cluster resource maps behind a single ingress.
  • Automated OpenAPI spec-driven deployment: specs generated and tested against the internal test framework, then raised as PRs into the architect review flow for every client-facing API.
  • A migration framework with Artifactory-published internal dependencies enforcing uniform audit logging and response structures.
  • Migration of the priority services onto standardized Python and Java 21 Spring Boot.
  • The Transactional Outbox pattern with Dynatrace tracing and S3 log archival, for reliable and auditable event delivery between services.
  • An extension of the Kong template from JSON-only to both JSON and XML.

Engineering decisions

Problem
Authentication, authorization and rate limiting were re-implemented per service, so a policy change meant touching every repository.
Decision
Push cross-cutting concerns to the edge and let Kong own them, leaving services responsible only for domain logic.
Implementation
Per-cluster resource maps behind a single ingress, with authentication, authorization and rate-limit policy configured at the gateway rather than in application code.
Result
Policy became a gateway concern with one place to change, and new services inherited the security posture instead of re-deriving it.
Problem
Clients could not depend on response or error shape, and audit trails differed enough that review was manual.
Decision
Make the contract the artifact: spec-first OpenAPI, a shared response envelope, and a standard audit-log structure distributed as internal packages.
Implementation
Standardized dependencies published to Artifactory and consumed by Python and Java 21 Spring Boot services, so the shape is inherited rather than copied. Spec changes are generated, tested and raised as PRs into the architect review flow.
Result
Contract changes became reviewable diffs, and audit logs archived to S3 in one consistent structure across the estate.
Problem
Services that wrote to the database and published an event did both independently. A crash between the two silently produced lost or phantom events.
Decision
Adopt the Transactional Outbox pattern rather than trusting a dual write.
Implementation
The business write and the outbox row commit in the same database transaction; a separate relay reads the outbox and publishes downstream.
Result
Event emission became at-least-once and recoverable, with the database transaction as the single source of truth.
Problem
Hand-migrating 175 services to the new patterns would have consumed the team for the better part of a year.
Decision
Automate the mechanical parts of migration behind validation guardrails, and keep humans on the architectural judgment.
Implementation
A migration agent using prompt engineering and structured tool calling to analyze, transform, validate, generate and test each service, with every output gated by validation rules and architecture review before merge.
Result
Migration became a reviewable pipeline with consistent output, rather than 175 individually negotiated rewrites.
  • Kong
  • OpenAPI
  • OAuth 2.0
  • Python
  • Java 21 / Spring Boot
  • PostgreSQL
  • Kubernetes
  • Artifactory
  • Dynatrace
  • S3
Architecture Lab: API Gateway
Automation · PrudentialMigration agent for service standardizationAn agent-based pipeline that migrates legacy codebases to the new service standard, removing repeated manual migration work.

The problem

Moving legacy services onto the standardized patterns was repetitive but not trivial: each one needed its contract, audit logging, dependencies and response structure reshaped without changing behaviour. Doing that consistently by hand across a large estate is exactly where humans drift and reviews get shallow.

What I built

  • An analyze → transform → validate → generate → test pipeline over legacy service source.
  • Prompt engineering and structured tool calling so each step returns checkable structured output rather than prose.
  • Validation guardrails that reject output failing the standardized contract, audit-log and response rules.
  • An architecture review workflow and generated changes are reviewed by engineers before they land.

Engineering decisions

Problem
Generated code is only useful if it is consistent and reviewable; free-form output is neither.
Decision
Constrain the agent with structured tool calling and treat validation as a hard gate, not a suggestion.
Implementation
Each stage emits structured results that are checked against the standard patterns; failures stop the pipeline instead of producing a plausible-looking diff.
Result
Output stayed consistent across services and every change arrived in a shape a reviewer could actually reason about.
  • Python
  • Prompt engineering
  • Structured tool calling
  • Validation guardrails
Architecture Lab: Migration Agent
Internal product · ModenxService extraction, real-time correctness and cloud costPulling a module out of the monolith, fixing what open SSE connections were costing in load and in data accuracy, and taking $50K+ a year out of the bill.
labeling cost avoided
$40K
annual AWS saved
$50K+

The problem

Real-time logging and DAU tracking ran over SSE, but connections stayed open for screens the user was no longer looking at. That did two kinds of damage: the same data was delivered more than once, and daily-active-user counts were inflated by screens nobody was watching, so a number the business relied on was quietly wrong. Elsewhere a module still sat inside the monolith, REST responses were shaped for no particular consumer, PostgreSQL absorbed connection churn directly, and cloud spend had never been revisited.

What I built

  • A custom batch workflow plugin for an external research team, saving up to $50K in labeling costs.
  • An AWS cost initiative that cut spend by $50K+ annually.
  • Extraction of a module out of the monolith into a standalone service, with restructured REST APIs and PgBouncer-backed PostgreSQL connection pooling to improve server response time.
  • Reworked SSE-based logging and DAU tracking that drops connections for screens no longer in view.
  • A data-processing service running scheduled background jobs that crunch customer data at scale for platform-wide analytics and reporting.

Engineering decisions

Problem
SSE connections stayed open for screens no longer in view, so the same data was delivered twice and DAU counts were inflated by screens nobody was watching.
Decision
Treat visibility as the signal for whether a stream should exist, rather than leaving teardown to the client.
Implementation
Reworked SSE-based logging and DAU tracking to drop connections for screens out of view, so a stream exists only while someone is actually looking at it.
Result
Duplicate data delivery stopped and DAU counts corrected. The metric started describing real usage.
Problem
A module still lived inside the monolith, and short-lived connections hit PostgreSQL directly so connection churn became database work.
Decision
Extract the module into a standalone service and pool connections in front of the database rather than tuning each client separately.
Implementation
The module moved out behind restructured REST APIs, with PgBouncer as the pooling layer between services and PostgreSQL.
Result
Server response time improved and connection handling moved out of the database's critical path.
Problem
Customer-data crunching for analytics and reporting competed with work users were waiting on.
Decision
Give non-interactive work its own service and its own schedule.
Implementation
A data-processing service running scheduled background jobs over customer data at scale, feeding platform-wide analytics and reporting.
Result
Reporting scaled on its own terms instead of borrowing capacity from the request path.
  • Python
  • SSE
  • PostgreSQL
  • PgBouncer
  • AWS
  • REST
Architecture Lab: Real-Time SSE Lifecycle

Kalvium

Full Stack Developer

Sept 2023 - May 2025 · Bengaluru, India

Throughput, access control and search on the platform side; a design system on the product side. The backend work is what shaped how I think about load.

  • Improved scalability with Redis caching and asynchronous task processing on Celery and Kafka, increasing system throughput under peak load.
  • Built an Elasticsearch-backed search layer fed by a PostgreSQL LISTEN/NOTIFY indexing service, so newly updated records became queryable without re-querying the primary database.
  • Built a centralized RBAC system for onboarding workflows, improving platform-wide security auditability.
  • Architected a centralized React design system published as a private NPM component library (TypeScript, Vite, semantic versioning), cutting UI development time by 40% across 3+ internal teams.
  • Python
  • Java 21
  • Go
  • Redis
  • Celery
  • Kafka
  • PostgreSQL
  • Elasticsearch
  • TypeScript
  • Vite

Infogic Solutions

Software Developer

Jan 2023 - Aug 2023 · Bengaluru, India

Product engineering on customer-facing workflows, where I first learned how much complexity hides behind a form.

  • Delivered live search, multi-criteria filtering and dynamic forms for product workflows.
  • JavaScript
  • React
  • Node.js
  • MongoDB

Architecture Lab

Five patterns I have shipped

Why each one was the right call, and what it cost to not have it.

Prudential API estate

API Gateway

One edge owns identity, policy and routing

Kong sits in front of the service estate and terminates the concerns that every service would otherwise re-implement: authentication, authorization and rate limiting. Services behind it receive requests that have already been identified and throttled, so they only carry domain logic. Routing patterns are defined per service class rather than per service.

Why this design

When 175 services each own their own auth, a single policy change becomes 175 pull requests and an incomplete rollout. Moving it to the edge makes the policy one artifact and makes a new service secure by default rather than by review.

  • Kong
  • OAuth 2.0
  • NGINX
  • Kubernetes
Client
Kong API Gateway
Authentication
Authorization
Rate limiting
Backend services · 6 clusters
Python
Java 21 / Spring Boot
PostgreSQL
Transactional Outbox
Dynatrace
S3 archival
Request path: Prudential estate

Systems I build

The tools, grouped by the problem they solve

Each one with where I actually used it.

Backend

Distributed Systems

Data

Cloud & Infrastructure

API Infrastructure

Observability

Side projects

Built to understand a protocol or a pipeline properly

  • RAG PDF

    Document question-answering over uploaded PDFs. Ingestion runs as queued background jobs that chunk and embed the document into a vector store, so upload and query stay on separate paths.

    • Next.js
    • LangChain
    • BullMQ
    • Valkey
    • Qdrant
    • OpenAI
  • WebRTC Video Calling

    Browser-to-browser video calling over WebRTC, with a signalling server handling peer discovery and session negotiation before media goes direct.

    • WebRTC
    • React
    • Express
    • Socket.IO
  • Stack Box

    Real-time chat built on Socket.IO with WebRTC for direct peer connections. Room state, presence and message fan-out are handled server-side.

    • Socket.IO
    • WebRTC
    • Node.js
    • MongoDB
    • React
  • OmniDrive

    Cloud file storage with upload, sharing, folder hierarchy and OAuth-backed access control over bucket storage.

    • Next.js
    • TypeScript
    • Appwrite
    • OAuth
    • Bucket storage

About

Backend engineer, systems-minded, happiest at the boundaries

I'm a backend-focused software engineer who enjoys turning messy production problems into systems that are easier to operate, scale and reason about.

The habit I keep coming back to is asking whether a fix belongs in one repository or in the pattern every repository inherits. The second answer is slower and almost always the right one, and it is how a change survives the next ten services and the engineer who arrives after you.

I care about the unglamorous parts: what breaks when a process dies halfway, what a bill looks like after a year of nobody checking, and whether the logs will still make sense to someone paged at 2am who has never seen the code.

Outside work I read more distributed-systems blogs and papers than I strictly need to, and I'm open to product engineering opportunities, particularly backend, distributed systems and platform roles at product companies.

Recognition

Education

  • KLE Technological University

    Bachelor of Engineering

    Aug 2016 - Aug 2020

  • Masai School

    Diploma in Computer Science

    Jan 2022 - Dec 2022

Contact

Have a hard system to build?

I'm interested in backend engineering, distributed systems and product engineering problems, the kind where the constraint is real and the tradeoff is interesting.

nayanph1@gmail.com