Trashiest Panda started as a personality experiment more than a utility bot. It lives in a Discord server, follows the conversation, and replies in character — a raccoon persona — whenever it is addressed, rather than answering every message that goes by.
The part I actually wanted to prove out was the inference path. All of its replies are generated by a local LM Studio server running on a desktop GPU on the home network, not a cloud LLM API. Discord bots that lean on hosted LLM APIs rack up a per-token bill the moment they get chatty; routing everything to hardware I already own keeps the cost at zero no matter how often the bot talks.
It's built on discord.js and Node.js, Dockerized so the runtime is reproducible, and it auto-deploys to a Raspberry Pi through a GitHub Actions self-hosted runner — push to the repo and the Pi picks up the new build without me SSHing in to redeploy by hand.
The persona constraint is what keeps the bot in this awkward, fun place between a toy and a tool: it has to stay in character, not become a generic assistant, while still depending on a model small enough to run comfortably on local hardware alongside everything else sharing that GPU.
Notes for next time: a self-hosted runner on the Pi turned out to be the right amount of automation for a project this size — real CI/CD without standing up infrastructure that outweighs the bot it's deploying.