# 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](https://github.com/users/jason-tucker/projects/3) 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 names** โ€” `Sloppy 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](Slash-Commands#sudo) 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 ` 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. - โœ… **Social feeds** โ€” `/sudo โ†’ Settings โ†’ Social Feeds` adds RSS-backed sources (e.g. an rss.app Instagram feed) reposted into a channel. Poller dedupes by `last_seen_id` and posts new items oldest-first every ~30 min; per-feed items-per-poll cap (sudo 3, bot owner unlimited). Gated by `feature.social_poller`. Backed by `social_feeds`. - โœ… **Reaction roles (#37)** โ€” `/sudo โ†’ Settings โ†’ Reaction Roles` builds a message with emoji=role mappings; reacting toggles the role. Optional expiry creates temporary game-night roles that auto-clean. Backed by `reaction_role_messages` / `reaction_role_mappings`. - โœ… **Welcome / goodbye messages** โ€” `/sudo โ†’ Settings โ†’ Welcome / Goodbye` sets a channel + template (tokens `{user} {server} {member_count} {account_age}`) for join/leave posts. Both default OFF. - โœ… **Auto-join roles (#36)** โ€” `/sudo โ†’ Settings โ†’ Auto Roles` applies roles to every new member. Gated by `feature.auto_role_on_join` (default OFF). Backed by `auto_join_roles`. - โœ… **Color roles (#38)** โ€” `/color` self-service color picker (one color at a time). Gated by `feature.color_roles` (default OFF). Backed by `color_roles`. - โœ… **Channel archive** โ€” `/sudo โ†’ Settings โ†’ Archive` archives/unarchives channels in opt-in categories (stores original name + parent for restore). Backed by `archive_eligible_categories` / `archived_channels`. - โœ… **botpanel integration (Redis command/event bus)** โ€” most flows are also RPC verbs on `cmd.squishy.*` (HMAC-signed) so the web dashboard drives the same actions; cache-invalidate + event fan-out on `bot.squishy.*`. All optional โ€” the bot runs without Redis or `BOTPANEL_RPC_SECRET`. See [Architecture](Architecture). --- ## ๐Ÿ”ต In progress / next up The current active backlog is tracked on the [Bot Development project board](https://github.com/users/jason-tucker/projects/3). The backlog issues #11โ€“#38 (filed 2026-05-11) are the carved-up `/sudo` brainstorm; #39 is the umbrella for designing the future `/mod` command. ### Recently shipped from this brainstorm - โœ… **#11** โ€” Dynamic `isBotOwner()` from the Discord Application Team. Bot-owner permission checks now resolve at runtime; see [Bot Owner](Bot-Owner.md) for setup. /report approval gates via this. - โœ… **#12** โ€” Per-hub auto-channel defaults (template, manual name, user limit). See [Auto Voice Channels โ†’ Hub defaults](Auto-Voice-Channels#hub-defaults---pinned-template--name--user-limit). - โœ… **#13** โ€” Hub lockdown โ€” per-hub (sudo) and server-wide (bot-owner). See [Auto Voice Channels โ†’ Hub lockdown](Auto-Voice-Channels#hub-lockdown--temporary-kill-switch). - โœ… **Owner grace** โ€” original owner can reclaim within 5 min, configurable in `/sudo โ†’ Settings โ†’ Voice โ†’ Owner grace (ms)`. See [Auto Voice Channels โ†’ Ownership transfer](Auto-Voice-Channels#ownership-transfer). - โœ… **Auto-thread media gate** โ€” auto-thread channels only thread messages with attachments or resolved link embeds. ### Operational - [ ] Verify `AUTO_VOICE_CATEGORY_ID` and `HUB_CHANNEL_IDS` in `.env` are correct for the ITSRI guild โ€” see [issue #3](https://github.com/jason-tucker/squishybot/issues/3) - [x] Enable Presence Intent in Discord Developer Portal โ€” [issue #4](https://github.com/jason-tucker/squishybot/issues/4) (resolved) - [x] 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). - **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 intake** โ€” `POST /webhook/` 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. --- ## How to use this roadmap 1. When you start working on a feature, move its project board card to **In Progress**. 2. Add a dated, real-semver section at the top of `CHANGELOG.md` (Keep a Changelog format, with a `v ยท ` footer) and bump `package.json` to match. 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).