Building a Fantasy Premier League Chatbot with Vibe Coding (and Tears)

I’ve been having fun recently vibe coding a chatbot that can access data, in this case from the Fantasy Premier League, and fetch the exact results a users asks for.

The bot uses a concept the AI world calls “Tooling” to fetch results and display them.

You can type in queries like:

Midfielders in good form between 8-10 million

It understands different languages, like:

Crazy rizz midfielders that are not too expensive

Miðjumenn í fantaformi sem eru ekki of dýrir

Try it out here: FPL With Robots.

I’ve learned a lot in the process both about vibe coding and tooling. Tooling, which was a more profound insight for me than vibe coding, will wait until the next post. Vibe coding is sexier, so we’ll start with that.

Spoiler: it’s both amazing and infuriating.

Vibe coding - the good bits

Vibe coding is a term coined by Andrej Karpathy, former director of AI at Tesla and co-founder of OpenAI. Instead of doing all the hard work of writing code, line by line, you just sit back, prompt the AI, and watch the code appear on your screen.

You can vibe code by prompting Claude or ChatGPT (I prefer Claude) and copy paste the results into your code, or you can use tools like Windsurf, Cursor, Replit or Lovable, which will edit your files directly.

Vibe coding is both amazing and infuriating. I got a chatbot working with FPL data in my terminal in minutes, and converted it effortlessly to using HuggingFace’s Gradio web interface. Three days in, and all I had left to do was launch.

This is what my program looked like after an hour or two. Pre-AI, I would have spent days on this.

Vibe debugging - the bad bits

This was so much fun. Then came the last 10% of the project. It took 90% of the time, and sucked out most of the joy. The calculations were wrong, Claude can’t do a proper OAuth flow, Heroku would crash complaining about memory consumption and Fly.io couldn’t even compile it.

Me on the first weekend of March, me during this weekend.

I tried to make the app more memory efficient using Windsurf, which directly updates your codebase as you vibe code, but that bloated the code without solving the problem. One method was failing, but when I asked it to fix it, others would break. This continued ad infinitum, the pendulum swinging endlessly between fixing and breaking different parts of the code.

I ended up rolling back the memory changes, debugging myself and launching on render.com (which I highly recommend).

Then, I had Midjourney draw up a logo for me.

Try out the bot here and let me know what you think.