Work
Places I've spent time building things over the last 14 years.
Aug 2025 - Present
XTEL (via Convo)Lead Software EngineerThese days I work on a platform that helps consumer goods companies plan promotions and pricing. My corner of it sits between the models and the optimizer. I check that predictions are sane before they shape a plan, catch bad configuration early, and slowly replace older APIs without breaking the workflows people already rely on. A lot of the job is making a complicated pipeline fail clearly instead of mysteriously.

May 2024 - Aug 2025
Took a break after almost a decade of remote work. Time to relax, and to sharpen skills by reading books and blogs and watching videos. Then came back at XTEL.
Nov 2022 - May 2024
Tasq.ioSenior Full Stack EngineerOil and gas operators used Tasq to watch equipment, spot odd behavior, and automate the follow-up. I led a small team of three and spent most of my time on the backend. That meant speeding up slow APIs, folding a pile of separate services into one repo we could actually reason about, and trimming about $20k a year off our AWS bill. I wrote about the repo consolidation, the PR guidelines, and the cost work if you want the longer versions.

May 2018 - June 2022
BriteCoreSenior Full Stack EngineerFour years on a cloud platform used by property and casualty insurers to configure policies and coverage, eventually more than a hundred companies. I led the group that built BriteLines, a product definition service and rating engine. The win I still remember is a cache job for large risks that used to run for 23 minutes and time out. We got it down to about 12 seconds on Lambda. I wrote about the cache speedup and the Lambda stampede on MySQL.

Jan 2017 - Dec 2017
Artstor (via Active Capital)Senior Software EngineerA digital asset platform used by universities, museums, and libraries to manage and share large image collections. I spent most of the year on DevOps and mentoring two developers. Moving deployments onto Docker cut downtime from roughly eight hours to one, and a lot of the rest was Nginx, monit, cron, and small scripts that kept the machines honest. Longer version of the Docker deploy work is on the blog.

Jan 2015 - Dec 2016
Chef Galaxy
Co-founder & sole engineerA marketplace where people could find and hire chefs for dinners, catering, and events. I built the whole thing, from the Flask backend and frontend to the database and the AWS setup underneath. It never really took off, but failing at my own product taught me more than a lot of jobs that went fine. I wrote about that in Four years on Chef Galaxy, and about the AWS setup.

Jun 2012 - May 2015
Crossover
Software EngineerMy first full-time role was a dashboard that showed automated test results, code quality, and coverage across a couple hundred products. Mostly ExtJS, custom themes, infinite-scroll grids, heat maps, and yes, Internet Explorer support, which was still a real requirement then.
Open Source Projects
Libraries and commands I keep in public. A couple of them are the code behind posts on the blog.
- deferjob: Durable delayed jobs in Postgres. Schedule work months ahead as a row you can query, cancel, and move, and a worker claims it with SKIP LOCKED. The longer version is Scheduling work months ahead.
- natpath: A read-only command that shows which private subnets still send S3 and DynamoDB through a NAT gateway, because the free gateway endpoints are missing. That path was most of the bill in Cutting $20k a year from our AWS bill at Tasq.
- filtered-fanout: A Python CDK construct. One SNS topic, several SQS queues, each with a filter and its own dead-letter queue, so one slow worker does not stall the others.
- pixindex: Indexes pictures in a folder or an S3 bucket. Search by camera, date, and GPS, or by what the picture shows. Find copies of the same shot. The pictures stay where they are.