FishBot: Shipping a Computer Vision Bot as a Real Product
How a personal script for World of Warcraft fishing grew into a paid Windows app with its own vision models, five supported game clients, and a small business built around it.
Updated September 2026 to cover the current version of the app.
The Origin Story
Fishing in World of Warcraft is one of the most tedious activities in the game. You cast, watch a bobber float in the water, wait for it to splash, and click at the right moment. Then you do it again, hundreds or thousands of times, for achievements, rare items, and gold.
I started FishBot in 2024 as a tool for myself. It worked well enough that other players wanted it, so it turned into a product. Today it is a Windows desktop app sold at fishbot.org, and it has gone through more than 70 releases.
What the App Does
FishBot runs the whole fishing loop: cast, find the bobber, watch for the splash, click to reel in, loot the catch, re-apply bait on a timer, and repeat. It works only by looking at the screen and sending normal mouse and keyboard input. It never reads or modifies the game's memory.
It supports five versions of the game (Classic, The Burning Crusade, Mists of Pandaria, Forever, and Midnight), each with its own interface. The demo above shows the app on the left and the game on the right: the small preview is what the bobber model sees, and the panel next to it shows each step as it happens.
Two Models, Two Jobs
The first version used a single YOLO model to find both the bobber and the splash. The current version splits the work between two smaller models, which made each one easier to train and more accurate:
- Finding the bobber: a YOLO11 object detector scans the screen and draws a box around the bobber.
- Spotting the bite: a much smaller YOLO11 classifier looks only at the cropped bobber, several times a second, and answers one question: is it splashing or not?
Both models are trained in PyTorch with a set of in-house tools for recording gameplay, labeling frames, and tracking accuracy over time. For the shipped app they are converted to Intel's OpenVINO format, which runs quickly on ordinary CPUs, so players don't need a gaming GPU to spare.
Not everything needed machine learning. Reading the loot window uses plain image processing: the app figures out which game version's loot window is on screen, then recognizes items by their color patterns so players can skip items they don't want. Automatic baiting works the same way, by recognizing the character panel from a few fixed spots on screen.
From Web App to Real Desktop App
The early version ran as a Python server with a browser-based interface. That was easy for me to build but awkward for players to install and run. The current app is a single Windows program:
- Python code compiled to a native executable with Nuitka, which also makes it harder to copy.
- A standard Windows installer, built automatically on GitHub Actions whenever I tag a release.
- An interface built in HTML but shown in a native window, so it looks modern without a browser.
- Models encrypted with a new key every release. The app only receives the key after the server checks that the device and the app version are allowed.
- A server-side switch that can mark any version as out of date, so a broken release can be pulled within minutes.
- Encrypted session logs that players can send me when something goes wrong, without exposing their data to anyone else.
The Business Around It
The code is only part of the work. Running FishBot as a product means handling accounts, payments, support, and marketing, and I have automated as much of that as I can:
- Pricing: a free 30-minute trial every session, then $14.99 a month or $99.99 for lifetime access, handled through Stripe.
- Accounts: Supabase for the database and sign-in, with passwordless email codes.
- Website: fishbot.org is a Next.js site with setup guides, a fishing guide, and a blog.
- Support: an AI support assistant built on Claude answers setup and troubleshooting questions on the site, trained on the app's documentation and real support conversations from the FishBot Discord.
- Marketing: an automated pipeline writes, renders, and uploads a short video ad to YouTube every night.
- Monitoring: a private dashboard that tracks subscriptions, app launches, and payment health across my projects.
As of September 2026, the app was launched about 8,000 times in a month, across more than 400 active accounts.
Challenges
Every player's screen is different. Resolutions, graphics settings, weather, water color, and time of day all change what the bobber looks like. The fix was data: recording footage across many zones and settings and retraining until the models held up everywhere.
Five game versions means five interfaces. Each version has its own loot window and character panel. I keep saved screenshots from every version as test cases, so a change for one version can't quietly break another.
The game keeps changing. Patches move interface elements and new expansions add new looks. Fast, automated releases matter more than getting any single release perfect.
Key Takeaways
The gap between a working prototype and a real product is bigger than most developers expect. The detection models were maybe a third of the work. The rest was installers, licensing, updates, support, and all the small fixes that make an app usable by people who will never read the code.
Splitting one hard problem into smaller ones paid off repeatedly: two small models instead of one big one, plain image processing where a model wasn't needed, and automation for every task I would otherwise repeat by hand.
And building something that saves people time has real value. Players aren't paying for the technology. They're paying to skip hours of clicking so they can spend their time on the parts of the game they enjoy.