image.png

This blog post comes as I’ve finally accepted the reality of the con. It’s part closure for me, part angry ramble and mostly a cautionary tale that I hope warns developers away from a risky business. Sit back, relax and enjoy the story of how I lost hundreds of hours and tens of thousands of dollars on a single freelance client.

Note: though my client has chosen not to respect the terms of our contract, I will, mainly because, as we will discuss, they have the financial means to avoid responsibility, while I do not. The details below are not as complete as I’d like them to be, because I do not want to run afoul of my contract terms.

Our story begins in February. I was approached by the CEO of a company based in my area who wanted a back end data processing system built out. The system needed to be built to process hundreds of PDF documents in a short period of time, classifying sub-documents within them and extracting data from them. We discussed terms and landed on a contract, which we both signed, with the following general terms:

Notably, I explicitly stated in the contract that:

I made a few mistakes in the contract that we will discuss below, but I want to note here that there were several conversations, specifically about a mysterious “previous developer” who “ran off with the codebase” that they were supposedly suing that should have tipped me off, which leads to the first lesson:

Lesson 1: If it feels sketchy, listen to your gut and leave.

I remember in hindsight talking about it with my wife and both of our eyebrows went up, but the money looked good and the project sounded cool, so we ignored our gut and went along with it.

image.png

hard work doesn’t always pay off

Over the weeks thereafter, I worked harder than I’ve ever worked in my life. We’re talking 60-80+ hour work weeks, nights, weekends and everywhere I could find a minute to code. The scope expanded almost immediately, but even the base scope was intimidating: a Rust backend capable of processing hundreds of documents an hour, doing document data extraction and classification, error handling, etc.

In the beginning, I explicitly was not handling infrastructure. I was told in the beginning that they already had the old codebase in production, but that it was just a compiled Python executable without the source code (because the developer had supposedly run off with the code…), so I figured the infrastructure was already there and that this would be a plug-and-play replacement.

That turned out to be incorrect, and in hindsight this should have lead me to believe they weren’t being entirely truthful about the “previous iteration” if it had existed. There were no production servers, there were not even any customers (I had been told they were post-revenue during the contract discussions, a mistruth that should have been enough to turn away to begin with) and I had no way of running a document through the old system to test its output against mine.

The infrastructure was stood up by a third party, but I was responsible for setting up CI/CD, dependency management, etc. This is where I made another, big mistake. In setting up the CI/CD, I decided to just build the codebase on the production systems. This was a mistake, as it meant the client now had unfettered access to the source code. If at any point in time they decided not to honor the contract, I couldn’t hold the source code above their head to influence payment.