Work top to bottom. Anything in 🔴 Blocker must be done before the site is publicly announced. 🟠 Important should be done launch day. 🟢 Nice-to-have can follow.
- Rotate the leaked GEE key. The
climatevision-gee@kinos-473422service-account private key was shared in plaintext. In Google Cloud Console → IAM → Service Accounts → Keys: delete that key, create a new one. - Set secrets as runtime env vars, never in the repo. Run
./scripts/setup_render_secrets.sh(Render) or./scripts/setup_fly_secrets.sh(Fly). Confirm none of these appear in any committed file:GEE_SERVICE_ACCOUNT,GEE_SERVICE_ACCOUNT_KEY_JSON,GEE_PROJECT_ID,ANTHROPIC_API_KEY,API_SECRET_KEY. - Confirm
CLIMATEVISION_ALLOW_DEV_KEY=0in production. It is set inrender.yaml; verify it on Fly too. A live dev key bypasses API-key auth. - Decide the truth-in-labeling posture. Until trained weights are
deployed, predictions come from untrained/synthetic models. Either:
(a) label the product a technical preview in the UI and API responses, or
(b) deploy trained weights first (see
notebooks/TRAINING_PIPELINE.md). Do not ship unlabeled demo output to NGOs/agencies as real monitoring. - Rotate the teammate Personal Access Tokens stored in
.git/config(franchaise, olufemi, and previously hopelyn). They were printed in plaintext.
- CORS matches the domain.
render.yamlsetsCLIMATEVISION_CORS_ORIGINS=https://climatevision.green,https://www.climatevision.green. Confirm the deployed env has it and that the frontend is built with the rightVITE_API_BASE_URL(empty = same-origin, which is correct here). - DNS → host. Point
climatevision.green(andwww) at Render/Fly and verify HTTPS (force_https = trueis set infly.toml). - Persistent storage is mounted.
fly.tomlmountsclimatevision_dataat/app/outputsandDATABASE_URL=sqlite:///app/outputs/.... Confirm the volume exists so run history + the NGO/alerts DB survive restarts. (On Render free tier, confirm the disk is attached — otherwise SQLite is ephemeral and you lose registrations on redeploy.) - Health checks green. Hit
/api/healthand/api/health/modelson the live URL./api/health/modelswill tell you whether real weights loaded. - Smoke test the core flow. One
POST /api/predictand one dashboard load against the live site. Confirm/docsrenders. - Merge the flood-detection PR (committed under your name) so the live build includes it.
- Deploy real trained weights for flooding first (best dataset fit:
Sen1Floods11), then deforestation and ice. Follow
TRAINING_PIPELINE.md. - Fill in the README benchmark table (IoU / F1) once a run passes the governance gate — replaces the "in progress" placeholders.
- Add a status/uptime check and basic error monitoring.
- Record dataset
provenance.json+ model cards for each deployed model (credibility for government adoption). - Push the 21 unpushed
maincommits and confirm CI is green onmain.
curl -s https://climatevision.green/api/health | jq
curl -s https://climatevision.green/api/health/models | jq # are real weights loaded?
curl -s https://climatevision.green/api/analysis-types | jqIf /api/health/models shows untrained/demo, you are still in preview mode —
which is fine, as long as the UI says so.