I build account-servicing and payment APIs for a global bank's core banking platform — the kind of systems where a retry has to be idempotent, a rollback plan matters as much as the feature, and "it works on my machine" isn't a finish line. Day to day that means Java, Spring Boot, message-driven integration, and a lot of time spent on failure modes.
Outside work I contribute fixes to open-source libraries I actually use, and build backend services to keep the fundamentals sharp.
- 🔭 Building a credit-card onboarding platform — Spring Boot microservices, event-driven, with bureau and decisioning services split out
- 🌱 Going deeper on distributed systems: consistency, backpressure, and failure recovery
- 🤝 Open to backend / platform roles and to reviewing PRs on anything below
Also: JPA/Hibernate · Flyway · Resilience4j · Testcontainers · JUnit 5 · Prometheus · OpenAPI
Fixes I've sent upstream to libraries I actually use. Each one ships with a
regression test that fails on main and passes with the patch.
| Project | PR | What it fixed | |
|---|---|---|---|
| axios | 109k ★ |
#11118 ✅ | TypeError when an interceptor is ejected mid-request — nullish handlers weren't guarded |
| caddy | 76k ★ |
#7922 ✅ | Proxy URLs resolving to a port the server would then bind |
| docling | 66k ★ |
#3985 ✅ | CSV dialect misdetected when a quoted field spans several lines |
| prometheus | 66k ★ |
#19324 #19396 #19486 ✅ | Discovery panicked on AWS Lightsail and ECS resources with absent optional fields |
| rclone | 60k ★ |
#9785 #9786 #9801 ✅ | Truncated uploads reported as successful on box, yandex and huaweidrive |
| keycloak | 37k ★ |
#51356 ✅ | Blank key-attestation values emitted into OID4VCI metadata |
| mastra | 28k ★ |
#20591 ✅ | Stale @mastra/core peer floors across nine store packages |
| goreleaser | 16k ★ |
#6752 ✅ | Generated Homebrew Casks didn't pass brew style |
| langchain4j | 13k ★ |
#6091 ✅ | Splitter failed outright on text with no detectable sentence boundary |
| go-git | 7.7k ★ |
#2305 ✅ | Revlist path validation rejected objects it shouldn't walk |
| raged | 24 merged | Top external contributor — Tree-sitter parsing, Neo4j graph, Qdrant vectors |
✅ merged. Currently in review: dify (155k ★, constant-time signature comparison), cobra (45k ★), thanos (14k ★), unstructured (15k ★, ×2), chainlit (12k ★), go-json (3.7k ★), plus follow-ups on prometheus, rclone, langchain4j, go-git, mastra and hermes-workspace.

