v0.6.0
A reliability and correctness pass across the whole app: course following, the collision and anchor
watches, weather, charts, tides, and profiles, with the safety alarms now holding up in a
backgrounded browser tab. Plus: the app menu is a new tile launcher, every readout follows the
server's imperial-or-metric unit preference, and route editing loads on demand.
Added
-
Imperial and metric display units across the whole app, following the Signal K server's unit
preferences (Server Config, Unit Preferences) with a per-profile local fallback on older
servers. Depth, anchor distances and radius, MOB range, measured legs, tide heights and station
range, temperatures, pressure, precipitation, wave heights, and visibility all convert; knots,
nautical miles, bearings, and the hPa isobar convention stay nautical. -
The app menu is now a launcher: large icon tiles grouped Navigate, Conditions, Safety, and
Settings over a dimming scrim, bottom-anchored on phones for one-handed reach, with Forecast
now findable in the menu. Both alarm mutes moved into a new Alarms panel beside the collision
thresholds. -
The measure layer supports opacity like every other overlay, starting Measure re-shows a hidden
measure layer, the Tides panel cross-links its stations layer with a show-on-chart toggle, and
layer opacity sliders have a floor so a checked safety layer can never be dimmed invisible. -
The Terra Draw route editor loads on first use instead of at startup, trimming the initial
bundle by about 137 kB for faster cold loads on Pi-class displays. -
Standard waypoints: drop one from a long press on the chart, see them as named markers, and
locate, go to, rename, or delete them from the new Waypoints panel. They live in the server's
own waypoint resources, so they interoperate with Freeboard-SK and every other client. -
An Active alerts list in the Alarms panel: every notification on the boat (engine, NMEA2000,
autopilot, or any plugin) surfaces with severity, time, and one-tap Silence and Acknowledge
that propagate to every station on a 2.28 server. -
Collision and MOB alerts ride the server's v2 Notifications API when available (server-managed
ids; muting locally silences the boat-wide alert), with the v1 delta publish kept for older
servers. Server capabilities are detected once from the features endpoint. -
The anchor watch speaks the standard Anchor API the moment a server ships it (the proposal's
drop, raise, radius, and reposition routes, feature-detected), ahead of the existing
anchoralarm-plugin path and the client-local watch. -
Custom chart symbols from the signalk-symbol-manager plugin: a note whose icon reference
resolves to a managed symbol renders that symbol (scale and anchor honored), and a provided
"waypoint" symbol replaces the built-in waypoint marker. At night-red, user artwork is remapped
into the red band so the theme's no-color rule holds. Without the plugin, every icon stays
built-in. -
Worldwide tides through the signalk-tides plugin when the server runs it (NOAA, Neaps,
WorldTides, or StormGlass per its configuration), with the NOAA CO-OPS path unchanged as the
fallback; the Tides panel says which source served. -
AIS target trails from the tracks plugin: faded wakes behind moving targets, themed for all
three themes, fetched only when the plugin is present and the layer is visible. -
Offline charts that actually work: PMTiles archives are cached as blocks in browser storage at
the protocol layer, so previously viewed chart areas render offline in every context, including
the plain-http default where no service worker can run (the old service-worker chart cache
provably never stored anything: range responses cannot enter the Cache API). Plugin-served
raster chart tiles, the seamark, bathymetry, boundary, and ice overlays, the base-map style,
and CO-OPS predictions gain service-worker caching over https, with per-cache bounds and quota
protection; opaque cross-origin responses are no longer cached (each one padded several MB of
quota). -
Tide stations and predictions, chart notes, and the vessel conditions panel now persist in
browser storage, so a reload with no signal replays the last data for the area, each item
declaring its own age, over plain http as well as https. -
When the base map style itself is unreachable (plain http at sea with no internet), the map
starts on a minimal water-colored fallback instead of staying blank, so cached charts and
every overlay still load. The real base map returns on the next load with connectivity. -
A Trends panel: depth, apparent wind, barometric pressure, and speed over the last 24 hours
as themed graphs, served by the server's v2 History API when a history provider runs
(signalk-questdb, signalk-to-influxdb2, or signalk-parquet), with provider fallback when the
default provider has no data. Without one, the graphs show the current session, sampled live. -
A "Track history (24 h)" chart layer: the vessel's server-recorded last day as a dashed line
under the live track, gap-split across stops, opt-in from the Layers panel and only queried
while shown.
Removed
- The browser-local PMTiles file upload. Chart files belong on the server: install the
signalk-pmtiles-plugin and drop .pmtiles files in its charts folder, and they appear in
Binnacle on every device automatically. Adding a chart by URL is unchanged and still syncs to
the server. Previously uploaded browser-local charts are dropped cleanly at upgrade.
Changed
- Delta batching in the stream worker now runs on a timer instead of requestAnimationFrame, and
AIS staleness pruning runs on a wall clock instead of the render loop, so live data keeps
flowing and the collision and anchor alarms keep evaluating while the tab is hidden. - An AIS target that stops reporting is now dropped after seven minutes, so anchored traffic with
a slow AIS refresh no longer flickers in and out of the target list. - Track recording no longer accumulates points while the boat sits at anchor: session gaps are
detected from fix continuity, not motion. - Cancelling MOB and raising the anchor are now two-tap confirms, and deleting a profile or a
saved track asks first, matching the route delete. - Escape handling is one shared topmost stack across the panels, the menu, and the measure tool,
so Escape always closes the surface on top and never one underneath. - Layer drag-to-reorder now stays within the layer's own category instead of crossing into the
next section. - Opening the Tides panel on a cold start is faster: the tide predictions and the current-station
lookup now fetch concurrently instead of back to back.
Fixed
- Editing a route no longer strips its waypoint names.
- The nav strip no longer shows the next waypoint's arrival time as the whole-route ETA.
- An active course now survives a page reload: the course state hydrates on first connect, and
the route's Active badge tracks the server, including courses started or cleared from another
station. - Arrival no longer re-alarms from GPS jitter at the arrival circle; the alarm latches until the
boat clearly leaves the circle. - A failed waypoint skip and a partially failed GPX import are now reported instead of passing
silently. - At night-red the own vessel, the AIS targets, and the note icons are no longer hidden along
with the base map's sprite icons. - An acknowledged collision alert re-arms once the situation clears, and a contact's severity
downgrade has hysteresis, so the alarm can neither stay silently dismissed nor flap between
danger and warning. - A target reporting speed without a course is no longer modeled as steaming due north, and
contacts with provider-supplied CPA keep classifying during an own-fix dropout. - The anchor watch announces a degraded state when GPS is lost, and an anchor-marker drag the
system cancels no longer silently relocates the anchor. - The MOB strip dashes out bearing and range on a stale fix instead of presenting frozen numbers
as live. - Wind particle colors now match the legend's absolute scale.
- Radar frames refetch on schedule: the cache no longer extends its own expiry on every read.
- A partial forecast no longer stretches stale wave pixels over a new viewport, and overlapping
forecast loads can no longer finish out of order. - The conditions panel's forecast section falls back to the free grid when a provider returns an
empty series, and the weather panel's clock notes stay live during a long open. - Deleting a user chart no longer leaves it in the persisted layer state, and renaming one
updates its Layers row and its server resource. - Tide times are correct when the browser's time zone differs from the station's (predictions
are now requested in GMT), tide data refetches after midnight at anchor, and the on-chart tide
label no longer shows past events. - Tide fetches are skipped entirely while nothing displays them.
- Note markers recover after a failed or superseded fetch instead of freezing until reload.
- A transient network failure at startup no longer wipes the stored auth token, and a failed
access request retries instead of hanging at "Requesting access". - Profiles no longer show "unsaved changes" on every launch, deleting all profiles no longer
resurrects the starter profiles, and a synced device no longer marks a profile active without
applying it. A failed profile import shows an error. - A refused alarm Silence or Acknowledge now shows an error in the Alarms panel instead of the
alarm just continuing to sound, and a collision alert whose server notification was cleared
from another station is re-raised instead of going silent. - Cleared notifications no longer linger in the Active alerts list, and an unchanged
notification broadcast no longer re-renders the panel. - AIS wakes now clear after a few minutes of failed refreshes instead of freezing in place, and
waypoint markers have their own color in each theme. - The weather panel's layer pills stay on one scrollable row at every window width instead of
wrapping into a second header row. - A trend history load that resolves out of order can no longer overwrite a newer result, and a
failed load shows its failure note instead of loading forever. - A trend metric requested twice on one path with different aggregates now maps to its own
column instead of mirroring the first. - A tide reading replayed from the offline cache remeasures the station distance from the
current position, so a reading cached a few kilometers away cannot misjudge the coverage
radius or misstate the range. - Muting the collision alarm from the danger strip now reports a refused boat-wide silence in
the Alarms panel, matching the panel's own Silence and Acknowledge. - Losing authorization mid-session no longer makes the collision notifier abandon its server
notification id; the v1 delta fallback carries the change until the server accepts again. - A unit preset changed on the server while the link was down is picked up on reconnect.
- The offline cache's third-party host matchers accept only the real weather and radar domains
and their subdomains, not lookalike hostnames that merely end in the same letters.
Internal
- Map tile, WebGL shader, and PMTiles resources are released on teardown, dead exports and the
unused weather view persistence were removed, and assorted hot-path allocations were trimmed. - Shared bbox helpers, a shared test fetch stub, the shared input primitive, and one global
segmented-control rule replaced per-feature copies. - The notification mirror compares the four status flags directly instead of serializing the
status object on every delta, a coordinate-cell quantizer shared by the tides and weather
caches replaced two copies, an IndexedDB store that degrades to memory now logs one
diagnostic breadcrumb, and the alarm mute rows sit on the shared button base. New tests cover
the session trend recorder, the notification dedup, the refused silence and acknowledge
paths, and the history provider fallbacks.