Roadmap

What comes next, release by release. Updated 2026-11-02. 59 items — 12 shipped · 12 in progress · 30 planned · 5 research.

valpha

Alpha — pre-alpha checklist (current)

Make pre-alpha defensible, then move it to alpha: every source working on real passes and in the SITREP, every place in scope, data kept on GitHub, jobs moved off GitHub Actions to a Canadian VPS (docs/ALPHA-ARCHITECTURE.md). Checklist, in order.

ShippedM · 2–4 days

Split the data out of the pipeline repo

The repo was 13 GB of files and 9 GB of history, growing 1.5–2 GB a day; checkouts filled runner disks and pushes timed out.

Plan
Method
De-duplicated raw scenes moved to rwi-imagery-baselines (381 scenes from 1,966 copies), rwi-imagery-s2 (551), rwi-imagery-s1 (235); history and ad-hoc pulls to rwi-archive-adhoc; daily pickup folders to month repos (rwi-sitreps-november-2026 first). Every file hash-checked on GitHub before removal; pointer indexes in main. Main files 13 GB → 3.4 GB. The pickup stores each baseline once.
Done when
Done 1 Nov 2026; site builds green after every step.
ShippedS · ≤1 day

Time standard — UTC is the record, local time beside it

A hand conversion put the 28 Oct Gagetown fire at 12:22 ADT instead of 13:22.

Plan
Method
docs/TIME-STANDARD.md; scripts/rwi_time.py (zone from coordinates); site 0.22.0 shows UTC first and the reader's own time beside it, switchable.
Done when
Done 1 Nov 2026 (SITREP 025 first report under it).
ShippedS · ≤1 day

SITREP 025 — close the gap after SITREP 020

GPT's SITREPs 021–024 were withdrawn (BENCH-010), leaving 30 Oct 18:52 – 1 Nov 18:53 UTC unreported.

Plan
Done when
Issued 2 Nov 2026.
ShippedS · ≤1 day

Wilco Watch archive pushed a merge conflict and broke the site build

Plan
Method
The archive push now restarts from the remote tip, validates index.json and refuses conflict markers.
Done when
Done 1 Nov 2026.
ShippedS · ≤1 day

Track logs overran its limit on every run since 30 Oct

Plan
Method
Sparse checkout and a 40-minute loop. Still ~1,000 Actions minutes a day; first job to move to the VPS.
Done when
A scheduled run completes and commits.
In progressM · 2–4 days

Audit every data source on real passes

Know which sources work before alpha, and which only look like they do.

Plan
Method
Per source — Sentinel-2, Sentinel-1, Landsat, FIRMS (watch + area), night lights, ADS-B (logs, history, Libya landing watch), AIS, ship/aircraft detections, Area Watches, Wilco Watch, baseline backfill, heat sources, provenance — last good run, failure rate, data freshness and one checked real pass. 1 Nov findings: Track logs every run cut off (fixed); Alerts 7 of 29 runs timed out at 10 min; the pickup's own FIRMS step fails when NASA is unreachable (the watch covers it); no Landsat in recent windows.
Done when
A table on this page with every source green or a named fix.
PlannedM · 2–4 days

Every working source in the SITREP

SITREP 025 uses pickups, FIRMS, night lights, the Libya and dark-ship watches and the Watches by hand; ADS-B city MILAIR, ship and aircraft counts and track logs are not in it.

Plan
Method
A standard daily builder that reads each source's summary file, so a source added later is in the next SITREP automatically.
Done when
Two consecutive daily SITREPs built by the standard builder with every green source present.
PlannedM · 2–4 days

Every place in scope gets a Watch

All 218 places are in the daily pickup and the heat watch, but only the 45 in the US West Watches get a daily Watch report with flights and ships. 173 have none, 89 of them in Canada.

Plan
Method
Regional Watches (Canada East, Canada West, Arctic/NWS, Europe, MENA, Indo-Pacific) on the area_watch.py pattern, one archive download for all.
Done when
Every enabled place belongs to a Watch and appears in the daily Watch issues.
In progressS · ≤1 day

Trump Watch

Owner request, 1 Nov 2026 — reported air-defence deployment near Mar-a-Lago; Palm Beach jet crash.

Plan
Method
White House, Mar-a-Lago, Palm Beach Intl, Joint Base Andrews, Camp David, Bedminster, Trump Tower and other presidential sites; Air Force One, C-32, Marine One and N757AF tracked by hex.
Done when
First Watch issue published.
In progressS · ≤1 day

Ottawa Watch — every federal department's main building

Owner request, 1 Nov 2026.

Plan
Method
Main HQ of every federal department, agency and core institution in Ottawa–Gatineau, plus campuses (NDHQ Carling, Tunney's Pasture, Confederation Heights, Place du Portage).
Done when
First Watch issue published.
PlannedS · ≤1 day

Create the next month repos ahead of time

The pickup writes to rwi-sitreps-<month>-<year>; without the repo it falls back to main.

Plan
Method
Owner creates rwi-sitreps-december-2026 and rwi-sitreps-january-2027 (empty, private) and adds them to the bot token.
Done when
Both exist before 1 Dec.
PlannedS · ≤1 day

Move October's pickup folders to rwi-sitreps-october-2026

Takes ~2.3 GB of previews out of main.

Plan
Done when
October in its month repo, verified, site green.
In progressS · ≤1 day

First live pickup through the month repo and raw-imagery repos

Plan
Done when
The 2 Nov 13:07 UTC pickup lands in rwi-sitreps-november-2026 and its raw scenes in rwi-imagery-s1/-s2.
PlannedS · ≤1 day

Decide on the unreviewed SITREP 025 draft branch

fix/sitrep-025-safe-draft-20261101 holds a draft and a workflow from a model run; SITREP 025 was issued from the standard builder instead.

Plan
Done when
Branch archived or deleted by the owner.
In progressS · ≤1 day

Alpha design — GitHub holds the record, a Canadian VPS does the work

Plan
Method
docs/ALPHA-ARCHITECTURE.md.
Done when
Owner signs off.
PlannedM · 2–4 days

Journalist desk on the static site — apply by form, approve or deny from email

The site is static until the VPS, so the PHP accounts and desk cannot run. Journalists still need a way to apply and to read held reports (HC-010 is desk-only).

Plan
Method
Application page on the site posts to Web3Forms, which emails desk@<domain> (forwarded to the owner's Proton). Each email carries Approve / Deny links that open a pre-filled issue in the private pipeline repo; a GitHub Action on the owner's issue generates a password, adds a bcrypt hash to the desk's .htpasswd (never the password), rebuilds the site, and emails the journalist from desk@<domain> via Resend; denials get a short note. The desk is a Basic-auth section of the static site holding the full versions of held reports; the hold-leak test still guards the public pages.
Done when
A test journalist applies, is approved from the email, logs in, and reads HC-010's full version; public pages still pass the leak test.
PlannedL · 1–2 weeks

Move scheduled jobs to the VPS

Plan
Method
Self-hosted runner first (existing workflows unchanged), then systemd timers one job at a time; heaviest first (Track logs, Live follow, Ship watch, ADS-B history, pickup).
Done when
No scheduled workflow left on GitHub.
PlannedM · 2–4 days

Serve the site from the VPS instead of Hostinger

The desk, hold, accounts and tasking are PHP; Hostinger needs a manual Deploy click and gives no control over the server.

Plan
Done when
DNS switched; hold and desk tested; Hostinger retired.
PlannedS · ≤1 day

Journalist accounts and database on the VPS

The PHP desk (accounts, desk notes, lead status, tasking) needs PHP and a database; it moves with the site.

Plan
Method
config.php and the SQLite database outside the web root; import approved journalists from the static desk's register (they do not reapply); keep the form + email approval, now writing to the database.
Done when
Approved journalists log in to the PHP desk; static desk retired.
PlannedS · ≤1 day

GitHub Actions for tests only

Plan
Done when
Actions minutes under 1,000 a month.
v0.7.x

Ships & aircraft

Counts and identities on top of imagery and heat.

In progressM · 2–4 days

Ship & aircraft counts with AIS / ADS-B identities

Turns "activity" into numbers per site and names where transponders allow.

Plan
Sources
Sentinel-1 RTC, Sentinel-2 L2A, JRC Global Surface Water, OpenStreetMap piers/aprons, aisstream.io (AIS), adsb.lol (ADS-B mil)
Method
Radar CFAR ship detection on water; optical ship detection plus berth occupancy along mapped piers for moored warships; aircraft as change vs a multi-scene median on mapped aprons. Match detections to AIS/ADS-B positions within distance/time windows.
Outputs
data/detections/passes.csv, data/detections/objects.csv, annotated plates, data/tracks/*
Done when
Pilot sites (Halifax, Esquimalt, Norfolk, Trenton, Barksdale) give counts that match a manual count within ±20% on 3 clear passes each.
Risks
Moored hulls merge with piers; fighters below resolution; Overpass outages (now cached).
v0.8.0

Night, dark ships, alerts, provenance (current)

Next pre-alpha. One new all-weather signal, one analytic win, and the two things needed before anything goes public.

ShippedM · 2–4 daysneeds: EARTHDATA_TOKEN secret

Night lights (VIIRS Day/Night Band)

Sees blackouts, blacked-out bases, new lit construction and front-line activity every night, at any latitude and through most smoke; would have shown the Crimea blackout directly.

Plan
Sources
NASA Black Marble VNP46A1 daily (LAADS / LANCE NRT), VIIRS DNB
Method
Daily radiance per site (sum and median in the box, cloud- and moon-masked), 30-day rolling baseline, z-score anomaly; flag drops > 50% (blackout) and new persistent lit area. Region-scale boxes for Crimea, Gaza, Lebanon, Sudan, Ukraine front.
Outputs
data/nightlights/<site>.csv, nightly before/after plates, flags into the alert stream
Done when
Reproduces the 23–24 Oct Crimea blackout and the Gaza/Lebanon baselines; runs nightly unattended.
Risks
NASA Earthdata login token needed (free); moonlight and snow-glare corrections; 500 m pixels are coarse for single bases.
In progressS · ≤1 day

Dark-ship flags (radar ship with no AIS)

A ship the radar sees that is not broadcasting is a story in itself — sanctions evasion, warships, smuggling.

Plan
Sources
Sentinel-1 detections, AIS log
Method
For each radar ship detection, search AIS within 500 m and ±30 min of the pass. No match and length > 40 m → dark candidate. Suppress known fixed objects (persistent at the same spot in > 70% of passes).
Outputs
dark flag on objects.csv, per-site dark count, plate colour coding
Done when
AIS logging runs continuously; one week of dark-ship candidates reviewed by hand at Hormuz, Bandar Abbas, Tartus, Hodeidah.
Risks
AIS logging is sampled (~50 min of each hour) — gaps would create false "dark", so detections without AIS heard in the window are marked NO-COVERAGE, not dark.
Depends on
Ship & aircraft counts with AIS / ADS-B identities
ShippedS · ≤1 day

Alerts (push / email)

Stop polling; hear about flags within an hour.

Plan
Sources
FIRMS watch, night lights, detections, dark ships
Method
One alert rule file (site, signal, threshold, quiet hours). A GitHub Action posts new flags to email and a push channel (ntfy.sh topic or Slack/Signal webhook), de-duplicated per site per 6 h.
Outputs
alerts.yaml rules, data/alerts/log.csv, notifications
Done when
A FIRMS flag at any site reaches Kevin's phone within one run of the watch.
Risks
Alert fatigue — start with Flagged-only and per-site mute.
ShippedS · ≤1 day

Provenance — hash and timestamp every drop

Proves what we knew and when — matters if a finding (e.g. the Wainwright timing) is challenged.

Plan
Method
On every commit that adds data or a SITREP, write a manifest of SHA-256 hashes; timestamp it with OpenTimestamps (Bitcoin, free) and optionally anchor the daily root hash on Algorand. Verification script and a public "proofs" page listing each SITREP's hash and anchor.
Outputs
proofs/<date>.json, .ots files, scripts/provenance.py verify, Proofs page
Done when
SITREP 001–004 hashed and timestamped retroactively; new SITREPs stamped automatically.
Risks
Algorand anchoring needs a funded account; OpenTimestamps needs no account.
v0.9.0

Change, baselines, review

See through cloud and polar night; know what normal looks like; put a human decision on every published flag.

ShippedS · ≤1 day

Baseline imagery on every place page

Place pages showed only the passes listed in a pickup manifest, never the clear baseline image each pickup keeps, so a place with no clear pass on record (Meaford, 30–31 Oct; 33 places in all) showed no imagery at all. Six places had no baseline either: their boxes straddle Sentinel-2 tiles or are bigger than one, and the pickup wants one scene to cover 80 % of the box.

Plan
Sources
Sentinel-2 L2A (Element 84 Earth Search)
Method
Frontend 0.21.1 shows each pickup's baseline (and earlier baselines a merged manifest keeps) with the passes, as a 1400 px JPEG. scripts/baseline_backfill.py gives every place with no baseline image up to three clear scenes from the last year, at least 30 days apart, mosaicking an acquisition's tiles, as JPEG quicklooks in data/baseline-imagery/. The Baseline backfill workflow runs it in chunks on merge, weekly for new places, and on demand (min 3 tops every place up to three).
Outputs
data/baseline-imagery/<site>/*.jpg, data/baseline-imagery/index.json, baseline images on place pages
Done when
Every enabled place with a clear Sentinel-2 scene in the last year shows at least one image on its page.
Risks
Repo size (JPEG only, a few hundred kB per image); places cloudy all year stay empty. The pickup's change baseline still needs one scene to cover the box, so those six places get no change score until the pickup mosaics tiles too.
In progressS · ≤1 dayneeds: The condition under which a later pickup may replace a pass already on record (owner decision)

Pickups that leave no gaps and lose nothing

Pickup windows are a fixed 24 h back from whenever the run starts, and runs start late or twice a day. A second run on the same date replaced the earlier run's manifest (six of seven pickup dates, 304 passes), windows left gaps (SITREP 017: no pickup covered 28 Oct 18:49–23:26), and scenes listed late by the archive fall outside the next window. Passes outside every window are never seen.

Plan
Method
Done in 0.8.8: a pickup merges into an existing manifest for its run date instead of replacing it (scripts/manifest_merge.py), and the six overwritten manifests were re-merged from git history. Next: the scheduled run starts its window at the previous run's end minus 12 h of overlap (24–72 h), so consecutive pickups join up and late-listed scenes are still caught; merged manifests drop the duplicates.
Outputs
merged data/<date>/manifest.json with a runs list, gap-free windows
Done when
A week of pickups has no window gaps and no pass that is on disk but missing from its manifest.
Risks
Longer catch-up windows make slower runs; capped at 72 h.
PlannedL · 1–2 weeks

Radar change detection (Sentinel-1)

The only way to watch Arctic/NWS sites until February and cloudy sites year-round.

Plan
Sources
Sentinel-1 RTC (same orbit stacks)
Method
Group passes by relative orbit; log-ratio and multi-temporal coefficient-of-variation per pixel against a 6-pass baseline; flag compact changes (new structures, vehicles parks, vessels, burn/ground scars). Optional: coherence from SLC via ASF HyP3 (free) for construction and earthworks.
Outputs
change maps per site, flagged blobs with area, plates
Done when
Detects known changes (Wainwright burn scar, Hormuz shipping shifts) and stays quiet at static sites for a week.
Risks
Speckle; orbit geometry differences; snow and freeze/thaw signals in the Arctic.
PlannedM · 2–4 days

Analyst review queue

Every published claim traceable to a human call; builds labelled data to cut false positives.

Plan
Method
Private review page lists new flags/detections with plate thumbnails; confirm / dismiss / note. Decisions stored as a CSV committed to the repo (or Artifact database); detectors learn per-site suppressions from dismissals.
Outputs
data/review/decisions.csv, review page, suppression list
Done when
All flags in a week reviewed in < 20 minutes total.
Risks
Static site cannot write — needs a small backend (VPS) or GitHub API form.
Depends on
Alerts (push / email)
In progressM · 2–4 days

Lead → story tracking — close out leads as published, and measure our lead time

Leads are the product. Nothing recorded when a story lands on one of our leads, so "we had it first" was anecdote. Track each open lead until a published story confirms (or kills) it, close it out as published, and record how far ahead RWI was: when the pipeline first flagged the event, when the lead was published, and when the first official statement, the first media report and the story came out. It shows the value of the journalist hold, and it is the basis for a public track record.

Plan
Sources
Web news search for each open lead (place names, aircraft tails, coordinates turned into place names, key terms), GDELT DOC 2.0 API (free) as a first pass, Admins set a lead's status on the site (account/lead-status.php, live); approved journalists report an outcome, which an admin accepts or dismisses, reports/lead-status.yaml (status) and reports/lead-stories.yaml (stories and timings)
Method
A daily agent run takes each open or carried lead and searches news since the lead was published (minus 24 h). It proposes matches with a short reason and a confidence; nothing is marked automatically. An admin confirms a match, or accepts a journalist's report, and the lead closes out as published. The record keeps the story's URL, outlet and time and the deltas: story vs lead publication (and vs desk time, if the lead was held), and RWI's first automated flag vs the first official statement and the first media report. It separates a story that confirms the lead from one that only mentions the place, and an independent outlet from a self-published one (Prime Rogue's own blog). A short daily digest lists new matches and close-outs. Leads go stale after 30 days without a match.
Outputs
reports/lead-stories.yaml: lead, story (URL, outlet, published, independent or not), lead public / desk time, first flag, first official, first media, deltas in hours, confirmed_by, Leads board and report pages: 'Story published: Prime Rogue, 19 h after our lead' and 'flagged 4.5 h before the base said anything', a daily lead digest (matches proposed, leads closed out), a running track record (median lead time, share of leads that became stories)
Done when
The daily run proposes matches for every open lead; confirmed stories show their timings on the site; the digest goes out daily.
Risks
False matches (same place, different event): proposals are never auto-confirmed. Paywalled outlets may need a journalist's confirmation. A self-published story is labelled so and never counted as independent pickup. Search cost: cap queries per run, and drop stale leads.
Depends on
Analyst review queue
ShippedS · ≤1 day

Model output only as graded benchmark entries (interim fix)

The GPT benchmark run (BENCH-010, FAIL) published its own PDFs through a special "model submissions" path: a panel above the canonical reports, alternate-edition boxes on report pages, and a build that stopped every deploy if one of its PDFs went missing.

Plan
Method
Interim (frontend 0.20.1): the special path is gone. A benchmark entry lists the files it evaluates (`attachments:` in its front matter); the site copies them next to the entry and lists them under "Files evaluated"; a missing file is listed as missing and never fails the build. Permanent: model and agent output goes through the review queue (a person accepts it before anything is published), and model benchmarks run on a branch with a pull request, never on main.
Outputs
benchmarks/*.md attachments, benchmarking/<slug>/ files on the site
Done when
Model and agent output can only reach the site through the review queue; the interim path stays for benchmark evidence.
Depends on
Analyst review queue
v0.10.0

Warnings & interference

Signals that tell us where to look before something happens, and first-pass news correlation without manual searching.

ResearchM · 2–4 days

GPS jamming & spoofing map

Strong, under-used indicator around the Baltic, Kaliningrad, Black Sea and Gulf.

Plan
Sources
ADS-B NIC/NACp fields (adsb.lol / ADSB Exchange historical), gpsjam.org methodology
Method
Aggregate share of aircraft with degraded navigation integrity per H3 hex per day; flag hexes above threshold near watchlist sites. Needs all aircraft, not just military → bulk daily ADS-B dumps.
Outputs
data/gnss/<date>.csv, daily map, site flags
Done when
Reproduces known jamming areas (Kaliningrad, eastern Med) for a test week.
Risks
Data volume (daily global dumps are GBs) — likely a VPS job.
PlannedM · 2–4 daysneeds: FAA NOTAM API key (optional)

Navigation warnings & NOTAMs

Live-fire areas, missile tests and closures are announced in advance — they tell us where to look.

Plan
Sources
NGA Maritime Safety Information broadcast warnings (NAVAREA IV/XII, HYDROLANT/HYDROPAC), NAV CANADA / FAA NOTAMs
Method
Pull warnings daily, parse coordinates and dates, intersect with watchlist boxes and zones; show active warnings on site pages and in SITREPs.
Outputs
data/warnings/<date>.json, site-page panel
Done when
Active warnings appear for Black Sea, Baltic and Atlantic exercise areas.
Risks
Free-text coordinate parsing; FAA NOTAM API needs a key.
PlannedM · 2–4 days

Automated first-pass news correlation

Today the CORRELATED / PARTIAL / NOT IN NEWS tags are done by hand.

Plan
Sources
GDELT 2.0 events & GKG (free), optional ACLED (key)
Method
For each flag, query GDELT events within 25 km and ±48 h; rank articles; propose a tag with links. Analyst confirms in the review queue.
Outputs
news candidates per flag, proposed tags in SITREP drafts
Done when
Proposed tags agree with manual tags on SITREPs 001–004 for ≥ 70% of items.
Risks
GDELT geocoding noise; language coverage.
Depends on
Analyst review queue
v0.10.5

Source quality (new free feeds)

Fix the limits capabilities.yaml admits to — cloud-inflated change scores, flares vs fires, gaps between fire passes, unnamed aircraft, partial range picture — with free sources first. Ordered by value per day of work.

ShippedM · 2–4 days

Cloud mask that catches fair-weather cumulus

The SCL-only mask passes small cumulus as clear and inflates change scores (SITREP 015: a 55% "change" at Rzeszów on a pass marked 100% clear was cloud; SITREP 008: CFB Gander 0.32 from broken cumulus and shadow). Every optical change flag depends on this.

Plan
Sources
OmniCloudMask (open-source model; red, green and NIR at 10 m — bands pickup.py already fetches), Sentinel-2 SCL (kept as a first pass)
Method
Run OmniCloudMask on each chip after SCL; mark cloud and cloud shadow, dilate, and recompute site_clear_frac. Add the planned brightness test as a cheap fallback. Re-score the last 30 days and compare flags before/after.
Outputs
cloud probability per chip, corrected site_clear_frac and change_vs_baseline in manifests
Done when
Rzeszów 27 Oct and Gander (SITREP 008) re-score as cloudy / low-confidence; no clear-sky pass in the pilot set loses more than 5% of its clear area.
Risks
Model inference time on Actions runners (CPU) — batch per run or move to the VPS; check the model's licence before shipping.
In progressL · 1–2 weeks

Tasking — custom runs over chosen targets

Ad hoc passes are run by editing trigger files by hand. Analysts (and later paying clients) need to task all sources, or a relevant set, over one or more targets for a window, from the dashboard.

Plan
Sources
sources.yaml (Sentinel-2, Sentinel-1, Landsat, VIIRS, FIRMS, GOES, ADS-B history)
Method
Phase 1 (0.8.2): sources.yaml + scripts/task.py + the Task workflow; the site's Task page (admin only) dispatches it through the GitHub API. Phase 2: accounts request, admin approves. Phase 3: credits per source × target, held on submit, settled on completion.
Outputs
data/tasks/<id>/ (task.json, status.json, outputs per target and source), Task page and per-task results page on the site
Risks
Actions minutes per task; privacy — client targets limited to sites and areas, single-aircraft or single-vessel follows stay admin-only.
In progressS · ≤1 dayneeds: EOG account (free registration)

Tell gas flares from fires (VIIRS Nightfire temperatures)

FIRMS "cannot tell a strike from a brush fire or a flare", so routine heat is a hand-kept list (firms_persistent / known_heat). Nightfire estimates each hot spot's temperature: flares run ~1,600–2,000 K, vegetation fires far cooler.

Plan
Sources
VIIRS Nightfire (VNF) — Earth Observation Group, Colorado School of Mines; free with registration
Method
Pull nightly VNF detections inside watch boxes; join to FIRMS hits within 750 m / same night; label hits flare-like, fire-like or unknown. Build a flare catalogue per site from persistence + temperature and use it in place of the hand list.
Outputs
heat class per FIRMS hit, data/firms-watch/flares.csv, routine-heat logic driven by data
Done when
Ras Laffan, Bandar Abbas, Abqaiq and Kharg classify as flares on ≥90% of matched nights with no hand list.
Risks
No explicit open licence found — use values internally to classify; ask EOG before republishing VNF fields. Night passes only.
PlannedM · 2–4 days

Geostationary fire detections (minutes, not passes)

FIRMS "misses short events between passes". Geostationary satellites look every 5–15 min, so a strike or short fire shows as a time series, and a single FIRMS dot can be confirmed or ruled out.

Plan
Sources
GOES-19 (East) / GOES-18 (West) ABI fire product (ABI-L2-FDC) on NOAA AWS Open Data, Meteosat FRP-PIXEL (EUMETSAT LSA SAF), Himawari wildfire product (JAXA P-Tree; registration) for East Asia
Method
Hourly job pulls fire pixels inside watch boxes for the matching satellite; store first/last seen and peak FRP per event; link to FIRMS hits. Show duration on the Thermal page and in SITREP heat lines.
Outputs
data/geo-fire/events.csv, duration and onset time per heat event
Done when
For the SITREP 014 Arava fire, onset and end times are within 15 min of the three polar passes.
Risks
~2 km pixels (Americas), ~3 km (Meteosat) — confirms, does not locate; NOAA data public domain, LSA SAF and JAXA need registration and attribution.
PlannedS · ≤1 day

Name aircraft beyond the Canadian and US registers

Many MILAIR and Watch rows carry only a hex code or no type (e.g. "ae6875", the old "aa9024 (, other)"). A hex lookup gives type, operator and registration for military and foreign aircraft too.

Plan
Sources
adsbdb.com API (free), hexdb.io (free), existing TC CCAR / FAA registry lookups first
Method
After the registry lookups, query unknown hex codes once, cache results in data/registry/hex.csv with a 30-day TTL, and fill type / operator / country in MILAIR, Watches and tracks.
Outputs
data/registry/hex.csv, fewer unnamed rows
Done when
Unnamed military rows in MILAIR and Area Watches fall by at least half over a week.
Risks
Community data, sometimes wrong — keep the source per field; respect rate limits.
PlannedM · 2–4 days

Range and restricted-airspace activity (US)

Vegas and Mojave Watches see only part of range traffic ("most range traffic does not broadcast ADS-B"). Knowing a range or TFR was active turns "something was here" into "the range was hot".

Plan
Sources
FAA TFR list (tfr.faa.gov), FAA special-use airspace schedules (sua.faa.gov)
Method
Daily pull of TFRs and SUA activation times for airspace overlapping Watch boxes; attach to each Watch day and to low-pass / landing rows near ranges.
Outputs
data/airspace/active.csv, a 'range active' line in Watches
Done when
Nellis / Groom / China Lake Watch days show which ranges were scheduled active.
Risks
No formal public API for SUA schedules — check FAA terms before scraping; US only.
Depends on
Navigation warnings & NOTAMs
PlannedS · ≤1 dayneeds: EARTHDATA_TOKEN secret (already used for night lights)

Plain explanations for flagged change

Many "Undetermined change" and heat flags have an ordinary cause (wildfire, flood, storm). Checking a few free event feeds first saves a manual look and stops false leads.

Plan
Sources
NASA EONET (natural events), Copernicus Emergency Management Service activations, NASA OPERA DIST-ALERT (land disturbance in North America; Earthdata)
Method
For each flagged site, query events within 25 km and ±3 days; add a "possible cause" line to the flag and to the Today feed; never clear a flag automatically.
Outputs
cause notes on flags in manifests and ALERTS
Risks
Coarse event footprints — a cause note is a hint, not an explanation.
ResearchS · ≤1 day

Sub-metre radar where open archives have it

Sentinel resolution (10 m) cannot count aircraft or small vessels; free open SAR archives sometimes cover a watched base.

Plan
Sources
Umbra Open Data (AWS), Capella Open Data (AWS)
Method
Weekly index of both STAC catalogues against watchlist boxes; when a new scene covers a site, make a plate and add it to the place page and Today feed.
Outputs
data/open-sar/index.csv, plates per covered site
Risks
Coverage is wherever the vendors chose to image — opportunistic, not a feed. Check each collection's licence (some CC BY) and credit the vendor.
ResearchM · 2–4 daysneeds: GFW API token (free self-registration); a licence decision

Dark vessels and AIS gaps (Global Fishing Watch)

Our dark-ship check is rare and unconfirmed because AIS coverage ends offshore. GFW already matches Sentinel-1 vessel detections to AIS globally and publishes AIS-disabling events.

Plan
Sources
Global Fishing Watch API v3 (SAR vessel detections; AIS gap events; vessel identity)
Method
Query detections and gap events inside naval and port watch boxes daily; merge with our CFAR detections; mark agreement.
Outputs
data/detections/gfw.csv, confirmed / unconfirmed dark candidates
Risks
CC BY-NC 4.0 — non-commercial only, no public commercial licence. Fine for free public SITREPs and journalist leads; must stay out of corporate deliverables unless GFW grants a custom licence. Fishing-focused, so naval coverage varies.
ResearchM · 2–4 daysneeds: OpenSky research access (application); a licence decision

Deeper flight history (OpenSky Network)

More receivers and a long historical archive would fill gaps in hindcasts and Watches. Does not fix the Arctic (only paid satellite ADS-B — Spire, Aireon — does).

Plan
Sources
OpenSky Network historical database (Trino)
Method
Use for hindcasts only at first; compare coverage against adsb.lol for three past events.
Outputs
hindcast flight pulls with an OpenSky source tag
Risks
Licence is for non-profit research, education or government use — commercial use needs a negotiated agreement.
vside-feeds

Side feeds (ntfy)

Small personal push feeds on the same alert plumbing — quick wins, any order.

PlannedS · ≤1 day

Feed: earthquakes near watch sites

Shallow quakes near watchlist sites as a push; first half of the seismic item.

Plan
Sources
USGS earthquake GeoJSON feeds (free)
Method
Hourly pull of USGS feed; shallow (< 10 km) events within 50 km of a site push to ntfy.
Outputs
ntfy pushes, data/seismic/*.csv
Depends on
Alerts (push / email)
PlannedS · ≤1 day

Feed: military aircraft over Calgary

Fun and useful — a push when a military callsign crosses the Calgary area.

Plan
Sources
adsb.lol /v2/mil (already logged)
Method
Filter the hourly ADS-B log for positions within ~60 km of YYC; push new callsigns (dedupe per aircraft per day).
Outputs
ntfy pushes
Depends on
Alerts (push / email)
PlannedS · ≤1 dayneeds: Gmail connected to the scheduled task

Feed: ATIP / OIC inbox

Know the moment an ATIP release or OIC letter lands.

Plan
Sources
Gmail (connector)
Method
Scheduled check of Gmail for new mail from ATIP offices / OIC; push sender + subject only.
Outputs
ntfy pushes
Risks
Keep message bodies out of pushes (public topic).
Depends on
Alerts (push / email)
PlannedS · ≤1 day

Feed: news spikes at watch sites

Early warning when reporting about a watch site jumps — a preview of auto-news.

Plan
Sources
GDELT DOC 2.0 API (free)
Method
Hourly article counts per site keyword set; push when the count exceeds 3× its 7-day hourly median.
Outputs
ntfy pushes
Depends on
Alerts (push / email)
vterms

Terms & licensing

Take the draft Terms of Use (v0.1, live on the site as a draft) to in-force, and build what they promise.

PlannedS · ≤1 dayneeds: Kevin's calls; legal review

Terms: open decisions

The Terms can't take effect until the open [DECISION]/[TBD] items are settled and a lawyer has read them.

Plan
Method
Set the effective date; add a contact address for licensing, verification and legal notices; confirm aisstream.io redistribution terms before offering AIS-derived feeds; decide on a French version; legal review.
Outputs
docs/TERMS.md v1.0
Done when
No [DECISION] or [TBD] markers remain and the draft banner comes off.
PlannedS · ≤1 day

Terms: public-facing cleanup

The draft on the site shows internal notes ("Items marked [DECISION] need Kevin's call", amber markers).

Plan
Method
Strip internal notes and markers from the rendered page (the repo copy keeps them), or remove them when v1.0 lands.
Outputs
terms.html
Depends on
Terms: open decisions
ShippedS · ≤1 day

Privacy policy

Required by Terms section 16 before any account or verification data is collected. Draft placeholder v0.1 (PIPEDA / Alberta PIPA) is on the site; open decisions and legal review remain.

Plan
Outputs
docs/PRIVACY.md, privacy.html
Done when
Published and linked from the footer and the Terms.
PlannedS · ≤1 day

Attribution on every output

Terms section 9 credit line plus required Copernicus / NASA / OSM credits on every SITREP, chart and imagery export.

Plan
Method
Generate the credit strings in the pipeline and stamp them on plates, PDFs and exports.
Outputs
plates, SITREP PDFs, exports
PlannedS · ≤1 day

ODbL-derived datasets kept separate

Databases derived from OpenStreetMap or adsb.lol must carry ODbL terms, not RWI's non-commercial terms.

Plan
Method
Publish ODbL-derived tables in their own folder with an ODbL notice; keep RWI value-added layers apart.
Outputs
data/odbl/*, licence notices
In progressL · 1–2 weeks

Journalist & student accounts

The free licence (Terms section 5) needs signup, verification and personal API keys.

Plan
Method
Signup with verification evidence (press card, association membership, newsroom email, published work; student email or enrolment), annual re-verification, personal API keys with rate limits, commercial-licence enquiry path.
Outputs
accounts, API keys
Depends on
Privacy policy, Terms: open decisions
v0.11.0

Extra sensors & coverage

Fill remaining sensor gaps and extend the base register beyond Canada.

PlannedS · ≤1 day

Seismic events

Large explosions and nuclear tests (Punggye-ri) show up on seismometers.

Plan
Sources
USGS earthquake API (free), EMSC
Method
Pull events daily; shallow events near watchlist sites flagged; add Punggye-ri as a site.
Outputs
data/seismic/*.csv, flags
Done when
Feed runs daily; historic test (2017) reproduced as a check.
ResearchM · 2–4 days

Industrial activity from air quality (Sentinel-5P)

NO₂/SO₂ over refineries, LNG and smelters shows shutdowns and restarts after strikes.

Plan
Sources
Sentinel-5P TROPOMI NO₂/SO₂ (Copernicus / Planetary Computer)
Method
Weekly mean column over infrastructure sites vs baseline; flag sustained drops.
Outputs
data/s5p/<site>.csv
Risks
~5 km pixels — only big facilities; wind and cloud effects.
PlannedS · ≤1 day

Satellite pass prediction

Board shows when the next usable image of each site is due, so ad hoc requests have an honest ETA.

Plan
Sources
CelesTrak TLEs for Sentinel-1/2, Landsat, NOAA-20/21, Suomi-NPP; Open-Meteo cloud forecast
Method
Propagate orbits (skyfield) for 72 h, intersect with site boxes and swath widths; add cloud forecast.
Outputs
next-pass table per site
PlannedL · 1–2 weeks

Coverage beyond Canada

Full registers for the US, NATO allies, Russia and China, built and verified the same way as Canada.

Plan
Method
Source lists (government, OSM military=*, Wikidata), place boxes, verify every box against first imagery, tag region/CCMD/country/program; roll out in batches of ~50.
Outputs
watchlist additions with verified flags
Risks
Watchlist size vs Actions run time — move heavy jobs to the VPS.