- Lead differentiation test (journalist hold). SITREPs 014 and 015 were built as a test of differentiated leads: the full report (with
- Lead status register (
reports/lead-status.yaml). - NASA FIRMS map key:
scripts/firms_area.pyand the *FIRMS area pull* workflow (any box, any dates, every satellite). Two keys as named - Tracks end as closed or aborted and stay in the Track archive; TRK-001–007 ended.
- ADS-B archive scanner:
--hex(whole-day traces) and abasesprofile (aircraft using each detect site); commit step keeps any scripts/identify_counts.py: names for ship and aircraft counts from transponders (roadmap item ship-air-counts; first run pending).- Reports: SITREP 014 (Israel election day), SITREP 015 (four zones, 21–27 Oct); Wainwright airlift whole-route plate.
Version history
Every change to the Roger Wilco Imagery pipeline and this site, numbered and dated. Versions follow semantic versioning while the project is pre-alpha (0.x).
Pipeline
v0.8.0
commit
6799f2eFrontend
v0.17.0
built 29 Oct 2026 00:26 MDT (06:26 UTC)
Pipeline
Data collection, analysis and reporting.
- Ship counts from Sentinel-1 radar (CFAR detector on a JRC surface-water mask) and transient-aircraft counts from Sentinel-2 (change vs a multi-scene median on OpenStreetMap aprons), with size classes and annotated plates (
scripts/detect.py). - ADS-B logging of military-flagged aircraft near watchlist sites every 20 minutes (adsb.lol, no key) and optional AIS logging (aisstream.io, needs
AISSTREAM_API_KEY), stored on thetracksbranch; detections are matched to these for identities. - Pilot sites flagged
detect: true: Halifax, Esquimalt, Norfolk, Trenton, Winnipeg, Barksdale.
- Added 65 radar sites: the full North Warning System (45 in Canada, 6 on Alaska's North Slope) and 14 Alaska Radar System (NORAD) long-range radars. New
programfield. - Added 12 Canadian installations and detachments abroad: operational support hubs (Kuwait, Germany, Senegal, Jamaica), Formation Europe/SHAPE, NATO Geilenkirchen, Stavanger, Lille, Izmir, and NORAD sites in Colorado Springs and Alaska.
- Watchlist now 164 sites (160 active).
- Added 38 Canadian military installations (all CAF bases, wings, support bases and stations on DND's footprint list, plus major training areas, Ottawa HQ sites, and northern forward operating locations). Canada now has 43 sites; watchlist 87.
- Added Taman Peninsula (Crimean energy-bridge substation area) and a coarse peninsula-wide Crimea box after the 23–24 Oct blackout strike. Watchlist now 49 sites.
- Every site tagged with a geographic region, US combatant command (area of responsibility) and a list of countries, for filtering.
- Every watchlist site now carries an
addedtimestamp (backfilled from git history). - SITREP register (
reports/index.yaml) for numbered reports; frontend builds from it. - SITREP 002 issued; shared report styles.
- Southern Lebanon box extended north to cover the Nabatieh area.
- Gaza box flagged: rectangle includes Israeli territory; polygon support pending.
- Quicklook-only mode with georeference sidecars for long look-back windows.
- 7-day pull; weekly SITREP 001 (7 d / 72 h / 24 h) with annotated plates and news correlation.
- Watchlist expanded to 47 sites: +10 bases, +3 conflict zones, +10 infrastructure sites.
- 3-hourly FIRMS thermal watch with persistent-site baselines, seeded with 7 days.
- First watchlist (18 bases, 6 zones), daily pickup of Sentinel-2, Sentinel-1, Landsat 8/9 and FIRMS.
- First 48-hour run and analyst SITREP.
Frontend
This website.
- The home page is now the v2 analyst interface. The classic Overview moved to overview.html; "Classic site" in v2 and "New interface" on the classic site switch between them, and the home page remembers the choice. No other URL changed.
- Watches in v2: a Watches page (latest day of each Area Watch, with plates, plus Wilco Watch) and a page per Watch with every day and the full report. Today links there.
- Signed-in accounts keep their starred places and last visit on the account (account/prefs.php), so they follow you between devices; stars made before signing in are kept.
- Lead status from the site (account/lead-status.php): admins (config.php
admin_emails) set a lead's status on the Leads board or a report page; approved journalists report an outcome (confirmed, story published…) with a link and note, which an admin accepts or dismisses on the Leads page. Status shows live on v2 and in leads.php.php accounts.php lead-status-yamlprints the site's statuses for the pipeline's reports/lead-status.yaml;php accounts.php outcomeslists reports waiting for review.
- v2 respects the journalist hold: held leads never appear on Today, Leads, report pages or in search. Report pages show "N new leads held for journalists until …" and fill in from leads.php for approved journalists, or once the hold ends.
- The build now refuses to publish if any held lead's text is in a public file (anything outside desk/ and account/), and the deploy runs a simulated-hold leak test first.
- Today: routine heat (flares, refineries, known sources) is folded into one line per day; Watches with nothing notable are folded into one "Nothing out of pattern on N Watches" line, so every Watch is counted.
- Plain satellite names (VIIRS (NOAA-21), MODIS) instead of feed codes; times just ahead of the clock read "just now".
- Maps render again: CARTO now answers keyless requests with an "API KEY REQUIRED" image, so v2 uses keyless Esri grey basemaps (light or dark with the theme) with a Map / Satellite switch, falls back to OpenStreetMap, and says so if no tiles load. Leaflet 1.9.4 is bundled in assets/vendor instead of loaded from unpkg.
- Phone filter rows fade at the edge to show they scroll.
- Preview of the new analyst interface at /v2/, built alongside the classic site (nothing in it changes).
- Leads page and journalist desk say when the 24-hour journalist hold is paused (read from the pipeline's HOLD_PAUSED_UNTIL), instead of promising an exclusive that is not running. The usual wording returns on its own when the pause ends.
- New Watches page (Reports → Watches): the latest day of every Area Watch (Vegas, Mojave, San Diego, Central Coast, LA, NorCal) with its notable items, flight and heat counts and new satellite plates, plus Wilco Watch. Each Watch has its own page (watch/<area>.html) with every day on record and the full report.
- New MILAIR page (Monitor → MILAIR): military, state, contractor and police aircraft over 18 Canadian cities, with the daily CSVs.
- Menu: the "Watch" group is now "Monitor", so it no longer clashes with the Watch reports; Wilco Watch moved under Reports.
- Capabilities: each card links to where you can see it, and shows one filled status badge (Live / Testing / Paused) with a separate New badge.
- Header: one row on every device. The 15 links are grouped into Overview · Reports (SITREPs, Hindcasts, Briefs) · Leads · Watch (Sites, Tracks, Thermal watch, Signals, Wilco Watch) · About (Method, Capabilities, Proofs, Benchmarking, Versions, Roadmap); every page keeps its URL. Phones and tablets get a Menu button that lists every page under its group.
- Header stays pinned while scrolling again (the 0.12 account widget had turned that off); links to a SITREP or lead ID land below it.
- The two sign-in buttons are now one Sign in menu; once signed in it shows your name, with the desk and account links.
- Overview banner is shorter, from the brand pack's website header, so the latest report shows on the first screen.
- Journalist hold: a report's new leads are exclusive to approved journalists for 24 hours. Public pages and PDFs show a "held" notice; leads.php, report.php and plate.php release them on the minute, without a rebuild. Full PDFs, lead data and held plates sit in desk/_data and desk/_files, which the web server refuses.
- New public Leads tab: every lead after its hold, with status and links back to its report.
- Journalist desk is now a lead dashboard: permanent lead IDs (<report>-L<n>), desk exclusives with countdowns, status (open / confirmed / killed / stale / story published), lineage (carried from / carried into), filters.
- Accounts: separate journalist and corporate sign-in (PHP; own tables, cookies and approval queues). Sign-in buttons top right on every page.
- Journalist desk (/desk/), gated to approved journalist accounts: every reporter lead from SITREPs, hindcasts and briefs in one searchable list, newest reports, live tracks, and how to credit RWI. Press styling (Sky / Mountain Blue accent).
- SITREPs: reporter leads (things in our data that no reporting explains yet) shown first on each report, with a lead count tag, a revision tag, and a "Leads only" filter (?leads=1). Leads are searchable.
- New SITREP type: Intra-day.
- Privacy page (draft placeholder, PIPEDA / Alberta PIPA) rendered from docs/PRIVACY.md and linked in the footer.
- Terms of Use page, rendered from the pipeline's docs/TERMS.md, with a draft banner while it is not in force; linked from the footer of every page (private and public sites).
- SITREPs page: strictly newest first (by issue time), with search and filters for type (daily, weekly, special…), place and month, plus an oldest-first toggle. Filters are kept in the URL so a filtered view can be shared. Each SITREP shows its type and the places it covers.
- Overview "Latest report" now picks the most recently issued SITREP.
- Wilco Watch: each day now carries an automated daily read (optical and radar change with labelled patches, snow, weather, night lights, thermal) and a change plate.
- Wilco Watch is now filed under DOGINT (type label "DOGINT · neighbourhood watch", page kicker). Small DOGGOINT easter egg in the page footer.
- Wilco Watch page now reads from the wilco-watch archive repo when it is available (falls back to the pipeline's copy). Only the marked images are published; the unmarked chips stay in the archive.
- SITREP imagery is now collapsed behind an expandable "Imagery — N plates" toggle.
- Deploy fix: the staging branch now keeps a normal history so Hostinger's Git redeploy can pull it; HTML/JSON are served no-cache so a redeploy shows at once.
- New Wilco Watch page: daily Killarney-to-Beltline look (newest and latest clear Sentinel-2 pass, newest Sentinel-1 radar, 24 h thermal count), house marked as Wilco HQ. No address is published.
- SITREPs page shows each report's plates as thumbnails that open the full image.
- New Benchmarking section: graded evaluations of RWI output against Prime Rogue's published analysis and other coverage (BENCH-001 self-evaluation #1, BENCH-002 Global News coverage benchmark), bylined Roger Wilco Imagery.
- Place names and site IDs anywhere on the site (thermal watch, signals, SITREP list, roadmap, site pages) now link to that place's page.
- Sites: new Visual change column and filter — latest clear Sentinel-2 pass vs baseline, graded No change / Minor / Undetermined change / Change + heat / Scene-wide (season, snow).
- Method page corrected: SITREPs are LLM-generated and automated (not analyst-written); Analyses are human and signed.
- Disclosure on the SITREPs and Method pages and in every footer: SITREPs are LLM-generated and automated; Analyses are human-written and signed by their author.
- Footer links Prime Rogue Inc. to primerogueinc.com.
- Roger Wilco brand (tentative): Wilco mark and wordmark in the header, brand palette in dark and light modes, Wilco hero on the overview, Wilco favicon/home-screen icon, footer motto.
- All timestamps shown in Calgary time (MST/MDT) with UTC in brackets after.
- Signals page: night-lights flags (VIIRS) and dark-ship candidates (radar ships with no AIS).
- Proofs page: SHA-256 manifest of every SITREP and data drop, with its OpenTimestamps anchor.
- Markdown tables (thermal watch, signals) now render with proper headers.
- Roadmap page: releases 0.8–0.11 with every planned item's purpose, sources, method, outputs, done-when, risks and dependencies; filter by status. Built from the pipeline's
roadmap.yaml.
- Site register: separate filters for geographic region, US combatant command and country (plus type and search), with counts; filters are kept in the page link so a filtered view can be shared.
- Region and combatant command shown in the register and on each site page.
- Dark mode is now the default, with a light/dark toggle in the header (remembered per browser).
- First build: overview, site register with dates added and map, per-site history pages (imagery + thermal detections), numbered SITREP archive, thermal watch, method page.
- Version history page shared by the private site and a standalone public build.
- Static output (
dist/private,dist/public) for Hostinger; daily rebuild via GitHub Actions with optional SFTP deploy.
Pipeline commit log private
Latest 60 commits, including automated pickups.
| Commit | When | Message |
|---|---|---|
6799f2e | 28 Oct 2026 19:40 MDT (01:40 UTC, 29 Oct) | tracks 2026-10-29T01:40Z |
a418ddf | 28 Oct 2026 19:04 MDT (01:04 UTC, 29 Oct) | Alerts 20261029T0104Z |
69af1f6 | 28 Oct 2026 19:02 MDT (01:02 UTC, 29 Oct) | FIRMS watch 2026-10-29T01:02Z |
6b6c23e | 28 Oct 2026 18:00 MDT (00:00 UTC, 29 Oct) | Ship watch 2026-10-29T00:00Z |
83c0b70 | 28 Oct 2026 17:50 MDT (23:50 UTC) | FIRMS area pull 2026-10-28T23:50Z |
9d0f569 | 28 Oct 2026 17:47 MDT (23:47 UTC) | FIRMS area pull: Gagetown 60 days |
6add554 | 28 Oct 2026 17:37 MDT (23:37 UTC) | Area Watch 2026-10-28 |
b437aca | 28 Oct 2026 17:37 MDT (23:37 UTC) | Wilco Watch 2026-10-28 |
83caa5e | 28 Oct 2026 16:56 MDT (22:56 UTC) | Provenance 20261028T2256Z |
593ab38 | 28 Oct 2026 16:54 MDT (22:54 UTC) | Provenance 20261028T2254Z |
ac8a368 | 28 Oct 2026 16:52 MDT (22:52 UTC) | Provenance 20261028T2252Z |
591e8a1 | 28 Oct 2026 16:51 MDT (22:51 UTC) | BRIEF-004 (C-146A movements, Al-Watiya Dec 2015) and BRIEF-005 (militia activity all-sources pass) |
cb1ad6b | 28 Oct 2026 16:49 MDT (22:49 UTC) | BRIEF-004 draft (C-146A movements) and BRIEF-005 fire plate (work in progress) |
69318d3 | 28 Oct 2026 15:57 MDT (21:57 UTC) | Detections 20261028T2157Z |
f1b850c | 28 Oct 2026 15:53 MDT (21:53 UTC) | tracks 2026-10-28T21:53Z |
394e4af | 28 Oct 2026 14:48 MDT (20:48 UTC) | Provenance 20261028T2048Z |
dec606d | 28 Oct 2026 14:34 MDT (20:34 UTC) | HC-003-P2 rev 2: Libyan Air Force photos vs imagery (G1, G2); sunrise corrected to 08:05 local |
4e87963 | 28 Oct 2026 14:24 MDT (20:24 UTC) | Alerts 20261028T2024Z |
f230e06 | 28 Oct 2026 14:22 MDT (20:22 UTC) | FIRMS watch 2026-10-28T20:22Z |
fbef260 | 28 Oct 2026 13:47 MDT (19:47 UTC) | Night lights 20261028T194722Z |
18f5a7d | 28 Oct 2026 13:38 MDT (19:38 UTC) | Ship watch 2026-10-28T19:38Z |
5221dd1 | 28 Oct 2026 13:05 MDT (19:05 UTC) | Pickup 20261028T1905Z (24h window ) |
6032907 | 28 Oct 2026 10:53 MDT (16:53 UTC) | tracks 2026-10-28T16:53Z |
7ed98d2 | 28 Oct 2026 07:37 MDT (13:37 UTC) | Provenance 20261028T1337Z |
9f73c4d | 28 Oct 2026 07:37 MDT (13:37 UTC) | Ship watch 2026-10-28T13:37Z |
cf66c36 | 28 Oct 2026 05:44 MDT (11:44 UTC) | Provenance 20261028T1144Z |
e6d5bf0 | 28 Oct 2026 05:42 MDT (11:42 UTC) | HC-003 part 2: Al-Watiya, whole of December 2015 (plates M1–M6, PDF, register) |
6bdf7b8 | 28 Oct 2026 05:37 MDT (11:37 UTC) | FIRMS area pull 2026-10-28T11:37Z |
dcc3ee3 | 28 Oct 2026 05:35 MDT (11:35 UTC) | History pull 2026-10-28T11:35Z |
0f981f8 | 28 Oct 2026 04:56 MDT (10:56 UTC) | Al-Watiya December 2015, whole month: history pull (imagery, MODIS, weather, fire, night lights, perimeter) and FIRMS area pull |
4f16b46 | 28 Oct 2026 04:51 MDT (10:51 UTC) | Provenance 20261028T1051Z |
f2418bd | 28 Oct 2026 04:49 MDT (10:49 UTC) | RWI-BRIEF-003: the Wainwright paratroopers, full file (what doesn't add up + BRIEF-002 + HC-004 + raw 130339 positions); BRIEF-002 plate P4 corrected (older burn south of the lakes) |
0541173 | 28 Oct 2026 03:54 MDT (09:54 UTC) | Provenance 20261028T0954Z |
832269e | 28 Oct 2026 03:52 MDT (09:52 UTC) | BRIEF-002 follow-up 1: best-guess Range 15 / pairs range road head (52.7692 N, 110.8990 W) from the 14:49 MDT fire front and the post-fire burn; clean imagery; P4 correction noted |
71007d4 | 28 Oct 2026 03:47 MDT (09:47 UTC) | Provenance 20261028T0947Z |
8157483 | 28 Oct 2026 03:45 MDT (09:45 UTC) | RWI-HC-004: the RCAF on the night of the Wainwright fire — every Canadian military aircraft transmitting, who can parachute medics (SAR units compared), air traffic over the drop zone; 3 leads |
5f90db4 | 28 Oct 2026 03:39 MDT (09:39 UTC) | Provenance 20261028T0939Z |
f5c95a8 | 28 Oct 2026 03:38 MDT (09:38 UTC) | RWI-HC-004 (in progress): plate H1 — RCAF aircraft transmitting during the Wainwright response, and SAR bases with distances |
db2bdfa | 28 Oct 2026 03:01 MDT (09:01 UTC) | Provenance 20261028T0901Z |
fcc396a | 28 Oct 2026 03:00 MDT (09:00 UTC) | tracks 2026-10-28T09:00Z |
f9de411 | 28 Oct 2026 03:00 MDT (09:00 UTC) | RWI-BRIEF-002: the Wainwright SAR parachute drop — CC-130H 130339 from the open flight archive, plates (route, Winnipeg legs, drop zone, fire and town, Lloydminster) |
78a0ac6 | 28 Oct 2026 02:21 MDT (08:21 UTC) | ADS-B history 2026-10-17 |
e9ba84b | 28 Oct 2026 02:19 MDT (08:19 UTC) | ADS-B history 2026-10-18 |
f25863a | 28 Oct 2026 02:19 MDT (08:19 UTC) | Libya landing watch 2026-10-28T08:19Z |
c415e7d | 28 Oct 2026 02:17 MDT (08:17 UTC) | ADS-B history 2026-10-27 |
f05719c | 28 Oct 2026 02:17 MDT (08:17 UTC) | Area Watch 2026-10-28 |
983104f | 28 Oct 2026 02:15 MDT (08:15 UTC) | ADS-B history 2026-10-26 |
5415988 | 28 Oct 2026 02:11 MDT (08:11 UTC) | rcaf profile: also business jets and PIA/LADD (hidden registration) aircraft within 600 km of Wainwright (Falcon 7X, 18 Oct) |
382d409 | 28 Oct 2026 02:08 MDT (08:08 UTC) | rcaf profile: only measure distance for military traces |
ac5c419 | 28 Oct 2026 02:08 MDT (08:08 UTC) | ADS-B history: rcaf profile (every Canadian military aircraft, whole-day traces) for the Wainwright parachute drop, 17–18 Oct |
3794180 | 28 Oct 2026 01:59 MDT (07:59 UTC) | Fire watch: a detection inside a site's own box belongs to that site only (padding no longer labels the Douda dump as Chabelley / Camp Lemonnier); 8 mis-attributed rows removed. Area Watch: redo an issue whose flight archive was not out yet |
d0e2e47 | 28 Oct 2026 00:25 MDT (06:25 UTC) | Ship watch 2026-10-28T06:25Z |
62eb0cf | 28 Oct 2026 00:22 MDT (06:22 UTC) | Provenance 20261028T0622Z |
1a1ea03 | 28 Oct 2026 00:17 MDT (06:17 UTC) | Watches: readable notable lines (civil / country military; no empty type) |
f04b39c | 27 Oct 2026 23:51 MDT (05:51 UTC, 28 Oct) | Alerts 20261028T0551Z |
b6ec1ad | 27 Oct 2026 23:49 MDT (05:49 UTC, 28 Oct) | FIRMS watch 2026-10-28T05:49Z |
3f810b6 | 27 Oct 2026 23:33 MDT (05:33 UTC, 28 Oct) | Provenance 20261028T0533Z |
68ec2af | 27 Oct 2026 23:31 MDT (05:31 UTC, 28 Oct) | Provenance 20261028T0531Z |
2564f93 | 27 Oct 2026 23:30 MDT (05:30 UTC, 28 Oct) | Register: quote SITREP 016 title (YAML) |
f5bafcc | 27 Oct 2026 23:30 MDT (05:30 UTC, 28 Oct) | SITREP 016 (evening 27–28 Oct): Djibouti — no heat at the PLA base in 180 days; the alerts were the Douda dump; recurring burns beside Chabelley (lead). Djibouti box split into PLA base, Doraleh, Camp Lemonnier, Chabelley, Douda dump; Miramar and Port of LA flares marked routine |