How it works

How the estimate is built.

Embertrace turns one or two camera frames into a probable origin with an uncertainty region, and uses public satellite heat to decide when and where to look. Measured inputs, modeled assumptions and limits are kept separate, because only the first kind is evidence.

The whole pipeline

Every stage evidence passes through, from a satellite pixel to a saved record.

Select a stage

GOES-18 / 19ABI-L2-FDCC, 5 minNASA FIRMSVIIRS x3, MODISCamera catalogALERTCaliforniaCluster, episodeAdaptive groupingBackground screenHistory, facilities, glintPriority scoreInvestigation valueCamera gatesFour ways to qualifyCamera assessmentRank, probe, lookSmoke and bearingTwo checks, both requiredSolve, land gateOrigin and regionDetection recordRevisioned, with evidence
ABI-L2-FDCC, 5 minGOES-18 / 19

NOAA publishes a fire mask, not raw radiance, so the background subtraction happens upstream. Embertrace keeps only the processed and saturated classes (10, 11, 30, 31) and reprojects each surviving pixel from the geostationary grid to a true four-corner footprint.

What goes into a solve

A frame is only half of it. The other half is where the camera was and where it was pointing at the moment of capture.

Preferred

The camera catalog

The public ALERTCalifornia feed: position, elevation, current pan, tilt, zoom and frame age. Where the feed publishes no coordinates, positions come from public CalOES and HPWREN map layers, verified against the 1,291 cameras that do publish them.

Fallback

The burned-in overlay

A saved or screenshotted frame has no catalog entry, so the pose comes from the footer the camera burns into the image, read by OCR in the browser.

Either way

The plume-base pixel

The lowest visible point of the smoke. A vision model proposes it and a person can overrule it; a manual mark always wins. Everything downstream is that one pixel turned into a bearing.

From a pixel to a probable origin

The pixel’s horizontal offset becomes a bearing through an exact focal-length transform. What happens next depends on how much evidence there is.

range unboundedCamera 1Camera 2

90% region, along the sightlineunbounded

The pixel fixes direction well and distance not at all. On its own the ray runs to the visibility limit, about 50 miles.
Bearing

Zoom changes what a pixel is worth

The field of view narrows as 2·atan(tan(FOV/2) / zoom), so at 6× a pixel carries roughly a sixth of the bearing it carries at rest. Treating zoom as a linear divisor is the error that puts an estimate a valley away.

Range

Terrain is what bounds one camera

A nine-line fan along the bearing, stepped every 100 m to 25 km and every 400 m beyond, casts the sight ray against ground height until it crosses. The ray carries a refraction term, and the crossing is refined by binary search.

Region

The uncertainty is the answer

Two cameras get 900 Monte Carlo samples; one camera gets 300 terrain replays. A single-camera region is long because the crossing is the uncertain part, and that shape is the honest reading of what one frame can say.

The confidence score ranks methods against each other: a two-camera fix reaches 76 at best, a single-camera bearing 30. A low number is the normal reading of one frame, not a fault, and it is never presented as a probability.

The decisions page

Every gate in the solve, the exact threshold it holds, and the named fire that set it — the corridor rules, the crossing vetoes, the identity ladder, and the full ledger table.

What it can and cannot say

What it does
  • Ingests the ALERTCalifornia catalog directly for camera position, pose and zoom
  • Fills the 419 catalog positions the public feed leaves blank, from public map layers
  • Reads the burned-in overlay by OCR when a frame arrives without its metadata
  • Corrects the centre bearing for smoke pixel and optical zoom
  • Crosses two forward sightlines on a local tangent plane
  • Walks a nine-line terrain fan when there is only one camera
  • Samples bearing, pose and position uncertainty into a 90% region
Where it is weak
  • Camera catalog coordinates may be rounded, and often dominate the error
  • Two frames are rarely simultaneous, which forces a stationary-source assumption
  • Smoke drifts, so the visible plume is not the ignition point
  • A foreground ridge can hide the source below the lowest visible smoke
  • Visible imagery cannot establish heat, hotspots, fire-front shape or acreage
  • Satellite heat pixels are coarse, can lag the frame, and never rewrite the camera solve

Telling background heat from a fire

NOAA’s fire product does the per-pixel screening upstream. What remains here is history and physics: does this place’s own past explain this reading, and could the light be a reflection.

History

Recurrence with a signature

Heat seen here on other days suppresses a new observation only when it matches the pattern: same time of day, same satellites. A fire two hours outside a glint’s nightly window is not explained by it.

Catalogs

Named facilities

Power plants and landfills carry penalties by kind and distance, from live California catalogs plus a checked-in federal snapshot for the rest of the coverage area, including Nevada’s geothermal fleet.

Physics

Sun-glint geometry

For a single-platform daytime signal, the system computes the panel orientation that would reflect the sun into that satellite at that moment. A realistic answer lowers priority and tells the operator why. Never a veto on its own.

The detail page

The Dora Fire timeline, the mirror math, the measured envelope and error rates, and what the background memory learns next.

The priority score

An additive score, clamped to 0 to 100, answering how much investigation a signal is worth. Not a fire probability, and never presented as one. It carries no camera-aiming term.

Adds

Strict thermal input+18The pixel passed the strict ingestion filter.
Two independent providers+24GOES and FIRMS both saw it.
Two satellite platforms+15Independent support, even in the same minute.
Persistent heat+12Three scan times spanning ten minutes or more.
Second scan+8Same location, a distinct scan time.
Repeat scansup to +14Three points per extra scan.
Sensor confidenceup to +12Scaled from 68% to 100%.
Radiative power+1 to +10Logarithmic in megawatts.
Recency+10 / +7 / +4 / +1Under 30 min, 3 h, 12 h, 24 h.

Subtracts

Single observation only-12No repeat scan and no independent sensor.
Stale-18Nothing seen for more than 24 hours.
Recurring background, pattern matches-18 to -28Heat here on 3 or more days, and this observation fits its time-of-day and platform pattern.
Recurring background, pattern differs-6Heat here before, but at another hour or on another satellite. History alone no longer vetoes.
Plausible sun glint-6 or -12One platform, sun up, and a realistic panel orientation would reflect the sun into it. Stronger at glint-scale power.
Heat here in earlier months-9 or -16The durable per-cell memory, beyond the retained fortnight.
Nearby heat history-7Another episode close by in the retained window.
Known facilitydown to -42Geothermal, biomass, landfill, fossil or solar within range.
Outside the United States-12 or -40No camera catalog and no facility catalog cover it. Never the only thing that stops a camera check.

Many heat pixels in one satellite image count as one scan; another distinct UTC minute counts as another. Repeat measurements keep an episode fresh, so waiting for the next five-minute GOES scan does not make it stale.

How a heat signal earns a camera frame

Four paths, checked most-specific first.

What the signal looks like

Each fact moves the priority score by the points beside it. Green adds. Red subtracts.

Approximate priority score28Corroborated opens at 58

First scanOpens

One clean GOES pixel under 15 minutes old, no heat history here, no facility match, a camera in range with a usable frame.

Do not wait when a clean GOES signal is actionable. Five to ten minutes is the difference between a camera catching a fire small and catching it grown.
First scan, strongClosed

The same fresh clean pixel carrying 25 MW or more, even where heat has recurred, as long as this observation does not fit that history's pattern.

Power is evidence about this scan, not about the neighbourhood, so it stands where the history test does not.
Strong thermalClosed

Two or more scans, 90% confidence or better, 25 MW or more radiative power.

Bypasses the score entirely. A signal this strong is worth a third of a cent whatever the arithmetic says.
CorroboratedClosed

Score of 58 or better, plus a repeat scan or an independent provider or platform.

The ordinary path. The threshold was lowered from 65 after a real detection landed exactly on 65 and then aged out of eligibility.

A camera frame is worth buying. Ranking picks which camera, and the signal and bearing checks still decide whether anything publishes.

A newly stored thermal observation wakes the qualifier; there is no statewide camera sweep. Ineligible, stale, pattern-matched, facility-matched and duplicate episodes make no image or vision call at all, and another thermal cycle does not repeatedly score the same camera frames. The queue still lists heat no camera can reach, so an operator can know it exists.

Choosing the camera, then the frame

Rank

Up to eight cameras within 80 km

Scored on terrain visibility along the sightline, distance from an ideal 25 km, mast elevation, frame freshness and aim. Cameras sharing a mast collapse to one; a pair is preferred when the crossing angle reaches 45 degrees.

Probe

Poll poses before buying pixels

Catalog pose is free and frames are not, so poses are watched for up to two minutes waiting for a camera to swing toward the signal before a survey frame is bought.

Spend

At most two frames, day or night

In daylight the model is asked for smoke. After dark a satellite-triggered check still runs, asks for glow, and must clear a stricter gate that rules out the moon and the towns by arithmetic. Assessments are rate-limited per trigger and per day.

Two independent checks before anything publishes

Check 1

The model must claim a signal

A vision call on the retained frame, asked for the signal the sky makes possible: smoke in daylight, glow after dark, both through twilight.

Check 2

The bearing must agree

The bearing implied by the model’s plume-base pixel is compared to the bearing from that camera to the thermal footprint, within the footprint’s own angular width plus the measurement uncertainties.

Then fusion

After the camera solve is frozen

Satellite evidence matched within twelve hours either side of capture can carry the range while the camera carries the bearing. The fused result is labeled, and the frozen camera solve is never rewritten.

The detail page

What the model is handed, the tolerance math, the night gate, and the honest limits of a single vision sample.

What may never enter a solve

Embertrace is a first-detection tool. If it could read where a fire already is, it would stop measuring and start restating, and no result would be evidence of anything. None of this is available to a live solve, at any stage:

  • News coverage and social media
  • Watch Duty, PulsePoint or any incident aggregator
  • CAD and dispatch traffic
  • IRWIN or CAL FIRE incident records
  • A later confirmed coordinate for the same fire

Confirmed coordinates are used in one place only: scoring accuracy after the fact, on a labeled case, with the solve already frozen. The same rule binds our own backtests, in schema and in code.

The stack

Everything Embertrace runs on, and what each piece is for. Every external service degrades rather than fails, and source freshness is shown wherever satellite evidence is.

Application

TypeScript on Next.js 16React 19, App Router, server components by default.
VercelHosting, edge middleware for the access gate, and the serverless routes.
PostgresDetections, revisions, retained evidence and the satellite tables.
Slack and emailA message when a detection publishes. Off unless configured, and the queue says which.

Satellite ingest

Python on AWS LambdaPolls, reprojects and clusters. Runs on a one-minute schedule.
NOAA GOES-18 and GOES-19ABI-L2-FDCC fire mask from the public S3 buckets, every five minutes.
NASA FIRMSVIIRS on SNPP, NOAA-20 and NOAA-21, plus MODIS near real time.
SQSHands a finished ingest to the qualifier so a camera check is never a cron guess.

Cameras and vision

ALERTCaliforniaPublic camera catalog, current pose and latest frames.
CalOES and HPWREN map layersPositions for the cameras the catalog publishes without coordinates.
Anthropic and OpenAI, via the Vercel AI GatewaySmoke and glow detection, plume-base pixel. Optional: the app runs without it and says so.
Tesseract.jsReads the burned-in footer in the browser when metadata is missing.

Terrain, place and facilities

USGS 3DEPFirst choice for point elevation, via the EPQS service.
Open-Meteo, Copernicus GLO-90Batch elevation for the terrain fan, and the first fallback.
Open-ElevationLast fallback. If all three fail, nothing publishes.
OpenStreetMap NominatimReverse geocoding for the coarse area label and the water test.
CEC, CalRecycle, EIA, EPA LMOPHeat-producing facilities: California live, the rest of the coverage area from a checked-in federal snapshot.

Maps

MapLibre GLVector rendering for every map in the app.
Esri World Topo and World ImageryRaster basemaps. Terrain is the default.
OpenFreeMapGlyphs for map labels.

Vision providers are optional and every key stays server-side. If all three elevation providers fail, the land gate cannot clear and nothing publishes.

Data sources

Data provenance

Embertrace uses camera pixels and metadata, the public ALERTCalifornia feed, public camera-position map layers, terrain elevation, public NOAA GOES and NASA FIRMS heat detections, and federal facility datasets. It does not consult news, incident databases, dispatch, crews, media or known-fire reports.