Fuego.Earth

2026

Abstract wildfire perimeters branching across an ivory and ember-red field.

A fire-spread model is not useful just because it runs. Someone has to choose a place, supply the right terrain, fuels, and weather, wait for the computation, and understand what the result does and does not say.

Fuego.Earth is an attempt to make that whole chain usable from a browser. I built it with My Tran, Álvaro Galván, and Sofiia Bilyk at Minerva University. A user can place an ignition point on a map, choose a date and duration, run Cell2Fire or FARSITE, and replay the estimated spread hour by hour. The platform also produces ensemble and relative-risk maps for questions that a single perimeter cannot answer.

I worked mostly where the scientific code became a dependable product: simulator inputs, spatial and temporal correctness, probability runs, API behavior, caching, deployment, and the contracts that connect those pieces.

The same ignition, two fire enginesFire 5501 benchmark · stored model output
Hour 0
These are native SVGs drawn from the saved model geometries, not a video or an illustration. Both panels use the same geographic extent, so differences in shape and area are directly comparable.

From one click to a perimeter

The visible interaction is simple. Pick an ignition point, choose the simulation window, and press run. Behind that click, Fuego.Earth has to collect and reconcile several kinds of evidence.

LANDFIRE provides fuel models and terrain for the selected area. Weather comes from sources such as HRRR and Open-Meteo. Other products add satellite observations, land cover, land-surface temperature, and roads. These sources were not designed to fit together. They arrive in different coordinate systems, resolutions, time zones, file formats, and definitions of missing data.

The first version let too much of that complexity leak into the fire engines. A fix for one data source could quietly change another path. A layer could look plausible on the map while being shifted by a few cells. Weather labels could be one interval away from the values actually used.

We eventually gave the system one internal contract. Extraction modules download raw data. Processing aligns every layer to a common grid with the same extent, resolution, coordinate system, and missing-data rules. The result is a Landscape. Products consume that object instead of knowing where each file came from.

That boundary mattered more than any one model. It made spatial alignment testable, let multiple products reuse the same prepared landscape, and kept the API thin. It also made provenance possible: an output can say which source, time window, and transformation produced it.

Two engines, one interface

Cell2Fire and FARSITE do not accept the same inputs or return the same outputs. One expects a particular set of ASCII grids, fuel tables, ignition cells, and weather rows. The other has its own landscape and weather formats. Their time steps and geometries differ too.

Fuego.Earth treats each engine as an adapter behind one fire-spread interface. The pipeline prepares model-specific files, runs the selected engine, and converts the result into a common GeoJSON time series. The web application only has to know that each step has a timestamp, a burned perimeter, area, weather, and a few summary statistics.

This sounds like ordinary software plumbing, but it is where many scientific applications become fragile. Early bugs included fuel classes missing from a lookup table, a drifting ignition marker, weather rows that overflowed long simulations, and timestamps that described the wrong interval. None of them made the interface crash in an obvious way. They produced believable, wrong results.

The lesson was that correctness has to include the glue around the model. A physically sophisticated engine cannot repair a raster shifted east or a weather series shifted in time.

One run is not a probability

A single simulation answers a conditional question: given this ignition, this weather, this landscape, and this model, where might the fire travel? It does not tell you how likely each place is to burn.

For the ensemble view, Fuego.Earth varies the uncertain conditions across many Cell2Fire runs. Each grid cell records the share of scenarios in which it burns. The interface calls that quantity chance of burning, which keeps it distinct from the separate Burn Probability Map. The latter is a relative-risk product that combines ranked drivers such as vegetation, slope, aspect, temperature, wind, humidity, and proximity to roads or settlements.

The ensemble feature forced a change in the product architecture. A request that starts one hundred fire simulations cannot safely sit inside one browser connection. It became an asynchronous job with progress, durable state, limits, and cached landscape data. The cache was not just a speed optimization. It had to be crash-safe, reject truncated terrain files, and keep results from one run from appearing in another.

Comparing the models with a real fire

We used historical fire perimeters as a check against the simulators. One stored benchmark follows Fire 5501 for 36 hours and compares each model with VEDA observations at 12, 24, and 36 hours.

At 36 hours, the observed perimeter covered 16.17 km². FARSITE produced 17.92 km², with an F1 score of 0.656 and an intersection-over-union score of 0.488. Cell2Fire produced 23.86 km², with an F1 score of 0.610 and an intersection-over-union score of 0.439.

That does not mean FARSITE is simply the better model. Cell2Fire had the stronger F1 score at 24 hours, and this is one fire under one set of inputs. The comparison was useful because it exposed where the models diverged over time. It also kept the product honest: a smooth animation is evidence that rendering works, not evidence that the fire forecast is right.

In the saved benchmark, the simulator stages completed in about 8.2 seconds for Cell2Fire and 2.1 seconds for FARSITE. Those numbers describe that run, not total time from a cold browser request. Downloading and preparing terrain can dominate the first request; a valid cache makes the next one much faster.

Turning research code into a public service

The production system is deliberately plain. A FastAPI service and a React/Mapbox application run on one virtual machine behind Caddy. Docker builds both fire engines at pinned revisions. GitHub Actions deploys from the main branch. SQLite stores jobs and usage counts so a restart does not erase work in progress.

The less visible work mattered most near launch: request timeouts, concurrency limits, stable error messages, path-traversal protection, strict CORS settings, and privacy rules for coordinates. Public analytics round locations to roughly one kilometre and avoid session recording. Exact ignition coordinates stay out of run logs.

This project changed how I think about applied modelling. The model is only one component of the claim a product makes. The claim also depends on where the inputs came from, how they were aligned, which version of the engine ran, what failed, and how uncertainty is shown to the person looking at the map.

If I continued the study, I would validate on many more fires and terrain types, publish calibration curves for the ensemble map, and make model disagreement a first-class part of the interface. The most trustworthy result may not be one crisp perimeter. It may be a map that shows where two reasonable models stop agreeing.

Fuego.Earth

2026

Апстрактни обриси пожара који се гранају преко поља боје слоноваче и жара.

Модел ширења пожара није користан само зато што може да се покрене. Неко мора да изабере место, припреми исправне податке о терену, гориву и времену, сачека прорачун и разуме шта резултат показује, а шта не.

Fuego.Earth је покушај да се цео тај поступак учини доступним у прегледачу. На Универзитету Минерва направио сам га са тимом који су чинили My Tran, Álvaro Galván и Sofiia Bilyk. Корисник може да означи место настанка пожара, изабере датум и трајање, покрене Cell2Fire или FARSITE и погледа процењено ширење ватре из сата у сат. Платформа прави и скупове симулација и карте релативног ризика за питања на која један сценарио ширења не може да одговори.

Мој рад је углавном био на споју научног кода и поузданог производа: улазима за симулаторе, исправном просторном и временском усклађивању, скуповима симулација, понашању API-ја, кеширању, постављању система у рад и правилима која повезују све те делове.

Исто место паљења, два модела пожараПример пожара 5501 · сачувани резултати модела
Сат 0
Ово су изворни SVG прикази направљени из сачуване геометрије модела, а не видео или илустрација. Оба приказа користе исти географски обухват, па се облик и површина могу непосредно поредити.

Од једног клика до мапе ширења

Оно што корисник види делује једноставно. Означи место настанка пожара, изабере временски оквир и покрене симулацију. Иза тог клика Fuego.Earth мора да прикупи и усклади више врста података.

LANDFIRE даје моделе горива и терен за изабрану област. Временски подаци стижу из извора као што су HRRR и Open-Meteo. Други делови платформе користе сателитска осматрања, покривач тла, температуру површине и путеве. Ти извори нису направљени да се непосредно уклопе. Имају различите координатне системе, резолуције, временске зоне, формате датотека и начине означавања недостајућих вредности.

Прва верзија је превише те сложености препуштала самим моделима. Исправка за један извор могла је неприметно да промени други поступак. Слој је на карти могао да изгледа уверљиво иако је био померен за неколико поља. Ознака времена могла је да се односи на један интервал, а вредности на суседни.

Систем смо зато свели на једно унутрашње правило. Модули за преузимање доносе сирове податке. Обрада усклађује сваки слој на исту мрежу, са заједничким обухватом, резолуцијом, координатним системом и правилима за недостајуће вредности. Резултат је објекат Landscape. Сваки производ користи њега, уместо да мора да зна одакле је стигла свака датотека.

Та граница је била важнија од било ког појединачног модела. Просторно усклађивање је постало проверљиво, више производа могло је да користи исти припремљени терен, а API је остао једноставан. Постало је могуће и да се уз резултат сачува порекло података: који извор, временски оквир и поступак обраде су га произвели.

Два модела, један начин употребе

Cell2Fire и FARSITE не примају исте улазе и не враћају исте резултате. Један очекује одређени скуп ASCII мрежа, табела горива, поља са местом паљења и редова са временским подацима. Други има сопствене формате за терен и време. Разликују се и временски кораци и геометрија резултата.

Fuego.Earth поставља сваки модел иза истог интерфејса за ширење пожара. Систем припрема датотеке које тражи изабрани модел, покреће га и претвара резултат у заједнички GeoJSON временски низ. Веб-апликација треба да зна само да сваки корак има време, границу изгореле површине, временске услове и неколико сажетих показатеља.

То звучи као обично повезивање софтвера, али управо ту научне апликације често постају непоуздане. Међу раним грешкама били су типови горива који су недостајали у табели, ознака пожара која се померала при удаљавању карте, превише редова временских података за дуге симулације и временске ознаке које су описивале погрешан интервал. Ниједна од тих грешака није морала очигледно да обори систем. Могле су да произведу уверљив, али погрешан резултат.

Из тога сам научио да исправност обухвата и све што окружује модел. Ни најнапреднији физички модел не може да исправи растер померен ка истоку или временски низ померен за један сат.

Једна симулација није вероватноћа

Једна симулација одговара на условно питање: ако претпоставимо ово место настанка пожара, ове временске услове, овај терен и овај модел, куда би ватра могла да се прошири? Она не говори колика је вероватноћа да ће свако место бити захваћено.

За приказ скупа могућих исхода, Fuego.Earth мења неизвесне услове кроз више покретања модела Cell2Fire. Свако поље мреже бележи у ком уделу сценарија је било захваћено ватром. У интерфејсу се та величина зове вероватноћа захватања ватром, како би се разликовала од засебне карте вероватноће настанка пожара. Та друга карта приказује релативни ризик спајањем чинилаца као што су вегетација, нагиб, експозиција падине, температура, ветар, влажност и близина путева или насеља.

Ова могућност је захтевала промену у архитектури производа. Захтев који покреће сто симулација не сме да зависи од једне везе са прегледачем. Претворен је у посао који се извршава у позадини, са приказом напретка, трајним стањем, ограничењима и поновном употребом већ припремљених података. Кеш није био само убрзање. Морао је да остане исправан после пада система, да одбаци непотпуне датотеке терена и да спречи да се резултат једног покретања појави у другом.

Поређење модела са стварним пожаром

Историјске границе изгорелих површина користили смо као проверу симулатора. Један сачуван пример прати пожар 5501 током 36 сати и пореди оба модела са VEDA осматрањима после 12, 24 и 36 сати.

После 36 сати, осмотрена изгорела површина износила је 16,17 km². FARSITE је дао 17,92 km², уз F1 меру од 0,656 и однос пресека и уније (IoU) од 0,488. Cell2Fire је дао 23,86 km², уз F1 меру од 0,610 и IoU од 0,439.

То не значи да је FARSITE једноставно бољи модел. Cell2Fire је после 24 сата имао бољу F1 меру, а ово је један пожар под једним скупом улаза. Поређење је било корисно зато што је показало где се модели временом разилазе. Такође је поставило важну границу за производ: глатка анимација доказује да приказ ради, али не и да је процена ширења пожара тачна.

У сачуваном примеру, сам рад симулатора трајао је око 8,2 секунде за Cell2Fire и 2,1 секунду за FARSITE. Ти бројеви описују то покретање, не укупно време првог захтева из прегледача. Преузимање и припрема терена могу да одузму највише времена при првом захтеву; исправан кеш знатно убрзава следећи.

Од истраживачког кода до јавне услуге

Јавна верзија система је намерно једноставна. FastAPI сервис и React/Mapbox апликација раде на једном виртуелном серверу иза Caddy сервера. Docker гради оба модела на тачно одређеним верзијама кода. GitHub Actions поставља ново издање са главне гране. SQLite чува послове и број покретања, тако да поновно покретање не брише рад који је у току.

Пред објављивање су најважнији постали мање видљиви делови: временска ограничења захтева, ограничење броја истовремених симулација, стабилне поруке о грешкама, заштита путања до датотека, строга CORS правила и приватност координата. Јавна аналитика заокружује локације на приближно један километар и не снима корисничку сесију. Тачне координате места паљења не улазе у дневник покретања.

Овај пројекат је променио начин на који размишљам о примењеном моделирању. Модел је само један део тврдње коју производ износи. Та тврдња зависи и од порекла улаза, начина усклађивања, верзије модела, забележених грешака и начина на који се неизвесност показује особи која гледа карту.

Када бих наставио истраживање, проверио бих систем на много већем броју пожара и врста терена, објавио калибрационе криве за скуп симулација и неслагање модела учинио видљивим делом интерфејса. Најпоузданији резултат можда није једна оштра линија. Можда је то карта која показује где два разумна модела престају да се слажу.