She can’t call for help. HoldOn does.
HoldOn protects elderly people from tech-support scams. Scammers show a fake virus warning, get the victim on the phone, make them install a remote-access tool like AnyDesk, and then tell them: “Don’t tell your family.” Once the scammer is watching the screen, the victim can’t ask for help.
HoldOn is a Chrome extension that spots that moment and:
Built in one afternoon at Vibe Sprint Hyderabad (The Product Folks × Scaler).
Pitch deck (live): https://nidhishrajan.github.io/holdon/pitch/deck.html · Demo walkthrough: PDF · PPTX
Chrome extension (sensor) ──► Next.js server (brain) ──► Telegram (family link)
- remote-access sites - AI writes the alert - alert + ✅/❌ buttons
- fake virus popup pages (Claude via RouterPlus) - button taps logged
- uninstall = tamper alert - in-memory alert log ──► /dashboard (proof)
- full-screen STOP overlay
| Part | Folder | What it does |
|---|---|---|
| Extension | extension/ |
Manifest V3. Watches tab URLs for remote-access tools (AnyDesk, TeamViewer, UltraViewer, RustDesk, ScreenConnect, …), scans pages for fake virus popups (2+ scam phrases + a toll-free number), shows the overlay, sends alerts. Debounced to 1 alert per site per 10 minutes. |
| Server | server/ |
Next.js. POST /api/alert writes the alert with AI (falls back to plain text if AI is unavailable) and sends it to Telegram. Polls Telegram for button taps. |
| Deck | pitch/deck.html |
The pitch deck, also served at http://localhost:3000/deck.html. |
| Spec | SPEC.md |
Architecture, API contracts, build phases. |
You need: Node.js 18.18+ (tested on 22), Google Chrome, and about 5 minutes.
You’ll see the STOP overlays and the alerts on the dashboard. Telegram and AI are skipped (alerts use a plain-text fallback).
git clone https://github.com/nidhishrajan/holdon.git
cd holdon/server
npm install
cp .env.example .env # leave the values empty for the quick try
npm run dev # keep this running → http://localhost:3000
Then load the extension:
chrome://extensions in Chrome.holdon/extension folder.The popup will say “Server up, Telegram not set up ⚠️” — that’s expected in this mode. Jump to Try the demo.
Do Option A, then fill in server/.env:
TM_API_KEY= # RouterPlus API key (OpenAI-compatible gateway) — optional, enables AI-written alerts
TELEGRAM_BOT_TOKEN= # from @BotFather
TELEGRAM_CHAT_ID= # your chat ID (see below)
Create the Telegram bot:
/newbot → follow the prompts → copy the token.https://api.telegram.org/bot<TOKEN>/getUpdates in a browser and find "chat":{"id":123456789. If the result is empty, message the bot again and refresh. (Stop the HoldOn server first — it reads the same updates.) Alternatively, message @userinfobot.server/.env, then restart the server (Ctrl+C, npm run dev) — Next.js only reads .env at startup.Click the HoldOn icon → it should say “Connected to Telegram ✅” → click Send test alert. Your phone should get “✅ HoldOn is now protecting Margaret.”
Never commit
server/.env— it’s already in.gitignore.
With the server running and the extension loaded:
| Step | Do this | You should see |
|---|---|---|
| 1 | Click the HoldOn icon → Send test alert | Telegram: “HoldOn is now protecting Margaret” |
| 2 | Open http://localhost:3000/fake-popup.html (a fake “Windows Defender” scam page, for demo only) |
Red overlay: “This warning is FAKE” + an alert |
| 3 | Open https://anydesk.com |
Red overlay: “STOP. Microsoft, Apple and your bank will NEVER ask you to install this.” + an AI-written alert using the context from step 2 |
| 4 | Tap ✅ It was a scam — I stopped it in Telegram | Message updates to “✅ Logged: scam stopped” |
| 5 | Open http://localhost:3000/dashboard |
Alerts, scams stopped, false alarms, precision |
| 6 | Remove HoldOn at chrome://extensions |
Tamper alert: “HoldOn was removed from Margaret’s laptop” |
Tips
| Method | Route | Purpose |
|---|---|---|
POST |
/api/alert |
{event_type, url, page_title, recent_tabs[], parent_name, child_name} where event_type ∈ fake_virus_popup · remote_access_site · tamper · setup_test |
GET |
/api/tamper?parent=&child= |
Opened by Chrome when the extension is uninstalled |
GET |
/api/stats |
{alerts, scams_stopped, false_alarms, recent[], telegram_configured} |
GET |
/dashboard |
Family dashboard |
Test without the extension:
curl -X POST http://localhost:3000/api/alert -H 'Content-Type: application/json' \
-d '{"event_type":"remote_access_site","url":"https://anydesk.com","page_title":"AnyDesk","recent_tabs":["Microsoft Security Alert - Call 1-800-555-0100","anydesk.com"],"parent_name":"Margaret","child_name":"Sarah"}'
localhost:3000) and alerts go to one Telegram chat set in .env.