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
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.
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.
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.
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
+18
The pixel passed the strict ingestion filter.
Two independent providers
+24
GOES and FIRMS both saw it.
Two satellite platforms
+15
Independent support, even in the same minute.
Persistent heat
+12
Three scan times spanning ten minutes or more.
Second scan
+8
Same location, a distinct scan time.
Repeat scans
up to +14
Three points per extra scan.
Sensor confidence
up to +12
Scaled from 68% to 100%.
Radiative power
+1 to +10
Logarithmic in megawatts.
Recency
+10 / +7 / +4 / +1
Under 30 min, 3 h, 12 h, 24 h.
Subtracts
Single observation only
-12
No repeat scan and no independent sensor.
Stale
-18
Nothing seen for more than 24 hours.
Recurring background, pattern matches
-18 to -28
Heat here on 3 or more days, and this observation fits its time-of-day and platform pattern.
Recurring background, pattern differs
-6
Heat here before, but at another hour or on another satellite. History alone no longer vetoes.
Plausible sun glint
-6 or -12
One 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 -16
The durable per-cell memory, beyond the retained fortnight.
Nearby heat history
-7
Another episode close by in the retained window.
Known facility
down to -42
Geothermal, biomass, landfill, fossil or solar within range.
Outside the United States
-12 or -40
No 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.
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 16
React 19, App Router, server components by default.
Vercel
Hosting, edge middleware for the access gate, and the serverless routes.
Postgres
Detections, revisions, retained evidence and the satellite tables.
Slack and email
A message when a detection publishes. Off unless configured, and the queue says which.
Satellite ingest
Python on AWS Lambda
Polls, reprojects and clusters. Runs on a one-minute schedule.
NOAA GOES-18 and GOES-19
ABI-L2-FDCC fire mask from the public S3 buckets, every five minutes.
NASA FIRMS
VIIRS on SNPP, NOAA-20 and NOAA-21, plus MODIS near real time.
SQS
Hands a finished ingest to the qualifier so a camera check is never a cron guess.
Cameras and vision
ALERTCalifornia
Public camera catalog, current pose and latest frames.
CalOES and HPWREN map layers
Positions for the cameras the catalog publishes without coordinates.
Anthropic and OpenAI, via the Vercel AI Gateway
Smoke and glow detection, plume-base pixel. Optional: the app runs without it and says so.
Tesseract.js
Reads the burned-in footer in the browser when metadata is missing.
Terrain, place and facilities
USGS 3DEP
First choice for point elevation, via the EPQS service.
Open-Meteo, Copernicus GLO-90
Batch elevation for the terrain fan, and the first fallback.
Open-Elevation
Last fallback. If all three fail, nothing publishes.
OpenStreetMap Nominatim
Reverse geocoding for the coarse area label and the water test.
CEC, CalRecycle, EIA, EPA LMOP
Heat-producing facilities: California live, the rest of the coverage area from a checked-in federal snapshot.
Maps
MapLibre GL
Vector rendering for every map in the app.
Esri World Topo and World Imagery
Raster basemaps. Terrain is the default.
OpenFreeMap
Glyphs 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.