Thermograph monorepo: graded-climate API + SSR frontend + infra, domain-specific containerized deploys
Find a file
Emi Griffith 22019bc632 Persist the homepage feed to Postgres instead of a per-replica file (#232)
homepage.json lives on the appdata volume today, written by whichever
process's notifier last refreshed it. Under Swarm each web replica has its
own disk, so a file only one replica's notifier ever writes leaves every
other replica reading a stale or missing feed indefinitely.

On Postgres, refresh()/load() go through store.py's existing derived-payload
table instead (a fixed sentinel key, since the feed isn't cell-scoped) - a
single upsert is already atomic, and every replica reads the same row.
store.IS_POSTGRES is False without THERMOGRAPH_DATABASE_URL, so dev/tests
keep the plain file path entirely unchanged; no existing test needed to
change.

Verified live against real Postgres: refresh() persists into the shared
derived table and load() reads the exact same feed back.
2026-07-21 00:24:17 +00:00
accounts Containerize the app and move the databases to PostgreSQL 18 (#220) 2026-07-20 06:28:23 +00:00
alembic Move the climate record from parquet to TimescaleDB hypertables (#227) 2026-07-20 20:15:55 +00:00
core Add a Postgres advisory-lock leader election for multi-host deploys (#229) 2026-07-21 00:07:52 +00:00
data Move the climate record from parquet to TimescaleDB hypertables (#227) 2026-07-20 20:15:55 +00:00
deploy Add entrypoint one-shot migrate mode and a Swarm secrets shim (#231) 2026-07-21 00:18:05 +00:00
notifications Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
templates Fix the footer leaking "wrapper. #}" from a broken Jinja comment (#211) 2026-07-20 04:14:56 +00:00
tests Persist the homepage feed to Postgres instead of a per-replica file (#232) 2026-07-21 00:24:17 +00:00
web Persist the homepage feed to Postgres instead of a per-replica file (#232) 2026-07-21 00:24:17 +00:00
alembic.ini Containerize the app and move the databases to PostgreSQL 18 (#220) 2026-07-20 06:28:23 +00:00
app.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
cities.json SEO: values filter — trim cities in anti-LGBTQ countries, keep notable hubs (#102) 2026-07-16 02:20:41 +00:00
cities_flavor.json SEO: values filter — trim cities in anti-LGBTQ countries, keep notable hubs (#102) 2026-07-16 02:20:41 +00:00
gen_cities.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
gen_flavor.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
indexnow.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
migrate.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
migrate_accounts_to_pg.py Containerize the app and move the databases to PostgreSQL 18 (#220) 2026-07-20 06:28:23 +00:00
migrate_cache_to_pg.py Move the climate record from parquet to TimescaleDB hypertables (#227) 2026-07-20 20:15:55 +00:00
paths.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00
requirements-dev.txt Add backend test suite; gate direct pushes; serialize LAN deploys (#41) 2026-07-11 19:37:49 +00:00
requirements.txt Containerize the app and move the databases to PostgreSQL 18 (#220) 2026-07-20 06:28:23 +00:00
warm_cities.py Split the backend into domain packages (#217) 2026-07-20 05:31:03 +00:00