How it works
Follow an email through each check.
MailWeft runs five checks on each email, fastest first. The first check that decides gives the verdict. The slower checks keep running and add their reasons below it.
| Check | Looks at |
|---|---|
| Rule checks | Sender, Reply-To, links, hidden characters, reply headers |
| B3 model | The text, plus header, authentication, subject, link, HTML and attachment features |
| Scam memory | Known scam emails, links and phone numbers |
| Sentences | Which sentences move the text model’s score |
| LLM judge | The newest message and every check’s result |
The playground shows the time each check took.
Verdicts
| Verdict | Meaning |
|---|---|
| Phishing | A strong rule fired, the B3 score is above the phishing line, the email is a copy of a stored scam, or the judge said phishing. |
| Unsure | The B3 score is between the two lines. The judge runs and may settle it. |
| Safe | The B3 score is below the safe line and nothing else fired. |
A verdict can rise as later checks finish, from safe or unsure to phishing. It never falls, with one exception: the judge may settle an unsure email as safe when no rule fired.
Rule checks
Rules need no training. A strong rule flags the email on its own. The main ones:
- A domain in the sender, Reply-To or links uses an organisation’s name or a look-alike, but is not one of its domains.
paypa1-secure.comis flagged;forms.gleis not. - A domain mixes alphabets in one word, such as a Cyrillic letter inside a Latin name.
- The sender name, address or subject contains characters that reverse the direction of text, or a link contains invisible characters.
- The subject says
Re:but the email has no reply headers. - A participant in a reply thread uses a look-alike of an earlier participant’s domain.
- The sender line hides another address or domain, such as a display name that shows a different organisation’s address.
Weak signals are listed as reasons but do not flag on their own. Examples are punycode domains (an encoding for non-Latin letters), plain http links, and link text that shows a different domain from the link itself. Rules never clear an email.
B3 model
B3 is a logistic model, a weighted sum of clues turned into a score from 0 to 1. Its strongest clue is the score of B2, a RoBERTa neural network for text, trained on phishing and legitimate mail, and on pairs that teach it the difference between an ordinary service notification and one with a scam request inside. The other clues come from the email itself: SPF, DKIM and DMARC results, the Reply-To domain (where replies go), link and HTML counts, attachments and the rule findings.
The panel lists the clues that raised and lowered the score. SPF, DKIM and DMARC are checks that the sending server is allowed to send for its domain. They carry most of B3’s gain: on 2025 email, B3 ranks phishing with ROC AUC 0.948, against 0.845 for B2 alone and 0.871 for B3 without these checks. Part of this gain may come from differences between the email collections; see Results. Phishing sent from a domain the attacker owns passes these checks, and B3 is weakest there.
Scam memory
The memory holds public scam emails from Phishing Pot, Nazario and security-team reports, grouped into campaigns. It is searched for an exact copy, then a scam link or phone number, then a near copy of the text, and the search stops at the first kind that matches. An exact or near copy of a stored scam flags the email. A shared link or phone number is shown as a reason but does not flag on its own.
The memory on this site holds public emails only.
Sentences
MailWeft removes one sentence at a time and runs the text model again. Sentences whose removal lowers the score the most are shown with the drop.
LLM judge
The judge is a large language model. It sees the newest message, with quoted history removed and personal details scrubbed, and the results of the other checks. It returns a verdict, a one-sentence reason and quotes from the email. Code checks that each quote appears word for word in what the judge was sent; quotes that fail are not shown.
The judge runs when the B3 score is unsure, a rule fired, or B3 is not loaded. Choose Always or Off in the playground settings. On 40 model-written account takeover threads, where the headers are genuine, the judge caught 33 in a test run without the scam memory. See Privacy for what is sent.