Inspiration

In 2024, people in India filed 1.23 lakh complaints about "digital arrest" scams and lost ₹1,935 crore. The script never changes: a video call from a fake "CBI officer", a fake case, and one rule — don't hang up, and don't tell anyone. The victims are often older people who live alone.

Most safety advice says "just hang up." But the scam is built so that the victim feels she can't. So I asked a different question: what if she never has to hang up, and never has to face that decision alone?

What it does

Ruko ("stop" in Hindi) is a calm, mobile-first safety layer for older Indians and their families. It is organised by time, not by features.

Before (calm). A 7-step setup: language, a trusted person, a family code word, what family may see, and a calm-moment rule written for her frightened future self: "If I send more than ₹10,000 to someone new, wait 1 hour and ask Rahul first."

During (scared).

  • One giant RUKO button. The call keeps running, and a calm card says "Real police never arrest anyone on a video call. You do not have to pay." It can read this aloud.
  • Tell my person sends a silent alert, so she never has to speak in front of the caller.
  • Check this call asks three yes / no / not-sure questions. Rules, not an AI verdict: the result shows exactly which answers matched.
  • Transfer pause. When the caller pushes her to pay, her own rule pauses it: "You are sending ₹2,00,000 to a new person." Cancel is the main button.
  • Rahul's phone gets one alert with Call, Block and Approve.

After (money gone). The golden hour: "Call 1930 now", five ordered steps, an evidence form, and a complaint pack she can read out, share, print or download.

Always. Adapt to me: Hindi, text up to 200%, high contrast, Easy Read, read-aloud and reduced motion. The calm card works offline.

For judges: /demo shows both phones side by side, syncing live. /about has a 60-second tour.

How I built it

  • React 19, TypeScript (strict), Vite, React Router 7 and Zustand with local persisted state.
  • No backend, no account, no tracking. The two phones sync through the browser's storage event.
  • A design system in plain CSS custom properties: tokens, a high-contrast theme, a 200% type scale, 48 px targets and motion that switches off under reduced motion. A unit test checks the contrast of every token colour pair.
  • English, हिंदी and Easy Read for every string. A test fails if any string has no Hindi translation.
  • Web Speech API for read-aloud, always with the same words on screen.
  • Offline-first PWA with Workbox.
  • Testing: 299 Vitest tests and 130 Playwright end-to-end tests on a 360 px phone, with axe checks in Hindi, high contrast and 200% text.

Challenges I ran into

  • Designing for panic. People in shock cannot read long advice, so every screen has one main action and short sentences.
  • Friction only where money can be lost. ₹500 to her chemist goes straight through. ₹2,00,000 to a new "RBI safe account" pauses.
  • Dignity versus safety. Family alerts can feel like surveillance, so she decides what her family sees.
  • Hindi is not translated English. Devanagari needs more line height, and amounts are read in lakh and crore.

Accomplishments I'm proud of

  • A pause that does not need you to hang up, and a rule written by your calm self for your scared self.
  • Lighthouse Accessibility, Best Practices and SEO all scored 100 on mobile.
  • A complete before, during and after journey in two languages.

What I learned

For an elder under pressure, accessibility is the product itself: big targets, plain words, read-aloud and Hindi. And the best safety feature is often another person.

What's next for Ruko

  • Usability tests with people aged 60+ and their adult children.
  • Partner with a bank or UPI app, because the pause belongs inside the payment flow.
  • More Indian languages, and one-tap reporting of the caller's number on Sanchar Saathi.

Built With

  • axe-core
  • css
  • deployxa
  • eslint
  • playwright
  • pwa
  • react
  • react-router
  • typescript
  • vite
  • vitest
  • web-speech-api
  • workbox
  • zustand
Share this project:

Updates

Submission history