Skip to content

Discord ticket bot

Finds the answer
you already wrote.

Most support tickets are a question somebody on your server has already answered. Smart Ticket searches those answers before it opens a channel — so your team only sees the ones that are actually new.

No language model. Nothing is generated. Every reply is an answer a person on your server wrote and approved, sent back word for word.

  • Free to run
  • Self-hosted
  • Your data stays yours
27
Servers
1
Questions answered
50%
Answered without a ticket
25 ms
Median search time

Counted from the database, refreshed every five minutes. A new install shows zeros — these are not rounded up.

How it works

Three steps, and a person only appears in the third.

  1. 01

    Form first, channel later

    A member fills in a short form

    They pick a topic and answer up to five questions. This all happens in a modal — no channel exists yet, and nobody has been pinged.


  2. 02

    Typically under 150 ms

    The bot searches what you wrote

    Full-text, fuzzy and — optionally — semantic search over your own knowledge base. If it is confident, it shows the answer straight away, with buttons to say whether it helped.


  3. 03

    Nobody repeats work

    Only what is left reaches your team

    No match, or the member says it did not help? Then a channel opens, with the form answers and a note about what the bot already tried and they rejected.

Try it

Ask it something.

This is the real engine, running against a real knowledge base of 25 entries, with the real score breakdown. Misspell a word. Use completely different words. Ask it something it cannot possibly know.

When it does not know, it says so. That is the feature — a system that never says “I do not know” is a system you cannot trust when it says anything else.

Nothing you type here is stored.

Try:

The knowledge base behind this box holds 25 entries somebody wrote by hand. No language model is involved — what you get back is one of those entries, or an honest nothing.

What is in it

Built for the part after the demo.

Anything can look good answering one question. These are the things that decide whether it is still useful in month three.

It tells you what is missing

Every question the search could not answer is recorded and counted. Identical questions are merged, not duplicated — so the list is a to-do list, not a wall of noise. Writing one answer closes every question it covers.

  • 14×can i pay with paypalwrite answer →
  • 9×where is my orderwrite answer →
  • 6×how do i change my emailwrite answer →

Every score is visible

No black box. Each candidate shows its full-text rank, coverage, trigram and semantic score, plus every bonus applied.

lexical0.90
semantic0.60
rule0.00

Guided paths, when a search is the wrong tool

Some problems need a question back. Build a decision tree once and the member clicks their way to the exact answer — the path is fixed, so the destination cannot be wrong.

Cannot log in2FA rejectedAnswer

It learns from your team, not from the internet

When a trainer closes a ticket, the bot offers the answer they just wrote as a draft entry — pre-filled, one click, edit before saving. Near-duplicates are caught before they can compete with the original.

📚 Save as FAQNot this oneephemeral, disappears if ignored

Transcripts that outlive the channel

Rendered from stored messages, not from Discord history — so they still work after the channel is deleted. Self-contained HTML with a search box, behind an expiring link.

Nothing to meter

No token bill, no per-seat pricing, no rate limit that turns into an outage on a busy day. The search is PostgreSQL and, if you want it, a 118 MB model running on your own hardware.

€0.00
Per question
€0.00
Per month
a Pi
Runs on

The deliberate part

There is no language model in here.

That is not a limitation this project is apologising for. For repeating a known answer to a known question, a deterministic search is the better tool — and it is the one you can actually audit.

  • It cannot invent an answer

    Everything it says is a stored entry, sent unchanged. There is no generation step, so there is nothing to hallucinate. When it has no answer it says so and fetches a person.

  • Every reply was approved by a human

    Somebody on your server wrote it and somebody on your server can change it. You always know exactly what the bot will say, because you can read the list.

  • The bill does not exist

    No tokens, no per-request pricing, no surprise on a day that goes viral. The only running cost is electricity for a Raspberry Pi.

  • Your questions stay on your hardware

    Nothing is sent to a third party for processing — not the member's question, not your answers. The semantic model, if you enable it, runs locally.

Questions

The ones people actually ask.

What does it cost?

Nothing. It is self-hosted: you run the bot on your own machine — a Raspberry Pi is plenty — and the dashboard on a free Vercel plan. There is no paid API anywhere in the system, so there is no bill that grows with usage.

Do I have to write all the answers myself?

You write them once, and mostly not up front. A fresh install is seeded with 25 general entries so you can try it immediately, and after that the bot tells you exactly which questions it could not answer, sorted by how often they were asked. Most of the knowledge base ends up being written from that list, and from answers your team already gave in tickets.

What happens when it does not know something?

It opens a ticket and tells your team what it already tried, so nobody suggests the same thing twice. The question is also recorded so you can write an answer for the next person who asks it.

What is the semantic search, if there is no AI?

A small sentence-embedding model (118 MB) that runs on your own hardware and turns text into numbers so that similar meanings land near each other. It ranks your existing answers — it does not write anything. You can leave it off entirely; full-text, fuzzy matching and synonyms work without it.

Does it read my members' messages?

Only inside ticket channels, and only to search for an answer and to build that ticket's transcript. It reads nothing anywhere else on the server.

Can I move to a hosted database later?

Yes. The bot and the dashboard talk to PostgreSQL through one interchangeable layer — switching from the Pi to a managed database is a change of one environment variable, with no schema or query changes.

Add it, seed it, and watch the unanswered list.

It arrives with three ticket categories, working forms and 25 example answers. Run /setup, point it at a channel, and it works. The tuning comes later, from real questions.