Elastic · Elasticsearch + Jina models
Scammers reuse their scripts, phone numbers and photos. Handshake remembers every scam it catches in Elasticsearch, so the next buyer who meets the same seller is warned, even when the words are different.
Same details
Exact matches
Phone numbers, emails, Cash App tags, accounts and links are pulled out in code and matched exactly, in any format: (408) 555-0199 is 408.555.0199.
Elasticsearch keyword terms
Same tactics
Matched by meaning
“pls send thru friends n family, 2 more ppl asking” matches “Send as F&F, other buyers waiting”. Jina embeddings find candidates and the Jina reranker decides.
Jina embeddings v5 + reranker v3
Same photo
Reused pictures
Listing photos read by Kernel are embedded with Jina CLIP. The same photo resized or cropped still matches at 0.98; a different one scores about 0.64.
Jina CLIP v2 · kNN on dense vectors
How it works
Memory runs alongside every check: a deal pasted as text, a screenshot, or a link Kernel opened.
- 01
Read the seller's side
The scan keeps only what the seller wrote, never the buyer's messages or details, plus the exact phrases it flagged as tactics.
AI · Structured output - 02
Ask memory three ways
Exact details by keyword, tactics by Jina embeddings and reranker, photos by kNN. The three searches run in parallel with the price check.
Elasticsearch - 03
Code weighs the evidence
Details or photos confirmed by two different people are a known scam. A single sighting or similar wording is a warning that can't make a deal high-risk alone.
Deterministic - 04
Remember what's caught
High-risk scans are stored automatically, and a buyer can report one with a click. The same message seen again bumps its count instead of duplicating it.
Upsert - 05
Count it live
This page reads memory with ES|QL on every visit: how many scams, how often they were met, and which tactics are most common.
ES|QL
Live from Elasticsearch
Read with ES|QL when this page loads. Seeded with common scam scripts, then growing with every scam Handshake catches.
Reading memory…
Built so it can't be abused
Two witnesses to convict
Pasting someone's phone number into a fake scam once doesn't brand them. Details only count as a known scam after buyers on two different networks reported them.
Reports point at real scans
A report names a scan Handshake ran in the last 30 minutes, which had to find warning signs, and only the person who ran it can report it. Nobody can submit their own text.
Only the seller's side
Memory never stores the buyer's messages, addresses or identity. Visitors are counted by a keyed hash, and buyers see only enough of a detail to recognize it.
Proof
0.41
reranker score for a reworded Friends & Family scam; honest listings scored below zero.
Jina reranker
0.98
photo similarity for the same scam photo resized; a different photo scored 0.64.
Jina CLIP
21
automated tests for fingerprints, matching rules, witnesses, reports and privacy.
Vitest
What we call
Fingerprint index
semantic_text · keyword · dense_vectorOne document per scam: tactics embedded by Jina, details as keywords, photos as nested 1024-dim vectors.
Same tactics
retriever: text_similarity_rerankerA semantic match finds candidates and .jina-reranker-v3 keeps only real matches.
Same photo
knn on photos.vectorPhoto vectors from .jina-clip-v2, matched above 0.92 cosine similarity.
Remember
_update with upsertThe same scam seen again bumps its count, adds new witnesses and keeps one document.
Live stats
POST /_query (ES|QL)Counts and top tactics for this page, computed in Elasticsearch.