Skip to content

Feature Roadmap

Jason Tucker edited this page May 6, 2026 · 7 revisions

Feature Roadmap

A living document describing what's planned, why, and the concrete steps to ship it. Each feature also has a card on the Bot Development project board with a matching breakdown — bring those into "In Progress" when you start, and use the implementation steps below as the punch list.


Status legend

  • Shipped — running in production, documented, and wired into /help
  • 🟡 Infrastructure ready — schema and/or /sudo → Settings toggle exists, but the user-facing behavior hasn't been built
  • 🔵 Designed — concept agreed, scope written, no infrastructure yet
  • 💭 Idea — bullet on a napkin; needs more thought before estimating

✅ Recently shipped

The 0.7.x and 0.8.x lines covered most of the original Phase 5/6 backlog:

  • Auto voice channels with persistent control panel — hubs rename in place, replacement hub spawns, attached private text channel, sticky 📋 Open Panel button, reconciler on startup
  • Voice control panel buttons — Rename, Lock/Unlock, Hosts (single panel listing all members with rank emojis), Templates (Auto / Counter / Comp 5-stack / Tryhard / Chill), Claim, Delete
  • Random tech default channel namesSloppy Ethernet style fallback when no rich-presence game is active
  • /report flow — modal → owner DM with Approve/Reject (notify or silent) → GitHub issue
  • /sudo → Settings panel — runtime config for sudo users, channels, voice cleanup delay, and the auto-thread channel list. Backed by bot_settings (key/value overrides), sudo_users (members granted sudo at runtime), and auto_thread_channels (the dynamic auto-thread list). See Slash Commands for the full sub-panel reference.
  • Auto Threads — channels added under /sudo → Settings → Auto Threads get a public thread on every non-bot message. Default thread name {author} — {first line} (100-char cap). Backed by auto_thread_channels. Requires the MessageContent privileged intent. Shipped as a single dynamic list rather than the per-channel feature flags originally drafted (clips/food were collapsed into one panel during implementation).
  • Hub Channels (dynamic)/sudo → Settings → Hub Channels adds/removes hubs at runtime. HUB_CHANNEL_IDS env is now a one-time legacy seed list; the DB is authoritative. Reconciler-driven hub recreation, replacement-hub flow, and isHubChannel() are all cache-backed.
  • channel.auto_voice_category override — the AUTO_VOICE_CATEGORY_ID env value is now overridable from /sudo → Settings → Voice. Auto-channel creation, hub registration, and the reconciler all read via getSetting() ?? env.AUTO_VOICE_CATEGORY_ID.
  • User profile editor — sudo-side editor under /sudo → Settings → User Profiles and via right-click → Manage User → Edit Profile. Self-service via /profile. Sudo edits all fields; self mode covers display name, birthday, and opt-out toggles. Every edit logs a profile-edit line.
  • Birthday pings — daily scheduler that fires at the configured target hour (default 9). Members opt out via /profile. Idempotency via bot_settings.birthday.last_run_date. Feb 29 birthdays handled in non-leap years.
  • Game roles + game prefs + /play LFG/sudo → Settings → Games is a full catalog editor (name / aliases / sort / view role / ping role / channel / visibility / archive / delete). /games is the self-service prefs editor; Manage User → Game Prefs is the sudo-on-behalf path. Toggling auto-syncs the corresponding Discord role on the target member. /play <game> posts an LFG message in the game's channel pinging its ping_role_id, with a 30-minute per-(user,game) cooldown (sudo-bypass via force:true) and allowedMentions hardening so @everyone/@here are never resolved.

🔵 In progress / next up

Not features — operational items that unblock everything else.

  • Verify AUTO_VOICE_CATEGORY_ID and HUB_CHANNEL_IDS in .env are correct for the ITSRI guild — see issue #3
  • Enable Presence Intent in Discord Developer Portal — issue #4 (resolved)
  • GitHub Actions auto-deploy on push to main — done end-to-end

💭 Ideas backlog

Light sketches — bring one to "Designed" status before it goes on the project board.

  • Voice channel "party" / LFG mode — members in an auto-channel can mark themselves LFG; the channel name appends (LFG x/y) and a button lets others join.
  • Auto-name cycling — if the rich-presence game changes mid-session, the auto-channel name updates to match (with rate-limit guards — Discord limits channel renames to 2/10min).
  • Voice channel stats — per-channel/-hub time totals, peak concurrent counts, top creators per month. Read-only sudo dashboard.
  • OC-style stock widget for other businesses — port otterbot's oc_stock pattern if a non-MKE business in the server wants the same kind of board.
  • External webhook intakePOST /webhook/<token> endpoint that posts to a configured channel (e.g. for GitHub Actions completion notices, Grafana alerts). Would require a small HTTP server alongside the Discord client.
  • Configurable thread archive duration — extend the auto-thread feature to expose 60/1440/4320/10080 minutes per channel.

How to use this roadmap

  1. When you start working on a feature, move its project board card to In Progress.
  2. Add a corresponding ## [Unreleased] entry in CHANGELOG.md with the same name.
  3. Treat the implementation steps above as a checklist — tick them off in commit messages or PR description.
  4. When the feature ships, move the card to Done, mark the row above ✅ Shipped, and prune steps from this page (keep the headline + 1-line summary so the history is readable).

Clone this wiki locally