prajjwal@chittori:~$ whoami
Prajjwal Chittori
> _
prajjwal@chittori:~$ cat summary.txt
Crypto & payments backend engineer. ex-Stader (founding engineer → $500M+ TVL liquid staking), ex-Visa cross-border payments & stablecoins, now Senior Backend Engineer at EtherFi building card ↔ on-chain settlement. Merged open source across blockchain infra (Optimism, revm, alloy, celestia-node, ethrex) and AI inference (vLLM, SGLang, mistral.rs). Based in George Town, Cayman Islands.
prajjwal@chittori:~$ ls links/
Experience
2021 – nowBackend engineering across crypto and global payments.
EtherFi — Senior Backend Engineer, Cash 2026 – now
Crypto / liquid restaking reconciled with Visa card settlement — real-time authorization, capture & reconciliation, Borrow Mode, and an event-driven cashback pipeline on Kafka.Go · Solidity · EigenLayer · Kafka
Visa — Senior Software Engineer 2022 – 2026
Cross-border payments: Visa Direct A2A, 100+ SWIFT message types, Treasury-as-a-Service across 15 currencies. Led an 8-engineer team on a real-time platform at 2,000+ TPS, 99.98% uptime.Java · Spring · Hazelcast · K8s
Stader Labs — Founding Engineer 2021 – 2022
Rust / CosmWasm smart contracts powering liquidity pools past $500M+ in total value locked across multiple chains; validator analytics over 1M+ nodes.Rust · CosmWasm · TypeScript
Research
3 papersPublished, peer-citable work.
Cache-aware request planning for black-box LLM APIs 2026 · preprint
Cache-Aware Client-Side Request Planning for Black-Box LLM APIs. When you consume an LLM through a paid per-token API you pay for the tokens the server processes, so the only lossless lever a client has is re-ordering requests to hit the provider's prompt cache. Formalizes that design space and ships a greedy prefix-clustering scheduler that shapes request order to maximize cache hits — up to 60% billed-cost reduction on an agentic workload at zero quality loss, Pareto-dominating prompt compression and semantic caching. DOI 10.5281/zenodo.21386594 · pjdurden/cache-aware-request-planning
Executable correctness under KV-cache compression 2026 · preprint
Perplexity Holds, Programs Break: Executable Correctness as a Blind Spot of KV-Cache Compression. KV-cache compression is benchmarked almost entirely on token-overlap and retrieval metrics that never check whether generated code actually runs or a tool call is schema-valid. Introduces kv-exec-bench, an open benchmark measuring code unit-test pass@1 and tool-call JSON-Schema validity under compression, built on NVIDIA's kvpress so any press works unmodified. DOI 10.5281/zenodo.20805562 · pjdurden/kv-exec-bench
StragglerPolicy — decentralized training 2026 · paper
Straggler-Aware Elastic Membership for Decentralized Training. A zero-GPU discrete-event simulator of DiLoCo-style decentralized ML training plus a straggler-aware membership policy for slow-but-alive nodes — 4.59× faster on a persistent-straggler scenario. Published on Zenodo. DOI 10.5281/zenodo.20574905 · pjdurden/churn
Open Source
25 merged · 17 projectsMerged work on the infrastructure other people build on — blockchain & crypto infra first, plus AI inference and ML systems. Star counts are live; open a tile for the actual bug.
vLLM
1 merged
build-correctness fixMerged contribution to vLLM, the standard high-throughput LLM inference & serving engine: fixed a self-contradictory precompiled-flag orthogonality test in the build system. vllm-project/vllm #44942
Meilisearch
1 merged
ranking-rules fixMerged contribution to Meilisearch, the Rust search engine: fixed a ranking-rules ordering bug where placing attributeRank/wordPosition before the words rule silently dropped matching hits. meilisearch/meilisearch #6437
SGLang
1 merged
PD cache-aware routing fixMerged contribution to SGLang, the high-throughput LLM/VLM serving engine: the prefill/decode router's cache-aware routing keyed chat requests on the first message only; routing on the full conversation lifted KV-cache hits from ~69% to ~96% and output throughput from ~678 to ~1078 TPS. sgl-project/sglang #27430
candle
2 merged
batched-inference mask fixesTwo merged contributions to candle, Hugging Face's minimalist Rust ML framework. Qwen3 produced incorrect output for any batch size > 1: the causal mask allocated a batch-independent buffer but shaped it (b, 1, tgt, tgt + offset), and Tensor::from_slice doesn't validate element count against a fully-specified shape — so batch row 0 read the correct mask and every row after it read past the buffer. Fixed by shaping the mask (1, 1, …) and letting the existing broadcast_add apply it across the batch. The follow-up swept the same defect out of the eight sibling models that carried it — qwen3_moe, the quantized Qwen3 pair, glm4_new, quantized_glm4, SmolLM3 and its quantized twin, and Z-Image's text encoder — where it was more exposed: Qwen3's mask path was gated to CPU under the flash-attn feature, while these build the broken mask on every multi-token forward on every backend. Rather than copy the corrected builder eight more times, it centralized build_additive_causal_mask in crate::utils and moved the regression tests there, deleting 306 lines against 189 added. huggingface/candle #3586 · #3879
mcp-go
1 merged
OAuth error-handling fixMerged contribution to mcp-go, the leading Go implementation of the Model Context Protocol (MCP): fixed getServerMetadata returning (nil, nil) on failure instead of an error, removing a silent-failure path for OAuth discovery. mark3labs/mcp-go #904
mistral.rs
2 merged
scheduler & GGUF-loader fixesTwo merged contributions to mistral.rs, the Rust LLM inference & serving engine: fixed reversed FCFS priority in the PagedAttentionScheduler preemption path so the oldest request is preempted last, and validated GGUF special-token ids against the vocab to prevent an out-of-bounds panic on model load. EricLBuehler/mistral.rs #2250 · #2282
Optimism
1 merged
op-wheel metrics fixMerged contribution to Optimism, the OP Stack monorepo powering Ethereum L2s like Base & OP Mainnet: fixed an op-wheel metrics bug where RecordBlockStats wrote block gas twice and left the base-fee gauge unset, and corrected the pre-block status log. ethereum-optimism/optimism #21127
Mooncake
3 merged
startup, SSD-offload & RDMA fixesThree merged contributions to Mooncake, the KV-cache store & transfer engine behind Kimi and used as a disaggregated KV backend by vLLM and SGLang: mooncake_master bound its RPC and HTTP servers to the numeric wildcard 0.0.0.0, which the acceptors resolved through getaddrinfo() — environments that answer EAI_NONAME for numeric literals killed startup with bad address: 0.0.0.0, fixed by pinning the dependency to a revision that parses numeric IP literals directly. And under 32-concurrency SSD offload, two flows sharing a KV prefix block hit the bucket backend's deliberate single-writer-per-key OBJECT_ALREADY_EXISTS rejection, which FileStorage::OffloadObjects treated as fatal — aborting the whole offload and leaving the decode node with INVALID_KEY floods; duplicate-key rejection is now a recoverable per-bucket condition. The third fix stopped an endpoint rebuild storm: when a QP reported an mlx5 local completion fault, the slice was handed to the other bonded RNIC, which had no endpoint for that peer NIC and so ran a full handshake with fresh QP numbers — and on recurrence handed it straight back, two RNICs ping-ponging the same slices at worker-loop speed. Neither brake applied: the local-failure branch deliberately never marked the rail failed, and the context-health counter is cleared by any concurrent healthy completion. The failing local-to-peer rail is now charged an error in the existing rail monitor, so the threshold that the remote-failure path already uses pauses it after five faults and auto-recovers. kvcache-ai/Mooncake #2919 · #2967 · #3387
AIBrix
2 merged
KV-event decoder & eviction fixesMerged contribution to AIBrix, the vLLM project's Kubernetes-native LLM-serving control plane: the ZMQ KV-event decoder dropped group_idx/medium/lora_name from vLLM's BlockStored event, causing false prefix-cache matches on hybrid-attention models; and made the KV-event indexer purge a pod's cached prefixes on AllBlocksCleared so evicted blocks are no longer served as stale cache hits. vllm-project/aibrix #2384 · #2385
revm
1 merged
EVM interpreter fixMerged contribution to revm, the Rust EVM behind Foundry & reth: reworked pop_address to use IntoAddress, removing a const-eval panic path in the stack interpreter. bluealloy/revm #3735
Envoy AI Gateway
2 merged
MCP proxy & token-usage fixesTwo merged contributions to Envoy AI Gateway, the Envoy-based gateway for AI/LLM traffic: the MCP proxy failed initialize with a 500 when a backend's SSE response opened with a keep-alive / empty data: event before the JSON-RPC result (seen on some FastMCP backends), so the SSE parser now skips non-response events instead of treating them as a fatal parse error; and the Anthropic translator dropped the input/cache token usage reported on message_delta, leaving it out of the final usage totals, now fixed to merge it in. envoyproxy/ai-gateway #2267 · #2292
celestia-node
1 merged
DA layer test-infraMerged contribution to celestia-node, the Go node for the Celestia data-availability layer: unified the header TestSuite constructors behind functional options, cutting duplicated test setup. celestiaorg/celestia-node #5041
alloy
1 merged
sol! macro derive fixMerged contribution to alloy, the Rust Ethereum-types & sol! toolkit used across Foundry, reth & the wider Rust EVM ecosystem: the sol! macro silently dropped Debug/PartialEq/Eq/Hash derives on the event/error enums it generates for contracts with overloaded events (e.g. Uniswap V3's two Swap events), because synthetic _N-suffixed variant names didn't resolve; fixed it to compute derivability from the underlying parameter types. alloy-rs/core #1118
ethrex
1 merged
Ethereum client startup fixMerged contribution to ethrex, the Rust Ethereum L1/L2 execution client by LambdaClass: replaced a too-broad datadir non-empty check with an actual-DB probe, so unrelated files (e.g. an EthDocker JWT secret in the same directory) no longer block a fresh node from booting. lambdaclass/ethrex #6786
llguidance
2 merged
constrained-decoding fixesTwo merged contributions to llguidance, the constrained-decoding engine behind structured / JSON-Schema output in vLLM, SGLang & llama.cpp: fixed JSON-Schema multipleOf rejecting negative multiples, and made max_tokens=0 rules compile to the empty string. guidance-ai/llguidance #357 · #356
outlines-core
2 merged
RFC3339 regex fixesTwo merged contributions to outlines-core, the Rust JSON-Schema to regex core behind Outlines' structured generation. The date format regex applied a uniform 01–31 day range regardless of month, so constrained decoding could emit dates that do not exist, such as 2022-02-31 and 2022-04-31; fixed by making the day range month-aware — 30-day months cap at 30 and February at 29 — deliberately leaving leap years unvalidated to keep the compiled regex bounded. The date-time format failed the other way: it accepted only a Z suffix, so valid RFC3339 numeric offsets such as 2021-01-01T00:00:00+05:30 were rejected outright; added the (+|-)HH:MM offset and kept it optional so offset-less strings still match. dottxt-ai/outlines-core #258 · #257
Ray
1 merged
autoscaler starvation fixMerged contribution to Ray, the distributed compute framework underneath much of the ML training and serving stack: Autoscaler v2 silently lost launch errors whenever one launch request spanned more than one node type. The reconciler keyed its error lookup on the launch request_id alone, but a single request carries a whole shape, and both the node-provider and KubeRay paths fan that shape out into one LaunchNodeError per node type sharing that id. The sibling errors overwrote each other in the dict and only the last one survived, so every other node type never reached ALLOCATION_FAILED. Those instances sat in REQUESTED until the request timeout fired, holding max_concurrent_launches capacity, and stayed eligible for allocation in later reconcile passes, letting a stale instance claim a Pod that was launched for a different request. Fixed by keying on the pair that actually identifies a launch error, (request_id, node_type), which also folds away the now-redundant node-type guard at the call site. ray-project/ray #65299
Earlier on-chain work
CoinSwap — CosmWasm + Terraswap DEX 2022
DEX swap contract for LUNA/UST/CW20 tokens, with a gas-fee analysis tool for the Terra blockchain. pjdurden/CoinSwap
Gas-Fee Benchmark — Terra/CosmWasm 2022
Benchmarking contract measuring the gas cost of storage patterns on Terra/CosmWasm — the analysis behind Stader's on-chain gas optimization. pjdurden/Gas_analysis
Companies Founded
2 venturesThings I started from zero and shipped to real customers.
KuruX Enterprises 2025
A sustainable-cleaning consumer brand (NAMELESS / WipeZilla), built solo end to end — manufacturing, compliance, listings. ₹2L revenue in month one; now run by family. wipezilla.in
Bizpedia 2024
A free, open-source wiki for the world of business — structured, contributor-driven reference. bizpedia.org
Creator
22K+ following · 20M+ viewsShort-form philosophy and long-form takes — an audience built on one consistent format.
Series What I Think About the Top 50 Fintech Companies of All Time Vision over financials — 50 companies, what each got right and wrong, and the founders behind them. →Side Projects
3 buildsSmaller things built to learn or to prove a point.
nanoserve — LLM inference engine 2026
A from-scratch LLM inference engine, built in public over 100 days. Paged KV cache, continuous batching, and a hand-written Triton paged-attention kernel — the core ideas behind vLLM in ~2k readable lines.PyTorch · Triton · CUDA pjdurden/nanoserve
Veri5 2024 – 25
Real-time identity & account-verification API for EU cross-border payments — distributed caching at 1,000+ req/sec, full observability.Spring · Redis · Hazelcast pjdurden/veri5-mvp
KuruX — trading simulator 2023
A private-equity trading simulator with a hand-built order book, featured by Y Combinator Startup School.
Competitive
Competitive programming
Codeforces Expert; ~8,000 problems solved across Codeforces, CodeChef, LeetCode, UVa and more. codeforces/pjdurden
Chess
FIDE-registered player, 1600+ rating.