Thermograph monorepo: graded-climate API + SSR frontend + infra, domain-specific containerized deploys
The button was dead on plain HTTP and failed silently everywhere.
Browsers only expose geolocation on secure origins, but `navigator.geolocation`
still EXISTS on http:// — getCurrentPosition just fails with a permission error
("Only secure origins are allowed"). The guard was `if (!navigator.geolocation)
return;`, which passes on http://, so the call went ahead, errored, and landed
in an empty error callback. Nothing happened at all.
`make lan-run` serves plain HTTP on 0.0.0.0:8137 so phones can reach it, so the
button could never work in the normal dev-and-phone workflow, and gave no hint
why. It would have worked on thermograph.org, which is HTTPS.
- Gate on `window.isSecureContext`, not just the API's presence. Where the
browser will refuse, hide the locate button and promote "Pick on the map" to
primary rather than offering a control that cannot work.
- Report failures: a declined prompt, a timeout, and an unavailable fix each get
their own message in an aria-live slot. A silent failure is indistinguishable
from a broken button, which is exactly how this went unnoticed.
- Show a "Locating…" state while the fix is pending; it can take seconds.
To exercise geolocation against the LAN dev server, serve it over TLS:
`make lan-run TLS=1` (self-signed cert into certs/).
Verified by driving the button in a real browser across all three cases:
insecure origin (button hidden, map promoted), permission granted (hero
re-points at the located place), permission denied (message shown, button
restored).
|
||
|---|---|---|
| templates | ||
| tests | ||
| api_accounts.py | ||
| app.py | ||
| audit.py | ||
| cities.json | ||
| cities.py | ||
| cities_flavor.json | ||
| city_events.py | ||
| climate.py | ||
| content.py | ||
| db.py | ||
| digest.py | ||
| gen_cities.py | ||
| gen_flavor.py | ||
| grading.py | ||
| grid.py | ||
| homepage.py | ||
| indexnow.py | ||
| mailer.py | ||
| metrics.py | ||
| migrate.py | ||
| models.py | ||
| notify.py | ||
| places.py | ||
| push.py | ||
| requirements-dev.txt | ||
| requirements.txt | ||
| schemas.py | ||
| singleton.py | ||
| store.py | ||
| users.py | ||
| views.py | ||
| warm_cities.py | ||