The toolbox at a glance
Pick a skill below to see what I built with it.
Languages
JavaPythonPostgreSQL
Databases
PostgreSQLMongoDB
Cloud & Infrastructure
AWSGoogle CloudDockernginxKafka
AI & Integrations
AI Agents & AutomationClaude CodeOpenAIAnthropicGeminiLLM APIsPlaidKlaviyoHubSpotGoogle Workspace
Leadership
MentorshipMigration ReviewIncident ResponseSystem DesignCode Review
Domains
Applied AIBackend DevData IntegrationMicroservicesAPI Design
Backend workflows for financial operations, account management, notifications, and data synchronization, in Spring Boot microservices.
My experiences
- ▸I guard domain state machines with pessimistic row locks — the lock, not the scheduler query, is the decision point.
- ▸I write scheduled jobs that page with keyset cursors, stop before their distributed-lock lease expires, and isolate failures per item.
- ▸I've built Kafka producers and consumers for after-commit lifecycle events, status round-trips, and replay-safe registration events.
- ▸I've used Spring Data JPA and QueryDSL for data access across investor-facing and issuer-facing services.
By the numbers
- 11
- Java codebases contributed to
- 31
- scheduled job classes created
- 2021
- first commit
Automation services, document-processing workflows, and recoverable background workers — including the AI pipelines behind internal operations tooling.
My experiences
- ▸I've built FastAPI services with typed Pydantic models for an AI agent platform and its operator APIs.
- ▸I've run Taskiq + Redis background tasks with locks, retries, and recovery after a worker drains.
- ▸I've built LLM workflows for classification, drafting, verification, and tool use.
- ▸I built a self-hosted AI pull-request reviewer (JordoBot9000) with a Postgres-backed work queue.
By the numbers
- 24
- background tasks (19 scheduled)
- 12
- LLM agent classes
- 3
- Python services
Durable workflow state, audit records, duplicate guards, and concurrency-safe work queues — modeled so the database enforces the rules.
My experiences
- ▸I model state machines as tables with status CHECK constraints, plus audit/history tables that record workflow state changes.
- ▸I build work queues claimed with FOR UPDATE SKIP LOCKED, so parallel workers never take the same row.
- ▸I enforce idempotency keys with unique and partial unique indexes, and use ON CONFLICT upserts for retry-safe writes.
- ▸I use pessimistic row locks and advisory locks where exactly one writer or runner must win.
By the numbers
- ≈400
- schema migration paths added across three codebases
- 14
- unique indexes as duplicate guards
- 5
- of them partial
Producers and consumers connecting backend workflows across services through asynchronous events.
My experiences
- ▸I queue lifecycle events inside a transaction and publish them only after commit, so a rolled-back write never notifies anyone.
- ▸I used Kafka for a publish-status round-trip between two services, plus a listener that turns material-change events into notices.
- ▸I made registration events replay-safe: re-running a job reuses the existing mapping and re-emits the event.
- ▸I built validation and auto-fill for document-extraction results returned over Kafka.
By the numbers
- 9
- producers created
- 19
- consumers created
- 9
- codebases
Scheduled checks and background tasks with retry and recovery paths, including long-running workflows moved out of user requests.
My experiences
- ▸I use lock-guarded schedulers: one runner fleet-wide, stopping early before the lease expires.
- ▸I've used the database as a queue with FOR UPDATE SKIP LOCKED — transactional with the data it reads, no extra broker.
- ▸I commit durable claims before irreversible side effects, so a crash can't cause a double send.
- ▸I moved long rebuilds to locked background jobs with 202 + polling instead of timing-out requests.
By the numbers
- 31
- Java scheduled job classes
- 24
- Python background tasks
- 19
- of them scheduled
Assistants for classification, drafting, verification, tool use, and batch processing — where the model interprets and the server confirms the facts.
My experiences
- ▸I built an AI review step that checks drafts before they go out, and qualified it against the old rules ahead of cutover.
- ▸I enforce human approval in the server — not the prompt — for sensitive account changes.
- ▸I use schema-validated structured outputs.
- ▸I measure prompt and flow changes with offline evals against frozen baselines before shipping.
By the numbers
- 12
- agent classes
- 3
- LLM provider adapters
- 1
- batch API adapter
Automated tests for backend workflows and operational interfaces, plus measurement before risky changes.
My experiences
- ▸I froze a measured behavior corpus before replacing rule-based guards with an LLM verifier.
- ▸I built a deterministic offline eval harness with frozen baselines for an LLM Slack agent.
- ▸I covered the share-transfer workflow with 34 test files, including explicit account-scoping denials.
- ▸I write tests for lock, retry, and idempotency paths — the places concurrency bugs hide.
By the numbers
- 550+
- test files added
- 10
- codebases with test additions
Container definitions, local development environments, and CI workflows for services I built.
My experiences
- ▸I built Docker Compose stacks for a self-hosted AI code reviewer, including a gateway variant.
- ▸I set up a local development Compose environment for an AI agent platform.
- ▸I wrote a dashboard web app's Dockerfile and CI workflows for pull-request checks and cloud deployment.
By the numbers
- 3
- Dockerfiles
- 3
- Compose files
- 2
- CI workflows added
Third-party platforms wired into backend workflows: Slack, HubSpot, Google Workspace, Klaviyo, Plaid, OpenAI, Anthropic, Gemini, and AWS.
My experiences
- ▸Slack: I built an LLM ops agent with verified interactions and in-thread approval buttons.
- ▸HubSpot and Google Workspace: I've used CRM history for outreach, timeline logging, and drafts placed in a rep's own Gmail.
- ▸I integrated Plaid verification data and documents into investor account workflows, and Klaviyo for campaign-update emails.
- ▸I've used OpenAI, Anthropic, and Gemini for document extraction and agents, and AWS for hosting and infrastructure.
By the numbers
- 3
- LLM provider clients
Production support & DB incident response
All skills
Served as a first responder for production database incidents on a multi-service PostgreSQL platform and reviewed schema migrations in the shared migrations repo — working each incident from symptom down to the exact query, lock, or payload at fault, then shipping the fix.
My experiences
- ▸I traced a database slowdown to its root cause in query load and lock contention, then shipped the fix.
- ▸I traced load spikes to chatty list endpoints and fixed them with pagination and lighter payloads — confirmed with response times after deploy.
- ▸I authored versioned SQL migrations across many schemas and merged other engineers' migration branches.
- ▸I wrote data repairs safety-first: dry run by default (ends in ROLLBACK), changes only rows in the exact expected state, returns changed rows, and checks the target state against audit history.
- ▸I left operations runbooks behind for the AI tooling I built.
By the numbers
- ≈400
- migration paths added across three codebases
- 12+
- database schemas
- 2022
- first migration authored
Systems that reach investors: AI-drafted follow-ups for stalled investments, physical-mail escalation, and communications for secondary liquidity events. The AI drafts, the server verifies the facts, and automated sends pass deterministic gates and record an audit trail.
My experiences
- ▸I built follow-ups drafted per case on a cadence; a gated auto-sender with a staged rollout re-checks live state just before sending, limits repeat contact, and logs every decision.
- ▸I built physical-mail escalation: a rep reviews the rendered proof, and edits are version-safe so a stale edit or a retry can never mail the wrong version.
- ▸I ran end-to-end investor communications for a corporate-action event, from tracking each investor's response to triaging replies.
- ▸I built an IRA custodian status digest where AI interprets the records and every fact comes from the server.
- ▸I built a Slack agent that drafts outreach into the requesting rep's own Gmail — a human always presses send.
Mentored two junior engineers and a summer intern on production backend work, and led technical work through design docs and a platform others built on.
My experiences
- ▸I mentored two junior engineers and a summer intern — with the intern, more pair programming and hands-on walkthroughs of how the systems work.
- ▸I wrote implementation-ready design docs for an LLM agent's approval workflows.
- ▸I built a database-backed configuration store that other engineers later extended.
- ▸I reviewed production schema migrations and served as a first responder for production database incidents.
By the numbers
- 1
- summer intern
- 2
- junior engineers
- 2
- design docs authored