What's new
New features, fixes and speed-ups in Ninth Bot, newest first. The same updates are posted in the community's changelog channel when they go live.
Review follow-ups for tickets, stream alerts, bulk lists and appeals; move docs to the docs site
Tickets open without Manage Roles, which is now only needed for Add user and Remove user. Once a ticket is claimed, only the person who claimed it can unclaim or close it, and ticket admins can take it over, unclaim it or close it. A YouTube live alert is edited to say the stream has ended, the same as on Twitch. "Show full list" is only for people with Manage Messages. The weekly summary posts at 09:00 Amsterdam time. The dashboard hides Accept and Deny from staff who can't decide. The guides are on docs.ninthbot.site, with the developer notes in its staff area.
Link the docs from /help and the setup panel
/help shows Docs, Dashboard and Privacy policy links, with the privacy policy now on ninthbot.site. Each category also has a guide button, for example "How tickets work" under Tickets. Every /setup section gets a 📖 Guide link button to the matching docs page.
Add evidence to any case from the dashboard
The dashboard can attach files and links to any case, list them, open them and remove them. Every addition or removal shows up in the mod log as "Case #N | evidence added/removed".
Use gateway-cached members and parallelize the server list
Access uses the gateway-cached member, which the GuildMembers intent keeps current on role changes and leaves, and fetches only on a cache miss. The server list loads all setups in one query and checks the servers in parallel.
Serve a ticket's HTML transcript to the dashboard
GET /v1/guilds/:id/tickets/:number/transcript (staff) returns { filename, html }. The bot reads the transcript fresh from that message, because Discord attachment URLs expire, so nothing new is stored.
No old-video spam, thumbnails and live /alerts test preview
The first check only records the newest video, and videos older than the alert are skipped. Cards show the video or stream thumbnail with simpler text, and /alerts test shows the creator's real latest upload or current stream, falling back to the sample card.
Include the bot's profile in /v1/health
GET /v1/health also returns bot: { id, username, avatarUrl } (null while logging in), which the dashboard uses as its site mark.
Dashboard API, stored logs, setting history with undo, ban appeals
Keep case reason history and add Edit reason button
Every reason change is kept. Only the case's moderator, or someone with Manage Server, can change a reason. The mod log shows the previous and the new reason. Mod-log case entries and /case have an Edit reason button that opens a modal prefilled with the current reason. /case also lists earlier reasons.
Message logging (edits, deletes, bulk deletes)
/setup → Moderation & logs has a Message log channel select. When set, member edits post an orange Message edited embed (before/after + jump link), deletes post a red Message deleted embed (author, channel, sent time, content, attachment names), and bulk deletes (e.g. /purge) post one embed with a .txt of every message. Bots, webhooks and the log channel itself are skipped. Clearing the channel turns it off.
Make merge changelogs readable and stop pinging
Twitch live & YouTube content alerts with /alerts
Add Twitch live & YouTube content alerts with /alerts command
Show the pull request summary heading once
Notify Discord when a pull request merges into main
Register slash commands in every guild listed in GUILD_ID
Channels Clear as section accessory + select-alone assertions
Cap categories at 25
Match placeholders case-insensitively
Configurable small/big images with {banner} placeholder
Interactive /setup panel + welcome runtime (ready to merge)
Ticket sweep crash, error log cred redaction, category max_open & memory leaks
Post-merge crash loop (stale build output) + log unhandled rejection reasons
'Moderate' user context menu
Member profile view in /history
/report command, report review (Valid/Dismiss) and evidence uploads
Normalize User slash options resolved as GuildMember (`undefined` tag in /warn)
Bot-wide Missing Permissions / Missing Access handling
All Discord log posts use a shared log embed builder
Anchor component customId patterns (unclaim also ran claim)