Maintained Open source Fork maintainer GPL-3.0, inherited from upstream 2025 - present

Discord Tickets (revamped)

A fork of the self-hosted Discord ticketing bot, with thread mode and durable scheduling.

Thread and forum modes remove the channel ceiling that limits channel-per-ticket bots, HTML transcripts get a central dashboard, and every scheduled job moved off in-process timers onto Temporal. The web UI was merged into the same repository.

What it is

A fork of the most widely used self-hosted ticketing bot for Discord, with more features and fewer bugs.

The upstream project is GPL-3.0, and so is this. That is not a choice this fork made, and it is the correct outcome anyway.

What changed

Thread mode, which removes the ticket ceiling. Channel-per-ticket is what most ticket bots do and it runs into Discord's channel limits on any busy server. Threads have no such limit and give staff a better overview besides.

Forum mode, for public support in a forum channel. An uncommon shape, and the right one when the answers should be readable by the next person with the same problem.

HTML transcripts with a central dashboard, so an admin can find a closed ticket without knowing which channel it used to live in.

A feedback portal collecting everything users submitted, rather than leaving it in a channel nobody reads.

Auto-assign, where the first staff member to comment picks up the ticket. Assignment schemes usually fail because they need somebody to run them. This one runs itself out of behaviour that already happens.

Plus backup categories for channel-mode tickets, a close-with-reason button, per-server appearance customisation, and the removal of the total limit on thread and forum tickets.

The web UI was merged into this repository. It used to be a separate project. Two repositories for one product means two release cycles, and the UI was always the one that fell behind.

Everything scheduled runs on Temporal

Stale-ticket handling, auto-close, the reopen window, transcript export and import, and cron automations all moved off in-process timers.

This is not optional and the bot refuses to start without a Temporal address. That is a deliberate cost. In-process timers on a Discord bot lose everything on restart, and a bot that restarts loses the auto-close it promised. Making the dependency mandatory rather than optional means there is one behaviour to reason about instead of two.

The consequences are stated plainly in the requirements: Node 20 or newer on glibc, since Temporal's native addon has no musl build, and MySQL or PostgreSQL, since SQLite support was removed.

Where it sits

151 commits by me on a codebase whose history reaches back to 2019. A fork I maintain, with the upstream credited.