# JS8Reporter Changelog ## v1.7.7 (2026-06-22) - **New:** File › **Import Flag Pins…** — imports a `.flags.json` file directly from the File menu, without opening the Flag Pins dialog. New pins are added; existing pins are replaced only if the incoming pin has a newer `updated_at` timestamp. Mirrors the existing Export Flag Pins… command. ## v1.7.6 (2026-06-21) - **Enhancement:** New pin highlight — a bright magenta ring is drawn around F!505, F!104, and F!309 pins received within a configurable number of hours (Settings › General › "New pin highlight"). The ring stands out against topo and shapefile map backgrounds. Set to 0 (default) to disable. ## v1.7.5 (2026-06-20) - **Enhancement:** F!505, F!104, and F!309 detail panels now show an **Age** field — the time elapsed since the report was filed (e.g. `4h 30m`, `2d 6h`) — matching the Age field already present in MHGridMapper pin popups. F!505 Age also appears in saved text reports. - **Fix:** On Raspberry Pi, the GPIO Alert Output section in Settings › Filters now uses a `LabelFrame` instead of a freestanding separator, eliminating a layout collision that caused a horizontal line to visually cross through the "Suppress alerts older than" control. Warning text for a missing `RPi.GPIO` package is now displayed in the default color rather than red. - **Packaging:** `flags.flags.json` excluded from release ZIP (runtime data file, not part of the distribution). - **Fix:** Importing a F!104 report in JS8Spotter log format (`HH:MM:SS - (FREQ) - CALLSIGN: F!104 …`) no longer shows "---" for the callsign in Report Detail. The plain-text parser was splitting content at the `F!104` marker, causing the `CALLSIGN:` prefix to land in the discarded portion before the marker. The parser now recovers the callsign from the log-line prefix and passes it explicitly to the record constructor. - **Fix:** F!104 export lines now include the sending station's callsign as a `CALLSIGN: ` prefix. Previously, records sourced from the JS8Spotter database stored the callsign separately from the message body, so the export omitted it and MHGridMapper showed no callsign on F!104 pin popups. Requires MHGridMapper v1.0.5 or later to display. ## v1.7.4 (2026-06-19) - **Fix:** F!505 records where every score field is X (unknown/N/A) now appear on the map as a gray pin (#888888) instead of being silently dropped. Previously `compute_pin_color` returned `None` for all-X records, causing the pin to be omitted entirely. A station that checks in with all-unknown scores still deserves a map presence. - **Fix:** Gray (all-X) F!505 pins carry no callsign label on the map. Scored pins continue to show `CALLSIGN (avg)` as before; no-score pins are unlabelled to avoid cluttering the map with a bare callsign that implies nothing about status. - **Fix:** MHGridMapper live-sync CSV timestamps are now exported in local time rather than UTC. Age calculations in MHGridMapper's pin popups now show the correct age regardless of timezone. - **Fix:** F!505, F!104, and F!309 exports now embed the JS8Spotter received timestamp as the datecode for records that carry no form-prepared datecode. This prevents MHGridMapper from displaying "age 0" for records whose operators did not include a `#XXXX` timestamp in the transmitted form. - **Fix:** `_auto_export_for_mhgridmapper` exception handling broadened from `OSError` to `Exception`, preventing a non-OS error in one export block (F!505, F!104, or F!309) from silently skipping the remaining exports. ## v1.7.3 (2026-06-17) - **Fix:** F!309 upward triangle (▲) was missing from the "Map Symbols" section at the top of the map legend. The per-severity color scale was already shown conditionally when F!309 pins are visible, but the symbol marker was absent from the always-visible header row alongside the F!505 and F!104 symbols. ## v1.7.2 (2026-06-17) - **Fix:** IGNORE.TXT callsigns were not suppressed for F!104 records — they appeared on the map and could trigger ALERT notices. F!104 records now apply the same ignore filter that F!505 records already used. - **New:** MHGridMapper live sync — after every database poll and on startup auto-reload, JS8Reporter silently exports F!505 data to `data/exports/mhgridmapper_stations.csv` and F!104 data to `data/exports/mhgridmapper_f104.txt`. MHGridMapper watches these files for changes and updates its map automatically when both programs are running. The export applies JS8Reporter's active date filter, deduplication, and circle filter, so both programs show the same picture. Time Lapse is intentionally excluded so MHGridMapper always shows the full filtered date range rather than a single TL frame. Filter changes in JS8Reporter propagate to MHGridMapper immediately rather than waiting for the next poll cycle. - **Fix:** Add Flag Pin dialog no longer pre-fills Latitude, Longitude, or Date/Time. These fields start blank for new pins. When adding a pin via map right-click, Lat/Lon/Grid are still populated from the click position. - **New:** View › **Show Flag Pins** — checkbutton toggle to show or hide flag pins on the map (default: on, persisted across sessions). Hidden pins remain in the data store and are unaffected by export operations. - **New:** View › **Clear All F104 Reports** — removes all currently loaded F!104 records from memory without writing to disk, mirroring the existing Clear All F505 Assessments command. - **New:** ALERT age threshold — the ALERT banner is now suppressed for records older than a configurable number of hours (default: 24). Prevents old alerts from re-firing every time the program is restarted, while still alerting for recent alerts received while the program was offline. Configurable in Settings › Alerts: "Suppress alerts older than N hours (0 = always alert)". - **New:** F!309 Situation Map Pin — a new form type that places an upward triangle (▲) on the map, color-coded by severity (green/yellow/orange/red/gray). Each pin encodes Affected Area (grid square), Category (event type), Severity, Situation Frame, Current Status, and an Expiration period (24h – 2 weeks). Pins expire automatically and disappear from the map when their expiration time passes. F!309 records are loaded from the JS8Spotter database alongside F!505 and F!104 records, and are also accepted via file import and folder import. Clicking a pin shows full detail in the detail panel. Right-click the map near a pin for a View F309 Pin menu entry. Toggle visibility with View › Show F!309 Pins; clear all with View › Clear All F309 Map Pins. IGNORE.TXT filtering and MHGridMapper live sync (`mhgridmapper_f309.txt`) both apply. ## v1.7.1 (2026-06-15) - **Enhancement:** Grid Converter now accepts decimal **Lat, Lon** as input (e.g. `34.5678, -86.1234`) in addition to Maidenhead and MGRS/USNG. Format is auto-detected. - **Enhancement:** Flag pin add/edit dialog now exposes **Severity** (Low / Medium / High / Critical) and **Status** (Active / Ongoing / Resolved) fields, which were previously only settable via import. - **Enhancement:** Flag pin color selection replaced with a named-color dropdown (matches Flag Pin Tool behavior). - **Enhancement:** Flag pin list dialog adds Severity and Status columns. ## v1.7.0 (2026-06-13) - **New:** Tools menu added with **Grid Converter** — converts between Maidenhead grid squares and MGRS/USNG coordinates. Auto-detects the input format, displays lat/lon, and provides Copy Maidenhead and Copy MGRS buttons. - **New:** File › **Export Flag Pins…** — exports all flag pins to a `.flags.json` file directly from the File menu, in addition to the Export button already available in the Flag Pins dialog. - **New:** **Import All Files from Folder** now also imports `.flags.json` flag pin files found in the folder alongside F505 and F104 files. The confirmation message and status bar reflect all three record types. - **New:** When adding a new flag pin — via right-click on the map or the Add New button in the Flag Pins dialog — the **Source field is pre-filled** with the station callsign from Settings › General. The field remains editable for pins sourced from other operators or reports. - **Change:** File menu labels clarified: "Import F!104 File" → "Import F104 File"; "Export as F!104" → "Export as F104"; "Export Data (CSV/TSV)" → "Export F505 Data (CSV/TSV)". - **Change:** Right-click on the map now shows a **combined context menu** when multiple pin types are near the click location. Flag pin actions (Edit, Delete), View Assessment (F505), and View F104 Report appear together in one menu separated by dividers, with "Add Flag Pin Here…" at the bottom when no flag pin is already present. - **Fix:** The zoom tool now **auto-exits after one use** — cursor and click behavior return to normal automatically without requiring a second click on the zoom button. - **Fix:** **Escape key** now reliably dismisses right-click context menus on Linux. ## v1.6.0 (2026-06-13) - **New:** Flag Pins — manually-placed situational awareness markers on the map, independent of received F!505/F!104 data. Right-click any map location to place a flag pin. Each pin stores a description, Maidenhead grid square, date/time (UTC), source, and a freely chosen color. The teardrop pin shape and description label are drawn on the map above all other pin layers. - **New:** View > Flag Pins… opens a management dialog to add, edit, delete, jump to, import, and export flag pins. - **New:** Right-click an existing flag pin on the map to edit or delete it. Right-click empty map space to add a flag pin at that location. Both context menus dismiss on Escape. - **New:** Flag pin import/export uses the shared `sitrep_flags` JSON format (`.flags.json`), fully interoperable with MHGridMapper. Export includes a `created_by` callsign field (set in Settings > General). Import merges by timestamp — an incoming flag replaces an existing one only if its `updated_at` is newer, so redistributed SitRep updates propagate correctly over net. - **New:** Settings > General tab (now the first tab) — Station Callsign field, used as `created_by` in flag pin exports. - **Fix:** Settings dialog `grab_set()` / `transient()` ordering corrected (Linux/Pi silent-grab bug — dialog was non-interactive in some configurations). ## v1.5.4 (2026-06-09) - **Fix:** When the same F!505 form is received a second time (e.g., an operator re-transmits an old prepared form), JS8Reporter now updates the existing record's received time to reflect the new receipt. Previously the original receive date was kept, so switching Date Source to "Record Date/Time Stamp" still filtered by the old date, hiding the re-received record. - **New:** File › Export as F!104… exports the currently visible F!104 situation reports to a plain-text file (one record per line), mirroring the existing F505 export. ## v1.5.3 (2026-06-07) - **Improved:** Map rendering now uses `LineCollection` and `PolyCollection` instead of individual per-segment draw calls, dramatically reducing render time — especially noticeable on Raspberry Pi hardware. - **New:** Animated progress bar and watch cursor appear during map rendering at startup, pop-out, and dock-back so the program does not appear frozen during the initial shapefile draw. ## v1.5.2 (2026-06-07) - **Fix:** Eliminated map rendering sluggishness introduced by the 1:50m shapefile upgrade. Shapefile geometry is now parsed once at startup and cached in memory; subsequent redraws (on data refresh, zoom, pan, pop-out/dock, etc.) no longer re-read the 4 MB shapefile set from disk on every draw. ## v1.5.1 (2026-06-07) - **Improved:** Map rendering upgraded from Natural Earth 1:110m to 1:50m shapefiles, providing noticeably sharper coastlines, country borders, and state/province lines with no change to system resource requirements. - **Fix:** Map toolbar Home button ("Reset original view") now correctly returns to the full North America extent even when a zoomed-in state was loaded from persisted settings on startup. ## v1.5.0 (2026-06-02) - **New:** F!104 Situation Report pin overlay — diamond-shaped pins (◆) appear on the map alongside F!505 pins, color-coded by status: green (1 = Normal), yellow (2 = Degraded), red (3 = Significant Problems). F!104 records are loaded from the same JS8Spotter database as F!505 assessments and are kept in a separate data store so they cannot affect F!505 display or reports. - **New:** F!104 pins respect all existing filters: Date Filter, Circle Filter, and Time Lapse (all three modes — rolling, cumulative, snapshot). The Time Lapse date list is built from the merged set of F!505 and F!104 timestamps. - **New:** ALERT detection extended to F!104 records — pins with an active alert carry a red "!" badge and the alert bar now identifies the form type with callsign and grid for both form types (e.g., ` F!104 ALERT: W4XYZ (EM73) `). Cancel dismisses all active alerts of both types. - **New:** File › **Import F!104 File…** — imports F!104 Situation Report records from a plain text or JS8Spotter CSV file. - **New:** File › **Import All Files from Folder** now auto-detects and loads both F!505 and F!104 records from each file in the folder. Both record lists are cleared before the import. - **New:** View › **Show F!104 Pins** — checkbutton toggle to show or hide F!104 diamond pins (default: on, persisted across sessions). - **New:** Reports › **F!104 Summary** — scrolled text popup listing all currently-filtered F!104 records with callsign, grid, status, and date columns. - **New:** Clicking an F!104 diamond pin on the map shows an F!104 Detail view (callsign, grid, status label, filed date) in the detail panel; the panel title changes to "F!104 Detail". Clicking an F!505 pin or deselecting restores "Report Detail". - **New:** **Map Symbols** legend (upper left, always visible) — explains the three map symbols: F!505 Area Assessment pin (▼), F!104 Situation Report diamond (◆), and Selection Circle (○). - **Change:** **F!104 Status** legend (lower left, stacked above Pin Color) added alongside the existing Pin Color legend. The Pin Color legend is otherwise unchanged. ## v1.4.9 (2026-05-29) - **Change:** Time Lapse simplified to manual-only navigation (Left/Right arrow keys). Removed the timed auto-advance (0.5s / 1s) playback option, which was unreliable. - **Fix:** Time Lapse Left/Right arrow keys now also work when the pop-out map window has focus. - **Fix:** Time Lapse arrow keys no longer leak into menu-bar navigation. ## v1.4.8 (2026-05-26) - **New:** ALERT records are now highlighted on the map with a red-orange pin and a red "!" badge, making alerting stations immediately visible. Pressing "Cancel Alert" reverts the pins to their normal status color. - **New:** Pop-Out Map documented in User Manual (Section 7.1) with guidance on using it for routine monitoring and an explanation of the Dock Map button. ## v1.4.7 (2026-05-17) - **Fix:** Error messages for missing matplotlib now correctly direct the user to run `python3 setup.py` instead of the incorrect `bash setup.sh`. - **Improved:** `setup.py` verifies that the venv module is available *before* deleting a stale virtual environment; on Debian/Ubuntu systems it prints the exact `apt install` command needed. This prevents a situation where the old venv is deleted but the new one cannot be created, leaving the user with no working environment. - **Improved:** `setup.py` skips shapefile re-download when the Natural Earth `.shp` files are already present, making a venv rebuild after a Python upgrade much faster. - **Improved:** `run.sh` detects a Python version mismatch between the system Python and the venv at launch time and shows a clear message directing the user to re-run `python3 setup.py`, rather than letting the app start and fail silently on the matplotlib import. ## v1.4.6 (2026-05-16) - **Improved:** File-imported F!505 records no longer require the `F!505` marker prefix — a 32-character score string plus a grid square (`GR[XXXX]`) is sufficient. This allows records exported by external tools (e.g. 505processor) to use a compact 41-character format. Records received from JS8Spotter and over-the-air sources are unaffected. ## v1.4.5 (2026-05-07) - **Fix:** GPIO Alert Output section now appears in Settings > Preferences… > Filters tab on Raspberry Pi systems where `RPi.GPIO` is not installed or fails to import. Hardware detection uses `/proc/device-tree/model` rather than relying on a successful package import. If `RPi.GPIO` is missing, the section displays a red install hint with the correct `--ignore-installed` command instead of the controls. - **Fix:** RPi.GPIO install instructions updated to use `--ignore-installed` — pip on Raspberry Pi OS incorrectly reports the package as already satisfied from system paths even when it is not present in the JS8Reporter virtual environment. - **Fix:** Removed unused GitHub URL from Help > About dialog. - **Feature:** IGNORE.TXT — call signs listed in this file (one per line, in the main program directory) are silently discarded when loading from any source: JS8Spotter database (open, auto-reload, and background polling), file imports, and folder imports. Lines beginning with `#` are treated as comments. If IGNORE.TXT contains entries at startup, a notification dialog lists the ignored call signs. ## v1.4.3 (2026-05-04) - **Feature:** GPIO alert output (Raspberry Pi only) — optionally drives a GPIO pin HIGH while an ALERT is active, enabling an external light or buzzer; pin returns LOW when the alert is cancelled. Enabled in Settings > Preferences… > Filters tab > GPIO Alert Output section. The GPIO section is shown on Raspberry Pi hardware; Windows and non-Pi users are not affected. The pin number (BCM numbering) is user-configurable; default is BCM 17. ## v1.4.2 (2026-05-03) - **Feature:** Export as F505 (File > Export as F505…) — saves all currently visible assessments to a plain-text file in the original F505 over-the-air format; intended for compiling received reports and transferring them to another operator who can import the file into their copy of JS8Reporter - **Change:** Menu item renamed from "Import MCF505 File…" to "Import F505 File…" to reflect the more common usage of the F505 name - **Feature:** Import All Files from Folder (File > Import All Files from Folder…) — imports MCF505 assessments from every .txt and .csv file in the configured Import Records folder; intended for users who accumulate weekly report files and need to visualize trends across multiple weeks - **Feature:** Import Records folder setting (Settings > Export > Import Records folder) — specifies the folder scanned by Import All Files from Folder; defaults to data/imports/ - **New:** Installation_Guide.txt — separate document covering system requirements, step-by-step setup, desktop launcher details, and setup troubleshooting - **Updated:** User Manual Section 2 condensed to a quick-start summary with reference to Installation_Guide.txt; Section 3 and Section 17 cross-reference Installation_Guide.txt for setup issues; change markers removed - **Improved:** run.sh now displays a GUI error dialog (zenity / xmessage fallback) when setup has not been run, with instructions and a reference to Installation_Guide.txt - **Improved:** run.bat now displays a PowerShell MessageBox when setup has not been run, visible even when launched from the desktop shortcut - **Improved:** setup.py detects and removes stale virtual environments when the Python version has changed, preventing silent failures after a Python upgrade - **Improved:** setup.py generates JS8Reporter.png during the desktop launcher step for reliable icon display on LXDE / Raspberry Pi OS (SVG used as fallback) - **New:** Packaging_Instructions.txt — release ZIP checklist and procedure ## v1.4.1 (2026-03-24) - **Fix:** Date filter now has a "Date Source" option: filter by Record Date/Time Stamp (when received) or Date/Time Code (from the form) — accommodates operators who resend forms without updating the datecode - **Fix:** Loaded Assessments list now sorts by received date so recently received records appear at the top regardless of form datecode - **Fix:** Datecodes decoded without a year context (file-loaded records) no longer produce future dates — a December datecode loaded in March now correctly resolves to the prior December - **Fix:** Database query now orders by received time descending so that when duplicate records share the same UID, the most recently received record is kept - **Fix:** Grid-square duplicate resolution now keeps the record with the latest received date rather than the latest form datecode ## v1.4.0 (2026-03-21) - **Feature:** Date Filter now supports three modes: No Filter, Previous N-Days (rolling), and Specified Dates - **Feature:** Previous N-Days mode automatically tracks the system date — no manual adjustment needed when running continuously - **Feature:** Time Lapse keeps up with the shifting Previous N-Days window; date list is recomputed each step - **Feature:** Filter mode and N-Days count are saved and restored on restart; new installs default to Previous 14 Days - **Fix:** Assessment Detail / Summary Table no longer shows "No assessments loaded" when records exist but are excluded by the active date filter; now shows a clear "No assessments match the current filters" message - Date Filter box enlarged to accommodate the new controls; Loaded Assessments list adjusts accordingly - **Fix:** Program now polls the open database every 60 seconds and automatically adds any new records — previously the display went stale after the initial load - **Fix:** Map zoom/pan set via the toolbar is now preserved across Time Lapse steps and all other map refreshes — previously the view reset to full map on each redraw - Removed keyboard shortcuts for infrequently used file/settings operations (Ctrl+O, D, S, T, E, ,) ## v1.3.2 (2026-03-17) - Replaced `setup.sh` with cross-platform `setup.py` (works on Raspberry Pi OS Bullseye and Bookworm, Linux, macOS, Windows) - `setup.py` automatically creates a Python virtual environment, resolving pip conflicts on newer Debian-based systems (PEP 668) - Added `run.sh` (Linux/macOS/Pi) and `run.bat` (Windows) launcher scripts - Update notifications now point to sitrepnet.com instead of GitHub - Summary table redesigned: compact Min/Max/Avg overview at top, followed by per-report blocks of up to 10 ## v1.3.1 (2026-03-15) - Fixed duplicate assessments appearing when a database is opened more than once - Off-map grid squares (valid Maidenhead grids outside the North America map area) are now flagged with `[off-map]` in the list and noted in the status bar ## v1.3.0 (2026-03-13) - Date filter (filter assessments by date range) - Time Lapse mode (rolling, cumulative, snapshot) with manual and timed step - Alerts for newly received assessments - Invalid record detection and marking - Color-coded score bars in the detail pane - Additional UI and display improvements ## v1.2.0 (2026-03-11) - Broadened database query to improve compatibility with JS8Spotter database formats - Added DB Diagnostic tool (Help menu) for troubleshooting database issues ## v1.1.0 (2026-03-11) - Initial release