<feed xmlns='http://www.w3.org/2005/Atom'>
<title>nav.git/android-app/app/src/main/kotlin/org/terst/nav/data, branch main</title>
<subtitle>nav — android navigation app
</subtitle>
<id>https://git.terst.org/nav.git/atom?h=main</id>
<link rel='self' href='https://git.terst.org/nav.git/atom?h=main'/>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/'/>
<updated>2026-06-05T07:51:24+00:00</updated>
<entry>
<title>Fix wind grid deserialization: make forecast-only fields nullable</title>
<updated>2026-06-05T07:51:24+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-06-05T07:51:24+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=aeba2b21b2e495a100757f62a07f6eda512a4ab0'/>
<id>urn:sha1:aeba2b21b2e495a100757f62a07f6eda512a4ab0</id>
<content type='text'>
The batch wind-grid endpoint only requests windspeed_10m and
winddirection_10m, so temperature_2m, precipitation_probability, and
weathercode are absent from its response. Moshi required these fields
and threw, causing fetchWindGrid to silently fail.

Made those three fields nullable with null defaults in WeatherHourly.
Updated the two call sites in WeatherRepository that access them via
the full forecast endpoint to use safe-call syntax.

https://claude.ai/code/session_017TwkSjhzhmTcHKmVG5MWUa
</content>
</entry>
<entry>
<title>Fix wind particles never appearing</title>
<updated>2026-06-04T06:35:07+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-06-04T06:35:07+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=75c61c2b5b3fbda316dc4e82b6027d80ff7132d3'/>
<id>urn:sha1:75c61c2b5b3fbda316dc4e82b6027d80ff7132d3</id>
<content type='text'>
Two bugs prevented wind particles from rendering:

1. Retrofit URL-encoded commas in the batch lat/lon query strings
   (%2C instead of ,), so Open-Meteo rejected every grid fetch silently.
   Fixed with encoded=true on the @Query annotations.

2. loadWindGrid() was only called from onCameraIdleListener, so particles
   never started unless the user manually panned. Added an eager trigger
   on the first GPS fix using the map's current visible region.

Also added a log warning when fetchWindGrid fails so future failures are
visible in logcat.

https://claude.ai/code/session_017TwkSjhzhmTcHKmVG5MWUa
</content>
</entry>
<entry>
<title>Tech debt: delete com.example.androidapp ghost package, symlink TackDetector, fix forecast current hour</title>
<updated>2026-05-28T07:09:43+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-05-28T07:09:43+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=c498b33300d260bbe64bec49de9ef78d9a322a6d'/>
<id>urn:sha1:c498b33300d260bbe64bec49de9ef78d9a322a6d</id>
<content type='text'>
- Deleted all 18 stale source files in com.example.androidapp (main + test)
  that duplicated org.terst.nav implementations from an earlier namespace
- Fixed the 3 tide model files (TidePrediction/Station/Constituent) whose
  package declarations read com.example.androidapp.data.model despite living
  in org.terst.nav.data.model directories
- Fixed HarmonicTideCalculator.kt imports to match the corrected package
- Fixed TideModelTest.kt package declaration
- Migrated HarmonicTideCalculatorTest to org.terst.nav.tide with correct imports
- Replaced test-runner's TackDetector.kt copy with a symlink to the android-app
  canonical source so the two can never diverge again
- Fixed addGpsPoint to pick the current wall-clock hour's forecast slot instead
  of always using the app-start hour (first item in forecast list)

https://claude.ai/code/session_01KXYBuAHZkvv63DeUG6XaZD
</content>
</entry>
<entry>
<title>Add hidden dev log (long-press drag handle)</title>
<updated>2026-04-11T18:05:59+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-11T18:05:59+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=ec2bc313ba88477aeefcb5c943ed387de2883ee8'/>
<id>urn:sha1:ec2bc313ba88477aeefcb5c943ed387de2883ee8</id>
<content type='text'>
NavLogger is a 200-entry in-memory ring buffer with format:
  HH:mm:ss.SSS LEVEL tag: message

Entries are written at:
- App start
- First GPS fix (lat/lon/sog/cog)
- fetchCurrentConditions: request params + full success summary
  (wind, temp, waves, swell, current) or exception class+message
- fetchForecastItems: request params + item count or error

DevLogSheet (BottomSheetDialogFragment) shows the log in a
monospace ScrollView with Copy and Clear buttons. Trigger: long-press
the drag handle bar on the instrument bottom sheet.

Primary use: copy the log and paste it to Claude to diagnose
conditions API failures without needing adb.

https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
</content>
</entry>
<entry>
<title>Remove bad ASA external links; fix conditions not loading on startup</title>
<updated>2026-04-11T08:31:11+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-11T08:31:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=45f56beef36a9888aef3773ac10f089c3d2c3b00'/>
<id>urn:sha1:45f56beef36a9888aef3773ac10f089c3d2c3b00</id>
<content type='text'>
- Strip all three unverified external link cards (ASA courses, ASA online,
  Quizlet flashcards) from the Learn tab — asa.com is a Brazilian financial
  site, not the American Sailing Association
- Remove dead openUrl() click handlers and unused Intent/Uri imports from LearnFragment
- Parallelize the two sequential API calls in fetchCurrentConditions so the HUD
  populates in ~half the time (weather + marine fetched concurrently via async/await)
- Add onFailure logging in loadConditions so errors are visible in logcat instead
  of silently swallowed
- Eagerly call loadConditions in the setStyle callback as a startup backstop: the
  camera-idle listener fires before GPS fixes and the initial position may be (0,0),
  so this guarantees a real fetch once the style is ready with a valid camera position

https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
</content>
</entry>
<entry>
<title>Area conditions HUD redesign: map-center conditions refresh + boat HUD strip</title>
<updated>2026-04-10T09:30:55+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-10T09:30:55+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=4daf9dfcd00844075768e5b0d1dd7a17002a26d0'/>
<id>urn:sha1:4daf9dfcd00844075768e5b0d1dd7a17002a26d0</id>
<content type='text'>
- Persistent top-of-map HUD strip (SOG/COG/BSP/Depth) replaces instrument grid in bottom sheet
- Bottom sheet now shows area conditions only (Wind/Temp/Baro + wave forecast) — always visible
- loadConditions() fires on every camera idle event so panning the map refreshes conditions
- Crosshair appears at map center while panning; hides when following GPS
- Added tempC field to MarineConditions (already fetched from Open-Meteo hourly)
- InstrumentHandler slimmed to area conditions only; updateDisplay() removed
- LocationService pipes nmeaBoatSpeedData from NmeaStreamManager to companion flow

https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
</content>
</entry>
<entry>
<title>merge: reconcile master particle-wind work with origin/main redesign</title>
<updated>2026-04-09T09:39:20+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-09T09:39:20+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=e109271f563327e461191c7c2988243c75cd58ab'/>
<id>urn:sha1:e109271f563327e461191c7c2988243c75cd58ab</id>
<content type='text'>
Merged divergent branches (common ancestor a9d87b6). Took origin/main
as base (layer manager, recenter, quit button, GPX tracks, marine
conditions, dark theme, user position layer, active/past track layers)
and layered in particle wind simulation work:

- MapHandler: added setupWindLayer, updateWindLayer, updateWindGridLayer;
  kept their user-pos layer, follow/recenter state, active+past tracks
- WeatherRepository: kept their fetchCurrentConditions, added fetchWindGrid
- MainViewModel: kept their track/marine/summary changes, added windGrid
  StateFlow, loadWindGrid, buildGrid
- MainActivity: kept their full UI (layer picker, quit, recenter, fade
  animations), added particleWindView wiring, weatherLoaded guard,
  windArrow/windGrid observers
- activity_main.xml: took their LinearLayout redesign, added ParticleWindView
  overlay inside ConstraintLayout

https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
</content>
</entry>
<entry>
<title>feat(wind): Level 1 — 4×5 viewport grid of wind arrows</title>
<updated>2026-04-08T23:51:36+00:00</updated>
<author>
<name>Claude</name>
<email>noreply@anthropic.com</email>
</author>
<published>2026-04-08T23:51:36+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=943d823d71ed5737e8f5b62d75f5d93ac1308d7d'/>
<id>urn:sha1:943d823d71ed5737e8f5b62d75f5d93ac1308d7d</id>
<content type='text'>
- WeatherApiService: batch endpoint getWeatherForecastBatch with
  comma-separated lat/lon → List&lt;WeatherResponse&gt;
- WeatherRepository.fetchWindGrid: chunks 20 points into two calls of 10,
  maps each response to a WindArrow at its returned lat/lon
- MainViewModel.loadWindGrid(bounds): builds a 4×5 grid from visible map
  bounds, calls fetchWindGrid, emits to windGrid StateFlow
- MapHandler.setupWindGridLayer: GeoJSON source + SymbolLayer reusing the
  wind-arrow icon; MapHandler.updateWindGridLayer: pushes feature collection
- MainActivity: stores mapLibreMapRef; calls setupWindGridLayer after style
  loads; addOnCameraIdleListener fires loadWindGrid on every pan/zoom;
  observes windGrid → updateWindGridLayer

https://claude.ai/code/session_01HXPjBsogsJVRwCiekDGkJX
</content>
</entry>
<entry>
<title>refactor: unify core models and finish org.terst.nav migration</title>
<updated>2026-04-04T07:45:41+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-04T07:45:41+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=97715ab4007ff3101f58edf4385cef1fc3d1615b'/>
<id>urn:sha1:97715ab4007ff3101f58edf4385cef1fc3d1615b</id>
<content type='text'>
</content>
</entry>
<entry>
<title>feat(instruments): add forecast wind, wave, swell and current from Open-Meteo</title>
<updated>2026-04-03T07:38:22+00:00</updated>
<author>
<name>Peter Stone</name>
<email>thepeterstone@gmail.com</email>
</author>
<published>2026-04-03T07:38:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.terst.org/nav.git/commit/?id=9417a7c6b08da362ad97e85973b7570e05d4f0b5'/>
<id>urn:sha1:9417a7c6b08da362ad97e85973b7570e05d4f0b5</id>
<content type='text'>
- Add swell params to MarineApiService request
- Add swell fields to MarineHourly model
- Add MarineConditions snapshot model
- Add WeatherRepository.fetchCurrentConditions() (first forecast hour)
- Add MainViewModel.loadConditions() + marineConditions StateFlow
- Add Forecast section to instrument sheet: Curr / Wave / Swell
- Populate TWS from forecast wind speed on first GPS fix
- Trigger loadConditions() once on first GPS position received

Co-Authored-By: Claude Sonnet 4.6 &lt;noreply@anthropic.com&gt;
</content>
</entry>
</feed>
