Building reliable systems under real constraints.
I've spent 8+ years building backend systems across fintech, nonprofit tech, and B2B SaaS — at companies like GoFundMe, GÜENO, Kreitech, and ChimiChurri. Most of my work has been in Java, Kotlin, and TypeScript, usually with PostgreSQL underneath.
I approach engineering with a bias toward action, but not recklessness. Ship early, iterate based on real feedback, and never let perfect be the enemy of deployed. But speed without discipline is just chaos — every system I build has proper security, testing, and observability from day one.
Working across different domains taught me that good engineering principles transfer: type safety, defense in depth, designing for failure modes, and understanding the business context behind technical decisions. The problems change — the discipline doesn't.
I don't just build what's specified — I question requirements, propose alternatives, and optimize for long-term maintainability over short-term convenience. Technical decisions are organizational decisions. Infrastructure choices affect team velocity, cognitive load, and how quickly you can respond to market changes.
nest-tenant — Published to npm
Multi-tenant library for NestJS with row-level isolation and schema-per-tenant support. Open source.
Konduit — Open Source
Lightweight workflow orchestration engine. DAG-based execution with distributed coordination.
GoFundMe Hackathon Winner
Built the winning project that shipped to production. Demonstrated ability to move fast and deliver impact.
NPO Claim Pipeline
End-to-end redesign of GoFundMe's nonprofit claim flow. Cut manual review queue by ~97% with automated verification and tiered approval logic.
I optimize for reversibility before elegance. The best architecture is the one you can change when requirements shift. Premature optimization and over-abstraction both poison future flexibility.
I bias toward boring technology until scale forces otherwise. Postgres, Redis, and monoliths solve most problems. Microservices, event sourcing, and novel databases are solutions to specific constraints — not default choices.
Infrastructure decisions are organizational decisions. Choosing a monorepo vs multi-repo, monolith vs microservices, or sync vs async affects team structure, deployment velocity, and cognitive load. Technical choices have human consequences.
I design for failure modes before happy paths. What happens when Redis is down? When a migration fails halfway? When a user bypasses the UI? Systems that only work under ideal conditions don't work.
Speed matters — but only when it doesn't poison the future. Shipping fast is valuable. Shipping fast in a way that makes the next feature harder is debt. I choose speed that compounds, not speed that extracts.
TypeScript, JavaScript, Java, Kotlin, Next.js, React, Node.js, NestJS, Spring Framework, PostgreSQL, MongoDB, Redis, Drizzle ORM, AWS, testing (Jest, Vitest, Playwright), CI/CD, Docker, monorepo tooling (Turborepo, pnpm workspaces), infrastructure fundamentals. And a lot more.