signalk-chiplog 2.0.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +186 -37
  2. package/README.md +340 -134
  3. package/index.js +80 -40
  4. package/lib/api.js +109 -1
  5. package/lib/background-schedule.js +67 -0
  6. package/lib/crew.js +185 -0
  7. package/lib/database.js +103 -1
  8. package/lib/departure-forecast.js +150 -0
  9. package/lib/detection.js +45 -14
  10. package/lib/entries.js +96 -48
  11. package/lib/event-watcher.js +1 -3
  12. package/lib/events.js +64 -16
  13. package/lib/export.js +20 -1
  14. package/lib/landmark-finder.js +209 -0
  15. package/lib/landmarks.js +210 -0
  16. package/lib/logbook-pdf.js +368 -17
  17. package/lib/observation-recorder.js +11 -5
  18. package/lib/tide-forecaster.js +23 -116
  19. package/lib/weather-forecaster.js +147 -0
  20. package/package.json +2 -1
  21. package/public/app.css +212 -2
  22. package/public/entry/entry.css +71 -0
  23. package/public/entry/js/components/CrewDialog.mjs +200 -0
  24. package/public/entry/js/main.mjs +114 -0
  25. package/public/entry/sw.js +2 -0
  26. package/public/js/animation/camera.mjs +180 -0
  27. package/public/js/animation/formats.mjs +45 -0
  28. package/public/js/animation/mercator.mjs +50 -0
  29. package/public/js/animation/mp4.mjs +77 -0
  30. package/public/js/animation/player.mjs +120 -0
  31. package/public/js/animation/renderer.mjs +326 -0
  32. package/public/js/animation/schedule.mjs +49 -0
  33. package/public/js/animation/storyboard.mjs +195 -0
  34. package/public/js/animation/tiles.mjs +219 -0
  35. package/public/js/animation/timeline.mjs +186 -0
  36. package/public/js/components/AnimationExport.mjs +173 -0
  37. package/public/js/components/AnimationView.mjs +439 -0
  38. package/public/js/components/CrewCard.mjs +22 -0
  39. package/public/js/components/ExportView.mjs +3 -8
  40. package/public/js/components/PassageView.mjs +49 -19
  41. package/public/js/components/Timeline.mjs +30 -7
  42. package/public/js/components/WeatherCard.mjs +134 -0
  43. package/public/js/context.mjs +7 -0
  44. package/public/js/days.mjs +10 -0
  45. package/public/js/format.mjs +15 -0
  46. package/public/js/i18n.mjs +246 -0
  47. package/public/js/landmarks.mjs +128 -0
  48. package/public/js/main.mjs +8 -5
  49. package/public/js/weather.mjs +193 -0
  50. package/public/vendor/mediabunny-LICENSE +373 -0
  51. package/public/vendor/mediabunny.min.mjs +50 -0
package/README.md CHANGED
@@ -1,45 +1,55 @@
1
1
  # Chiplog
2
2
 
3
- An automated logbook for [Signal K](https://signalk.org). Chiplog writes the logbook from the data already on your boat's Signal K server — passages, track, engine and sail, instrument readings, alarms — and lets the crew add what sensors cannot know from a tablet at the helm: manoeuvres, notes and handwriting.
3
+ An automated logbook for [Signal K](https://signalk.org). Chiplog writes the logbook from the data already on your
4
+ boat's Signal K server — passages, track, engine and sail, instrument readings, alarms — and lets the crew add what
5
+ sensors cannot know from a tablet at the helm: manoeuvres, notes and handwriting.
4
6
 
5
- - **One entry per passage**, opened when the boat leaves and closed when it arrives, tolerating short stops such as a lock or a lunch anchorage.
7
+ - **One entry per passage**, opened when the boat leaves and closed as soon as it arrives, carrying on after short stops
8
+ such as a lock or a lunch anchorage.
6
9
  - **GPS track**, distance, time under engine and under sail.
7
10
  - **Hourly instrument readings**, as on a paper log, plus readings at departure, arrival and each manoeuvre.
8
11
  - **Automatic events**: alarms, autopilot changes, strong wind, falling barometer.
9
12
  - **Departure and arrival names**, looked up online and corrected once for good.
10
13
  - **Consultation webapp**: logbook by day, map, timeline, corrections, export.
11
- - **Tablet entry app**: big buttons for gloves and wet fingers, stylus handwriting, night mode, works through Wi-Fi dropouts.
14
+ - **Replay a range of passages** on the map — an hour of sailing per second — and save it as an MP4 for a phone, a
15
+ square post or a widescreen, rendered entirely in your browser.
16
+ - **Tablet entry app**: big buttons for gloves and wet fingers, stylus handwriting, night mode, works through Wi-Fi
17
+ dropouts.
12
18
  - **Abandon-ship copy**: JSON, CSV and GPX, downloadable or written to a USB drive.
13
19
 
14
20
  English and French, chosen from the browser's language.
15
21
 
16
22
  ## Contents
17
23
 
18
- - [Requirements](#requirements)
19
- - [Installation](#installation)
20
- - [How the logbook is written](#how-the-logbook-is-written)
21
- - [The logbook webapp](#the-logbook-webapp)
22
- - [The tablet entry app](#the-tablet-entry-app)
23
- - [Configuration](#configuration)
24
- - [Signal K data used](#signal-k-data-used)
25
- - [Backups and abandon ship](#backups-and-abandon-ship)
26
- - [Retrospective analysis](#retrospective-analysis)
27
- - [Privacy and online services](#privacy-and-online-services)
28
- - [Troubleshooting](#troubleshooting)
29
- - [Limitations](#limitations)
30
- - [Development](#development)
31
- - [License](#license)
32
-
33
- ## Requirements
34
-
35
- - **Signal K server 2.x** running on **Node.js 22.13 or later**. Chiplog uses Node's built-in SQLite module, so there is nothing to compile — it installs the same way on a Raspberry Pi.
24
+ - [Requirements](#requirements-)
25
+ - [Installation](#installation-)
26
+ - [How the logbook is written](#how-the-logbook-is-written-)
27
+ - [The logbook webapp](#the-logbook-webapp-)
28
+ - [The tablet entry app](#the-tablet-entry-app-)
29
+ - [Configuration](#configuration-)
30
+ - [Signal K data used](#signal-k-data-used-)
31
+ - [Backups and abandon ship](#backups-and-abandon-ship-)
32
+ - [Retrospective analysis](#retrospective-analysis-)
33
+ - [Privacy and online services](#privacy-and-online-services-)
34
+ - [Troubleshooting](#troubleshooting-)
35
+ - [Limitations](#limitations-)
36
+ - [Development](#development-)
37
+ - [License](#license-)
38
+
39
+ ## Requirements ✅
40
+
41
+ - **Signal K server 2.x** running on **Node.js 22.13 or later**. Chiplog uses Node's built-in SQLite module, so there is
42
+ nothing to compile — it installs the same way on a Raspberry Pi.
36
43
  - **A position and speed over ground** on the Signal K bus (GPS). Everything else is optional and used when present.
37
- - **Recommended:** [signalk-autostate](https://github.com/meri-imperiumi/signalk-autostate), which publishes `navigation.state` (moored, anchored, sailing, motoring). Without it, Chiplog decides from speed alone and says so in the apps.
38
- - **Recommended:** a correct system clock, e.g. with `signalk-set-system-time`. The logbook is dated from the server's clock.
44
+ - **Recommended:** [signalk-autostate](https://github.com/meri-imperiumi/signalk-autostate), which publishes
45
+ `navigation.state` (moored, anchored, sailing, motoring). Without it, Chiplog decides from speed alone and says so in
46
+ the apps.
47
+ - **Recommended:** a correct system clock, e.g. with `signalk-set-system-time`. The logbook is dated from the server's
48
+ clock.
39
49
  - **Optional:** a USB drive left plugged into the server, for the abandon-ship copy.
40
50
  - **Optional:** an internet connection, for map tiles and place names. The logbook itself never needs one.
41
51
 
42
- ## Installation
52
+ ## Installation 📦
43
53
 
44
54
  Install **Chiplog** from the Signal K App Store (**Apps & Plugins → Store**), or from the command line:
45
55
 
@@ -50,30 +60,44 @@ npm install signalk-chiplog
50
60
 
51
61
  Then restart the Signal K server, and in the Signal K admin:
52
62
 
53
- 1. Go to **Apps & Plugins → Configuration**, open **Chiplog**, tick **Enabled** and save. The defaults suit most boats; see [Configuration](#configuration).
63
+ 1. Go to **Apps & Plugins → Configuration**, open **Chiplog**, tick **Enabled** and save. The defaults suit most boats;
64
+ see [Configuration](#configuration-).
54
65
  2. Open **Webapps**: **Chiplog** is listed there. Its two pages are also reachable directly:
55
66
  - the logbook: `http://<your-server>:3000/signalk-chiplog/`
56
67
  - the tablet entry app: `http://<your-server>:3000/signalk-chiplog/entry/`
57
68
 
58
69
  The logbook is stored in a single SQLite file, `~/.signalk/plugin-config-data/signalk-chiplog/chiplog.sqlite`.
59
70
 
60
- ## How the logbook is written
71
+ ## How the logbook is written 📖
61
72
 
62
73
  ### Passages
63
74
 
64
75
  A **passage** is one logbook entry: from leaving a berth or anchorage to arriving at the next one.
65
76
 
66
- - **Departure.** A passage opens when the boat gets under way. It is dated from the moment the boat actually left — not the few minutes later when the decision was confirmed — and placed where it was last still.
67
- - **Short stops** do not end a passage. Stopping marks it as stopped; moving again within the tolerance (30 minutes by default) carries on with the same passage. Staying stopped longer closes it, with the arrival time set to when the boat stopped.
68
- - **Casting off** from the tablet opens the passage right away, before the boat moves (see [Departures](#departures-open-the-passage)).
69
- - **Power cuts and restarts.** If the server comes back after the boat has been still for longer than the tolerance, the passage is closed at its last movement. A short restart carries on with the same passage.
70
- - **Under way or stopped** comes from `navigation.state` when signalk-autostate provides it. Otherwise Chiplog averages speed over ground over 3 minutes: under way above 1 knot, stopped below half a knot. This keeps a boat swinging at anchor from starting passages.
71
-
72
- A passage that was split in two — a stop just longer than the tolerance, for instance — can be merged back from the logbook webapp. The stop the merge folds away is kept on the timeline as its own line, naming the place, since it would otherwise leave no trace once the merge takes the later passage's arrival as its own.
77
+ - **Departure.** A passage opens when the boat gets under way. It is dated from the moment the boat actually left — not
78
+ the few minutes later when the decision was confirmed — and placed where it was last still.
79
+ - **Arrival.** A passage closes as soon as the boat stops, dated and placed where it actually stopped: the arrival is
80
+ named and copied to the USB drive straight away.
81
+ - **Short stops.** Leaving again within the tolerance (30 minutes by default) of that arrival reopens the same passage
82
+ rather than starting a new one. The stop stays on its timeline as its own line, naming the place, followed by a
83
+ departure line when the boat sets off again. A passage you closed yourself from the webapp is never reopened.
84
+ - **Casting off** from the tablet opens the passage right away, before the boat moves (see
85
+ [Departures](#departures-open-the-passage)). Soon after an arrival, it goes to the passage that just ended instead,
86
+ which carries on once the boat moves.
87
+ - **Power cuts and restarts.** If the server comes back after the boat has been still for longer than the tolerance, the
88
+ passage is closed at its last movement. A short restart carries on with the same passage.
89
+ - **Under way or stopped** comes from `navigation.state` when signalk-autostate provides it. Otherwise Chiplog averages
90
+ speed over ground over 3 minutes: under way above 1 knot, stopped below half a knot. This keeps a boat swinging at
91
+ anchor from starting passages.
92
+
93
+ A passage that was split in two — a stop just longer than the tolerance, for instance — can be merged back from the
94
+ logbook webapp. The stop the merge folds away is kept on the timeline as its own line, naming the place, since it would
95
+ otherwise leave no trace once the merge takes the later passage's arrival as its own.
73
96
 
74
97
  ### Track and distance
75
98
 
76
- While under way, a track point is recorded every 15 seconds, plus extra points on a turn of 15° or more or a speed change of 1 knot, so tacks show on the map without bloating straight lines. The distance is the length of the track.
99
+ While under way, a track point is recorded every 15 seconds, plus extra points on a turn of 15° or more or a speed
100
+ change of 1 knot, so tacks show on the map without bloating straight lines. The distance is the length of the track.
77
101
 
78
102
  ### Engine or sail
79
103
 
@@ -84,84 +108,184 @@ Each passage is split into engine and sail periods covering the time under way.
84
108
  3. `navigation.state` (`motoring` / `sailing`);
85
109
  4. the configured default, **sail**.
86
110
 
87
- A wrong period can be corrected in the webapp. A correction to the period in progress holds until the engine data actually changes. Each actual switch is also logged as a line in the passage's timeline.
111
+ A wrong period can be corrected in the webapp. A correction to the period in progress holds until the engine data
112
+ actually changes. Each actual switch is also logged as a line in the passage's timeline.
88
113
 
89
114
  ### Instrument readings
90
115
 
91
- Readings are taken at departure, **every hour on the hour** during the passage (configurable), at arrival, and with each manoeuvre, note or sketch logged live, so a reef appears with the wind that called for it and a note with the conditions when it was written. Each reading holds whatever is available among position, speed and course over ground, heading, speed through water, true and apparent wind, depth, barometer, air and water temperature, the log and the hour counter of each engine — both engines of a twin-engine boat. A sensor that has gone silent is left blank rather than repeating an old value.
116
+ Readings are taken at departure, **every hour on the hour** during the passage (configurable), at arrival, and with each
117
+ manoeuvre, note or sketch logged live, so a reef appears with the wind that called for it and a note with the conditions
118
+ when it was written. Each reading holds whatever is available among position, speed and course over ground, heading,
119
+ speed through water, true and apparent wind, depth, barometer, air and water temperature, the log and the hour counter
120
+ of each engine — both engines of a twin-engine boat. A sensor that has gone silent is left blank rather than repeating
121
+ an old value.
92
122
 
93
123
  ### Automatic events
94
124
 
95
125
  Added to the timeline without anyone touching anything:
96
126
 
97
- - **Alarms** — any Signal K notification reaching `alarm` or `emergency` (man overboard, engine alarm, anchor watch…), and when it clears.
127
+ - **Alarms** — any Signal K notification reaching `alarm` or `emergency` (man overboard, engine alarm, anchor watch…),
128
+ and when it clears.
98
129
  - **Autopilot** — engaged, disengaged, mode changes.
99
- - **Wind** — true wind, averaged over 2 minutes, rising above 20 and 30 knots and falling back below them (configurable).
130
+ - **Wind** — true wind, averaged over 2 minutes, rising above 20 and 30 knots and falling back below them
131
+ (configurable).
100
132
  - **Barometer** — a fall of 4 hPa or more over 3 hours (configurable).
101
133
 
102
- An alarm at anchor between two passages goes to the passage that ended there, as long as the boat is within 1 nautical mile of that arrival.
134
+ An alarm at anchor between two passages goes to the passage that ended there, as long as the boat is within 1 nautical
135
+ mile of that arrival.
103
136
 
104
137
  ### Tide forecast
105
138
 
106
- When a passage opens, Chiplog fetches the predicted water height near the departure for the next 24 hours (configurable service, on by default) and shows it on the passage page: the departure's place, the high and low tide times and heights, and the height curve. Fetched once, at departure — not kept up to date afterwards. Offline is handled the same way as geocoding: retried for a while, then given up on quietly if the boat stays out of reach, or if the position simply has no tide (an inland lake). Hourly data, so times are accurate to within about half an hour — enough for a logbook reference, not for timing a lock or a bar crossing to the minute.
139
+ When a passage opens, Chiplog fetches the predicted water height near the departure for the next 24 hours (configurable
140
+ service, on by default) and shows it on the passage page: the departure's place, the high and low tide times and
141
+ heights, and the height curve. Fetched once, at departure — not kept up to date afterwards. Offline is handled the same
142
+ way as geocoding: retried for a while, then given up on quietly if the boat stays out of reach, or if the position
143
+ simply has no tide (an inland lake). Hourly data, so times are accurate to within about half an hour — enough for a
144
+ logbook reference, not for timing a lock or a bar crossing to the minute.
145
+
146
+ **Heights are relative to mean sea level, not a charted "hauteur d'eau".** The free tide service used has no notion of
147
+ chart datum (the lowest-astronomical-tide reference SHOM and other official tide tables use), so a reading here can be
148
+ several metres off what a nautical chart or an official tide table would say for the same moment — the app says so under
149
+ the chart. Tide _times_ are unaffected by this: a vertical offset does not move when high or low water falls.
150
+
151
+ ### Marine weather forecast
152
+
153
+ When a passage opens, Chiplog also fetches the marine weather forecast near the departure for the next 24 hours (on by
154
+ default, can be turned off) and shows it, titled with the departure place, as a table every 3 hours: sky and rain, wind
155
+ (Beaufort force, direction, speed and gusts), waves and swell (height, period, direction), pressure, visibility, air and
156
+ sea temperature, and current. A thunderstorm or a force 7 or more stands out in red. Each row gives the strongest gust
157
+ and the rain over its three hours. The PDF logbook lists the same forecast, titled the same way, in its own full-width
158
+ block above the day's table of events and observations.
107
159
 
108
- **Heights are relative to mean sea level, not a charted "hauteur d'eau".** The free tide service used has no notion of chart datum (the lowest-astronomical-tide reference SHOM and other official tide tables use), so a reading here can be several metres off what a nautical chart or an official tide table would say for the same moment — the app says so under the chart. Tide _times_ are unaffected by this: a vertical offset does not move when high or low water falls.
160
+ Arrows point where the wind, the sea and the current are going; the compass point next to them is where wind, waves and
161
+ swell come _from_, but where the current flows _to_, as sailors usually read them. Like the tide, it is fetched once at
162
+ departure and not updated afterwards; far from the sea, only the atmospheric part is shown.
109
163
 
110
164
  ### Place names
111
165
 
112
166
  Departures and arrivals are named automatically:
113
167
 
114
168
  1. **Known places first.** Within 200 m (configurable) of a place already named, that name is used.
115
- 2. **Otherwise online**, from OpenStreetMap's Nominatim service. Until it answers — at sea, out of reach of a network — the place shows its coordinates (e.g. `46.1466N 1.1686W`) as a provisional name, and the lookup is retried later.
116
- 3. **Corrections are remembered.** Renaming a departure or arrival in the webapp also renames that place for every later passage starting or ending nearby. Past passages keep the name they recorded.
169
+ 2. **Otherwise online**, from OpenStreetMap's Nominatim service. Until it answers — at sea, out of reach of a network —
170
+ the place shows its coordinates (e.g. `46.1466N 1.1686W`) as a provisional name, and the lookup is retried later.
171
+ 3. **Corrections are remembered.** Renaming a departure or arrival in the webapp also renames that place for every later
172
+ passage starting or ending nearby. Past passages keep the name they recorded.
173
+
174
+ ### Landmarks (amers)
175
+
176
+ Every position in the log is also given the way a paper logbook gives one — as a distance and a bearing **from a
177
+ landmark**, under the coordinates, in a lighter grey:
178
+
179
+ ```text
180
+ 46°08.88′N 001°12.90′W
181
+ 2,3 M ENE (065°) — Phare de Chauveau
182
+ ```
117
183
 
118
- ## The logbook webapp
184
+ - **The landmarks come from OpenStreetMap**, fetched area by area through Overpass and kept: lighthouses and major
185
+ lights, capes, named towers and other seamark landmarks, minor lights, isolated-danger and safe-water beacons,
186
+ harbours and marinas. The numbered marks of a channel are left out — "6 c" says nothing in a logbook.
187
+ - **The nearest useful one wins**, not simply the nearest: each kind carries a range (15 nm for a lighthouse, 3 for a
188
+ harbour…), narrowed by the light's own range when known, and the landmark closest relative to its range is the one
189
+ quoted. Offshore, beyond them all, the coordinates stay alone.
190
+ - **Past passages fill in by themselves** once their area has been fetched — the bearing is worked out when the page or
191
+ the PDF is drawn, never stored.
192
+ - Turn **Read each journal line against the nearest landmark** off to keep the boat off Overpass entirely.
193
+
194
+ ## The logbook webapp 💻
119
195
 
120
196
  Open **Chiplog** from the Signal K webapps, or `/signalk-chiplog/`. Reading needs no more than read-only access.
121
197
 
122
- - **Status bar** — under way under sail or engine, stopped, or waiting for data, with a link to the passage in progress. A warning shows when detection works from speed alone because signalk-autostate is missing.
123
- - **Logbook** — a summary above the list (number of passages, total distance, total time, across every passage logged, not just what is loaded), then passages grouped by day, newest first, with times, departure and arrival, distance, duration and an engine/sail bar. A passage across midnight appears on both days. Provisional place names are shown as such.
124
- - **Passage page** — summary (distance, duration, average speed, and the highest speed and wind seen), map of the track (OpenStreetMap with OpenSeaMap seamarks, which can be hidden) with a small boat marker at the selected point, a scrubber under the map to step back and forth through its history (defaulting to the latest point, so it shows the current position on a passage in progress) with a band of that point's time, SOG, COG, STW, TWS, TWD, TWA and AWA, the tide forecast near the departure (place, high/low times and heights, height curve) when one was fetched, the engine and sail periods, the boat's status (each engine's hour counter at departure and arrival and the hours run, and the tank levels and battery charge, voltage and current noted at departure), and the log: every reading and event in order, including handwritten notes. A passage in progress refreshes every minute. Each line's comment can be edited (read/write access); a manoeuvre or note the crew logged themselves can also be deleted — automatic lines (alarms, autopilot, weather, corrections) can only be annotated.
198
+ - **Status bar** — under way under sail or engine, stopped, or waiting for data, with a link to the passage in progress.
199
+ A warning shows when detection works from speed alone because signalk-autostate is missing.
200
+ - **Logbook** — a summary above the list (number of passages, total distance, total time, across every passage logged,
201
+ not just what is loaded), then passages grouped by day, newest first, with times, departure and arrival, distance,
202
+ duration and an engine/sail bar. A passage across midnight appears on both days. Provisional place names are shown as
203
+ such.
204
+ - **Passage page** — summary (distance, duration, average speed, the highest speed and wind seen, and the crew aboard),
205
+ map of the track (OpenStreetMap with OpenSeaMap seamarks, which can be hidden) with a small boat marker at the
206
+ selected point, a scrubber under the map to step back and forth through its history (defaulting to the latest point,
207
+ so it shows the current position on a passage in progress) with a band of that point's time, SOG, COG, STW, TWS, TWD,
208
+ TWA and AWA, the marine weather forecast every 3 hours from departure, the tide forecast near the departure (place,
209
+ high/low times and heights, height curve) when one was fetched, the engine and sail periods, the boat's status (each
210
+ engine's hour counter at departure and arrival and the hours run, and the tank levels and battery charge, voltage and
211
+ current noted at departure), and the log: every reading and event in order, including handwritten notes. A passage in
212
+ progress refreshes every minute. Each line's comment can be edited (read/write access); a manoeuvre or note the crew
213
+ logged themselves can also be deleted — automatic lines (alarms, autopilot, weather, corrections) can only be
214
+ annotated. Under each position, in grey, its bearing and distance from the nearest landmark.
125
215
  - **Corrections** (read/write access):
126
216
  - rename the departure, or the arrival once the passage is closed — a passage in progress has none yet to rename;
127
217
  - switch an engine period to sail or back;
128
218
  - close a passage in progress, e.g. to confirm an arrival;
129
219
  - merge with the previous or next passage;
130
220
  - delete a passage (admin).
131
- - **Export** — download the whole logbook or a date range as a PDF logbook to print, JSON, CSV or GPX, and write the abandon-ship copy to the USB drive now (admin). The PDF is written in the webapp's language and the device's time zone.
132
- - **Retrospective** (admin) — reconstruct past passages for a date range from an InfluxDB history (see [Retrospective analysis](#retrospective-analysis)).
221
+ - **Animation** — pick two dates and every passage between them replays on the map, one after another, the port time
222
+ skipped. The map follows the boat at a scale chosen for each passage — a short hop kept readable rather than
223
+ magnified, a long crossing allowed a wider view but never so wide the boat crawls across empty water — while a bubble
224
+ shows the speed, the distance covered since the start and the date. Play, pause and a slider over the animation's own
225
+ time, at ×0,5, ×1, ×2 or ×4. **Export MP4** saves it as a video in one of five shapes (Mobile 9:16, Portrait 3:4,
226
+ Square 1:1, Landscape 4:3, Widescreen 16:9). Everything happens in the browser: nothing is rendered or encoded on the
227
+ Signal K server, and the map tiles are the only thing downloaded.
228
+ - **Export** — download the whole logbook or a date range as a PDF logbook to print, JSON, CSV or GPX, and write the
229
+ abandon-ship copy to the USB drive now (admin). The PDF is written in the webapp's language and the device's time
230
+ zone.
231
+ - **Retrospective** (admin) — reconstruct past passages for a date range from an InfluxDB history (see
232
+ [Retrospective analysis](#retrospective-analysis-)).
133
233
 
134
234
  **Helm entry** in the top bar opens the tablet entry app.
135
235
 
136
- ## The tablet entry app
236
+ ## The tablet entry app 📱
237
+
238
+ Open `/signalk-chiplog/entry/` on the tablet, or follow **Helm entry** from the logbook. For an app-like, full-screen
239
+ launcher, use the browser's **Add to Home Screen** (Safari: Share → Add to Home Screen; Chrome: menu → Add to Home
240
+ screen / Install app).
137
241
 
138
- Open `/signalk-chiplog/entry/` on the tablet, or follow **Helm entry** from the logbook. For an app-like, full-screen launcher, use the browser's **Add to Home Screen** (Safari: Share → Add to Home Screen; Chrome: menu → Add to Home screen / Install app).
242
+ ### Crew
243
+
244
+ A compact, read-only list at the top of the screen shows who is aboard the current passage. The pencil next to the title
245
+ opens a dialog to tick names on or off from the crew list, and to add a new name (with an optional role, e.g. "skipper")
246
+ — typing one both logs it aboard and adds it to the list for next time, no admin login needed. Every name in that
247
+ dialog, including one just added, carries its own pencil to correct it and a trash icon to remove it from the list for
248
+ good; a removal asks to confirm first, and past passages that recorded the name keep it. A new passage starts with the
249
+ same crew as the one before it, ready to adjust rather than re-enter from scratch.
139
250
 
140
251
  ### Logging a manoeuvre
141
252
 
142
- Tap the manoeuvre: tack, gybe, reef in, shake out reef, sail change, anchor down, anchor up, moor, cast off, watch change. One tap logs it with the time, the position and an instrument reading.
253
+ Tap the manoeuvre: tack, gybe, reef in, shake out reef, sail change, anchor down, anchor up, moor, cast off, watch
254
+ change. One tap logs it with the time, the position and an instrument reading.
143
255
 
144
- - **Sail change** asks which sail went up: mainsail, genoa, jib, staysail, spinnaker, gennaker, code 0, storm jib, or any name you type.
256
+ - **Sail change** asks which sail went up: mainsail, genoa, jib, staysail, spinnaker, gennaker, code 0, storm jib, or
257
+ any name you type.
145
258
  - A banner then confirms it for 10 seconds, with two big buttons:
146
259
  - **Undo**, for a mistaken tap;
147
260
  - **Add a comment**, e.g. "25 kn, second reef".
148
261
 
149
262
  ### Departures open the passage
150
263
 
151
- With no passage open, **Cast off** and **Anchor up** are highlighted. Tapping one opens the passage at that moment, and the header shows "Ready to leave since…" until the boat moves. Chiplog then carries on with that same passage. If the boat never leaves, it closes like any long stop; **Undo** right after the tap removes it altogether.
264
+ With no passage open, **Cast off** and **Anchor up** are highlighted. Tapping one opens the passage at that moment, and
265
+ the header shows "Ready to leave since…" until the boat moves. Chiplog then carries on with that same passage. If the
266
+ boat does not leave within the tolerance (30 minutes by default), the passage closes at the cast-off; **Undo** right
267
+ after the tap removes it altogether. Within the tolerance of an arrival, the tap goes to the passage that just ended
268
+ instead of opening one: that passage carries on when the boat moves.
152
269
 
153
- Other entries made with no passage open go to the last passage if the boat is still within 1 nm of where it ended — a note once moored belongs to the passage that brought you there. Anywhere else, the app asks you to cast off first.
270
+ Other entries made with no passage open go to the last passage if the boat is still within 1 nm of where it ended — a
271
+ note once moored belongs to the passage that brought you there. Anywhere else, the app asks you to cast off first.
154
272
 
155
273
  ### Notes and handwriting
156
274
 
157
275
  - **Note** — type and tap **Log it**.
158
- - **Handwriting** — takes over the whole screen, with a toolbar above the pad: fine pen, thick pen, highlighter, eraser, undo, and a choice of colour (kept to the theme's colour in night mode, to spare night vision). Pen pressure also sets the line width. The eraser removes only what it actually touches, splitting a stroke rather than deleting all of it; undo steps back through strokes and erasing alike. Once a stylus has touched the pad, fingers are ignored, so a palm resting on the screen does not draw. Add a comment and tap **Log it** to send.
276
+ - **Handwriting** — takes over the whole screen, with a toolbar above the pad: fine pen, thick pen, highlighter, eraser,
277
+ undo, and a choice of colour (kept to the theme's colour in night mode, to spare night vision). Pen pressure also sets
278
+ the line width. The eraser removes only what it actually touches, splitting a stroke rather than deleting all of it;
279
+ undo steps back through strokes and erasing alike. Once a stylus has touched the pad, fingers are ignored, so a palm
280
+ resting on the screen does not draw. Add a comment and tap **Log it** to send.
159
281
 
160
- Handwritten notes appear as drawn — colour, pen or highlighter included — in the logbook's timeline and in the PDF export, not just on the tablet.
282
+ Handwritten notes appear as drawn — colour, pen or highlighter included — in the logbook's timeline and in the PDF
283
+ export, not just on the tablet.
161
284
 
162
285
  ### Latest entries
163
286
 
164
- Below, the latest entries of the current passage (or of the last one) are listed with their time. Each can take a comment, and your own entries can be deleted; a note's text can be edited.
287
+ Below, the latest entries of the current passage (or of the last one) are listed with their time. Each can take a
288
+ comment, and your own entries can be deleted; a note's text can be edited.
165
289
 
166
290
  ### Night mode
167
291
 
@@ -169,53 +293,64 @@ Below, the latest entries of the current passage (or of the last one) are listed
169
293
 
170
294
  ### When the Wi-Fi drops
171
295
 
172
- Keep logging. The header shows **Not connected** and how many entries are waiting. Each entry is kept on the tablet with the time it was made, and sent in order as soon as the server answers again, with the position the track recorded at that time. An entry sent just before the connection dropped is never logged twice.
296
+ Keep logging. The header shows **Not connected** and how many entries are waiting. Each entry is kept on the tablet with
297
+ the time it was made, and sent in order as soon as the server answers again, with the position the track recorded at
298
+ that time. An entry sent just before the connection dropped is never logged twice.
173
299
 
174
- If the server refuses a waiting entry when it comes back — typically nothing to attach it to — it is shown in red in the latest entries, to discard.
300
+ If the server refuses a waiting entry when it comes back — typically nothing to attach it to — it is shown in red in the
301
+ latest entries, to discard.
175
302
 
176
- **Starting the app with no connection** needs HTTPS (see [Troubleshooting](#the-tablet-app-does-not-start-without-a-connection)). Over plain HTTP the app still keeps entries through a dropout, as long as it was loaded beforehand.
303
+ **Starting the app with no connection** needs HTTPS (see
304
+ [Troubleshooting](#the-tablet-app-does-not-start-without-a-connection)). Over plain HTTP the app still keeps entries
305
+ through a dropout, as long as it was loaded beforehand.
177
306
 
178
307
  ### With Signal K security enabled
179
308
 
180
309
  Logging needs read/write access. The first time, the app shows **This tablet needs access**:
181
310
 
182
311
  1. Tap **Request access for this tablet**.
183
- 2. In the Signal K admin, open **Security → Access Requests**, and approve **Chiplog tablet** with **read/write** permission. Choose a token expiry of **NEVER** so the tablet is not locked out at sea.
312
+ 2. In the Signal K admin, open **Security → Access Requests**, and approve **Chiplog tablet** with **read/write**
313
+ permission. Choose a token expiry of **NEVER** so the tablet is not locked out at sea.
184
314
  3. Within a few seconds, the tablet is in. It keeps its token.
185
315
 
186
- To revoke it, delete the device under **Security → Devices**: the tablet asks for access again. **Sign in instead** uses a regular Signal K user account.
316
+ To revoke it, delete the device under **Security → Devices**: the tablet asks for access again. **Sign in instead** uses
317
+ a regular Signal K user account.
187
318
 
188
- ## Configuration
319
+ ## Configuration 🔧
189
320
 
190
321
  In the Signal K admin, **Apps & Plugins → Configuration → Chiplog**.
191
322
 
192
- | Setting | Default | What it does |
193
- | -------------------------------------------------- | --------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- |
194
- | Stop duration that ends a passage | 30 min | Shorter stops stay within the same passage. |
195
- | Under-way speed without navigation.state | 1 kn | Used only without signalk-autostate: under way above it, stopped below half of it. |
196
- | Propulsion assumed without engine data | sail | When nothing says whether the engine is running. Set to engine on a motorboat. |
197
- | Instrument snapshot interval | 60 min | Readings on this clock boundary during a passage. |
198
- | Track point interval | 15 s | A track point at least this often while moving. |
199
- | Place matching radius | 200 m | A departure or arrival this close to a known place takes its name. |
200
- | Name departures and arrivals with online geocoding | on | Turn off to never send positions online; places are then named after their coordinates until corrected. |
201
- | Geocoding service | `https://nominatim.openstreetmap.org` | Any Nominatim-compatible service, e.g. a self-hosted one. |
202
- | Fetch the tide forecast at departure | on | Turn off to never send the departure position online; the passage page then shows no tide. |
203
- | Tide service | `https://marine-api.open-meteo.com/v1/marine` | Any Open-Meteo Marine-compatible service, e.g. a self-hosted one. |
204
- | USB export directory | — | Where the abandon-ship copy is written, e.g. `/media/usb`. Empty turns the USB copy off. |
205
- | Automatic USB copy interval | 15 min | How often the USB copy is brought up to date. 0 turns the periodic copy off. |
206
- | Copy to the USB drive at each arrival | on | Brings the USB copy up to date as soon as a passage ends. |
207
- | Logbook language (PDF) | en | Language of the PDF logbooks on the USB drive (English or French). |
208
- | Ship's time zone (PDF) | the server's | Time zone of the PDF logbooks on the USB drive, e.g. `Europe/Paris`. |
209
- | Wind speed thresholds | 20, 30 kn | Logged when the 2-minute average true wind crosses them. |
210
- | Barometric drop warning | 4 hPa / 3 h | 0 turns it off. |
211
- | InfluxDB host (retrospective analysis) | — | Local or remote host of the InfluxDB 1.x database signalk-to-influxdb writes to. Empty turns the retrospective analysis page off. |
212
- | InfluxDB port | 8086 | |
213
- | InfluxDB database | — | |
214
- | InfluxDB username / password | — | Leave empty if the database needs none. |
215
- | InfluxDB protocol | http | `http` or `https`. |
216
- | InfluxDB vessel context | this server's own | Only needed running the replay from a different Signal K server than the one that wrote the history, e.g. development pointed at a production database. |
217
-
218
- ## Signal K data used
323
+ | Setting | Default | What it does |
324
+ | ---------------------------------------------------------------- | --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
325
+ | Stop duration within which a new departure continues the passage | 30 min | A passage closes when the boat stops; leaving again sooner reopens it, the stop kept as a stopover. |
326
+ | Under-way speed without navigation.state | 1 kn | Used only without signalk-autostate: under way above it, stopped below half of it. |
327
+ | Propulsion assumed without engine data | sail | When nothing says whether the engine is running. Set to engine on a motorboat. |
328
+ | Instrument snapshot interval | 60 min | Readings on this clock boundary during a passage. |
329
+ | Track point interval | 15 s | A track point at least this often while moving. |
330
+ | Place matching radius | 200 m | A departure or arrival this close to a known place takes its name. |
331
+ | Name departures and arrivals with online geocoding | on | Turn off to never send positions online; places are then named after their coordinates until corrected. |
332
+ | Geocoding service | `https://nominatim.openstreetmap.org` | Any Nominatim-compatible service, e.g. a self-hosted one. |
333
+ | Read each journal line against the nearest landmark | on | Fetches the landmarks of the areas sailed through from OpenStreetMap, so each position is also given as a bearing and distance from one. Turn off to keep the coordinates alone. |
334
+ | Landmark service (Overpass API) | `https://overpass-api.de/api/interpreter` | Any Overpass-compatible service, e.g. a self-hosted one. |
335
+ | Fetch the tide forecast at departure | on | Turn off to never send the departure position online; the passage page then shows no tide. |
336
+ | Marine service | `https://marine-api.open-meteo.com/v1/marine` | Any Open-Meteo Marine-compatible service, e.g. a self-hosted one. Serves the tide, and the sea state and current of the weather forecast. |
337
+ | Fetch the marine weather forecast at departure | on | Turn off to never send the departure position to the weather services; the passage page and the PDF then show no forecast. |
338
+ | Weather service | `https://api.open-meteo.com/v1/forecast` | Any Open-Meteo-compatible forecast service, e.g. a self-hosted one. |
339
+ | USB export directory | — | Where the abandon-ship copy is written, e.g. `/media/usb`. Empty turns the USB copy off. |
340
+ | Automatic USB copy interval | 15 min | How often the USB copy is brought up to date. 0 turns the periodic copy off. |
341
+ | Copy to the USB drive at each arrival | on | Brings the USB copy up to date as soon as a passage ends. |
342
+ | Logbook language (PDF) | en | Language of the PDF logbooks on the USB drive (English or French). |
343
+ | Ship's time zone (PDF) | the server's | Time zone of the PDF logbooks on the USB drive, e.g. `Europe/Paris`. |
344
+ | Wind speed thresholds | 20, 30 kn | Logged when the 2-minute average true wind crosses them. |
345
+ | Barometric drop warning | 4 hPa / 3 h | 0 turns it off. |
346
+ | InfluxDB host (retrospective analysis) | — | Local or remote host of the InfluxDB 1.x database signalk-to-influxdb writes to. Empty turns the retrospective analysis page off. |
347
+ | InfluxDB port | 8086 | |
348
+ | InfluxDB database | — | |
349
+ | InfluxDB username / password | — | Leave empty if the database needs none. |
350
+ | InfluxDB protocol | http | `http` or `https`. |
351
+ | InfluxDB vessel context | this server's own | Only needed running the replay from a different Signal K server than the one that wrote the history, e.g. development pointed at a production database. |
352
+
353
+ ## Signal K data used 🔌
219
354
 
220
355
  None of these is required except position and speed over ground; each feature uses what the boat has.
221
356
 
@@ -227,40 +362,74 @@ None of these is required except position and speed over ground; each feature us
227
362
  | Boat status | `tanks.*.*.currentLevel`, `.currentVolume`, `.capacity`, `.name`, `electrical.batteries.*.voltage`, `.current`, `.capacity.stateOfCharge`, `.temperature`, `.name` |
228
363
  | Events | `notifications.*`, `steering.autopilot.state`, `.mode`, `.engaged`, `.target`, `environment.wind.speedTrue`, `environment.outside.pressure` |
229
364
 
230
- ## Backups and abandon ship
231
-
232
- - **Download** — Export page → PDF (a paper-style logbook: a page per day with time, position, course, speed, wind, barometer, depth, engine or sail and remarks, handwritten notes included), JSON (the complete record, including tracks and handwriting), CSV (logbook lines in nautical units, for a spreadsheet) or GPX (tracks).
233
- - **USB drive** — leave a USB drive plugged into the server and set the USB export directory. Chiplog then keeps a copy on it by itself: every 15 minutes and as soon as a passage ends (both configurable). **Write to the USB drive now** on the Export page makes a copy immediately. The copy fills a `chiplog/` folder on the drive with one PDF, JSON, CSV and GPX file per passage, named so that sorting by name sorts by date — e.g. `2026-09-13_0612Z_La-Rochelle_Les-Sables-d-Olonne.csv` (times in UTC; a passage in progress ends in `underway`).
234
- - Each export writes only passages that are new or changed since the last one, and removes the files of passages deleted, merged or renamed. Other files in the folder are left alone.
365
+ ## Backups and abandon ship 🛟
366
+
367
+ - **Download** — Export page → PDF (a paper-style logbook: a page per day with time, position, course, speed, wind,
368
+ barometer, depth, engine or sail and remarks, handwritten notes and the crew aboard each passage included), JSON (the
369
+ complete record, including tracks and handwriting), CSV (logbook lines in nautical units, for a spreadsheet) or GPX
370
+ (tracks).
371
+ - **USB drive** — leave a USB drive plugged into the server and set the USB export directory. Chiplog then keeps a copy
372
+ on it by itself: every 15 minutes and as soon as a passage ends (both configurable). **Write to the USB drive now** on
373
+ the Export page makes a copy immediately. The copy fills a `chiplog/` folder on the drive with one PDF, JSON, CSV and
374
+ GPX file per passage, named so that sorting by name sorts by date — e.g.
375
+ `2026-09-13_0612Z_La-Rochelle_Les-Sables-d-Olonne.csv` (times in UTC; a passage in progress ends in `underway`).
376
+ - Each export writes only passages that are new or changed since the last one, and removes the files of passages
377
+ deleted, merged or renamed. Other files in the folder are left alone.
235
378
  - Each file is flushed to the drive before it appears, so pulling the drive out never leaves a half-written file.
236
379
  - The Export page shows the schedule, the last copy, the next one, and the last failure if any.
237
380
  - **The database** — `chiplog.sqlite` in the plugin's data folder can be copied while the plugin is stopped.
238
381
 
239
- ## Retrospective analysis
240
-
241
- Already have a history of the boat's Signal K data before Chiplog was installed, or from a period the plugin was stopped? The **Retrospective** page (admin access) reconstructs those passages from it, using the exact same detection Chiplog runs live — the same thresholds, so a reconstructed passage is one Chiplog would have logged had it been running at the time.
242
-
243
- - **Requires [signalk-to-influxdb](https://github.com/tkurki/signalk-to-influxdb)** (a recommended companion plugin) already having written the boat's data into an InfluxDB 1.x database — local or on another machine, set in **Apps & Plugins → Configuration**: host, port, database, and a username/password if it needs one.
244
- - Pick a **from** and **to** date on the Retrospective page and start it. It runs in the background — the page shows its progress — and can be cancelled at any point; a first quick pass finds when the boat moved, and only those stretches are then fetched and reconstructed, so weeks in port take next to no time. Once done, the page sums up what it added: passages, distance, time under engine and sail, track points and events; what was already reconstructed up to that point stays on record.
245
- - **Refuses to run while a passage is under way**, whatever the date range asked for — it would be reconstructing history through the same detection that is simultaneously tracking the live passage.
246
- - **Refuses a range that overlaps a passage already logged**, to avoid a duplicate or a conflicting one. Reconstruction only ever adds passages; it does not edit or merge into an existing one.
247
- - **What is not reconstructed**: Signal K alarms and emergencies (`sk_alarm` events), since a typical InfluxDB history does not archive notifications the way it does a numeric reading; strong-wind and falling-barometer events while the boat lay still between passages; and the extra track points recorded live on turns and speed changes — a reconstructed track has one point per **Track point interval**. Everything else read from a continuously published path — position, speed, wind, engine, autopilot, depth, barometer — is reconstructed the same as live.
248
-
249
- ## Privacy and online services
250
-
251
- - **Place names.** With geocoding on, the position of each departure and arrival that matches no known place is sent to the geocoding service — OpenStreetMap's public Nominatim by default. Nothing else is sent, and nothing at all when it is off.
252
- - **Tide forecast.** With it on, the departure position of each passage is sent to the tide service — the public Open-Meteo by default — once, at departure. Nothing at all when it is off.
253
- - **Maps.** The logbook webapp loads map tiles from OpenStreetMap and OpenSeaMap while the device viewing it is online. Offline, the track is still drawn, on a blank background.
254
- - **Retrospective analysis.** Running one queries the InfluxDB database set in the plugin configuration — the boat's own, local or remote, never a third party — for the Signal K history in the requested range.
382
+ ## Retrospective analysis 🕓
383
+
384
+ Already have a history of the boat's Signal K data before Chiplog was installed, or from a period the plugin was
385
+ stopped? The **Retrospective** page (admin access) reconstructs those passages from it, using the exact same detection
386
+ Chiplog runs live — the same thresholds, so a reconstructed passage is one Chiplog would have logged had it been running
387
+ at the time.
388
+
389
+ - **Requires [signalk-to-influxdb](https://github.com/tkurki/signalk-to-influxdb)** (a recommended companion plugin)
390
+ already having written the boat's data into an InfluxDB 1.x database — local or on another machine, set in **Apps &
391
+ Plugins → Configuration**: host, port, database, and a username/password if it needs one.
392
+ - Pick a **from** and **to** date on the Retrospective page and start it. It runs in the background — the page shows its
393
+ progress — and can be cancelled at any point; a first quick pass finds when the boat moved, and only those stretches
394
+ are then fetched and reconstructed, so weeks in port take next to no time. Once done, the page sums up what it added:
395
+ passages, distance, time under engine and sail, track points and events; what was already reconstructed up to that
396
+ point stays on record.
397
+ - **Refuses to run while a passage is under way**, whatever the date range asked for — it would be reconstructing
398
+ history through the same detection that is simultaneously tracking the live passage.
399
+ - **Refuses a range that overlaps a passage already logged**, to avoid a duplicate or a conflicting one. Reconstruction
400
+ only ever adds passages; it does not edit or merge into an existing one.
401
+ - **What is not reconstructed**: Signal K alarms and emergencies (`sk_alarm` events), since a typical InfluxDB history
402
+ does not archive notifications the way it does a numeric reading; strong-wind and falling-barometer events while the
403
+ boat lay still between passages; and the extra track points recorded live on turns and speed changes — a reconstructed
404
+ track has one point per **Track point interval**. Everything else read from a continuously published path — position,
405
+ speed, wind, engine, autopilot, depth, barometer — is reconstructed the same as live.
406
+
407
+ ## Privacy and online services 🔒
408
+
409
+ - **Place names.** With geocoding on, the position of each departure and arrival that matches no known place is sent to
410
+ the geocoding service — OpenStreetMap's public Nominatim by default. Nothing else is sent, and nothing at all when it
411
+ is off.
412
+ - **Landmarks.** With them on, the area a passage sailed through — a half-degree box, not its track — is sent to the
413
+ Overpass service, OpenStreetMap's public instance by default, once per area ever. Nothing at all when it is off.
414
+ - **Tide forecast.** With it on, the departure position of each passage is sent to the tide service — the public
415
+ Open-Meteo by default — once, at departure. Nothing at all when it is off.
416
+ - **Weather forecast.** With it on, the departure position of each passage is sent to the weather service and to the
417
+ marine service — both the public Open-Meteo by default — once, at departure. Nothing at all when it is off.
418
+ - **Maps.** The logbook webapp loads map tiles from OpenStreetMap and OpenSeaMap while the device viewing it is online.
419
+ Offline, the track is still drawn, on a blank background.
420
+ - **Retrospective analysis.** Running one queries the InfluxDB database set in the plugin configuration — the boat's
421
+ own, local or remote, never a third party — for the Signal K history in the requested range.
255
422
  - **Nothing else** leaves the boat. There is no account, analytics or cloud service.
256
423
 
257
- Map data and place names © OpenStreetMap contributors (ODbL); seamarks © OpenSeaMap; tide data © [Open-Meteo.com](https://open-meteo.com/) (CC BY 4.0).
424
+ Map data and place names © OpenStreetMap contributors (ODbL); seamarks © OpenSeaMap; tide and weather data ©
425
+ [Open-Meteo.com](https://open-meteo.com/) (CC BY 4.0).
258
426
 
259
- ## Troubleshooting
427
+ ## Troubleshooting 🐛
260
428
 
261
429
  ### "Chiplog is not running"
262
430
 
263
- The plugin is disabled or failed to start. Enable it under **Apps & Plugins → Configuration**, and check **Server → Server Logs** if it does not start.
431
+ The plugin is disabled or failed to start. Enable it under **Apps & Plugins → Configuration**, and check **Server →
432
+ Server Logs** if it does not start.
264
433
 
265
434
  ### "Detected from speed alone"
266
435
 
@@ -268,20 +437,27 @@ Chiplog works, but departures and arrivals are decided from speed only. The mess
268
437
 
269
438
  - **"install signalk-autostate"** — nothing publishes `navigation.state`. Install and enable signalk-autostate.
270
439
  - **"until signalk-autostate makes its first decision"** — normal for a minute or two after the server starts.
271
- - **"has not been updated since…"** — the source named stopped publishing. signalk-autostate republishes every 10 minutes while it receives position and speed: check that the GPS data reaches the server, and that the plugin is enabled.
272
- - **"is “default” (from nmea0183.AI)"** — another device publishes a navigational status Chiplog does not use, typically the boat's own AIS transponder, and signalk-autostate's value is not there to take over. Check that signalk-autostate is enabled; Chiplog prefers its value over any other source.
440
+ - **"has not been updated since…"** — the source named stopped publishing. signalk-autostate republishes every 10
441
+ minutes while it receives position and speed: check that the GPS data reaches the server, and that the plugin is
442
+ enabled.
443
+ - **"is “default” (from nmea0183.AI)"** — another device publishes a navigational status Chiplog does not use, typically
444
+ the boat's own AIS transponder, and signalk-autostate's value is not there to take over. Check that signalk-autostate
445
+ is enabled; Chiplog prefers its value over any other source.
273
446
 
274
447
  ### Passages are not opening
275
448
 
276
- Check that `navigation.position` and `navigation.speedOverGround` are updating under **Data → Browser** in the Signal K admin. Without current data, Chiplog neither opens nor closes passages, and the status shows **Waiting for data**.
449
+ Check that `navigation.position` and `navigation.speedOverGround` are updating under **Data → Browser** in the Signal K
450
+ admin. Without current data, Chiplog neither opens nor closes passages, and the status shows **Waiting for data**.
277
451
 
278
452
  ### "Your Signal K account is not allowed to do this"
279
453
 
280
- Security is on and you are not signed in, or your account is read-only. Corrections need read/write access; deleting passages and writing to the USB drive need an admin.
454
+ Security is on and you are not signed in, or your account is read-only. Corrections need read/write access; deleting
455
+ passages and writing to the USB drive need an admin.
281
456
 
282
457
  ### The tablet says the server does not accept device access requests
283
458
 
284
- Turn on **Allow New Device Registration** under **Security → Settings** in the Signal K admin, or use **Sign in instead**.
459
+ Turn on **Allow New Device Registration** under **Security → Settings** in the Signal K admin, or use **Sign in
460
+ instead**.
285
461
 
286
462
  ### "No passage to log this in"
287
463
 
@@ -289,43 +465,68 @@ No passage is open and the boat is not near the last arrival. Tap **Cast off** o
289
465
 
290
466
  ### The tablet app does not start without a connection
291
467
 
292
- Browsers only allow an app to start offline and to be installed over HTTPS. Turn on SSL under **Server → Settings** in the Signal K admin, restart, and open the app with `https://` on the SSL port. Over plain HTTP, the app still keeps entries through Wi-Fi dropouts once it is loaded.
468
+ Browsers only allow an app to start offline and to be installed over HTTPS. Turn on SSL under **Server → Settings** in
469
+ the Signal K admin, restart, and open the app with `https://` on the SSL port. Over plain HTTP, the app still keeps
470
+ entries through Wi-Fi dropouts once it is loaded.
293
471
 
294
472
  ### "The last copy failed" on the Export page
295
473
 
296
- The USB drive is not mounted at the configured directory, or cannot be written. The failure is also written once to the Signal K server log and shown in the plugin status. Plug the drive back in — and check it is mounted at the same place — and the next automatic copy catches up with everything that changed meanwhile.
474
+ The USB drive is not mounted at the configured directory, or cannot be written. The failure is also written once to the
475
+ Signal K server log and shown in the plugin status. Plug the drive back in — and check it is mounted at the same place —
476
+ and the next automatic copy catches up with everything that changed meanwhile.
297
477
 
298
478
  ### Wrong dates in the logbook
299
479
 
300
- The server's clock is wrong — common on a Raspberry Pi without a real-time clock. Set it from GPS with `signalk-set-system-time`.
480
+ The server's clock is wrong — common on a Raspberry Pi without a real-time clock. Set it from GPS with
481
+ `signalk-set-system-time`.
301
482
 
302
483
  ### Handwriting strokes are dropped or turn into typed text
303
484
 
304
- On an iPad, this is Apple's **Scribble** intercepting the Apple Pencil before the page sees it — a known iPadOS/Safari limitation with no web-page-level fix (Scribble runs beneath the browser). If it happens often, turn Scribble off under **Settings → Apple Pencil → Scribble**; a tablet dedicated to Chiplog does not need it.
485
+ On an iPad, this is Apple's **Scribble** intercepting the Apple Pencil before the page sees it — a known iPadOS/Safari
486
+ limitation with no web-page-level fix (Scribble runs beneath the browser). If it happens often, turn Scribble off under
487
+ **Settings → Apple Pencil → Scribble**; a tablet dedicated to Chiplog does not need it.
305
488
 
306
489
  ### A retrospective analysis finishes but reconstructs nothing
307
490
 
308
- Signal K tags historical data with the vessel it came from; a replay only reads data tagged for its own vessel. This shows up running the replay from a different Signal K server than the one that wrote the history — a development instance pointed at a production database, typically — since each server has its own vessel identity by default. The replay's error names the vessel contexts it actually found in the database; set the matching one as **InfluxDB vessel context** in the plugin configuration.
491
+ Signal K tags historical data with the vessel it came from; a replay only reads data tagged for its own vessel. This
492
+ shows up running the replay from a different Signal K server than the one that wrote the history — a development
493
+ instance pointed at a production database, typically — since each server has its own vessel identity by default. The
494
+ replay's error names the vessel contexts it actually found in the database; set the matching one as **InfluxDB vessel
495
+ context** in the plugin configuration.
309
496
 
310
497
  ### A retrospective analysis takes minutes then fails with no clear reason
311
498
 
312
- The InfluxDB server did not answer — unreachable, overloaded, a firewall or a VPN not connected. Each query now gives up after 30 seconds with the connection problem it ran into, rather than hanging until some far longer, less informative failure; check that the server named in the plugin configuration is reachable from wherever Signal K runs, and that it is not overloaded.
499
+ The InfluxDB server did not answer — unreachable, overloaded, a firewall or a VPN not connected. Each query now gives up
500
+ after 30 seconds with the connection problem it ran into, rather than hanging until some far longer, less informative
501
+ failure; check that the server named in the plugin configuration is reachable from wherever Signal K runs, and that it
502
+ is not overloaded.
313
503
 
314
504
  ### A retrospective analysis over several days makes the InfluxDB server unresponsive
315
505
 
316
- The replay first reads one mean speed per minute, a week at a time, then fetches only the stretches where the boat moved, six hours at a time and already reduced to one value per track interval, with a short pause between requests, specifically so this does not happen — a boat's InfluxDB often shares a resource-constrained host (a Raspberry Pi) with Signal K itself, and one query spanning weeks across every path at once can overwhelm it. If it still struggles on a very small or busy host, run the reconstruction over shorter date ranges instead of the whole history at once.
506
+ The replay first reads one mean speed per minute, a week at a time, then fetches only the stretches where the boat
507
+ moved, six hours at a time and already reduced to one value per track interval, with a short pause between requests,
508
+ specifically so this does not happen — a boat's InfluxDB often shares a resource-constrained host (a Raspberry Pi) with
509
+ Signal K itself, and one query spanning weeks across every path at once can overwhelm it. If it still struggles on a
510
+ very small or busy host, run the reconstruction over shorter date ranges instead of the whole history at once.
317
511
 
318
512
  ### Reconstructed passages keep their provisional place names for a while
319
513
 
320
- A replay wakes the geocoding lookup as soon as it finishes, but the lookup itself still needs internet access to succeed — the passage page shows the raw coordinates until it does. If the boat (or the Signal K server running the replay) has no internet access at the time, naming is retried on the same backoff as any other departure or arrival, up to an hour between attempts; nothing is lost, it just takes longer to resolve.
514
+ A replay wakes the geocoding lookup as soon as it finishes, but the lookup itself still needs internet access to succeed
515
+ — the passage page shows the raw coordinates until it does. If the boat (or the Signal K server running the replay) has
516
+ no internet access at the time, naming is retried on the same backoff as any other departure or arrival, up to an hour
517
+ between attempts; nothing is lost, it just takes longer to resolve.
321
518
 
322
- ## Limitations
519
+ ## Limitations 🚧
323
520
 
324
521
  - **Not yet:** a places page, and editing manoeuvre shortcuts from the webapps.
325
- - **Offline charts** are not provided.
522
+ - **Offline charts** are not provided; the animation draws the tracks on a blank sea when there is no connection.
523
+ - **The MP4 export needs a browser with WebCodecs** — Chrome, Edge, Safari 17 or Firefox 130 and later. Without it the
524
+ animation still plays on screen, and the export button is simply not offered.
525
+ - **A long animation takes a while to export**: every frame waits for its map before it is drawn, so the video is the
526
+ same whatever the connection was doing, but a long range means a lot of tiles. Turning the seamarks off halves them.
326
527
  - **One vessel per Signal K server**, and no per-crew-member authorship.
327
528
 
328
- ## Development
529
+ ## Development 🧑‍💻
329
530
 
330
531
  ```bash
331
532
  npm install # also copies the browser libraries into public/vendor/
@@ -334,10 +535,15 @@ npm run lint
334
535
  npm run demo:seed -- /tmp/chiplog-demo # a demo logbook to try the webapps with
335
536
  ```
336
537
 
337
- The functional specification is in [docs/SPEC.md](docs/SPEC.md), the data model in [docs/DATA_MODEL.md](docs/DATA_MODEL.md), and the REST API in [docs/API.md](docs/API.md). [CLAUDE.md](CLAUDE.md) describes the code layout and conventions.
538
+ The functional specification is in [docs/SPEC.md](docs/SPEC.md), the data model in
539
+ [docs/DATA_MODEL.md](docs/DATA_MODEL.md), and the REST API in [docs/API.md](docs/API.md). [CLAUDE.md](CLAUDE.md)
540
+ describes the code layout and conventions.
338
541
 
339
- `docs/screenshots/` holds the images the Signal K App Store shows for this plugin (`signalk.screenshots` in `package.json`), taken against a demo logbook (`npm run demo:seed`) with a real browser, e.g. `google-chrome --headless --window-size=1280,800 --screenshot=docs/screenshots/01-logbook.png http://localhost:3000/signalk-chiplog/?lang=en`. Retake them after a visible UI change.
542
+ `docs/screenshots/` holds the images the Signal K App Store shows for this plugin (`signalk.screenshots` in
543
+ `package.json`), taken against a demo logbook (`npm run demo:seed`) with a real browser, e.g.
544
+ `google-chrome --headless --window-size=1280,800 --screenshot=docs/screenshots/01-logbook.png http://localhost:3000/signalk-chiplog/?lang=en`.
545
+ Retake them after a visible UI change.
340
546
 
341
- ## License
547
+ ## License 📄
342
548
 
343
549
  MIT — see [LICENSE](LICENSE). Changes are listed in [CHANGELOG.md](CHANGELOG.md).