Hi, I'm

Srajan Pathak

Staff Software Engineer

Ten+ years building backend systems — and lately, the tooling for running fleets of AI coding agents.

I think in systems — high-level architecture down to low-level design, and the trade-offs in between. On nights and weekends I build developer tools; the current obsession is infrastructure for AI coding agents.

/ Side projects

Built for fun, across the stack — from JVM fault tolerance to local-first databases to AI experiments that led to warden.

warden

Go

Run a fleet of AI coding agents from one cockpit — a single Go binary that spawns, monitors, and tears them down in isolated git worktrees.

GitHub

spaiSH

Go

Experimental AI shell assistant — ask questions, get shell commands, run an autonomous agent loop in your terminal.

GitHub

FileDBv2

Go

Lightweight, embeddable, local-first database — single binary, NDJSON storage, gRPC/REST API, full CLI.

GitHub

sp-treeview

TypeScript

Material-design tree view component for Angular, published on npm.

GitHub

pocket-money

Go · React Native

Family-oriented chore tracking and pocket-money app — parents define and approve chores, kids log them and track their earnings and payouts.

GitHub

expense-manager

Python · React

Web-first expense ledger — categories, tags, and payment methods with charts for monthly, category, and tag-based spend.

GitHub

/ About

I've spent 10+ years in backend engineering at consumer scale — Gojek, Glovo, and now Affirm — the last several as a tech lead and then staff engineer. The part of the job I enjoy most is system design: mapping a messy problem into services, data models, and failure modes, and being able to argue the trade-offs at both the whiteboard level and the code level.

I've worked across a wide spectrum of technologies rather than one stack — JVM services in Java, Kotlin and Clojure, systems tooling in Go, data pipelines over Kafka and RabbitMQ, and storage from Postgres to Redis to MongoDB.

Recently I've been deep in AI-assisted development. After building spaiOS and spaiSH to explore the space, I landed on warden — and building it with fleets of AI agents (managed by warden itself) has been the fastest I've ever taken an idea from sketch to a mature, released tool.

  1. Staff Software Engineer · Affirm
    2025 — present

    Backend, Barcelona.

  2. Staff Software Engineer · Glovo
    2023 — 2025

    Owned the promotions platform architecture in the Growth domain — including its zero-downtime migration to a domain-driven design and a real-time pipeline ingesting millions of partner promotions daily.

  3. Technical Lead · Gojek
    2019 — 2023

    Led backend teams across GoPay (payments) and Discovery — bank integrations, the relevancy platform behind merchant/promo discovery, and order history as a single source of truth.

  4. Software Engineer · Quintype
    2018 — 2019

    Full-stack work — built a configurable publisher component library that stood up a full news site in minutes.

  5. Software Engineer · Infobeans
    2015 — 2018

    Java platform work — from a PCI-DSS-certified loyalty processing engine for POS systems to cross-platform mobile apps.

Languages

GoJavaClojurePythonKotlinTypeScript

Data & messaging

PostgreSQLMySQLMongoDBRedisKafkaRabbitMQ

Focus areas

System Design (HLD & LLD)MicroService ArchitectureDistributed SystemsDeveloper toolingAI agent infrastructure

/ Professional work

Systems I've owned at consumer scale — the problem, my role, and what shipped.

Promotions Retrieval Redesign

300ms p95 → 20ms p99

Staff Engineer — end-to-end owner, RFC author & technical lead

Product-level deals (BOGO, % off) and checkout-level deals (free delivery, service-fee discounts) were served through one generalized model and a single API that returned every promotion for a list of stores — so the storewall loaded ~200 stores just to show two badges each, and catalog views fetched all promos up front, leaning on a client SDK to match promos to products that slowed every client release.

I authored the RFC to split promotions into two first-class domains — ProductPromotions and CheckoutPromotions — redesigned the schema, and introduced three purpose-built, indexed APIs. I ran it as a phased, fully backward-compatible migration: dual-writing old and new models before cutover, moving promo-to-product matching server-side to retire the client SDK, and caching the hot storewall path. Cutting latency this far let promotions graduate from a best-effort tier-2 dependency — dropped on timeout — to a reliable service shown to every user.

JavaMySQLKafkaRedisDomain-driven design

In-Store Promotions Ingestion

~6 hr lag → <10 min

Staff Engineer — RFC author, design & delivery

Large grocery partners run flat-price deals on thousands of individual products daily, but there was no practical way to model them — the portal required a separate form per product, so those deals never reached the app and customers went in-store for them, leaving store and app prices inconsistent.

I authored the RFC for a public bulk-ingestion API: partners push their entire promotion list in one call, a thin synchronous front persists it to S3, emits a Kafka event, and returns a job ID, while a horizontally scalable async worker pool validates and creates the promotions. The bottleneck was the per-product conflict check — a heavy multi-table join whose cost grew with the dataset, so lag compounded with every new partner. I re-architected it onto a purpose-built denormalized, composite-indexed table (written transactionally with the source of truth), turning each check from a linear scan into a near-constant index seek — so ingestion latency stopped scaling with partner count. End-to-end lag dropped from ~6 hours (8 a.m. submissions live at 2 p.m.) to under 10 minutes even at peak, keeping the app in sync with in-store pricing.

JavaKafkaS3MySQLAsync workers

Cross-Company Promotions Platform Migration

7 teams · 8 promo types · 3 quarters

Program lead — migration strategy & growth-platform delivery owner

The growth platform had to migrate onto the group's central promotions backend — the one other brands already ran on — without disrupting live deals. It looked like a data migration and was not one: the central platform did not yet support some of the promotion types being migrated or the EU price-transparency rules the markets require, so those capabilities had to be added there first, and every consumer surface (catalog, storewall, store view, pricing, checkout) was affected — spanning roughly seven teams across two companies.

I owned the program end to end and led a four-engineer team that migrated the promotion data and adapted the BFF services to consume the new backend. I turned an ambiguous "migrate everything" mandate into a phased, vertical-by-vertical plan — nothing moved big-bang, each capability migrated behind a fully working system and rolled out market by market. In parallel I drove the central-platform team to add the capabilities the migration needed — including EU Omnibus price-transparency compliance, the regulatory blocker gating every European market — as additive features that did not disturb the brands already live on it. I ran a weekly lead sync across all seven teams, aligned PMs and EMs on both sides, and traveled on-site to unblock the hardest cross-company dependencies. We migrated eight promotion types across grocery and food and rolled out across every market with zero disruption to live promotions — surfacing and re-baselining each dependency delay transparently along the way.

Cross-org programPhased migrationBFFEU OmnibusStakeholder alignment

/ Get in touch

Open to interesting problems, systems to design, and conversations about agent tooling. The fastest way to reach me: