Qalqon watches Telegram groups for fraud — advance-fee scams, fake offers, phishing links and disguised malware — across languages. It removes what is clearly an attack, and asks a human about everything else.
Real communities talk about money constantly — buying and selling, splitting bills, arranging payments, helping each other out. A filter tuned to flag those buries the group's purpose in false alarms, and eventually removes the members who post most usefully. An early version of this bot flagged four of the fifteen real messages now kept as its test corpus, and banned two of them outright.
The topic is never the signal. What separates the two is whether someone is asked to part with money or credentials before receiving anything. Qalqon is built around that distinction rather than around keywords about money — which is also why it works the same way in a language it has never been tuned for.
Cheap detectors run first; the language model only when it can still change the outcome. The signals are combined, never averaged — and the rules that decide what happens are a pure function with no network and no database, so every case can be tested.
The model is told what is normal for the community it guards, so an ordinary post quoting a price reads as everyday trade rather than an earnings promise.
Homographs, typosquats, credentials-in-URL and buried double extensions. Nothing is ever fetched — following a stranger's link would hand them an SSRF probe.
Repeat offenders escalate; strikes expire, so one bad week does not follow someone forever. Long-standing members can never be banned automatically.
A moderation bot's worst failure is not missing a scam. It is removing a real member — and doing it invisibly.
A suspicious message alone is not enough. The sender's profile has to agree before anyone is removed; a lone red flag goes to a human instead.
New deployments report what they would do without touching anything, so the thresholds can be judged against real traffic before they are trusted.
If a detector cannot run, the verdict is marked degraded and admins are told. A screening step that quietly stops working is worse than one switched off.
Every alert carries Ban, Ignore and Trust buttons. Marking a decision wrong clears the strike behind it, so a mistake cannot compound.
Ordinary conversation is never stored. Only messages that were acted on are kept, and only for 90 days.
Admin decisions are recorded as ground truth, so the false-positive rate is a number on a dashboard rather than a feeling.
Event-driven Model–View–Controller: the controller translates Telegram updates, the model holds every rule and all state, and views subscribe to what it announces. The model imports no Telegram code at all, which is what makes the whole decision path testable without a network.
Telegram, Groq and Hugging Face are all substituted, so the full escalation matrix runs in seconds on every change.
The web process opens the database read-only and mounts it read-only. Its buttons ask the bot to act, so a bug here cannot alter moderation state.
No published ports — the bot polls outbound, and its only listener stays on the private container network, so it adds no attack surface to the host.