This is the copy-paste path from "clone" to "live, judged submission". Commands are Windows PowerShell unless noted. The app degrades gracefully: every cloud integration is optional and the service runs in clearly-labelled fallback mode without it. Only the openFDA recall is always live.
openFDA (recall, public) ─┐
Fivetran → BigQuery (ops) ├─► Cloud Run API (FastAPI) ──► Frontend (static)
Gemini 3 (reasoning) ─┘ │ audit hash-chain · approval gate
| Tool | Why | Check |
|---|---|---|
| Python 3.11+ | backend | python --version |
| Node (optional) | only if you switch the frontend to a bundler | node --version |
| Google Cloud SDK | BigQuery + Cloud Run deploy | gcloud --version |
| git | the public repo requirement | git --version |
Install gcloud: https://cloud.google.com/sdk/docs/install (Docker is not required — Cloud Run builds from source).
# from the repo root (cortex/)
python -m venv .venv
.\.venv\Scripts\python -m pip install -r backend\requirements.txt
# terminal 1 — backend API on :8099
.\.venv\Scripts\python -m uvicorn app.main:app --app-dir backend --host 127.0.0.1 --port 8099
# terminal 2 — static frontend on :8790
python -m http.server 8790Open http://127.0.0.1:8790 . Health check: http://127.0.0.1:8099/api/health →
mode: partial, openfda: live. Smoke test the whole flow:
.\.venv\Scripts\python backend\scripts\smoke_test.py # expect RESULT: PASSFastest (free, no billing): Google AI Studio key
- Get a key: https://aistudio.google.com/apikey
- Confirm the exact Gemini 3 model id from the hackathon resources page.
- Create
backend/.envfrombackend/.env.example:GOOGLE_API_KEY=ya29.... USE_VERTEX=false GEMINI_MODEL=gemini-3-pro # ← exact id from hackathon resources - Restart the backend.
/api/healthnow showsgemini: live; LLMOps shows the real model + token counts.
Or via Vertex AI (needs the GCP project from §3):
gcloud auth application-default login
GOOGLE_CLOUD_PROJECT=<project-id>
USE_VERTEX=true
GEMINI_MODEL=gemini-3-pro
# after installing the SDK
gcloud init
gcloud auth login
gcloud config set project <PROJECT_ID>
gcloud services enable run.googleapis.com bigquery.googleapis.com aiplatform.googleapis.comThe free $300 trial covers everything here for the hackathon.
bq --location=US mk -d <PROJECT_ID>:recallops_cortex
.\.venv\Scripts\python backend\scripts\load_bigquery.py # creates tables + loads the seed [provided once §3 is done].env: GOOGLE_CLOUD_PROJECT=<id>, BIGQUERY_DATASET=recallops_cortex.
With this set, blast-radius runs as real BigQuery jobs and logs job IDs (proof).
- Sign up: https://fivetran.com (free trial).
- Create a connector — a Google Sheet of the seed ops data is the quickest —
with destination = the BigQuery dataset
recallops_cortex. - Grab API creds: Account → API key/secret; note your group/destination id.
.env:FIVETRAN_API_KEY=... FIVETRAN_API_SECRET=... FIVETRAN_GROUP_ID=...- Fivetran MCP: connect the Fivetran MCP server so the agent can read connector status / trigger syncs as a tool. (Wiring lands with task #5.)
The /fivetran route then shows real connector status + live sync timestamps.
gcloud run deploy recallops-cortex-api `
--source backend `
--region us-central1 `
--allow-unauthenticated `
--set-env-vars "GEMINI_MODEL=gemini-3-pro,USE_VERTEX=true,GOOGLE_CLOUD_PROJECT=<id>,BIGQUERY_DATASET=recallops_cortex"Cloud Run uses backend/Procfile to start uvicorn on $PORT. Copy the printed
service URL.
Secrets (Fivetran keys, AI Studio key): prefer
--set-secretswith Secret Manager over--set-env-vars. Never commit.env.
Set the API base in index.html:
<script>window.RO_CONFIG = { apiBase: "https://recallops-cortex-api-XXXX.run.app" };</script>Then host the static cortex/ folder — Firebase Hosting, Vercel, Netlify, or a
second Cloud Run service. That hosted URL is the Devpost "Project URL".
GET /api/health→mode: live, every integrationlive, atrace_id./llmops→ real Gemini 3 model id, real token counts per run./fivetran→ connector status + live sync timestamp.- BigQuery query job IDs in the Cloud Run logs for blast-radius.
/compliance→ audit hash-chainintact: true.- openFDA record id + retrieval timestamp visible in logs.
- No secrets in the repo, frontend, logs, or screenshots.