Nine years across retail, supply chain, payments, investment banking and healthcare — event-driven Java services, Kafka pipelines and AWS platforms. I also architected and shipped a multi-tenant SaaS product solo, now live on Google Play.
Client engagements are described without internal system names. The platform I own is documented in full.
dataAsOf timestamp.SCAN from a bastion host surfaced container keys with a TTL of -1; TYPE showed they were Sets; SCARD showed millions of members; and EXISTS on a random member returned 0. The entities had expired. Their IDs had not.@RedisHash entities expired silently and their IDs stayed behind — millions of orphaned references, an unbounded leak that no application code owned.SMEMBERS or KEYS is O(N) on a single-threaded server, so cleanup ran as cursor-based SSCAN in 500-key batches with pipelined existence checks and pipelined SREM. Keyspaces are discovered by scanning the Spring context for @RedisHash repositories rather than hardcoded, so a new cache is covered the day it ships.activedefrag and a tuned maxmemory-policy applied through a Terraform-managed ElastiCache parameter group — no cluster restart.Java 8/11/19, Spring Boot, Spring MVC, Hibernate, REST APIs, microservices
Distributed systems, event-driven architecture, multi-tenant security models, idempotency & deduplication, schema evolution, DLQ and fail-fast validation, low-latency tuning
Kafka, Avro, Schema Registry, Redis, Apache NiFi, Oracle, PostgreSQL, MySQL, MongoDB, Cassandra, Firestore
Cucumber BDD, JMeter, Vitest, emulator-based integration testing, Claude Code for reusable engineering automation
AWS Lambda, API Gateway, EventBridge, S3, DynamoDB, CloudFormation · GCP Cloud Run, Cloud Functions, IAM · Docker, Kubernetes, Jenkins, GitHub Actions
Flutter, Dart, React, Next.js, TypeScript, JavaScript ES6
Systems outlive the people who build them. These are the artefacts I produce alongside the software.
Architecture, data contracts, risk register, unresolved unknowns marked explicitly, and a first-week plan for whoever inherits it. Available on request.
Collection-by-collection ownership, which writes the backend owns, and what each actor can read. The rules are the authorisation boundary, so they are documented as such.
A published package name can never change, so a brand rename lives only in labels and listings. Written down as intent so nobody “fixes” it later.
Based in Tamil Nadu, India. Available immediately, comfortable across UK, EU and US time zones, and set up to work with global teams remotely.