Inspiration

Scam warnings often arrive at the worst possible moment: a message creates urgency, a phone is ringing, and the person being targeted has seconds to decide whether to trust it. Older adults do not only need a red warning. They need a clear pause, understandable evidence, and a safe next action without losing control of their phone.

SageSense implements and adapts the Sixth Sense Product-thon blueprint by Billy Hermawan. We retained its point-of-risk intervention and low-density, large-type direction, then made the prototype Android-first, warning-only, privacy-first and bilingual. Material divergences are documented in docs/divergence-log.md.

What it does

With explicit Android permissions, SageSense:

  • analyses supported message notifications locally for suspicious links, urgency, credential requests, payment language and impersonation signals;
  • checks incoming caller numbers against a local Watchlist while always allowing the call to continue ringing;
  • creates a bilingual Cognitive Pause explaining the evidence and safe next steps;
  • optionally shows a short-lived, user-authorised warning shield over another app without reading or capturing the screen;
  • stores a redacted local history with search, filters, source provenance and delete-all;
  • uses Personal Scam Memory to relate repeated scam patterns when a sender or domain changes; and
  • lets the user explicitly ask a constrained Agent for a plain-language explanation, confirmation-required actions and official citations.

Local detection, history and deterministic safety guidance continue to work offline. The Agent explains a local risk event; it does not block calls, make payments, contact organisations or declare a transaction safe.

The phone number, domain and scam messages shown in the pitch are clearly labelled demonstration fixtures. They are not reports about real people or a claim that SageSense contains live threat intelligence.

How we built it

The Android client uses Kotlin, Jetpack Compose, Material 3, Room, DataStore, Coroutines and Flow. NotificationListenerService processes supported message notifications, while CallScreeningService performs a bounded local number lookup and immediately allows the call. A versioned deterministic risk engine produces a 0–100 score and evidence codes on-device.

The Agent backend uses Python 3.12, FastAPI and Pydantic v2. It routes deepseek-v4-flash through the team's OpenCode Go subscription from a Vercel function; the provider key never enters the APK. Deterministic topic gating, bounded schemas, read-only tools, citation allowlisting, output validation and a safe fallback wrap the model call. The curated knowledge layer uses transparent weighted lexical retrieval rather than a vector database because the current corpus is small and reviewable.

Privacy boundaries include redaction before persistence and Agent use, omitted sender identity, masked phone Watchlist values, stripped URL paths/query strings, no cloud account or cloud history, HTTPS-only release traffic and 30-day local retention for non-demo events.

Challenges we ran into

  • Android notification channels are immutable after creation, so an early silent configuration required new versioned channels to restore the intended real-message and call-warning behaviour.
  • CallScreeningService can be unbound before asynchronous work finishes. We moved the bounded warning lookup to application scope while returning the allow-call response immediately.
  • Australian numbers appeared as 0400…, 614… and +61 400…; canonicalising those forms was necessary for reliable local Watchlist matching.
  • A permanently floating assistant would create distraction and privacy/policy concerns. We changed it to an optional event-only shield that auto-hides and never reads the current screen.
  • Large text exposed navigation clipping, so the bottom navigation adapts to a two-by-two layout at high font scale.

Accomplishments that we are proud of

  • A real Google Messages notification produces one explainable local event, visible warning and deep-linked Cognitive Pause.
  • A Watchlist call keeps ringing while SageSense presents a warning.
  • The demo remains usable with permissions denied, the network unavailable or the model provider degraded.
  • English, Simplified Chinese, 1.3x/2.0x font scale, ≥22sp app typography and ≥56dp primary touch targets are built into the release candidate.
  • The current release candidate passes 49 Android JVM tests, 31 backend tests, Android lint with zero errors, APK assembly, isolated Android 17 emulator acceptance and GitHub CI.

What we learned

An anti-scam product should optimise for a safe decision, not simply a confident classification. Deterministic local evidence, explicit uncertainty, source provenance and user control are more valuable than adding an unconstrained chat interface. We also learned to separate competition evidence from production claims: seeded data and emulator behaviour are useful demonstrations, but they are not live threat intelligence or older-adult user validation.

What's next

After the hackathon, SageSense would need authenticated regional threat feeds, measured precision/recall and false-positive targets, moderated research with older adults and carers, a wider OEM/device matrix, Google Play permission review, formal privacy/security assessment, durable WAF rate limiting, monitoring, release signing and staged production operations.

Built with

Kotlin · Jetpack Compose · Material 3 · Room · DataStore · FastAPI · Pydantic · DeepSeek V4 Flash · OpenCode Go · Vercel

Credits and source links

  • Original blueprint: Sixth Sense by Billy Hermawan.
  • Independently generated SageSense shield mascot: SageSense team using ChatGPT/OpenAI; no original Sixth Sense asset was reused.
  • Knowledge references: ACCC/National Anti-Scam Centre Scamwatch, ASD Australian Cyber Security Centre, FTC and FBI IC3. Full URLs and supported claims are in docs/sources.md.
  • Source: https://github.com/MortyYJT/sagesense
  • Installation and build instructions: https://github.com/MortyYJT/sagesense#run-android

Team

  • Yu Junteng — team lead, backend, Agent, data contracts and integration
  • Jiahui Zhou — UI design, Compose, bilingual and accessibility
  • Yijia Sheng — product documentation, test integration and submission package
  • Xiuning Gu — demo story, recording, editing, subtitles and presentation
  • Junteng Hu — Android team member

Built With

  • codex
  • datastore
  • deepseek-v4-flash
  • fastapi
  • jetpack
  • kotlin
  • material
  • opencode
  • pydantic
  • python
  • room
  • vercel
Share this project:

Updates

Submission history