Salih Muhammed
All projects

Case study 01

SilverWard: scam detection for seniors

A prototype that helps seniors check suspicious messages. I built the Flutter app and the web app, where a language model returns a scam likelihood with three plain-language reasons from a typed message or a camera image.

2ways to check: text or camera
3plain-language reasons per verdict
5retries with exponential backoff

How it works

TextCameraAppFlutter, webPOSTFlask APIchecks JSONpromptJSONModelgpt-4o-miniverdictPossible scam · 85%3 plain-language reasons
A message is typed or captured on camera. The app sends it to a Flask API, which asks gpt-4o-mini for a strict JSON verdict and turns it into a plain-language alert.

Concept: the alert a senior would see

Today · 3:24 PM

Your parcel could not be delivered. Confirm your address within 24 hours to avoid return: parcel-sg-redelivery[.]example

Possible scam

85% likely to be a scam

  • An urgent deadline pressures a quick reply.
  • An unfamiliar link asks for personal details.
  • Generic wording suggests a mass message.
Recreated from the prototype design. The message is fictional and the link is defanged.

01

The problem

Scams in Singapore kept rising. The team's research, drawing on Singapore Police Force briefs, found that seniors made up about 7% of scam cases, and that most anti-scam tools were not designed around them. Many seniors lacked confidence telling real messages from fake ones.

02

The concept

SilverWard flags a suspicious message where it arrives, shows how likely it is to be a scam, explains why in plain language, and offers to check with a community forum before the person acts.

03

My contribution

I built the mobile app in Flutter, then built the web app that connects to the OpenAI API to detect scams from a typed message or a camera image. I also produced the initial Figma interface designs that set the direction for the app.

04

How the web app works

A Flask service exposes two endpoints, one for text and one for camera images. The web front end captures a frame with the browser camera API. Each request goes to gpt-4o-mini with a prompt that asks for strict JSON: a scam probability, a yes or no verdict and three short reasons. The service rejects any response that does not match that shape, and retries with exponential backoff when rate-limited.

05

What I would harden

This was a prototype. A production version would minimise or redact message content before it leaves the device, because messages are sensitive. The model's probability is not calibrated, so it needs evaluation against labelled scam messages. Open CORS and debug mode suit a demo, not deployment, and secrets should never reach logs.

All projects