Inspiration

We've all been in that Discord server. Someone sends "you're literally so perfect 🥺" in main chat. Someone else gets way too soft on VC at 2am. The cringe is unbearable, and nobody ever says anything. We thought: what if the moderator was an AI that watched everything, judged silently, and then roasted you in front of the whole server the moment you slipped up? Rizzless is that bot.

What it does

Rizzless is a Discord bot that publicly calls out flirting in real time across three surfaces:

Text — every message gets scored 0–100 by Gemma 4 for flirt intensity. Anything 60+ gets a savage AI-generated comeback referencing what you actually said.

Voice — joins your VC, transcribes everyone's speech with Groq Whisper, scores it, and roasts you out loud through ElevenLabs TTS while you're still in the call.

Images — Google Cloud Vision flags hearts, kisses, racy content, and joyful faces. The bot weaves what it saw into the roast.

Repeat offenders get DM warnings, public "cheating" callouts when they flirt at multiple people, and Discord timeouts. There's no escape.

How we built it

Node.js + discord.js for the bot itself. gemma-4-31b-it (via Google's Gemini API) handles both flirt scoring and adaptive comeback generation. Groq's Whisper Large v3 Turbo does sub-second voice transcription.

ElevenLabs Flash v2.5 streams TTS as Opus packets straight into Discord with no FFmpeg in the path. Google Cloud Vision handles image moderation via service account auth. State lives in-memory; everything runs locally on a MacBook.

The latency-sensitive parts (TTS fetch, voice channel join, LLM scoring, image analysis) all run in parallel with Promise.all, and the voice connection stays warm between callouts so back-to-back roasts don't pay the join handshake twice.

Challenges we ran into

Voice was a minefield. ElevenLabs returns mono PCM but Discord expects stereo, so our first audio test sounded like a sped-up chipmunk. Switched to Opus and let Discord handle channel demuxing.

One bug locked users out forever. Our voice listener freed its per-user slot only on successful transcription so any too-short utterance left the user "permanently speaking" and the bot ignored them for the rest of the session.

API key auth doesn't work for Vision anymore. Google now requires service account JSON files, which meant a whole new auth path. We then leaked a key in chat and had to revoke it. Don't paste secrets, kids.

Cooking a MacBook Air with Gemma 4 26B locally. We tried Ollama for a free LLM. The fans hit takeoff speeds and responses took 30+ seconds. Went back to the hosted API.

Adaptive quips kept timing out. Our first version had a 1.2-second cap on LLM calls but the model needed 1.5–3s, so every quip arrived too late and we shipped a generic line instead. Removing the timeout fixed it instantly.

Accomplishments that we're proud of

We are very proud of the monster we have created... Voice, text, image, no one is safe from cringe-detection, this bot airs everyone out with no acceptions.

It was great to test different technology and find fun ways to utilize them, and we are proud that this actually works!

What we learned

Local hosting is NOT for the weak. Almost melted a hole in the table where my laptop was sitting trying to host this on my macbook.

Parallelize any LLM calls you can to reduce latency, some take a long time, it is better to start that call early and recieve results as fast as possible.

Google Cloud Studio and Google AI Studio don't share credits :( but thankfully, theres a free tier and some credits we were gifted to test out this tech! Yipee!

What's next for Rizzless

Ideally, we host Gemma locally on a more capable machine, that way we minimize API dependency.

We were thinking about adding different detection capabilities to Rizzless, like a cornball detector 🥀, and maybe a performative male detector 🍵📖

Built With

  • discord.js
  • elevenlabs-api
  • gemma-4
  • google-cloud-vision-api
  • google-gemini-api
  • google/genai
  • groqapi
  • groqwhisper
  • javascript
  • node.js
  • npm
Share this project:

Updates