Senior Software EngineerFull-stack · AI · Platform
I build AI agents, full-stack products, payment systems, RAG search, LLM eval harnesses, durable workflows, data pipelines, growth engines, customer integrations, real-time ML, cloud platforms and MVPs in weeks that hold up in production.I buildAI agents that hold up in production.
11 years shipping production software across the stack: React front ends, Go and Python services, Stripe payments and, lately, LLM agents that run 400K tasks a month. I work best close to the people who use what I build.
Discovery, POCs, integrations and onboarding, explained in plain English to non-technical teams.
02
Selected work
Production systems: the problem behind each one, how it works, and what changed after it shipped.
Upload, booking or Stripe event
Temporal workflow
LangGraph agent
MCP tools
Human approval
CloudSpot·2024–2026
Agentic workflow platform
Problem
Photographers were losing hours to admin around every upload, booking and payment.
What I built
An event-driven platform in async Python and TypeScript: Temporal workflows, LangGraph agents and sub-agents calling Pydantic-validated tools on MCP servers, and human approval with audit logs.
~400K tasks a month
99.9% completion
Python
TypeScript
Temporal
LangGraph
MCP
Golden dataset
LLM-as-judge
CI regression gate
Router: Claude / OpenAI
CloudSpot·2024–2026
LLM evals and cost-aware routing
Problem
LLM features had to ship without quality regressions or runaway model bills.
What I built
Success metrics and eval harnesses before every launch (golden datasets, LLM-as-judge rubrics, Langfuse tracing, CI regression gates), plus routing across Claude and OpenAI with retries, fallback, token budgets and prompt caching.
−46% cost per task
~2¢ per task
Evals
Langfuse
Claude
OpenAI
CI/CD
Invoice sent
Stripe Connect
Idempotent webhooks
Photographer paid
CloudSpot·2022–2024
Embedded payments on Stripe Connect
Problem
Photographers invoiced in one tool and got paid in another, and the platform earned nothing on it.
What I built
Payments in Go and TypeScript on Stripe Connect with KYC, card and ACH, idempotent retry-safe webhooks, and a guided in-app onboarding flow for identity, bank setup and the first invoice.
~$16M a year by month six
Zero double charges
Onboarding 54% → 79%
Go
TypeScript
Stripe Connect
PostgreSQL
Customer question
Hybrid search
LLM + guardrails
Answer or hand off
CloudSpot·2024–2026
Streaming RAG support agent
Problem
Support volume was growing faster than the team, and three new hires were planned.
What I built
In-app chat over server-sent events with hybrid pgvector search across help docs and 50K resolved tickets, guardrails, and a confidence-based handoff to a human.
~40% of tier-1 chats resolved
CSAT unchanged
~$180K/yr in hires avoided
RAG
pgvector
SSE
Guardrails
Contract
E-signature
Questionnaire
Client portal
CloudSpot·2023
Studio client workflows
Problem
Photographers juggled separate tools for contracts, questionnaires and their client portal.
What I built
I owned the e-signature, questionnaire and client-portal features of the August 2023 Studio launch in Vue.js, TypeScript, Go and PostgreSQL.
24% of paying users adopted it in 6 months
17% lower churn for Studio users
Vue.js
TypeScript
Go
PostgreSQL
Discovery
Fixed-bid scope
Build
Production
JDCommerce·2021–2022
Five client MVPs, 6–10 weeks each
Problem
Small businesses in coaching, video, marketplaces and teleradiology needed working products fast, on a fixed budget.
What I built
I worked forward-deployed with each owner: ran discovery, scoped fixed-bid MVPs and shipped them to production with React, Next.js, Node.js, Django and AWS, then turned the repeat work into a delivery playbook.
5 MVPs in production
~$140K phase-two work
1–2 weeks saved per build
React
Next.js
Node.js
Django
AWS
New booking
Agent plans
Parallel API calls
Photographer approves
CloudSpot·2024–2026
AI booking assistant
Problem
Every new booking meant about 40 minutes of contracts, questionnaires and invoices.
What I built
A tool-calling agent that hits the contract, questionnaire and invoicing APIs in parallel and drafts the paperwork for the photographer to approve.
40 → 8 min per booking
+26% invoice payments
Tool calling
Human-in-the-loop
TypeScript
Advertiser server
Events API kit
TikTok Ads
Attribution
TikTok·2021
Server-side Events API kit
Problem
When iOS 14.5 tracking rules landed, advertisers' browser pixels started missing conversions and budgets were at risk.
What I built
A reusable server-side Events API kit in Python and Node.js that advertisers could drop next to their existing Pixel, plus hands-on integration help.
Used by 40 advertisers
~20% more attributed conversions
~$1.5M CAD kept running
Python
Node.js
Events API
Pixel
New study
Triage model
Worklist priority
Radiologist reads
JDCommerce·2022
X-ray triage in a radiology worklist
Problem
Urgent X-rays waited in the same queue as routine ones.
What I built
I deployed a vendor's FDA-cleared triage model (PyTorch, FastAPI, Docker) into the client's teleradiology worklist in their HIPAA-eligible AWS account. Flagged studies jump the queue, and radiologists still read every case.
−35% time-to-read on urgent studies
PyTorch
FastAPI
Docker
AWS
HIPAA
Old CRM export
LLM field mapping
Review flagged fields
Ready in Studio
CloudSpot·2024–2026
LLM import assistant
Problem
Photographers switching from another CRM spent about 3 hours setting up, and many gave up in week one.
What I built
An LLM-powered assistant that maps client lists and templates into Studio and flags uncertain fields for a human to check.
Setup 3 h → 25 min
Week-one activation 34% → 55%
LLMs
Structured outputs
Data migration
New gallery
Embeddings + scoring
Cluster duplicates
Highlights
CloudSpot·2024–2026
AI Highlights for photo galleries
Problem
Clients scroll past the best shots in galleries of hundreds of photos.
What I built
Image embeddings, aesthetic scoring and near-duplicate clustering over about 6M photos a month, picking highlights and grouping similar shots on every new gallery.
On for ~80% of galleries
+12% print orders (A/B)
Computer vision
Embeddings
A/B testing
PostHog + Stripe
SQL scoring
Clay enrichment
HubSpot routing
CloudSpot·2024–2026
Product-led growth engine
Problem
Sales couldn't tell which free users were about to buy.
What I built
SQL models score PostHog usage and Stripe signals as product-qualified leads, enriched in Clay and synced by reverse ETL into HubSpot lifecycle stages and routing.
+19% free-to-paid vs. holdout
~$500K new ARR in year one
SQL
PostHog
Reverse ETL
HubSpot
Account metrics
Anomaly model
SHAP reasons
Alert
TikTok·2021
Ad-tracking anomaly monitor
Problem
Broken tracking usually surfaced days later, when a client noticed their numbers had dropped.
What I built
An anomaly-detection and data-quality monitor (Python, scikit-learn, SHAP) across managed accounts that flags drops in spend or conversions with plain-English reasons.
3 days → 4 h to detect
30+ breaks caught before clients
Python
scikit-learn
SHAP
Visitor
Feature pipeline
ML router
Best variant
Unbounce·2018–2020
Smart Traffic personalization
Problem
A/B tests pick one winning page for everyone, even when different visitors convert on different pages.
What I built
Real-time ML routing that sends each visitor to the landing-page variant most likely to convert, and the event and feature pipelines on AWS Lambda and DynamoDB behind it.
+20–30% conversions vs. A/B
Patent-pending
Python
ML
AWS Lambda
DynamoDB
Lead captured
Webhook + retries
Field mapping
CRM
Unbounce·2015–2016
CRM integrations that don't drop leads
Problem
About 1.5% of landing-page leads never made it into customers' CRMs.
What I built
I hardened the Salesforce, HubSpot and Zapier integrations with webhook retries, field mapping and alerts.
Failed deliveries 1.5% → <0.1%
−30% related tickets
Webhooks
Salesforce
HubSpot
Node.js
03
How I work
I do best on messy, cross-functional problems where nobody has written the spec yet.
Find the real problem
I talk to the people doing the work before I write code. Half the time the fix is a workflow change, not new tech.
Ship the simplest fix
The boring solution usually wins. When AI is the right call, I start small, keep a human in the loop and add autonomy once the evals say it's safe.
Measure what changed
Every launch gets a baseline and a success metric first: holdouts, A/B tests, golden datasets. If a number didn't move, I say so.
Core engineer on Smart Traffic, real-time ML personalization that beat A/B testing by 20–30% on conversions.
Built a lead-scoring model synced to Salesforce; top-scored trials converted at 3x the average.
Software Engineer I–II, GrowthFeb 2015 – Dec 2017
Built lead capture and scoring for the Landing Page Analyzer (#2 on Product Hunt, 8,000+ users in its first weeks).
Shipped 25+ onboarding experiments and hardened the CRM integrations behind every landing-page lead.
05
Toolbox
I pick the stack to fit the problem, not the other way round. A sample of what I've worked with:
Python
TypeScript
JavaScript
Go
Node.js
SQL
Java
C#
.NET
React
Next.js
Vue.js
Angular
Tailwind
FastAPI
Django
Flask
NestJS
Express
GraphQL
REST
WebSockets
SSE
Electron
PostgreSQL
pgvector
MySQL
MongoDB
Redis
DynamoDB
Kafka
AWS SQS
AWS Lambda
ECS
S3
GCP
Azure
Docker
Kubernetes
Terraform
GitHub Actions
GitLab CI
Jenkins
Datadog
Grafana
Sentry
OpenTelemetry
Linux
Claude
OpenAI
AWS Bedrock
LangGraph
LangChain
MCP
Temporal
Pydantic
Langfuse
LangSmith
RAG
Embeddings
PyTorch
scikit-learn
SHAP
Stripe
Twilio
Okta
HubSpot
Salesforce
PostHog
Segment
Clay
n8n
Education
B.Sc. Computer Science, University of British Columbia 2010 – 2014
06
Let's build something useful.
I'm looking for a senior role where I can own work end to end, from the first conversation with users to the dashboard that shows whether it worked. Send me a note, or see how I work on GitHub.