About

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.

Shipped highlights

2026

nest-tenant: Published to npm

Multi-tenant library for NestJS with row-level isolation and schema-per-tenant support. Open source.
2026

Konduit: Open Source

Lightweight workflow orchestration engine. DAG-based execution with distributed coordination.
2025

GoFundMe Hackathon Winner

Built the winning project that shipped to production. Demonstrated ability to move fast and deliver impact.
Shipped

Automated Nonprofit Verification Pipeline

End-to-end redesign of a nonprofit claim flow. Automated verification and tiered approval logic reduced manual review volume.

How I Work

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.

See: nest-tenant

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.

See: Schema-per-Tenant vs RLS: When to Use Which

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.

See: SKIP LOCKED Is Not Enough

Past work with

GoFundMeGÜENOKreitechChimiChurri

Toolbox

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.

If what you see here resonates, let's talk.