Inspiration
Every scam aimed at older adults has the same rule: don't tell your family. The "tech support" caller, the fake IRS agent and the "your grandson is in jail" call all depend on silence. In 2025, Americans 60 and older reported $7.7 billion in fraud losses to the FBI, about 60% more than the year before (AARP on the FBI IC3 report).
Banks already send fraud alerts, but the alert goes to the same person the scammer is coaching on the phone. Insurance pays you back after the money is gone. We wanted to stop the money before it leaves, by breaking the one thing every scam needs: silence.
MHacks asked us to build something that grows. Aval grows a circle of protection around the person who raised you.
What it does
Aval is a family safety hold on an older parent's bank account.
- Normal payments go straight through. Her electric bill, or money to her daughter, is sent right away. She never feels watched.
- Risky payments are held at the bank. Aval scores the payee using live Capital One Nessie data. If it looks risky, a real bank transfer moves the money into an Aval Hold account. It's not a pop-up she can click past: the money is out of the scammer's reach before anyone picks up a phone.
- The family sees it live. Her children see the payment on their phones, with every reason it was flagged.
- Release takes two keys. The money goes out only if Mom confirms and a guardian approves. First, Mom answers one question: "Were you told to keep this secret?" If she says yes, her approval stops counting and every guardian sees "Call her now."
- Then there's a 60-second objection window. Any guardian can pause the payment.
- Two stops bring it home. If two different guardians tap Stop, or Mom cancels, the money transfers back to her checking.
- If nobody acts, the hold refunds itself (after 150 seconds in the demo, 24 hours in real use).
Nobody acts alone. Releasing needs Mom plus a guardian, and stopping needs two guardians or Mom herself. Held money is never sent without Mom's confirmation, and a refund always goes back to her own account.
For our sponsor and track judges
Capital One: Nessie is the bank, not a decoration
- The risk score comes from live Nessie reads, and each reason records which call produced it:
GET /customers: is the payee a registered merchant?GET /accounts/{id}/transfers: has this account ever been paid, and how often?GET /accounts/{id}: is the receiving account brand new?GET /enterprise/bills: is this a known monthly biller, and what does she usually pay?
- Every dollar moves through Nessie with
POST /accounts/{id}/transfers:DIRECT(Mom → payee),HOLD(Mom → Aval Hold),RELEASE(Hold → payee) andREFUND(Hold → Mom). - Every bank call is visible. The big screen's bank log shows each request and its HTTP status as it happens.
- It's designed as a bank feature: an opt-in safety setting a bank could offer inside its own app.
SpacetimeDB: the database is the whole backend
There's no other server: no Express, no cron jobs, no Redis, no hand-written websockets. One TypeScript module on Maincloud does everything.
- Tables and subscriptions: Mom's phone, every guardian's phone and the big screen subscribe to the same tables, so a tap anywhere shows up everywhere instantly.
- Reducers enforce the rules: only Mom can confirm, stops must come from two different identities, and a "yes" to the secrecy question voids Mom's key. If two guardians tap Approve at the same instant, reducers run as transactions, so exactly one wins and the other sees "Someone already acted."
- Scheduled tables are the clock: the objection window and the auto-refund are scheduled rows, so they fire even when every phone is closed.
- Procedures call the bank: a reducer writes an outbox row. A scheduled procedure reads the state, calls Nessie over HTTP, and writes the result in a separate transaction, checking the payment state first so a retry doesn't send money twice.
- Lifecycle reducers power presence:
clientConnectedandclientDisconnectedshow who in the family is online. - Identity is the login: each phone's SpacetimeDB identity is its account. The Nessie API key sits in a private table that the browser can never read.
FinTech
Today's fraud tools either warn the victim or pay back the loss afterward. Aval adds a missing control: shared, time-limited custody of a risky payment, with real money movement, a full audit trail, and automatic return if no one acts.
Beyond the Code
Our hardest problems were human, not technical. A tool that lets relatives control a parent's money can become its own kind of abuse. So Aval is built around dignity: Mom keeps her own key, held money is never sent without her, and every refund goes back to her account. Large type and two-button screens make it usable for someone who isn't comfortable with apps. And the secrecy question turns the scammer's main weapon into the signal that brings the family in.
How we built it
- Backend: a SpacetimeDB TypeScript module hosted on Maincloud.
- Bank: the Capital One Nessie API, for customers, accounts, bills and transfers.
- Frontend: React, Vite, Tailwind and Framer Motion, designed as a warm family scrapbook instead of a surveillance dashboard. The projector-sized "Family Ledger" big screen has a QR code, so anyone can join Margaret's family from their own phone. It's hosted on Vercel.
- Team: Tanvir built the backend, SpacetimeDB and Nessie integration. Mateo designed and built the UI.
Challenges we ran into
- Nessie doesn't update balances after a transfer, so Aval keeps its own ledger and treats each Nessie transfer record as the receipt.
- Nessie's transfer endpoint accepts only a few fields, so we track each transfer's destination ourselves.
- Reducers can't make HTTP calls, and procedure transactions can re-run. That's why every bank call goes through the outbox, which checks state before sending.
- Our timers fired instantly until we found that SpacetimeDB schedules in microseconds, not milliseconds.
- Designing for dignity, not control took more thought than any line of code.
Accomplishments that we're proud of
- Every hold, release and refund is a real Nessie transfer, shown live with its HTTP status.
- Every safety rule is enforced on the server and is safe when two people tap at once.
- The secrecy question: one yes/no question flips silence, the scammer's best tool, into a family alert.
- A two-person team built it in under 20 hours.
What we learned
- With SpacetimeDB, the database can be the whole backend: state, rules, timers, real-time sync and outbound HTTP in one module.
- A bank integration has to plan for failure: timeouts, retries and receipts.
- Protecting older adults from fraud is as much about dignity as detection.
What's next for Aval
- Connect to real accounts through a bank partner, and add push notifications so guardians don't need the app open.
- Let families set their own rules: amount limits, trusted payees, and how many guardians must agree.
- Build on the trusted-contact and temporary-hold rules brokerages already follow (FINRA Rules 4512 and 2165), so a bank could offer Aval as an opt-in feature.
Built With
- capital-one
- framer-motion
- nessie
- react
- spacetimedb
- tailwindcss
- typescript
- vercel
- vite
- websockets
Log in or sign up for Devpost to join the conversation.