Staging#33
Merged
MichaelWheeley merged 14 commits intoMichaelWheeley:feature/thai-language-devfrom Apr 3, 2026
Merged
Conversation
…le N0NBH data Two bugs reported in propagation display: 1. Kp index (and SSN/SFI fallback) treated numeric zero as absent because the server used || null when resolving the current value from history. A quiet geomagnetic day (Kp=0) caused kp.current to be set to null, which propagated to the header and layout displays as '--'. Fixed by switching to ?? null / ?? '--' throughout (server route + Header, SpaceWeatherPanel, ClassicLayout, useSpaceWeather). Also tightened the !result.sfi.current / !result.ssn.current guards to == null so a genuine zero is never treated as missing. 2. When hamqsl.com (N0NBH) was temporarily unreachable the server returned stale cached data indefinitely. The error path never updated the cache timestamp so every subsequent request re-tried, failed, and served the same old data with no age bound. Added N0NBH_MAX_STALE_TTL (4 h): beyond that the endpoint returns 503 rather than misleading clients. Normal and error-fallback responses now include fetchedAt and stale:true when serving fallback data. useBandConditions passes these through extras; BandConditionsPanel and PropagationPanel show a stale badge in their headers when N0NBH data could not be refreshed. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
NOAA changed noaa-planetary-k-index.json and noaa-planetary-k-index-forecast.json from array-of-arrays to array-of-objects. The old parser read d[0]/d[1] on each row; with objects those are undefined, so parseFloat(undefined) goes to NaN then 0 for every entry, making kp.current always 0 regardless of actual conditions. Both the server /api/solar-indices handler and the browser-side useSpaceWeather hook detect the format (Array.isArray check) and read the correct field (d.Kp for history, d.kp for forecast) in object format, with fallback to old array indexing. Guard history values with Number.isFinite() instead of bare || 0. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…arser getSolarData() in propagation.js fetched noaa-planetary-k-index.json independently and parsed it with the old array-of-arrays accessor d[n][1]. NOAA now returns objects, so d[last][1] was undefined, parseInt gave NaN, and the NaN || 2 fallback permanently locked kIndex at 2 — matching neither the actual conditions nor the value shown in the header. Apply the same format-detection fix (Array.isArray check, read d.Kp for object format) used in the space-weather route. Switch to parseFloat so fractional Kp values (e.g. 4.67) are preserved rather than truncated. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…test entry NOAA's f107_cm_flux.json array does not guarantee chronological order; the last element in the array can be months old (observed: last entry was 2026-02-20 with flux=112 while the actual current value from 2026-04-02 was flux=140 at array index 0). getSolarData() in propagation.js was using data[last].flux and therefore reporting stale SFI to the panel footer. Fix: reduce over the array to find the entry with the maximum time_tag. space-weather.js was building the SFI history chart with data.slice(-30) on the unsorted array, giving a chart with out-of-order and non-recent readings. Fix: sort a copy by time_tag before slicing. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
The N0NBH stale-data badge added in the previous commit had hardcoded
English strings. Add band.conditions.stale.label and
band.conditions.stale.tooltip keys to all 16 language files and
replace the hardcoded literals in BandConditionsPanel, PropagationPanel,
and ClassicLayout with t() calls using {{mins}} interpolation.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ng from health check (#866) Stop collecting, storing, and transmitting visitor IP addresses to third parties. IPs are now only held as SHA-256 hashes in memory for dedup counting — never persisted to disk or sent externally. Removes ip-api.com integration, country statistics, and IP display from the dashboard and JSON health endpoint. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add a "Share Presence" toggle in Station settings so users can hide their callsign from the Active Users map layer. Toggling off stops heartbeats and sends an immediate leave beacon. Add a Privacy section to the Community tab documenting the app's data practices: no cookies, no tracking, hashed visitor stats, opt-in presence, and local-only browser storage. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…Rate_dev [Feature] Satellite range / range rate / doppler factor, with languages
Fix/propagation solar index display
… 3 routes Visitor counting was limited to '/', '/index.html', '/api/config' while session tracking covered all non-health/asset requests. This caused concurrent sessions to far exceed reported unique visitors. Now both use the same scope so the numbers stay consistent. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
Type of change
How to test
Checklist
server.js: caches have TTLs and size caps (we serve 2,000+ concurrent users)var(--accent-cyan), etc.).bak,.old,console.logdebug lines, or test scripts includedScreenshots (if visual change)