Inspiration
Scam messages are getting more convincing, and the people who struggle most are often older people with nobody to ask. They feel embarrassed, they are told to act now, and if they do click or pay, they rarely know what to do in the first hour. We wanted to build something calm and clear that gives them a second opinion, and gives their family a quick way to help.
What it does
Second Look is a Streamlit app for older people and the family who look out for them.
- Check a message. Paste a message or upload a screenshot and get a plain-language verdict, with the exact phrases that raised concern highlighted.
- Privacy shield. Before anything is sent to the AI model, emails, phone numbers, card and bank details, ID numbers and one-time codes are masked on the user's own computer.
- Next steps. Explain it simply, draft a warning for family, and prepare a report for the bank or authorities.
- Already clicked or paid? A fixed checklist, plus a downloadable action log that contains no message text, sender or link.
- Is it really them? A guide to checking whether a caller or sender is genuine.
- Link inspector. Breaks a link into its parts and flags lookalike domains without ever opening the link.
- Spot the Scam quiz. Fixed scenarios for practice.
- How accurate is it? The measured results, with their limits.
How we built it
Python and Streamlit, with Qwen3-32B served by Featherless. Local rule checks (lookalike domains, link shorteners, urgency and payment wording) run alongside the AI model. Rules can raise a verdict but never lower it. If the model is unavailable, the app falls back to rules only and says so.
The main design rule is that AI helps understand and draft, while safety-critical advice comes from fixed, checked content. Every AI output is post-checked, for example no links, no advice to delete, and no digits in a family warning, and is replaced by fixed wording if it fails. The "Already clicked or paid?" and "Is it really them?" pages use no model at all.
Message text is treated as untrusted input throughout. It is placed in delimiters, closing-tag tricks are stripped, and any evidence phrase the model returns is only shown if it really appears in the message. The app stores and logs nothing.
Results
We tested on a second set of 50 fictional, AI-written messages (22 scams, 28 legitimate) that the prompt was never tuned on.
| Configuration | Accuracy | Precision | Recall |
|---|---|---|---|
| Rules only | 58% | 100% | 5% |
| Model only | 94% | 95% | 90% |
| Full app (rules and model) | 92% | 95% | 86% |
The full app caught 19 of 22 scams and wrongly flagged 1 of 28 legitimate messages. The three misses were early-stage "wrong number" and romance openers that contain no request yet. The sample is small, the messages are fictional, and screenshot input was not part of the testing.
Challenges
- False alarms. Before tuning, the full app wrongly flagged 13 of 20 legitimate messages in our first test set. For an older person, crying wolf is a real cost, so we tuned the prompt on that first set and then measured on a second set it had never seen.
- Empty model replies. Some responses came back empty because the model ran out of its token budget. We added a larger budget, a retry, and a rules-only fallback.
- Prompt injection. A scam message is hostile text by definition. A security review of our own code led to fixes for tag-stripping tricks, masking inside link query strings, and treating earlier model output as untrusted too.
- Honest numbers. Our tuned results looked much worse than our unseen ones, so we separated the two and described the history on the accuracy page instead of hiding it.
What we learned
Keep the model's role small and check everything it says. A held-out test set is worth more than a good-looking tuned score. And for vulnerable users, the fixed, human-checked parts of the app matter as much as the clever ones.
What's next
Testing on real messages and other languages, and a fuller.
No live link graph in git hub repo
Built With
- claude
- featherless
- python
- qwen
- streamlit
Log in or sign up for Devpost to join the conversation.