Previous Projects
From 2013 to 2025, I worked full-time for a fintech startup. It began as a 6-month contract, they kept giving me work,
and after a year they asked me to become an employee. That job came first, and I kept looking after a few of my own
clients in my spare time.
In 2024, one customer needed a way for global teams to send in finished recordings, organized by
series and episode. Many of the team members don’t speak English as a first language, and each recording can run to
several gigabytes. I built a one-page web app for it. A team fills in a form, drops in their files and clicks
Upload, and the recordings land in the customer’s Amazon S3 bucket. The files go straight from the browser to S3, so
the web server never handles a byte of them.
When one of my customers’ email campaigns failed, I built DMARC Help. It was a private tool that showed my customers
how much of their email the big mailbox providers trusted, and who else was sending mail in their name. DMARC was a new
technology, and I wanted to see what it could do. I built all of it, starting in 2017, and ran it until 2024. It was
never open to the public.
Discover France (archive) ran guided and self-guided bicycle tours, and multisport tours in France. I came in during a
2008 website upgrade and supported the business until it changed hands in 2017. During this time, it became authorized to
run VIP Tour de France tours, able to let its riders onto the closed racecourse just before the pros arrived. I handled
the technical side of its website and several sister sites.
Great American Coil makes heating and cooling coils for HVAC systems. Around
2010, I inherited its coil performance application, written in Visual Basic 5. It worked out the hot water (heating)
and chilled water (cooling) coils an air-conditioning job needed. These coils were typically used in large office
buildings, with separate A/C controls for each office. Great American Coil’s sales staff used it, its engineers used it
to cross-check customer requests, and its customers used it too. For each coil type, it printed out all of the relevant
inputs and calculations.
Xtreme Clutch, a division of Australian Clutch Services, needed a way for customers to find a distributor near
them. Honeyweb, a local web design firm, built the website. I built the
distributor search on xtremeclutch.com.au (archive).
What It Did
I imported 520 distributors, then built a search around them:
- Regional sub-pages. Each region had its own page listing every distributor in it
(e.g. Queensland, archived).
- Search by postcode, suburb, state or country. A search run from a regional page stayed within that region. You
could also search across all areas at once.
- A Google Map. The map zoomed in or out as needed, so that every distributor in the results was on screen. A click would give the customer immediate access to the distributor’s phone number.
- An HTML list of the same distributors. Clicking any distributor in the list selected it on the map.
The site ran on ExpressionEngine, so the search was a custom ExpressionEngine plugin.
In 2010, I built the management website for CrossFit Full Strength, a gym in Phoenix, Arizona. I worked alongside the
gym’s owner and coaches, around what they did every day: write the day’s workout, record everyone’s scores, fill classes,
pay coaches and collect dues. I then rebuilt it as The Box Tracker
(archive), a hosted product that many gyms
could share. The first 2 gyms were onboarded in April 2011 and, at its peak, 15 CrossFit gyms ran on the platform.
In October 2010, a customer’s website was being actively exploited. It was a custom-built PHP site, and 6 other
developers had worked on its code over the previous 5 years. The attacker had found a handful of SQL injection points,
and one Execution After Redirect flaw on an admin page: the page sent visitors who weren’t logged in to the login page,
but kept running the code below the redirect, so anyone who ignored the redirect could use the page anyway.
One customer recently needed their website to know the distance between people. It did not have to include exact driving
directions, so I based it off of zip code latitudes/longitudes. I got these indirectly from the
US Census Bureau (archive) and used fuzzy trigonometry.
The first step was to find a way to put the zip code information into a database. The latest available (circa 2004) which was
easily workable came from http://www.boutell.com/zipcodes/ (archive).
A project required me to map the serial numbers of USB flash drives, to the DOS drive letters associated with
them, with a very high degree of certainty. This is not the serial number of the volume (or partition) but of the device
itself.
This means that if I insert a PNY Attaché 512 MB memory stick, and Windows assigns it the drive letter F:\, then I
need to know that F:\ is a USB flash drive and that the serial number of that device is 075916911BF9.
In 2009, a customer needed a way to stream disk images over the network when imaging new machines. Since the machines
were new, the images were mostly empty space, which made them good candidates for compression. CPU was a bigger
bottleneck than network bandwidth, and he decided the existing compression options, including gzip, were too slow. He
also wanted to use udpcast to image multiple machines at once.
Another developer and I worked on a proof of concept, passing code back and forth through the customer. The other
developer wrote the first version, and I found several large speed gains.
In November 2008, a customer in England wanted to run a free online service that called web pages and scripts on a
schedule. His vision was a cross between an uptime monitor and a cron schedule for web endpoints: you gave http.sh
(archive) a page or script and a schedule, and it
requested that page on time and reported how the request went. He wanted the scheduler written as a multithreaded Linux
daemon in C. I wrote the daemon and delivered it in mid-December, then answered his setup and data questions through
January 2009. I didn’t build the website.