Source · CHANGELOG.md
Changelog
Every notable change to LoadConsensus, dated. Sourced from the repository’s CHANGELOG.md and rendered at request time, so this page is always current with what has shipped.
Unreleased
No changes recorded yet.
Webhook subscriptions, Sentry, status page
Added
- Public
/status page with server-side latency probes against six
/api/v1/* endpoints, derived operational / degraded / major headline, pipeline freshness table, coverage stats, and the five most recent public revisions.
- Sentry SDK wired in
client, server, and edge configs plus
instrumentation.ts. Cron workers remain on JobRun telemetry by design.
- Public
/changelog page rendered from CHANGELOG.md at request time
with an RSS 2.0 feed at /changelog.xml.
- Public
/roadmap page split into Now / Next / Later. SiteNav component linking Datacenters, Consensus, Pricing, API, and
Changelog from the homepage header and footer.
Changed
- Homepage footer now also links
/changelog and /roadmap.
Operational
- 207 tests passing across 15 files.
tsc --noEmit clean.
Datacenter map, CSV exports, ERCOT LFL aggregate, /status
Added
- ERCOT Large Flexible Load queue scraper (
jobs/ercot-lfl-fetcher/)
with a DO scheduled spec (0 8 * * *, basic-xxs). Operates in stub-mode by default; activates when ERCOT_LFL_CSV_URL is set. Seeded 12 aggregate RTOQueueEntry rows reflecting real ERCOT board reporting (63 GW year-end 2024 to 233 GW December 2025).
/dc/map MapLibre view using CARTO Positron raster tiles (no API key
required). Markers sized sqrt(MW) between 4 and 30 pixels. Tab navigation switches between /dc table and /dc/map.
- Real latitude and longitude data on 17
DatacenterProject rows
(Microsoft Mt. Pleasant, xAI Memphis, OpenAI Stargate Abilene, and others) via Supabase MCP.
- Pro+ CSV export endpoints:
/api/v1/load-forecasts.csv (Pro 50K / Team 200K / Enterprise 1M rows)/api/v1/datacenter-projects.csv with opt-in
Multi-source NERC LTRA + EIA STEO consensus, /utility, /admin, /api/v1, PageView analytics
Added
/utility index with searchable table and per-utility datacenter
count, and /utility/[slug] profile pages including FERC eLibrary deep-link and project list. not-found.tsx returns a real 404.
- Twenty-one NERC LTRA
LoadForecast rows (14 peak-demand-gw plus 7
annual-energy-twh) seeded via Supabase MCP. The LoadForecastRevision trigger was demonstrated on an UPDATE of the EIA STEO ERCOT annual-energy-twh row (deltaPct = 3).
- Idempotent re-runnable seed at
scripts/seed-nerc-ltra-2025.mjs. /admin internal dashboard (5 tabs: Pipeline health, Subscribers,
B2B intent, DC review, Data sources) gated by ADMIN_TOKEN cookie or header. Login route at /api/admin/login.
- Public read API at
/api/v1: health (public), sources
Initial scaffold: 11 tables, Source/PowerEvent/LoadForecast, homepage, /pricing, /iso/[iso], Stripe wiring, Supabase Auth
Added
- Repository scaffold: Next.js 16 (App Router, Turbopack), React 19,
Tailwind 4, Prisma 7 with @prisma/adapter-pg, Vitest.
- Initial Postgres schema with 11 tables, all RLS-enabled:
Source, ForecastDocument, LoadForecast, LoadForecastRevision, PowerEvent, JobRun, Subscriber, Organization, ApiKey, PageView, Event.
LoadForecastRevision BEFORE UPDATE trigger capturing prior value,
absolute delta, and percent delta when value changes.
- Canonical migration template at
prisma/migrations/manual/2026-05-14-initial-schema.sql
include=sources,notes
/api/v1/revisions.csv with since and minAbsPct filtersrequireTier(actual, required) helper plus TIER_RANK constants.Dev-bypass tier pinned at rank 0 so it cannot grant CSV access.
/api-docs gained a CSV exports section with curl examples and a
402 upgrade_required row in the Errors table.
withApiAuthTier wrapper returning 402 for sub-tier callers while
the underlying withApiAuth continues to track rate limits.
Changed
/iso/ercot now includes a Large Flexible Load queue section with
an honest disclaimer that ERCOT does not publish per-entry queue data.
- Homepage footer gained a
/status link.
Operational
- 207 tests across 15 files in 1.14s. CSV endpoints correctly return
402 to the dev-bypass identity. Twelve RTOQueueEntry rows and 17 geocoded datacenter projects live in production.
,
load-forecasts, consensus, datacenter-projects (and :slug), power-events. Bearer lookup via sha-256 ApiKey row; dev-bypass enabled when NODE_ENV != production.
/api-docs page with real curl examples and live DB-sourced
PageView plus ASN intent tracking: hashed IP, parsed UA, ASN
classification, Organization upsert with intentScore = pageviewCount + (isDC ? 50 : 0) + sessionCount * 5, PageView insert, and a 1x1.gif fallback. 21 verified ASNs covering the major hyperscalers, CDNs, GPU clouds, and colos. Eight Organization rows seeded so the /admin B2B Intent tab is non-empty.
/account/notifications with auto-save, tier-aware upgrade notices,
and four sections (forecast alerts, DC alerts, digests, account).
/account/api-keys mint flow: mintApiKey returns a `lc_<32 url-safe
chars>` raw key once, stored as sha-256. Active / revoked table, tier-capped selector, reveal-once banner with clipboard copy.
- Supabase Auth (magic-link, passwordless):
/login, /auth/callback,
/auth/signout, and a server-rendered /account view. src/proxy.ts refreshes the session on every request.
- Stripe wiring:
/api/stripe/checkout, /api/stripe/portal, and
/api/webhooks/stripe handling checkout.session.completed, customer.subscription.{created,updated,deleted}.
/pricing SubscribeButton showing `Coming soon — billing not yet
enabled when STRIPE_PRICE_ID` is unset.
alert-dispatcher DO scheduled worker (daily 14:00 UTC) reading 24h
of LoadForecastRevision and DatacenterProjectRevision, matching preferences, deduping via Event, and sending through SendGrid with dry-run fallback when the API key is absent.
Changed
ApiKey schema gained userEmail and prefix columns (migration
applied via Supabase MCP).
/api-docs hero now shows Get a key → linking to
/account/api-keys when signed in and /login otherwise.
middleware.ts renamed to src/proxy.ts to match the Next.js 16
Fixed
customer.subscription.deleted correctly downgrades the Subscriber
Operational
- 152 tests across 11 files in 1.07s (79 added in this batch). 23 routes
verified end to end (200 / 307 / 401 / 405 as designed). 17 web routes plus 7 API routes verified — 11 returning 200, dev-bypass works, bad-bearer returns 401, /api/v1/consensus returns a multi-source range-band JSON document.
(idempotent table / index / FK / trigger / RLS blocks plus a sanity-check tail).
- Schema-drift checker (
scripts/check-schema-drift.mjs) running on
- Seed of the source catalog (federal + 7 RTOs) plus a homepage
reading source coverage and upcoming releases from the DB.
- Subscribe API at
/api/subscribe with the homepage capture form
/calendar page listing PowerEvent rows (STEO monthly, CDR
semi-annual, LTRA annual).
eia-steo-fetcher DO scheduled worker producing 32 LoadForecast
rows from the live EIA STEO publication.
/pricing page (free / pro / team / enterprise) plus initial
JobRun telemetry pattern (beginJobRun / endJobRun) with the
invariant that every exit path — try, catch, finally, early return, process.exit — must record an outcome.
Operational
- 45 Vitest tests passing.
tsc --noEmit clean. Build pipeline
check-schema-drift → prisma generate → next build green.