CurseForge Discord Bot Manager - Release Tool

Python tooling, Tkinter UI, Discord bot workflow, CurseForge API integration

Problem
Tracking several CurseForge projects by raw IDs made release announcements, channel routing, and testing harder to manage from Discord alone.
Work
Adapted an existing release bot into a local desktop manager with tracked-mod tables, CurseForge search, per-game/per-mod routing, stats, tests, and screenshot-safe settings.
Tech
Python, Tkinter, Discord bot workflow, CurseForge API, local ignored runtime state, Windows launchers
Result
Mod release tracking becomes a visible workflow: see followed projects, test announcements, route messages, and inspect release state without editing config by hand.

Screenshot

CurseForge Discord Bot Manager dashboard

Overview

CurseForge Discord Bot Manager is my adapted fork of a Discord bot that watches CurseForge projects and posts release announcements.

The original bot already handled the core idea: monitor projects and notify Discord when a new file is released. My version focuses on the part I needed day to day as a mod author: making that workflow visible, editable, and less fragile.

I wanted to track multiple mods, see what each ID actually was, route announcements by game or by specific mod, test messages before sending them publicly, and avoid manually editing config values every time the list changed.

So I built a Windows desktop manager around the bot.

What It Does

  • tracks configured CurseForge project IDs
  • shows readable mod names, authors, games, downloads, likes, update dates, and stored versions
  • lets me add a mod directly by MOD_ID
  • lets me search CurseForge by name and add the selected result
  • supports followed/unfollowed state for configured mods
  • routes announcements by global defaults, per-game defaults, or per-mod overrides
  • supports global, per-game, and per-mod mention tags
  • stores sent versions so the same release is not announced twice
  • can send the latest release for a selected mod to debug or release channels
  • exposes logs, latest activity, last sent release, and error state in the UI
  • includes a stats view for downloads, likes, stored versions, and comments links
  • prevents duplicate manager windows
  • keeps .env, local runtime files, logs, database, API keys, and UI state out of git

Tracked Mods

The main table turns a raw list of IDs into something readable.

Instead of only seeing 1547636 or 1487708, the manager resolves each project through CurseForge and shows the mod name, author, game, downloads, latest CurseForge update, latest stored release, and current follow state.

Tracked mods table

This matters because I do not only want to track my own projects. If I follow another mod, the author column makes it clear that it is external and not one of mine.

The columns are configurable from the table header, and the app remembers the visible columns and sort state locally.

Adding Mods

There are two add paths.

For private, unlisted, or not-yet-indexed projects, adding by MOD_ID is still the safest option.

For public projects, the manager can search CurseForge by name and let me add the selected result.

CurseForge search dialog

The search depends on what CurseForge returns for the API key, so I did not remove the direct ID workflow. Both paths are useful.

Settings And Routing

The settings tab edits the runtime values that matter most without opening .env.

It includes the global message tag, debug channel, check interval, announcement toggles, reaction toggle, and per-game defaults.

Settings with safe screenshot mode

The per-game defaults are not a hardcoded list. They are generated from the games detected in the tracked mods. If I add a Subnautica 2 mod and the API returns its gameId, Subnautica 2 can appear in that section.

I also added a safe screenshot mode. It only changes what the UI displays; it does not edit .env. Discord channel IDs and mention tags are masked so I can take screenshots without leaking server-specific values.

Stats

The stats view is intentionally simple.

It gives me a compact table for downloads, likes, stored versions, update dates, and comments links.

Stats view

The goal is not analytics. It is a quick operational view of the projects the bot is following.

Discord Output

The actual output is a Discord release embed.

Discord release message

The bot can include the configured mention tag, changelog summary, release links, timestamp, reactions, and mod logo.

Implementation Summary

The app is built in Python with Tkinter and runs locally through a single Windows launcher.

The desktop manager wraps the existing bot workflow instead of replacing it. It can create the local virtual environment, start or stop the bot, run a one-time update check, send test notifications, inspect logs, and update tracked mod configuration.

Runtime state lives under .local/: virtual environment, logs, release database, PID file, window geometry, and UI preferences. That keeps the repository clean and avoids committing machine-specific or sensitive data.

The manager also has a small single-instance control socket. If I open the launcher twice, it asks the previous manager window to close instead of leaving duplicate windows running.

Scope

This is still personal tooling.

It is public because the workflow is useful to show and could be adapted by another CurseForge/Discord setup, but it is not trying to be a polished SaaS dashboard or a general moderation bot.

The value is in making my own publishing workflow less error-prone: know what is tracked, know where it announces, test the message, and keep release state visible.

Result

The final result is a practical release-tracking tool around the way I publish mods.

It turns a config-heavy bot into a small desktop workflow: track projects, inspect state, change routing, test output, and publish announcements without constantly editing raw environment values.