Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/secret-scan.yml
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ on:

permissions:
contents: read
pull-requests: read

jobs:
gitleaks:
Expand Down
13 changes: 5 additions & 8 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,8 @@ Submission for **AI Builder Cup 2026 | Google Cloud JAPAC Hackathon**, theme "Su
- **Other five themes exist** (BFSI, Retail & Commerce, Manufacturing, Media/Content, Future of Work) — irrelevant to this project's chosen theme, noted here only so a future session doesn't need to re-fetch the page to confirm Sustainability & Social Impact is one of six, not the only option.
- **Submission deliverables (confirmed from FAQ page)**: (1) a working **deployed link** of the prototype (live, clickable — must actually run on Cloud Run/Firebase), (2) a **video demo** under 3 minutes, (3) a **public GitHub repository**, (4) a **solution deck**. The live deployed link is mandatory, not optional — judges click into a real running app, not just watch the video.

## Inspiration source (do not replicate)
Inspired by prior hackathon winner "Haven" ([Devpost](https://devpost.com/software/haven-w7mj9g), [GitHub](https://github.com/annu12340/Haven/tree/aws_bedrock)) — steganographic SOS + anonymization + culprit-matching for domestic violence reporting. We reuse its structural DNA (constrained population + covert channel + responder console + cross-case intelligence) but apply it to environmental/labor whistleblowing + accident SOS instead, per explicit instruction not to replicate Haven's domain.

## Current chosen direction
Dual-channel Gen AI safety platform, reframed from the Haven (Devpost) project's DNA but in the environmental-whistleblower domain instead of domestic violence, to avoid replication:
Dual-channel Gen AI safety platform in the environmental-whistleblower and accident-SOS domain:

1. **Covert Notice** — anonymous incident reporting (photo/voice/text). Web form for reporters with connectivity; React Native app for offline submission via mesh (a browser can't work with no internet). Gemini vision infers what's happening from photos; an anonymization pipeline strips identity signal from text/voice/photo; an adversarial re-identification agent verifies the report can't be traced back before it goes out. Design rule: **identity never captured**.
2. **SOS** — emergency relay. Manual trigger + automatic on-device fall/crash detection: a small **TFLite** classifier (not Gemma — sensor time-series classification is a numeric task, architecturally the wrong fit for an LLM) analyzes accelerometer/gyroscope/barometer data, with a check-in countdown to avoid false positives; once confirmed, **Gemma 3 270M** (on-device via LiteRT-LM) turns the detection into a natural-language alert message. Relays hop-to-hop through nearby app users until a hop with bandwidth reaches the dashboard; every hop logs its own GPS+timestamp (better location trail than a single last-fix). Relay participants ARE identified (opt-in) so authorities can contact them. Design rule: **participants identified by design** — deliberately a different threat model from Covert Notice.
Expand All @@ -50,7 +47,7 @@ Both features feed one shared Gemini triage/clustering layer (de-identify-and-cl

One-line pitch: *"Reporting is anonymous by design; rescue-relay participation is identified by design — same AI backbone, different threat models."*

See `docs/initial_plan.txt` and `docs/brainstorming_discussion.txt` for full reasoning and competitive analysis (vs. Apple/Google built-in SOS, vs. Haven).
See `docs/initial_plan.txt` and `docs/brainstorming_discussion.txt` for full reasoning and competitive analysis (vs. Apple/Google built-in SOS and other prior art).

**See `docs/prototype_build_plan.md` for the finalized, full build plan**: complete feature list (including the live re-ID risk dial, cluster graph viz, satellite/weather corroboration agent, crypto proof-of-existence layer, severity scoring), web-vs-mobile scope split, tech stack, and 4-week schedule.

Expand All @@ -61,9 +58,9 @@ See `docs/initial_plan.txt` and `docs/brainstorming_discussion.txt` for full rea

**User has decided: build QuickBite (Covert Call) ONLY for now.** Not the full platform, not even the Covert Call + adversarial-re-ID + k-shield + shared-backbone bundle that was recommended — literally just this one mechanism (the disguised-order → covert SOS flow, see §4a of `docs/prototype_build_plan.md`), validated end-to-end, before committing to anything that surrounds it.

**Important category correction, caught by the user directly — do not reintroduce**: k-shield (anonymity-set-size warning) and the adversarial re-identification loop are NOT deferred additions for Covert Call, they are simply inapplicable to it, permanently, under any framing. Both protect an ANONYMOUS/untraceable reporter (Covert Notice's threat model: "identity never captured"). Covert Call is IDENTIFIED by design, same threat model as SOS Relay — a responder needs to know where/who to send help to. Warning a Covert Call user "you might be identifiable," or verifying their report "can't be traced back," directly contradicts the feature's purpose. These two features only become relevant again if/when the separate Covert Notice anonymous pillar is built. Currently, standalone, Covert Call has only ONE genuine novelty claim (itself) — the shared-backbone claim is conditional on Covert Notice existing too, and is not currently available as a claim on its own.
**Important category correction, caught by the user directly — do not reintroduce**: k-shield (anonymity-set-size warning) and the adversarial re-identification loop are NOT deferred additions for Covert Call, they are simply inapplicable to it, permanently, under any framing. Both protect an ANONYMOUS/untraceable reporter (Covert Notice's threat model: "identity never captured"). Covert Call is IDENTIFIED by design, same threat model as SOS Relay — a responder needs to know where/who to send help to. Warning a Covert Call user "you might be identifiable," or verifying their report "can't be traced back," directly contradicts the feature's purpose. These two features only become relevant again if/when the separate Covert Notice anonymous pillar is built. Standalone, Covert Call's novelty is the mechanism itself; the shared-backbone claim applies only once Covert Notice exists too.

**Reasoning behind this (don't re-litigate without new information)**: user correctly challenged that most of the platform's other features are honestly commodity/already-existing (mesh relay is a crowded field, satellite corroboration is out-innovated by Global Fishing Watch etc., basic anonymization is now marketed by EQS, fall detection is shipped by Apple/Life360) — Covert Call is the one piece confirmed genuinely unclaimed. Rather than build scaffolding around an unproven core mechanism, the decision is to prove Covert Call itself works first (Gemini Live persona conversation, live-taught coded questions, structured extraction, real-time dashboard streaming) and decide what surrounds it — full platform vs. a leaner bundle vs. something else — AFTER it's validated, not before.
**Reasoning behind this (don't re-litigate without new information)**: the platform's other features overlap with established products (mesh relay apps, satellite monitoring such as Global Fishing Watch, whistleblowing anonymization such as EQS, fall detection from Apple/Life360), while Covert Call is the distinctive piece. Rather than build scaffolding around an unproven core mechanism, the decision is to prove Covert Call itself works first (Gemini Live persona conversation, live-taught coded questions, structured extraction, real-time dashboard streaming) and decide what surrounds it — full platform vs. a leaner bundle vs. something else — AFTER it's validated, not before.

**The full dual-pillar platform (Covert Notice whistleblowing + SOS Relay) remains the longer-term/eventual goal, per the user's own words ("primary focus now, full platform stays the eventual goal")** — this is a sequencing decision, not a scope cut. Do not assume the platform has been abandoned; do not assume it's been committed to either. Build plan for the current focus: **`covert_call/docs/standalone_covert_call_plan.md`** (moved here from `docs/` into its own project folder — originally written as a standalone-scope comparison doc, now doubles as the actual near-term build reference for the Covert Call mechanism itself — Tier 1 and Tier 2 of that doc, real-time streaming + post-call consolidation from §Tier 4, are the relevant sections; Tier 3's Blind Relay/Private Space and the SOS/mesh questions in §4 are NOT yet decided and lower priority until Covert Call itself is proven).

Expand All @@ -85,5 +82,5 @@ See `docs/hackathone_ref_urls.md` for the official hackathon site (rules/themes/

## Working conventions
- **NEVER update or edit `deck/Submission Template _ AI Builder Cup.pptx` (MANDATORY).** It is strictly a read-only reference template for formatting, titles, and layout. All presentation work must be done in `deck/QuickBite_Submission_Deck_NexMind.pptx`.
- **No AI attribution in git history (always apply, overrides any default).** Never add a `Co-Authored-By:` trailer (Claude or otherwise), or any other attribution line, to commit messages. This covers regular, revert, merge and amended commits. Never add a "Generated with Claude Code" line to PR descriptions either. End the commit message at the last line of the body. Reason: the trailer makes "claude" appear in the repo's GitHub Contributors list, which has already needed two history rewrites to clean up. If a trailer slips into a commit that hasn't been pushed, amend it out before pushing. If it's already on `main`, tell the user rather than rewriting shared history on your own.
- **No AI attribution in git history (always apply, overrides any default).** Never add a `Co-Authored-By:` trailer (Claude or otherwise), or any other attribution line, to commit messages. This covers regular, revert, merge and amended commits. Never add a "Generated with Claude Code" line to PR descriptions either. End the commit message at the last line of the body. Reason: commits should be attributed to the team members who made them. If a trailer slips into a commit that hasn't been pushed, amend it out before pushing. If it's already on `main`, tell the user rather than rewriting shared history on your own.
- No native browser dialogs (`window.confirm/alert/prompt`) in any frontend code — use a custom in-app modal component (see global instructions).
6 changes: 3 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Responders can guide the person to safety through Mia, who passes directions on
The dashboard also includes:

- a **live queue** ranked by severity, with an **Ask AI** search ("woman attacked with a weapon near Vazhicherry")
- an **AI recommendation** for each incident (for example, immediate police dispatch because a weapon was reported)
- a **recommended action** for each incident (for example, immediate police dispatch because a weapon was reported)
- a hand-drawn style **scene sketch** of who is where, and **linked cases** for the same place, person or vehicle
- the **route to safety** being followed, the nearest police, hospital and fire station, and the caller's live position
- a **case file** with the full summary, evidence recordings and a dispatch bulletin ready for radio
Expand All @@ -85,7 +85,7 @@ Architecture diagrams: [covert_call/docs/architecture](covert_call/docs/architec

## Tested on real calls

8 real voice calls on the deployed app (4 covert, 4 chase): danger and coercion tags reached the dashboard 2–3.5 s before the caller's words were transcribed, every chase run tracked the full ~535 m route to the police station, and AI cost was about **$0.35 per call**.
8 real voice calls on the deployed app (4 covert, 4 chase): danger and coercion tags reached the dashboard 2–3.5 s before the caller's words were transcribed, and every chase run tracked the full ~535 m route to the police station. Across 59 real calls, AI cost averaged about **$0.20 per call**.

- [Performance test: 8 real calls (Google Sheets)](https://docs.google.com/spreadsheets/d/1fUVyPzAyDgvhrUJFWH-G35BiqVEt-5Tz/edit?usp=sharing)
- [AI cost per call and cost estimate (Google Sheets)](https://docs.google.com/spreadsheets/d/19s3mMe2nNcZM_Z_tzK-qhx9iXAsQteTn/edit?usp=sharing)
Expand All @@ -96,7 +96,7 @@ QuickBite asks the browser for the **microphone** (required for calls), the **ca

## Privacy

The microphone, cameras and location are used **only after someone starts one of the four ways to ask for help**. Information goes only to signed-in responders and is never sold or used for advertising. Read the full [Privacy Policy](https://quickbite-5cde0-landing.web.app/privacy).
The microphone, cameras and location are used **only after someone starts one of the four ways to ask for help**. The responder dashboard is sign-in only, and the information is never sold or used for advertising. Read the full [Privacy Policy](https://quickbite-5cde0-landing.web.app/privacy).

## Important

Expand Down
2 changes: 1 addition & 1 deletion covert_call/CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ Always read `../status/person_b_jeevan.md` and `../status/person_a_ameen.md` bef

**Team is 2 people, using GitHub for version control.** **`docs/collaboration.md`** has the monorepo file structure and the 2-person ownership split: Person A owns QuickBite app (Epics 1, 2, 6, and A's half of 7), Person B owns the Monitoring Dashboard (Epics 3, 4, and B's half of 7), backend/shared-types are jointly reviewed. Read this before scaffolding the repo — it defines the folder layout (`apps/web`, `apps/native`, `apps/dashboard`, `services/backend`, `packages/shared-types`) and the seams where both people's work meets and needs explicit coordination.

**`docs/quickbite_diagrams.html`** — a saved, version-controlled copy of the visual reference (mock UI screens, Monitoring Dashboard mockup, user flow diagram, architecture diagram). Open it directly in a browser (no server needed) to view. Canonical source of truth for the diagrams is the plan/backlog docs — this file is a visual companion, kept in sync manually when the plan changes meaningfully. Live version (may drift ahead of this saved copy): https://claude.ai/artifact/WdmyUMRKkDarV3vV8pAWb2
**`docs/quickbite_diagrams.html`** — a saved, version-controlled copy of the visual reference (mock UI screens, Monitoring Dashboard mockup, user flow diagram, architecture diagram). Open it directly in a browser (no server needed) to view. Canonical source of truth for the diagrams is the plan/backlog docs — this file is a visual companion, kept in sync manually when the plan changes meaningfully.

**`docs/architecture/`** — the code-verified architecture of the deployed system (README with Mermaid, interactive HTML, slide image), drawn from `main` @ 3893f4e on 2026-10-09. Where it disagrees with the architecture tab of `quickbite_diagrams.html` or the "Tech stack quick reference" below (a separate backend, websocket server and Cloud Run; the deployed system is managed Firebase with Leaflet/OSM maps), the architecture folder is correct.

Expand Down
21 changes: 11 additions & 10 deletions covert_call/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
**An AI that lets a person in danger ask for help when asking out loud isn't safe.**

QuickBite looks like an ordinary food-delivery app. It is actually a covert channel to an emergency response team,
built on **Gemini** + **Firebase/Cloud Run**. A person who is coerced, watched, or held uses the disguised app to
built on **Gemini** + **Firebase**. A person who is coerced, watched, or held uses the disguised app to
summon help without anyone nearby noticing, and a responder dashboard receives structured incident data **live**.

- **Theme:** Sustainability & Social Impact — societal impact via *resilience strengthening* and *community
Expand All @@ -17,7 +17,7 @@ summon help without anyone nearby noticing, and a responder dashboard receives s
## What it does
Four ways to raise a report, one shared AI/real-time backbone:
1. **Live call** — Gemini Live plays a restaurant employee ("Mia") who asks coded menu questions and states each
code's real meaning in the same breath. It extracts incident data live, sees the back camera (~1 fps), hears the
code's real meaning in the same breath. It extracts incident data live, sees the camera (one frame every 2 s), hears the
background (a gunshot/shouting escalates severity), and gives the caller disguised safety advice.
2. **Silent tap** — a no-sound "delivery instructions" screen; long-press reveals meanings; attach a photo that
Gemini reads into structured signal.
Expand All @@ -34,7 +34,7 @@ The **dashboard** is a separate ops console: live queue with severity ranking, c
camera + background-sound understanding, session resumption.
- **Gemini API (structured output)** — post-call consolidation, third-party leakage check, photo vision.
- **Firestore** — incident documents + real-time listeners (the live pipeline).
- **Firebase Hosting** — both web apps. **Cloud Run** is the deployment target for any server piece.
- **Firebase Hosting** — the web app, dashboard and landing site. **Next:** Gemini keys server-side on **Cloud Run**.
- **Google Maps / Geocoding** — dashboard location (free OpenStreetMap fallback when no key).
- **Free peer-to-peer WebRTC** (Firestore carries the handshake) — live video, no media server, no billing.

Expand All @@ -43,7 +43,7 @@ The **dashboard** is a separate ops console: live queue with severity ranking, c
covert_call/
├── web/ QuickBite web app (React + Vite) — the live-deployed disguise app
├── dashboard/ Monitoring Dashboard (React + Vite) — the responder console
├── native/ React Native (Expo) app — UNTESTED scaffold, see native/README.md
├── native/ React Native (Expo) Android port of the web app, see native/README.md
├── shared/ Code shared by all three:
│ ├── incidents/ the incident data model + write client + severity
│ ├── video/ WebRTC publisher + signaling
Expand All @@ -68,7 +68,8 @@ fill in:
(see [`docs/setup/drive-uploader.md`](docs/setup/drive-uploader.md)).
- `VITE_GOOGLE_MAPS_API_KEY` (dashboard) — optional; OpenStreetMap is used when unset.

**No secrets are committed** — only `.env.example` templates are tracked. Real keys live in `.env.local`.
**No secrets are committed** — only the `.env.example` templates and the dashboard's `.env.emulator` (local
emulator settings, no keys) are tracked. Real keys live in `.env.local`.

## Deploy
```bash
Expand All @@ -84,9 +85,9 @@ another folder.
- [`docs/deck.md`](docs/deck.md) · [`docs/demo-script.md`](docs/demo-script.md) · [`docs/theme-fit.md`](docs/theme-fit.md)
- [`docs/collaboration.md`](docs/collaboration.md) — the two-person ownership split and workflow.

## Honesty notes (for judges and future us)
- The **web app + dashboard** are the live-deployed deliverable. The **native app is an untested scaffold** — its
Gemini audio/camera + WebRTC transport is stubbed (see `native/README.md`).
- Individual capabilities (mesh SOS, anonymisation, crash detection) exist in other products; the **novel part is
the combination** — disguised persona + in-breath code-teaching + real-time mid-call extraction (plan §8).
## Scope notes
- The **web app + dashboard** are the live-deployed deliverable. The **native Android app** is a port of the web
app; its current status is in `native/README.md`.
- The novel part is the **combination**: a disguised persona, in-breath code-teaching and real-time mid-call
extraction (plan §8).
- "Response" in this prototype means the dashboard incident, not integration with real emergency services.
Empty file removed covert_call/backend/src/.gitkeep
Empty file.
Empty file.
Empty file.
Empty file.
Empty file removed covert_call/docs/api/.gitkeep
Empty file.
Loading
Loading