Me A picture of me

My name is Justin Willis and I am a computer scientist. I call myself bkvaluemeal because, a few years back when I used to play Xbox, that was my gamertag. It's stuck ever since. I now spend most of my time programming, learning about my major and starting new projects. I primarily use Python, but I also know Java and various web development languages. I am very interested in AI and automation and have a few projects about that in development.

I've been working with computers since I was probably about 7 years old. The earliest thing I can remember doing was learning HTML and making webpages with Trelix Web on my family's computer. My mother used to teach computer concepts and was probably what drove me to pursue this field. I credit my father with actually providing me my first textbook, albeit an online one.

One summer I just decided to learn Java. It seemed really interesting to me and I wanted to master it. I began to watch a playlist on YouTube from TheNewBoston and then used that to write RuneScape bots. Hence my obsession with automation.

The reason I learn something new is because I want to apply it. That's exactly why I chose to master Linux. I saw how resource intensive Windows is to run and thought, "there has to be a better way". Linux, in general, is far superior at running efficiently in my opinion. There must be a reason why practically every website runs on it. In my experience, everything just simply works on Linux. There are no cumbersome redistribute packages you need to download and install for a program to run, Python and Perl come preloaded with most distributions and if you need anything else, it's just a quick command to execute.

I've always had this innate desire to deeply understand something. I find myself unable to stop working until I reach a satisfying milestone or finish entirely. That said, most of the projects I start are never finished. They are forever in a state of infinite development and evolving over time. Because of that, I usually release them as open source for other people to contribute and help develop.


ACM Programming Competition Team aLife().get() at the ACM Programming Competition

During my senior year in high school, I was awarded an internship with the local chamber of commerce to design and develop an events calendar we called the Bee Line . I was paired with a marketing firm who taught me how to do it right and within a few months we had an final product we were ready to show. One feature that I personally created, but was scrapped in favor of the official paid version, was an easy to use form to add bulk events to the calendar. To do this, I learned how the events were stored in the database and created a form to match it. Nevertheless, everyone was satisfied with our work and the Bee Line is still used to this day.

Fast forward to my junior year at university, some friends and I competed in the programming competition. We were restricted from the internet and left only with our knowledge to complete 5 rather difficult problems. To my surprise, we placed 3rd out of 16 teams and received a balloon for it.

Later, I applied for a research grant to develop robotics software with my professor. The goal was to create a modular navigation library for the popular robotics framework ROS. Essentially, what we did was take the existing library and add more control over it by allowing the user to build a flexible navigation stack to suit the needs of their particular application. The original library did everything automatically and without user intervention, which is great, but would frequently become disoriented and perform actions which we thought were unnecessary. Thus, the Flexible Navigation library was born. With our software, your robot can go anywhere and do it exactly how you want it! Previously, an operator was restricted to using only a max of 2 planners, but with our modular approach, you can use any number of them each with varying levels of precision. The possibilities are endless!

I start a lot of projects. Some of them aren't finished, while others are fairly mature. I mainly develop in Python simply because it's an extremely easy language that allows you to cheat and has decent memory management. Compare that to Java, which I started out with, needs to run a large JVM which sucks up RAM and enforces "good" practices with public/private identifiers which effectively eliminates cheating. Look, sometimes you need to touch the privates of an object to get the job done! It also helps when you can write an application in something close to English. Plus, I mean, Python comes standard in all major distributions of Linux and Mac (spoiler, Linux basically depends on Python 2.7). Go has recently caught my eye and I hope to learn it and do something with it soon.


2015 - Present
[kuh-bood-l] noun, Informal
  1. the lot, pack, or crowd

I wrote this Python library to extend the features that Selenium offers. It is my standard utility for browser automation and web unit testing and as my use case grows so will it.

I initially created caboodle to natively support CAPTCHA solving using Tesseract . I got decent results with a sample data set, but it never proved to translate well to production. The work around I decided to implement was paid CAPTCHA solving using ruCAPTCHA (who appears to be cheapest service on the Internet).

My initial attempt at writing the library was extremely unorganized and very difficult to maintain. You could have called it spaghetti code because there was only one main function to handle everything with a complicated series of logic statements and loops to make it all work. Eventually, I got so fed up with it that I scrapped the entire code base and rebuilt it.

The v1.0.0 release introduced a dynamic challenge/agent system with a defined base class for each where you would add only the capabilities that you need. The new system works where the Challenge objects collect data relevant to solve a particular challenge, package it up into a dictionary, and pass it around to every Agent until one has the capabilities to solve it. The results are added to the dictionary and sent back to the Challenge who executes the necessary actions to complete the request.

2016 - Present

I wrote this Python application to export the abandoned Tesseract CAPTCHA solving features and all of the image processing libraries it required out of caboodle. This one feature made it extremely complicated to install and run caboodle and thanks to the v1.0.0 rebuild, I was able to move all the complicated bits into a self contained Docker image. provides a web API and web management console for image analysis and image recognition using Tesseract for optical character recognition and Clarifai for AI based image analysis and recognition.

2017 - Present

I wrote this Python application to wrap caboodle into a web API hosted in a Docker container for instances where it is not entirely feasible to run it alongside the parent program (like a dependent Docker image). exposes the CAPTCHA solving capabilities of caboodle (reCAPTCHA and Solve Media) in a simple web API.


2013 - Present

This is probably my biggest and most involved project I have ever worked on. I started it in the summer of 2013 with the goal to automate the internet in an attempt to make money. It began when I decided to program an Arduino Leonardo to act as a keyboard and mouse and connected it to an Android TV stick to automate App Trailers. I was banned very quickly, but I was able to make $50 that summer by doing nothing.

I eventually learned about Proxmox and LXC containers and found a way to run Android x86 virtually on a spare computer. I rigged up a bot using Android's ADB over a network socket and was able to run 4+ VMs on a single machine for no cost. This too was banned quickly, but I didn't give up easily.

During my freshman year of college I learned about the ARChon Runtime for Chrome. This method was by far the most efficient way to run Android apps and enabled me to run as many instances as I could fit in RAM. Of course, however, this got banned.

I have since moved to the Internet and have found several websites that offer money for medial tasks. I created a Python library called caboodle to provide browser automation like a human would that even supports CAPTCHA solving (way before the hype train when everyone else thought it was cool, might I add).

I like to think that this project is what drove me to learn the stuff I know today. I mean, by doing all of this I learned about IP black lists (by banning my dorm from Google's ReCAPTCHA), containerized workflows (which later led to Docker), git, Python, event loops, etc.



Good documentation is essential for any project; because, how else would you know how to use it? I have invented my own standardized format for Python docs and grew tired of manually typing it every time. So, I wrote Docgen to do it for me.

Docgen works by importing your Python project and recursively reading every docstring. It formats the docstrings into Markdown and writes them to disk. You're then able to commit them to Git and view them in your browser for easy access.

Docgen was the first command line application that I ever wrote using Python as everything before it was either a library or web based and not intended to be used directly from the command line.


2015 - 2016

Kiwi was an attempt at building a better WordPress, but without a database to manage everything. The concept was to read and write HTML using PHP in a static/dynamic way. I realize those two words directly contradict one another, but hear me out.

Why run a relational database on your server when all it is going to do is serve mostly static content (like a blog)? You could completely eliminate that database and save page load time, by spending extra time reading and writing the file once and then serving the static content later.

In practice, this was much quicker than WordPress, but lacked an easy method to customize and edit content. I implemented a system of "mods" to allow one click deployment of things like Bootstrap, which worked well, but I quickly grew tired of writing PHP and the project became abandoned. I hope to pick this back up some day and redesign it in a much more efficient way. I'm considering rewriting this in Go and implementing a decoupled single page system using Javascript like Ember, but better.