The problem
People receive suspicious messages as text and screenshots. I built a workflow that extracts the message, runs classification and risk analysis, and keeps a private analysis history.
What I built
- Designed and developed the Flutter/Dart frontend, Python/FastAPI backend and PostgreSQL storage end to end.
- Added camera/gallery OCR with Google ML Kit, message analysis endpoints, risk signals and per-user history.
- Trained a TF-IDF and Logistic Regression classifier on 800 curated messages; evaluated on a stratified 200-message held-out split.
- Implemented Firebase/JWT authentication, role-based authorization, ownership checks and sensitive-pattern redaction.
- Added MLflow experiment/model tracking, inference-version monitoring, PSI category drift checks and backend/Flutter CI.
How it fits together
- 01Text or screenshot
- 02ML Kit OCR
- 03Authenticated FastAPI
- 04TF-IDF + classifier
- 05Risk analysis + history
An engineering decision
I used an interpretable classical ML baseline and kept preprocessing and inference together. Model version tracking and category drift checks make changes to predictions easier to investigate.
Evaluation & limitations
The classifier achieved 89.5% accuracy (179/200) and 89.2% weighted F1 on the held-out split of a 1,000-message curated dataset. These are classifier evaluation results, not a production scam-detection guarantee. Multilingual and real-world evaluation remain areas for improvement.
Next steps
Expand language and edge-case coverage, strengthen the evaluation dataset, and compare multilingual embedding models against the existing baseline.
