Inspiration

Scams reach people in the chats they already use, in the language they already read. Singapore is multiracial, and its four official languages are English, Mandarin, Malay and Tamil, so a scam can arrive in any of them, and so can the person it fools: a parent, a grandparent, a friend. Detectors tell you once and forget you. Enterprise phishing training (Hoxhunt, KnowBe4) is sold to IT departments and drills made-up scams. We wanted a coach for the people around you, family and friends: check a message, learn the one giveaway, then practise the tricks you fall for, using the real scams that reached your circle. Baitproof already works in all four official languages.

What it does

  • Check. Paste or forward a message, a screenshot or a voice note (website or Telegram). You get a verdict (scam, likely scam, not sure, looks fine), the giveaway quoted from the message, what to do next, what each link really is, and the official Singapore help lines (ScamShield 1799 and the Anti-Scam Helpline). A "How I decided" panel shows every piece of evidence.
  • Train. The tricks you fail become practice: a 3D driving game called Scam Road where each lane is an answer (graded on the server, so scores cannot be faked), a daily challenge, a fake-link hunt, and boss fights. The points you earn buy a character and a 3D house.
  • Family and friends. Friends by invite link or code, a friends-only leaderboard and live races, small groups (up to 12) whose shared, redacted scams become gates in everyone's games, and a "can you spot the scam?" challenge link you can send to a parent or a friend, who plays it in two minutes with no account.

How we built it

  • Nemotron on Nebius Token Factory does the reading: nvidia/NVIDIA-Nemotron-3-Nano-30B-A3B for every check (temperature 0, reasoning off, about 0.03 US cents per check) and nvidia/Nemotron-3.5-Super-VL to read screenshots.
  • The model proposes; deterministic gates decide. A check is a pipeline: injection gate, intent diagnosis against a closed list of 19 purposes, free local tools, an evidence ledger, an arbiter, a confidence loop and a critic. Every finding is a record with its source, strength and the quote it rests on; the model's own opinion counts for less than hard evidence, a red flag whose quote is not in the message is dropped, and "safe" has to be earned.
  • Tavily looks up a named company's real website and scam reports about a link. Directories and social sites are filtered out and a result must look like the company's own name, so it is weak evidence that never decides alone.
  • All four official languages, not just English. English, Chinese (Simplified and Traditional), Malay (with Indonesian) and Tamil all run the full pipeline, and Chinese, Malay and Tamil each have a rule pack of their own; anything else goes to the model alone and is never called "safe". The site's language, not the message's, decides what you see.
  • Stack. Python, FastAPI, SQLite, vanilla JavaScript with a strict content-security policy, three.js for the 3D road and house, a Telegram bot, Caddy for HTTPS, all on one small cloud server. Over 1,600 automated tests plus real-browser tests.

Challenges we ran into

  • A plain model over-flags. One Nemotron call is a good scam catcher and a poor judge of genuine messages: it called 12 of 100 genuine English SMS scams, 13 of 40 Chinese and 14 to 17 of 25 Tamil. The gates fix that, at the price of more honest "not sure" answers.
  • Honest evaluation. Our test sets drift into the rules once you read the failures, so the headline number is a fresh split of real SMS we never tuned on, and we kept the first reading and the negative results.
  • Languages are not translations. Mandarin has no word boundaries and two scripts; Tamil's "don't" comes after the verb; warnings ("never share this code") contain the very words scams use.
  • A model-only "safe" is dangerous in languages we cannot check, so there it only ever says "not sure".
  • A bug after launch. A friend saw a Spanish scam in the English game. Two causes: a scam a visitor once checked in Spanish was dealt back to them, and our own reference bank holds a Spanish and a French example for the model. We fixed both, and added a real-browser test that plays every site language and fails if any foreign message appears.

Accomplishments that we're proud of

  • On 100 real SMS scams we never tuned on, a plain Nemotron call caught 94 but wrongly flagged 12 of 100 genuine messages; Baitproof caught 76 to 79, called 0 to 1 safe, and wrongly flagged 0 to 2 genuine messages.
  • In Chinese, Malay, Indonesian and Tamil test sets, no scam was called safe, and no genuine message was wrongly flagged in the final runs.
  • It is live, free, needs no account, keeps tactics rather than messages, and speaks all four of Singapore's official languages.

What we learned

Measure everything and report the first reading. The most useful tests were the ones that made us look bad: the fresh split found scams our rules called safe, and the multilingual run exposed a safety hole we would never have found in English alone. A model is best used as a proposer inside rules that can say no.

What's next for BaitProof

A native-speaker review of the Malay and Tamil text, a WhatsApp bot (the chat app most people in Singapore already use), and more Singlish and code-mixed messages in our test sets.

Built With

Share this project:

Updates

Submission history