-
-
GIF
4/4: Earlier verified DEV run: Claude purchase and eight authored challenges; simulated settlement, no Visa API transaction.
-
GIF
1/4: Shared-vendor exposure reaches the PE dashboard and affected company; synthetic incident and simulated payment.
-
GIF
3/4: Real disposable Okta account suspended automatically and restored by practice Reset; actual UI evidence.
-
GIF
2/4: Self-approval blocked, wrong destination rejected, corrected bill independently released; simulated ledger.
Try it
- Live: https://sidecall.vercel.app. Add
?stagefor the presenter narration. - Site password:
sidecall-password(see note 1 above). Then pick anyone from the "Sign in as" list; the demo password for every seeded person issidecall-demo. - Start as Jamie Chen (AP clerk, Summit Home Health). Open Simulator in the header, choose Brightline payroll breach, and press Fire incident. Reset puts the portfolio back to a clean slate.
- The portfolio, incidents and payments are synthetic; the configured disposable Okta account pause and practice restoration are real.
Workflow GIFs
The four gallery animations show exposure, payment rejection and correction, real Okta suspension and practice recovery, then a separate earlier verified DEV AI purchase test. They use actual UI captures with time cuts; payments are simulated and verification calls are role-played.
Inspiration
In December 2021, ransomware took down Kronos, the payroll system behind about 8 million workers. Larry Kroeck, a cafeteria worker at Allegheny General Hospital, lost about 54 hours of pay and was told nothing could be done, because about 2,000 other employers had the same problem.
Companies owned by the same private equity firm quietly share payroll providers, IT contractors and logins. 48% of breaches now involve a third party (Verizon 2026). Vendors take a median 73 days to tell customers; attackers can move laterally in about 29 minutes. When one shared vendor falls, its sister companies find out last, if at all. And since a March 2026 ruling against Bain Capital, the PE firm itself can be held responsible.
That's why we built Sidecall: when one vendor or login is compromised, it finds the sister companies that genuinely share it, tells each one exactly what to do, and holds the money until a person verifies.
What it does
- Finds who genuinely shares it. A shared login or admin access is urgent; merely being a customer is advisory, and only when the vendor itself fell. A company with its own separate login isn't alerted at all.
- Holds the money. Summit Home Health was about to pay $480,000 to an account changed by email two days before the breach (
••2208 → ••7731). Sidecall holds it, never cancels it, and flags the bank change. - Makes a different person verify. The clerk who asked for the payment can't release it. A controller calls the number on file, types the account digits the vendor confirmed, and releases or rejects. Cash moves only on release. A rejected payment can be safely re-sent to the last phone-confirmed account.
- Carries a red-team finding one step ahead. Red teams like Armadin stop at one company's boundary. Sidecall tells each sister that shares the same access: reachable here, not tested here, plus exactly what to check.
- Runs each company's own pre-approved steps. With "pause the shared login" pre-approved, Cedar Ridge's real disposable Okta pause was confirmed 2 seconds after the report in the recorded run. This is one observation, not a latency guarantee; practice Reset restores only the receiver-owned demo hold. It's capped at 3 companies per report; payroll logins always wait for a click.
- Pauses a real account without holding anyone's keys. Sidecall sends a signed instruction to a receiver the company runs, which alone holds the Okta credential. The recorded public-demo run suspended and restored a real disposable Okta account, independently checked in Okta.
- Pays routine bills with Claude, inside the controller's limits. Claude can only request a bill the controller approved, for the exact amount and payee. Convex rechecks everything, and holds it if the vendor is under an incident.
- Shows the firm the whole picture, and only the firm: "3 companies exposed · 4,200 people · $612,000 held", on a live map. Companies never learn who was hit.
How we built it
- Convex is the backbone. One report writes the incident, every exposure, hold, flag, pre-approved step and alert in one transaction, and every dashboard sees the same snapshot live, with no polling. A replayed report writes nothing new; two people clicking Acknowledge at once produce exactly one winner. In our test suite, one report held 304 payments across 303 companies in about 1.4 s.
- Controls live in the backend, not the UI. Requester ≠ approver, controller-only release, the confirmed-digits check and the 3-company cap run inside the mutations, and refusals are logged too.
- Claude (Opus 5.5) writes; rules decide. Claude pre-writes the alerts, hold notices and vendor letter, checked against our copy rules: never name who was hit, never call a payment fraud, only the number on file. Exposure, urgency and holds are deterministic.
- The account pause is a signed protocol. Every command has a fixed ID, so a retry can't pause twice, and Sidecall waits for a signed receipt with the account state read back from Okta.
- React, Vite, TypeScript and Tailwind on Vercel, plus an MCP endpoint where AI assistants are audited as agents with no release tool.
- Tested: 296 app and backend tests plus 99 more, and a rehearsal script that plays every demo beat against a live deployment.
What's real, what's simulated
- Simulated: the portfolio, people, payments, incidents and bank changes. The second app-token revocation action is simulated; the allowlisted disposable Okta account pause is real.
- Real: the Convex backend and its guarantees, the exposure and hold rules, Claude's writing and bill runs, the scorecard, and DNS vendor detection on real public domains. The Okta pause worked on a real test account, but no real company's Okta is connected.
Proof: the scorecard
We planted 18 cases with known answers, including honest ones that must be left alone. Nothing in the backend reads the answer key.
| Scenario | Caught | Missed | False holds | Correctly left alone |
|---|---|---|---|---|
| Brightline payroll breach | 6 | 0 | 0 | 4 |
| Ironclad shared login leaked | 0 | 0 | 0 | 3 |
| Ironclad MSP compromised | 4 | 0 | 0 | 1 |
These are our own planted cases, not a benchmark.
Challenges we ran into
- The asymmetry. A company with its own login shouldn't be alerted when a shared login leaks, but should be when the vendor itself is breached. We encoded it as link types and show the non-alert on screen as discipline, not a miss.
- Never revealing who was hit. Every company-facing alert, hold notice and Slack message drops the reporting company; tests check it.
- Acting without becoming the next weak point. A tool holding every company's admin keys is itself the shared vendor attackers want. So Sidecall only sends signed requests, and each company's own receiver holds the credential.
Accomplishments that we're proud of
- The $480K moment works end to end on the live site: held, the requester refused, the controller verifies by phone, cash moves exactly once.
- 0 missed, 0 false holds on 18 planted cases, including an honest bank change a cruder rule would flag.
- A real Okta account paused by one signed instruction, without Sidecall ever holding the key.
- We checked the premise on real data: public DNS of 26 companies in one real PE portfolio shows 9 on the same device-management vendor.
What we learned
Holding beats blocking. A control that pauses money, or a login, for a person to verify, with a record of who decided and why, is one a finance or IT team can actually live with. The firm should see everything; the company decides.
What's next
- Connect real companies' Okta, Microsoft Entra and Google Workspace through their own receivers.
- Turn a vendor's breach email into an incident for a person to confirm.
- Pull vendor lists straight from AP systems.
- Pilot with one mid-market PE firm.
Built with
Convex · Convex Auth · React · Vite · TypeScript · Tailwind CSS · Vercel · Claude (Anthropic) · Model Context Protocol (MCP) · Okta API · Node.js
Built With
- claude
- codex
- convex
- mcp
- node.js
- okta
- tailwind
- typescript
- vercel
- vite
Log in or sign up for Devpost to join the conversation.