Thumbnail photo credits: @noonvincent

Happy 2026! This past holiday season was as refreshing as it was busy, and a bit of rest has given me a renewed vigor for All The Thingsā„¢. One of said Thingsā„¢ has been some focus time on a continued side project of mine for some time: a Discord bot named Jolyne.

In this post, I talk about what Jolyne does and why she exists, as well as all of the fun ways Jolyne has evolved over time.

Origins

The Gluten Cult

It was October 2019 when some close friends and I took a Games and Culture class back at MIT. For some reason, we decided it was imperative to play Team Fortress 2 for the class. We needed some flavor of voice chat, and long gone were my days of creating a Ventrilo or TeamSpeak server. My friends suggested Discord, and I already had an account that I occasionally used. Thus, The Gluten Cult was born.

Image
I wonder what will be around when TF3 comes out. 🤭

Any rational person is probably wondering, ā€œThe Gluten Cult???ā€ Long story short, my undergraduate dorm arranged its rooms around lounges that also functioned as unofficial clubs. In my junior year, this lounge was named The Bread Box. In my senior year, we rebranded to The Gluten Cult. Pretty much all of our naming conventions derive from this glutenous foundation (spoilers: the GitHub repository for Jolyne is named ā€œciabattaā€ since ā€œbotā€ is a homophone with the second syllable of ciabatta).

As time went on, we grew past our TF2 origins and invited more folks from our college lounge (including some alumni). Membership ballooned only a handful of months after the server was created when the Coronavirus pandemic grew in intensity. Our tightly knit friend group dispersed internationally and we could only keep in touch through social media. Discord provided a natural way for us to chat freely in channels dedicated to our interests. Furthermore, whenever we wanted to play videogames like Among Us or Overwatch, we had voice channels we could easily hop into. The fact that this was all free was just icing on the cake.

Music, Please!

Whenever we played video games, we liked the idea of having background music. Discord’s bot ecosystem was rich, and there seemed to be some popular ones that handled this task well (such as Octave). We used Octave for a while and generally had a positive experience with it. That said, we eventually ran into consistent and spurious failures.

Note: this was my personal experience back in 2021. If Octave is still around, this is no reflection on its current behavior, or its historical behavior for others.

ā€œOctave is a feature-rich Discord bot delivering the sweet sound of music from a plethora of websites straight to your server!ā€

At the time, YouTube really started cracking down on some of the lower effort bots that interacted with its streaming APIs. In search of an alternative, we ran across countless ā€œmusic bots,ā€ and their functionality varied from completely absent to feeling vaguely malicious. Our group also wanted to install more bots that had specific, dedicated feature sets.

To address all of these requirements, we eventually came to the conclusion that we should try creating our own bot.

But… Why Custom Bots?

Image
Zoolander is a classic!

I’ve always been a fan of doing personal projects just for the fun of it, but for every project that successfully kept my interest I have at least a dozen more that barely made it past a README.md. I wouldn’t say that creating a Discord bot particularly excited me. In fact, I’ve traditionally viewed creating bots as one of the least fun projects I could do on my own time, as they rely on established platforms that may impose arbitrary constraints.

That said, one of the most satisfying things one can do as a software developer is create something and get direct feedback. On a smaller scale, this may mean writing some code and finally getting it to work via some flavor of testing which, if I’m being honest, probably starts by just getting some code to run. In the long run, this might involve responding to actual user feedback.

Creating a Discord bot provided a unique opportunity where I could create something that people wanted to use, were willing to contribute to, and did not have the pressure of being public. The more I thought about it, the more it felt like a playground for new technologies I wanted to try out.

Jolyne

Stone Free

If there’s one thing you can count on The Gluten Cult for it’s never taking things seriously. Well, that and everything is a JoJo reference. You can set nicknames for users and bots in Discord, and our original nickname for Octave was Jolyne, the protagonist of JoJo’s Bizarre Adventure Part 6, Stone Ocean.

Image
Jolyne and her stand, Stone Free.

When we decided to iterate on Octave, the initial plan was to actually have a suite of bots. I claimed the main work on Jolyne, and in that same repository a bot named Gyro (after Gyro Zeppeli) was also being developed. In the end, we found it more sustainable to just work on one bot.

Getting Started

I started Jolyne in the pre-LLM era, so the knowledge needed to get her running was done the old fashioned way: Googling ā€œdiscord bot tutorialā€, copying code from Stack Overflow and GitHub, and if straits were truly dire I’d check the official documentation. Eventually, I had a functioning prototype running right off of my laptop.

Obviously, it wasn’t too sustainable to keep Jolyne running on my own machine 24/7. I researched a handful of different options, and I wasn’t too comfortable with the dedicated Discord bot hosting providers that were popular. I landed on the (questionable) decision of renting out an EC2 instance.

Image
Jolyne's beginnings were humble...

I was spending $10 a month, but EC2 is reliable and it was fun using AWS outside of a full-time employment context. Things were going great for a year or so; we used Jolyne regularly for music, folks had feature requests, and I got into the habit of pushing regular updates. I became comfortable digging into the odd ffmpeg and yt-dlp bug. I shoveled in Reddit posting, birthday reminders, and inside jokes. I created a reusable project template and build system to keep things organized. My friends even wanted to contribute every now and then. Jolyne quickly became my first stop when I was in the mood to work on personal projects.

Let’s Go On-Prem

I mean, not actually, but I was tired of paying $10 a month on an EC2 instance. I had a spare Raspberry Pi or two sitting around, and living in an apartment I wasn’t hardcore enough to set up an actual server rack (even though that is one of the first things I’m doing if I ever have a house with more space). I had a mini hackathon with some folks on my server, and my personal project was migrating Jolyne to run on a Raspberry Pi. It was by no means difficult, but it was pretty fun and saved me some money. Also, I enjoyed the process of creating a shared Google Doc with my friends, throwing a ton of ideas down, and chipping away.

Image
All the JoJo references.

Once again, Jolyne was in a steady state. Barring the occasional reboot, SSHing in to update her code, and the low hum of a fan, Jolyne ran without any problems. My friends and I had another hackathon where we added some new features like an integration with Google’s API, weighted sampling for daily posts to add a more natural distribution of posting, and custom GitHub Action runners to create ARM compatible images on ghcr that are polled via Watchtower. We even had some of our non-technical friends contribute ideas and implement changes on the server.

AI Is All You Need

Jolyne’s third stage really kicked off two years ago when LLMs became the new flavor of the month. I got lazy maintaining Jolyne on a Raspberry Pi and eventually moved her back to AWS, except this time I used Amazon Lightsail, AWS’ VPS solution. I wanted to make Jolyne’s development process a bit more standardized so that I had more of a response when my friends asked how to work on her more involved infrastructural changes.

I threw Jolyne on a Tailnet, uploaded all of her secrets to Infisical, created a development server and bot, and tightened up Jolyne’s testing, code standards, CI/CD, code review guidelines, and deployment. Setting up Jolyne is easy as:

git clone https://github.com/hierophant-green/ciabatta.git
cd ciabatta
bin/setup
bin/jolyne

I also created some convenient release scripts, easy and informative PR generation, and descriptive logging. Bottom-line? Jolyne became the outlet for all of the (reasonably applicable) development wants and best practices I dreamt up. The new technologies that were coming out? I would add them into Jolyne just for fun. To this day, I still pay for separate OpenAI and ElevenLabs API tokens for some of Jolyne’s features like a custom MCP used by a Jolyne agent and a ā€œhomunculusā€ feature that impersonates people in our server voice chats.

Image
Jolyne's mermaid diagram. šŸ§œā€ā™€ļø

Parting Thoughts

The rate at which technology has been evolving, as well as the discourse around these advancements, is truly incredible. As someone who is a tech enthusiast, as well as a security professional who tries her hardest to stay on top of new trends, I’m usually trying to figure out how these new developments may change my old habits. For me, the best way to do this is through direct experimentation. That being said, it’s hard to stay afoot when new tools and paradigms are created daily, especially when a lot of my cognitive effort is already being spent professionally. Having a creative outlet like Jolyne bridges this gap, and adding new features to her is always fun and worth the effort.

What’s Next?

There’s a long list of Jolyne GitHub issues, suggestions from friends, and technologies I’ve been meaning to experiment with. That said, when I started writing this article, it was before Discord’s decision to enforce age verification. Jolyne’s next feature might be a Spotify integration or a full migration to another provider. All I know is that either way it’s going to be a lot of fun.