Project Info
Inspiration
We all have elderly loved ones who we know are not very modern or aware of the latest trends in financial scams, which makes them prime targets for scams. In 2025, American seniors alone lost $7.7 billion to scams, with phishing scams being among the most common. We wanted a preventative tool which makes it very difficult to fall for scams without relying much on the end user's tech-skills: it needed to be a seamless experience for them.
What it does
The core functionality of the app is that it monitors any call from a number not on a pre-created whitelist for red flags. Calls that are flagged with scam hallmarks, such as a sense of urgency, requests for money, or opportunities that sound too good to be true, are then routed in different ways depending on the user's settings and privacy preferences. The least intrusive is just a small visual and audio warning for the end user, a somewhat intrusive route is doing the earlier route plus notifying a trusted adult about the call, and the most intrusive option is letting the trusted adult either enter the call, or even terminate it themselves based on the scam transcript. The idea is that this trusted adult and the user discuss and agree upon a policy that works best for their situation and comfort levels.
How we built it
We mostly used agentic workflows to write the code, allowing us to spend a lot of time thinking and describing features. This helped us keep the scope focused but also rich in terms of what features we supported. This allowed us to create a product which does one thing very well. The heart of Loop is Deepgram. We stream both sides of the call into Deepgram's nova-3 model in real time, with language=multi set. This allows us to handle multi-language conversations, which expands the reach of our product beyond English-speaking countries. Deepgram's extensive support for major languages like Hindi, Spanish, German, and many more means we can help people in every region and transcribe in people's native languages instantly. We tuned endpointing to 100 milliseconds so every utterance finalizes the moment it's spoken. That speed is what lets us interrupt a scam as it happens. Deepgram's agentic tools allow us to follow up on scams via automated trusted adult reach-out and email notification, enabling permanent records of every interaction. Those transcripts flow into Redis, where we run vector KNN search against known scam patterns and a caller-fingerprint database allows us to flags repeat offenders across our userbase.
Challenges we ran into
We ran into a lot of integration challenges, especially with Twilio, which we used for call forwarding. One of our main goals was to make the experience as seamless as possible so users only had to download the app once and could keep receiving calls normally. Getting that to work was honestly much harder than expected since Twilio was the only service that really supported what we needed, and working around the limitations of free accounts took quite a bit of trial and error. We also had to deal with the challenges of integrating with existing phone call workflows on mobile devices, which required some creative solutions. Beyond that, a big challenge was keeping the scope realistic for a hackathon while still making sure each tool we used actually added value instead of feeling forced into the project.
Accomplishments we're proud of
We built a working platform that can detect potential scam activity, explain why something looks suspicious, and provide clear next steps for users. We were also able to integrate multiple services into a single experience that felt simple and easy to use.
What we learned
We learned a lot about building reliable AI systems under a tight deadline, especially around handling real-world scam scenarios and making the results understandable for users who may not be super tech-savvy.
What's next
We want to improve detection accuracy, support more scam channels like phone calls and text messages, and add some custom features that help can family members stay more informed when potential scams are detected.
Loop
Protected call-routing and live scam intervention for families.
Scammers isolate. Loop reconnects.
Loop sits on a call, transcribes both sides in real time, recognizes scam tactics as they unfold, pauses the call and warns the user the instant they're asked for a code or a payment, alerts a trusted family member live, and — once the call ends — plays back a plain-spoken voice recap of what happened.
Two technologies do the heavy lifting:
- Deepgram — real-time, multilingual speech-to-text (and the spoken post-call recap).
- Redis — the vector store for scam-pattern matching, caller fingerprints, and live call state.
For the hackathon, the paid telephony/carrier routing is mocked — but the intelligence pipeline is real.
graph TD
classDef client fill:#e1f5fe,stroke:#0288d1,stroke-width:2px;
classDef server fill:#ede7f6,stroke:#5e35b1,stroke-width:2px;
classDef ext fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
classDef db fill:#fff3e0,stroke:#f57c00,stroke-width:2px;
subgraph Clients ["App — one app, two roles"]
UserApp["Protected User"]
Dashboard["Family Dashboard"]
end
subgraph Backend ["Loop Backend (Node + TypeScript)"]
WS["WebSocket gateway"]
Pipeline["Live pipeline: rules → risk scoring → protective intervention"]
Report["Post-call recap (PII-redacted)"]
end
Deepgram["Deepgram — nova-3 multilingual STT + TTS"]
Redis["Redis — vector KNN scam patterns + caller fingerprints + call state"]
%% Live ingestion
UserApp -->|dual-track audio| WS
WS -->|stream audio| Deepgram
Deepgram -->|live transcript| WS
WS --> Pipeline
%% Detection
Pipeline -->|KNN vector search| Redis
Redis -->|pattern + caller matches| Pipeline
%% Intervention
Pipeline -->|pause + warning| UserApp
Pipeline -->|live alert| Dashboard
%% Post-call
WS -->|call ends| Report
Report -->|generate voice recap| Deepgram
Deepgram -->|spoken summary| UserApp
Report -->|recap + summary| Dashboard
class UserApp,Dashboard client;
class WS,Pipeline,Report server;
class Deepgram ext;
class Redis db;
Routing is mocked. Intelligence is real.
Monorepo layout
loop/
backend/ Node + TypeScript server (the real intelligence pipeline)
mobile/ Expo (React Native + TS) iOS app -> TestFlight
shared/ Types shared between backend and mobile
- The mobile app is the protected call bridge. It captures two audio tracks (caller side + the device mic / user side) and streams them to the backend. One app, two roles: Protected User and Family.
- The backend holds the API keys and runs the pipeline, powered by Deepgram (speech-to-text + voice recap) and Redis Cloud (vector store).
Quick start
See backend/README.md and mobile/README.md.
# backend
cd backend && npm install && cp .env.example .env && npm run dev
# mobile
cd mobile && npm install && npx expo start
Keys
Every integration degrades gracefully when a key is missing, so the app always
runs while keys are being provisioned. Fill in backend/.env:
Core (required for the full experience):
DEEPGRAM_API_KEY— real-time multilingual speech-to-text + the spoken post-call recapREDIS_URL— Redis Cloud: vector KNN scam-pattern search, caller fingerprints, call state
Optional (enhance summaries/embeddings; safe to leave blank):
ANTHROPIC_API_KEY,VOYAGE_API_KEY,TERAC_API_KEY/TERAC_BASE_URL
Multilingual
Scams don't only happen in English. Loop transcribes calls natively across languages
using Deepgram's nova-3 model with language=multi, which handles
code-switching — a caller mixing Hindi and English ("Hinglish"), or speaking
entirely in Spanish, French, or German, all in one stream. Endpointing is tuned to
100 ms so each language shift finalizes promptly. Warnings and the post-call recap
are rendered in the conversation's active language, so the protected user is always
spoken to in a language they understand.
Analysis
View
Metric
- 19
- 15
- 10
- 8
- 8
- 4
Figures cover GitHub contributors during the hackathon window. A co-authored commit counts in full for each author, so per-member totals add up to more than the whole-team figures.
Technology
- AnthropicIn code
- ExpressIn code
- ReactIn code
- RedisIn code
- TypeScriptIn code
- Node.jsClaimed
- PythonClaimed
5 of 7 appear in the indexed code. 2 claimed on Devpost could not be matched to code, which may simply mean the tool leaves no trace in the repository.
AI coding agents
- Claude CodeConfig · Commits
- CodexConfig
- CursorCommits
Detected from committed agent config files and commit authorship. Absence of a signal is not proof an agent was unused.
Codebase size
Source size
344 KB
Source files
68
Counts recognized source files only; vendored directories, binaries and lockfiles are excluded, so this is smaller than the repository on disk.
Repository
CalHacksAIHackathon/loop-publish
92 files · 1.4 MB · @ 95cb229
Structure
Interface
15 files · 16%Screens, components and styles rendered to the user.
API & routing
9 files · 10%Request entry points: routes, handlers and controllers.
Application logic
37 files · 40%Domain rules, services and shared utilities.
Supporting
Layers are inferred from where files sit in the tree, not from reading the code. A project that names its directories unconventionally will read oddly here — open the file browser to check anything the diagram implies.
Languages
- TypeScript97%
- Markdown3%
- YAML0%
Share of indexed source by file size. Binary and vendored files are excluded.
Dependencies
backend/package.json
npm · 18- @anthropic-ai/sdk
- @deepgram/sdk
- cors
- dotenv
- express
- ioredis
- nodemailer
- redis
- twilio
- ws
- zod
- +7 more
mobile/package.json
npm · 17- @edkimmel/expo-audio-stream
- @expo/vector-icons
- expo
- expo-audio
- expo-av
- expo-constants
- expo-file-system
- expo-haptics
- expo-linear-gradient
- expo-notifications
- expo-speech
- expo-status-bar
- react
- react-native
- react-native-live-audio-stream
- +2 more
Declared in the repository’s manifests at the indexed commit. A declared package is not proof it is used, and runtime dependencies are listed first.
This project’s features have not been analysed yet.
Export this project's context (description, README, evidence, key source files) to chat with an AI agent elsewhere.