HomeAboutWorkServicesPluginsMonitorBlogContactstart_a_build
Florida Keys· 6 min read

DirtyBoat: The Charter, The Code, The Booking Engine

How the DirtyBoat booking engine actually works. Astro, Supabase, Stripe direct, and a Claude agent that books charters while I am offshore at Robbie's MM 77.5.

KM

Kit Mobley

Islamorada, FL

DirtyBoat: The Charter, The Code, The Booking Engine

The short version of the boat

DirtyBoat 2.0 is a 42 foot Custom Liberty Express, full tournament rigged, sitting in slip at Robbie’s Marina, Mile Marker 77.5, Islamorada. Offshore only. No backcountry, no bay, no bridges, no flats. If you want a poling skiff for tailing reds, I am not your captain. If you want to run blue water for sails, mahi, tuna, and wahoo, that is what the boat is built for.

One word, capital D, capital B. DirtyBoat. The name came off a 1995 32 foot Blackfin that Joe Sabe bought and never got around to renaming, and the full story of how a placeholder became a brand is its own post: DirtyBoat: What the Name Actually Means to Me. This post is about the other half of the operation, the code.

Why I built the booking engine myself

Most charter captains in the Keys book through FareHarbor, OpenWater, or a paper calendar taped to the helm. FareHarbor is fine. I use it for affiliate flow on Robbie’s Marina, which has pushed $7.1M+ in online revenue through that network since 2016. It works.

But for DirtyBoat specifically, I wanted something different. I wanted the booking flow to know things FareHarbor does not know. Tide windows. Sargassum reports. Whether the sails are running off Alligator Reef this week. Whether the customer is asking about a half day when the only thing biting in that window is a full day run to the humps.

So I built it. Astro front end, Supabase for state, Stripe for payment, and an Anthropic Claude agent sitting in the middle. The agent reads inbound charter requests, checks the calendar, knows my rules (no backcountry, two anglers minimum on overnights, deposit policy, weather cancellation terms), and either books the trip or routes the conversation to me by text.

The result: I stopped losing trips at 11pm on a Tuesday when somebody from Ohio is planning their week and I am asleep because we left the dock at 5am.

The whole build took about three weekends. Nothing exotic in the stack, it is the same one I put on client sites. The build cost me roughly what I would have paid FareHarbor in platform fees over 18 months, and after that the platform is free forever and does exactly what I want. That math works for any captain running more than 40 or 50 trips a year on their own boat.

It also ended the deposit fights. Stripe holds the deposit against the reservation, the cancellation policy is in the confirmation email and the terms checkbox, and nobody argues about whether they agreed to a 72 hour window when the timestamp is sitting in the database.

What the agent actually does

People ask me what an AI agent on a charter site does that a form cannot. Fair question.

A form collects data and dumps it in your inbox. You read it at 9pm, you reply at 10pm, and by then the customer has booked with the captain three slips down who answered in twenty minutes. That is the entire problem with charter booking. Speed of reply correlates almost perfectly with conversion.

The agent answers in seconds. It also answers correctly. If someone asks about light tackle tarpon in May, the agent tells them we are offshore only and suggests two captains who run backcountry out of Robbie’s. That referral is worth more than a bad booking. The customer gets the right boat, the other captain gets a trip, and nobody walks away from the dock disappointed that DirtyBoat does not do what they thought it did.

If someone asks about sailfish in February, the agent confirms availability, quotes the trip, sends a Stripe deposit link, and writes the booking to Supabase. I get a text. The customer gets a confirmation. Done.

The numbers after a season of running it this way: about 60 percent of bookings now come in through the site and clear without a single human touchpoint until the morning of the trip, and the volume of pre-booking questions in my text threads dropped by roughly two thirds. I answer edge cases now, not the same twelve questions every night. Yes, one of the twelve is whether there is a bathroom. There is. It is a head. Everyone calls it a bathroom until they are on the boat.

The boat name is the best keyword you own

Here is a piece of local SEO most Keys captains miss. If your boat has a distinctive name, that name is your best long-tail keyword. People search “DirtyBoat charter” or “DirtyBoat Islamorada” after a dock neighbor mentions us or they watch the boat come into Robbie’s at three in the afternoon with flags flying. Those searches convert far better than “Islamorada fishing charter” because the searcher already has intent.

The mistake is letting that brand equity live only on Facebook or Instagram, where Google cannot see the content properly. I own dirtyboat.com. I own the schema on the page and the reviews structured data. When someone searches the boat name, the first result is my site, not a third-party directory pulling my info and running ads against it. I do the same work for the charter clients I build for: get the boat name locked down first, then worry about the generic terms.

What the website teaches the developer side

Running my own charter site is the best web dev research I have. Every assumption I would make about a client site, I get to test on myself first, with real money on the line.

A few things I learned that I now bake into every charter client I build for.

The phone number has to be a text number. Charter customers do not call. They text from the parking lot of a Publix in Plantation, Florida, asking if tomorrow is open. If your contact button opens a voice call, you lose the booking. DirtyBoat charter line is (305) 209-5594, and it is set up so taps from mobile go straight to SMS.

The gallery has to load fast on bad cellular. People look at charter sites in the car, on US-1, between Florida City and Key Largo, where coverage drops to one bar. If your hero image is a 4MB JPEG you are invisible to half your buyers. Astro with proper image optimization handles this. WordPress with a stock theme does not.

The address has to be a marina, not a street. Mile Marker 77.5 means something to anyone who has driven the Keys. The street address of Robbie’s means nothing to a customer trying to find the dock at 5am. Every charter site I build now has mile marker plus marina name in the meta description, in the schema, and in the first sentence of the contact section.

Two hats, one workshop

I get asked how I do both. Charter captain in the morning, developer in the afternoon. The honest answer is that the two jobs feed each other.

The boat pays for the development habits I would not otherwise have. Writing code that runs unattended for a week while I am offshore with no signal teaches you to build for failure in a way that comfortable office work does not. If the booking engine breaks at noon on a Saturday and I am 22 miles out on a kite spread, the system needs to either keep working or fail in a way that does not lose the customer.

The development work pays for the boat improvements that make the charter better. Last winter I rebuilt the live well plumbing with money from a Vice Alliance project. The year before, new electronics. The year before that, full tower rigging.

This is also why I do not build websites for clients I would not respect as a customer. I have a slip to pay for. I do not have time to argue with a contractor about whether their site needs a carousel.

If you found this page searching for DirtyBoat

If you came here looking to book a charter, the boat is at Robbie’s Marina, MM 77.5, Islamorada. Booking line: (305) 209-5594. Trips run year round, offshore only, two anglers minimum on full days.

If you came here looking at the web dev side, the booking engine that runs DirtyBoat is the same architecture I build for other charter captains, marinas, and Keys businesses. Astro, Supabase, Stripe, Claude. Text me at (954) 682-9551 or email km@kitmobley.com. I usually reply between trips.

Either way, the name stuck. I am keeping it.