Click an incident. The nearest available units of the NIMS kind and type you need rank by straight-line distance, and every distance carries the age of its fix as a ticking clock. Two of twenty products we read colour a stale unit. None of them prints the age.
Asked by the person beside dispatch who answers "what have we got, and what is closest?": the operations chief or duty officer of a fire or EMS agency, the EOC resource desk, and in a private fleet the security-operations supervisor.
The output is one sentence and a ranked list, each line carrying its distance, its type and the age of its fix. It is never a dispatch, an assignment or a status change. Those belong to CAD and to the radio. The app has no status control on purpose.
E1-6 sits 46.2 km away by its last fix. That fix is over half an hour old, so the unit may have moved. The nearest Type 1 with a fresh fix is E1-309, at 63.0 km.
A dot on a map shows a unit where it was. The recommendation should say when that was.
Of 20 products read across CAD, overlays, Esri, telematics and private security, 2 mark a stale unit. One goes yellow then red after an admin-set interval; one shows "yellow for Stale, red for Inactive" with no threshold stated. No page shows the age as a clock, and none puts it next to the distance it qualifies.
"Most appropriate", "vehicle specs" and "run cards" are the nearest phrases. No vendor page read filters "nearest" by NIMS kind and type — the very thing NIMS says a typed resource is for: to be "identified, inventoried, and tracked to determine availability".
Spillman Flex, Samsara, Geotab, TrackTik and Esri closest-facility all rank by drive time or ETA. That is CAD's job, and CAD does it well. So this app never competes on the ranking. Its straight-line rank is a labelled screen beside the decision.
One telematics product updates every 1–2 seconds. Another's feed is recommended at 30 seconds or more. A third logs adaptively, on curves. A radio drops out under a ridge. The age of a position differs unit by unit, and a single "last refreshed" stamp hides all of it.
The data to compute it is already in the schema. Esri location sharing's last-known-locations layer carries location_timestamp (when the device recorded the fix) and created_date (when the server received it). No page read says either is displayed.
And no standard sets a fix-age threshold. NIMS, the Cal OES closest-resources bulletin and the state mutual-aid plan are all silent. So the app prints the cadence and threshold it is using, and never calls either a standard.
The poll time is not the fix time. A feed light that is green says the last request succeeded. It says nothing about whether the unit reported in the last half hour.
So the app computes age only from the mapped fix-time field. The received time is shown, never used. A unit with no fix time is stale, never fresh.
For the clicked incident and the stated kind and type: the nearest available unit, its straight-line distance, and its fix age — then how many of the ranked five are fresh, late or stale. A stale unit is ranked in place, never hidden, and wears its age.
Colour is never the only channel. Every band is also a word on the line, so the list reads correctly in print, in grayscale and to a colourblind operator.
Change the type to Engine Type 1 on the same fire. The nearest available unit by last fix has not reported for over half an hour. Hiding it would lie about the fleet. Recommending it would lie about its position. So the sentence says both.
The operator sees the trade-off in one line: 16.8 km closer, or half an hour more certain. That is a judgement for a person with a radio, and the screen hands it to them with the evidence attached.
The app never invents a lifecycle. Your CAD's statuses — en route, on scene, at hospital — map onto the three NIMS resource states through your own codebook. A code it does not name is Unmapped, never treated as Available. The type filter reads a dated extract of NIMS RTLT and NWCG names, because FEMA's RTLT API is available only on request; your own type codebook replaces it.
Reading the figures: computed over the generated demo fleet at reference time 2026-10-21 16:31Z. They become measurements only on your own AVL.
So the headline lane is, and can only be, your own AVL. In the demo it stays empty, with its citation, and a generated fleet stands in: one unit at each of the 931 active CAL FIRE fire stations, typed to a published Cal OES roster mix (117 / 117 / 24), seeded, never moving.
| Lane | What the wire said |
|---|---|
| CAL FIRE aircraft tracking | Now token-gated — HTTP 200 with an error 499 in the body, and gone from the anonymous directory. A status-code check calls it healthy. |
| Cal OES fleet layers | One is an August 2024 vendor dump. The one titled "Fire Resource AVL" is a 2022 roster with no time field. A title proves nothing. |
| Keyless ADS-B | No CORS for a browser, one API self-declared deprecated, one 403 — and transponder aircraft are not a fleet. |
| WFIGS incidents | Live, every 5 min — the targets. "Current" is not "burning": filtered to wildfires, default to the largest not fully contained. |
| CAL FIRE water drops | Live, written ~64 s after each drop. Events, not positions — an aircraft between drops is invisible. Never a target, never in a figure. |
The bound layers arrive in three different native spatial references and three spellings of the object id. Each is read from the layer's own metadata at boot, never assumed.
The connector reads one FeatureServer point layer you name, at the cadence you state: a Velocity or GeoEvent output, Esri location sharing's last-known-locations layer, or your telematics vendor's layer.
Stored in this browser only, LOCAL — NOT SHARED. Never in a link, never in an export. A secured layer takes a short-lived, referer-bound token minted outside the app. No password is ever entered.
The map controls' Legend button emptied the map: the app's click handler read it as a legend row with no value and filtered every unit out. Two suites reported green. The browser suite failed it, and the guard is now negative-tested.
Re-rendering the cards every second swapped the button under the pointer between press and release, and dropped focus from a picker in use. The tick now patches in place. A ticking clock that breaks the controls beside it is worse than no clock.
A 304 with an empty body, or a gated 200, is a failed read. The app keeps the last good units and degrades only that feed's line: refresh failed … fix ages keep counting. The suite forces it in a real browser.
Reading the figures: every service, count and vintage above was probed live on 2026-10-21 and is reproduced in the recipe with its terminal output. The 931 units are a GENERATED demo fleet at real CAL FIRE station points, labelled on every row, popup and export. The incidents and water drops are live.
Every one of these is written into the delivered application's own README. A tool that hides its edges costs you the call it gets wrong.
The AVL layer you already publish, your CAD's status codes, your unit roster and the stale line your duty officers already use by instinct. Then every recommendation beside your dispatch carries the age of the position it rests on.
Coexists with what you run: your CAD keeps the decision, your telematics keeps the positions, and your Esri stack keeps the data. This app adds the clock.