Repository navigation
AgOpenWeb v26.7.1
Pre-releaseSix weeks of work since 26.7.0: 361 pull requests. Most of them are fixes that bring guidance, U-turns, sections, tram lines and fields in line with AgOpenGPS, checked against AgOpenGPS's own code by parity tests. This is a beta release; please report anything that's off with Bug Report Dump → Send Report in the main menu.
Apps
- Every head shows the web client in the system's own web view: a plain Activity + WebView on Android, WKWebView on iOS and Photino.NET on Windows, macOS and Linux. Avalonia is gone from the apps.
- The app starts without waiting for the network, and only one copy runs per device (Android, desktop).
- Desktop: it asks before the window closes, keeps its size and place between runs, has a restore size and the AgOpenWeb icon, no longer crashes on close on macOS, and Start Fullscreen works. On Linux touchscreens, menus stay open and text fields take focus after a finger tap.
- Android keeps its data in external files storage, so you can reach it over USB. The startup crash with an accessibility service on is fixed.
- The screen stays on while the app is in front.
Guidance and tracks
- Stanley, Pure Pursuit and contour steering follow AgOpenGPS's controllers and are checked against its code.
- The AgOpenGPS pass model: the reference line is the edge between passes. Pass labels read "1R" and the light bar shows which side of the line the pass is on.
- Track parity:
- points are recorded at the pivot;
- the pass is picked again every 0.66 s;
- a hidden or deleted track stops guidance;
- offset passes go round the outside of a bend;
- curve passes reach past A and B.
- New ways to make a track: A+ at a typed heading, AB lines from typed coordinates, water pivot tracks, Bnd. Curve with corners rounded to the U-turn radius, All Edges (a curved side becomes a curve), and drawing a curve between two taps on the fence.
- Nudge and snap work as in AgOpenGPS, and Ref Nudge moves the reference line and saves it.
- Cycle Lines and Auto Track are on the right panel, with Cycle Back. Driven tracks start at the first pass, on the side you choose.
- With a tool offset, the tool runs on the pass, not the tractor, and coverage is no longer drawn at twice the offset.
- Guidance bar: a light bar or a steer bar, set in Screen & Alerts. It shows the distance to the line with AutoSteer off.
U-turns
- Wide rows (wider than twice the turn radius) follow the turn line as AgOpenGPS does. The K-turn, the Keyhole style and the omega fallback are built.
- Manual U-turns:
- they work with the YouTurn toggle off;
- they use the configured radius and follow a curve where the tractor is;
- they end on the target pass when the tractor is off its line.
- Skip changes, nudges and a change of track plan the turn again. The turn lands on the pass it was built for.
- Reversing out of a turn cancels it. A missed turn, or no pass to turn onto, sounds once.
- Tap the arrow to swap the turn's direction. "Ignore worked tracks" never turns onto a worked pass.
- Snake order plans every pass inside the field. The end of the field ends the turns.
Sections, coverage and tram lines
- Sections switch off over every inner boundary (drive-through ones too), while reversing, and when GPS is lost. Only the configured sections are sent as on, and a module's steer switch can engage the sections.
- Out of bounds: AutoSteer stays on, the boundary turns red and PGN 239 sends geoStop.
- Coverage:
- it's kept on reopen and when leaving a field;
- it's saved as world-anchored tiles in milliseconds, even on large fields;
- see-through worked area and a memory leak are fixed.
- The field data card shows total, worked, remaining, overlap, rate and trip.
- Tram lines come back when a field reopens, follow a renamed track and go with a deleted one. An active AB line gets tram lines parallel to it, and tram lights use AgOpenGPS's wheel check.
- Hydraulic lift and tram lights in the headland work as in AgOpenGPS.
Fields, boundaries and headlands
- A field is now one
field.geojsonfile. AgOpenGPS field files are imported once, then deleted. The format is documented for other tools inDocs/FIELD_FILE_FORMATS.md. - The headland is right on L-, U- and C-shaped fields. A distance that leaves nothing of the field is refused.
- When the outer boundary changes, the headland and tram lines are rebuilt. Headland lines drawn on the old boundary are removed, and you're told which.
- An inner boundary needs the outer boundary first. Delete Boundary removes the outer one only when it's the last.
- Field names that differ only in capitals are refused. Closing a field ends a boundary recording.
- Imports: ISO-XML (curves, every field in the file, lines without a boundary), KML/KMZ and AgShare downloads with exact coordinates. ISO-XML v4 is exported on field close.
- Aerial imagery has an on/off switch and works for any boundary.
GPS and NTRIP
- Each sentence family has its own decoder:
$KSXT(Bynav/Unicore) and Unicore INSPVAX are supported;- one fix per receiver epoch;
- whole lines from any datagram.
- Heading and roll can come from the steer module's IMU (PGN 253) or an external IMU (PGN 211).
- Heading: Fix/Dual heading as in AgOpenGPS. The first heading needs real travel; tap the vehicle to reset the direction.
- When GPS data is lost, AutoSteer and sections stop and a warning shows over the map. Steering also stops when guidance goes stale.
- NTRIP:
- RTCM is forwarded as whole messages, paced like AgIO, to the GPS module's own address (broadcast as fallback or by setting);
- a main and a fallback service;
- the client is sturdier and the report explains itself;
- no Kansas GGA for VRS casters;
- closing a field keeps corrections flowing.
- Network IO shows what the caster sends, how old the receiver's corrections are, a System Data card and NTRIP on/off.
Modules and add-ons
- New PGNs:
- PGN 100 (corrected position) for seed monitors and rate controllers;
- PGN 214 GPS_Out;
- PGN 247 vehicle geometry;
- PGN 240/241 ISOBUS task controller;
- Rate Control's loopback PGNs and remote section switches (PGN 234).
- PGN 254, 239, 252 and 251 are byte-for-byte AgOpenGPS frames. PGN 254's cross-track byte and 251's framing are fixed.
- VT cards show ISOBUS implements' own screens, through a link gateway or an slcan USB adapter.
- Web cards show an add-on's own web page in a card, floating or in a pane beside the map.
Setup and settings
- Steer wizard: steps fit the screen, it waits for the module to arm, and the CPD and Ackermann tests give clear feedback.
- Min PWM and proportional gain reach 200, and the WAS offset can be set by hand, as in AgOpenGPS.
- The tool profile saves the Machine, U-Turn and Tram tabs, and the vehicle profile saves AHRS roll calibration.
- Settings sliders have − / + buttons and a typed value. A UI Size setting scales the controls, not the map.
- On-screen keyboard: caps lock, a symbols key, and the first key replaces the value. The field's text shows when the keyboard covers it.
Translations
- The web UI is translatable on Weblate, in more than 20 languages. A CI check makes sure every translated label fits the English layout.
Bug reports
- Send Report sends a dump straight from the app, with an offline outbox, screenshots and files. The dump includes settings, coverage tiles, U-turn state, NTRIP/RTCM logs and five minutes of GPS log. Credentials are left out.
AgOpenWeb v26.7.1
Use the Beta — it is rebuilt from
developon demand and daily when there are changes, and is the build to report issues against.
Version: 26.7.1
Self-contained — no .NET install needed. Pick the set that matches how you'll run it.
(In every mode the host also serves http://<host>:5174 on the LAN, so other devices
connect in a browser.)
🖥️ Desktop — a window with the guidance UI (host runs in-process)
| OS | Download | Run |
|---|---|---|
| Windows x64 | agopenweb-win-x64.zip |
run AgOpenWeb.Desktop.exe (needs the WebView2 Runtime, pre-installed on Windows 11) |
| macOS (Apple silicon) | agopenweb-macos-arm64.dmg |
drag AgOpenWeb to Applications, launch (first launch: right-click → Open) |
| Linux x64 / arm64 | agopenweb-launcher-linux-<arch>.tar.gz |
extract, ./run.sh (needs system WebKitGTK — see the bundle README) |
🛰️ Headless — no window; UI in a browser/tablet at http://<host>:5174 (in-cab mini-PC / SBC)
| OS | Download | Install (auto-starts on boot) |
|---|---|---|
| Linux x64 / arm64 | agopenweb-linux-<arch>.tar.gz |
sudo ./install.sh --from app (systemd; installs ICU + libfontconfig/libGL) |
| Windows x64 | agopenweb-win-x64.zip |
right-click install-service.cmd → Run as administrator (Windows Service) |
📱 Mobile — all-in-one (host + UI on the device)
| Device | Download | Install |
|---|---|---|
| Android | agopenweb-android.apk |
sideload |
See each download's bundled README for full prerequisites and details.
What's Changed
- Issue templates: welcome reports in any language by @chriskinal in #159
- Android: keep app data in external files storage (reachable over USB) by @chriskinal in #161
- Fixed UI overflow of "Zero WAS" button by @manih98 in #162
- iOS: remove leftovers from the native-UI era by @chriskinal in #164
- iOS: bump build number to 3 (TestFlight 26.7.0) by @chriskinal in #165
- Fix manual U-turn never completing in a field with no headland (#163) by @chriskinal in #166
- Steer wizard: clear feedback in the CPD / Ackermann circle tests (#154) by @chriskinal in #167
- Manual U-turns work with the YouTurn toggle off (AgOpenGPS parity) by @chriskinal in #168
- Stop steering when guidance goes stale; log GPS/pipeline/UI stalls (#169) by @chriskinal in #171
- Steer wizard: fit every step without vertical scrolling (#154) by @chriskinal in #177
- Bug Report Dump: include GPS/dual/IMU/AutoSteer settings; redact credentials by @chriskinal in #178
- Lateral snap: keep the heading-direction flag current (#172) by @chriskinal in #179
- Sections: Auto sections off while reversing (#173) by @chriskinal in #180
- Steer wizard max angle: require real wheel movement; fix switch gate polarity (#170) by @chriskinal in #181
- U-turn fallback: anchor the turn on the pass line, not the tractor (#174) by @chriskinal in #182
- Coverage: keep the worked area on a display-quality change (#175) by @chriskinal in #183
- Web map: remember the camera view mode across restarts (#176) by @chriskinal in #184
- Stanley: integral offset follows the travel direction (AB lines and curves) by @chriskinal in #185
- Contour: keep the strip while steering; lock follows AutoSteer by @chriskinal in #186
- U-turn: re-plan a planned turn after a nudge; drop stale target pass by @chriskinal in #187
- Coverage: keep painting after Delete Applied Area while sections are on by @chriskinal in #189
- AgShare download: exact coordinates, keep local files, sane rings by @chriskinal in #190
- NTRIP: check the caster's reply, report rejections, fix reconnect by @chriskinal in #191
- Interop: ISOXML GPN ids and boundary order, Twol tracks, old Sections.txt by @chriskinal in #192
- Plans: AgShare re-download vs stale field.geojson by @chriskinal in #193
- Coverage: worked area for jobs imported from an old Sections.txt by @chriskinal in #194
- Fix antenna position images in autosteer wizard by @sakisdog in #188
- Tests: YouTurnCycleTests sets up its own config by @chriskinal in #195
- Android launcher: fix startup crash when an accessibility service is enabled by @sakisdog in #196
- Plans: remove Avalonia (system web views on each head) by @chriskinal in #197
- Plans: new launchers keep the screen on by @chriskinal in #199
- Coverage: keep a job's coverage on reopen; atomic, consistent saves by @chriskinal in #200
- Coverage: autosave in milliseconds instead of seconds on large fields by @chriskinal in #202
- Coverage: save a job as world-anchored tiles, rewriting only what changed by @chriskinal in #203
- Plans: move the coverage tiled persistence plan to Completed by @chriskinal in #204
- Fields: one-way import of AgOpenGPS field files into field.geojson by @chriskinal in #205
- Fields: tracks, flags and headland lines live in field.geojson by @chriskinal in #206
- Fields: background image in field.geojson; stop saving tram lines by @chriskinal in #207
- Fields: contours, recorded paths and the elevation log out of AgOpenGPS files by @chriskinal in #208
- Coverage: delete Sections.txt once its job is saved as tiles by @chriskinal in #209
- Plans: move the file-format modernization plan to Completed by @chriskinal in #210
- Default IsMetric to true and fix false fallback reads by @sakisdog in #201
- Shell: keep the screen on while the app is in front by @sakisdog in #198
- Docs: field and coverage file formats for AgShare by @chriskinal in #211
- Plans: jobs record the implement, Finish on close, locked jobs by @chriskinal in #212
- NTRIP: pace RTCM to the GPS module like AgIO (#169) by @chriskinal in #213
- Heading: don't use $PANDA's IMU heading as the dual heading (#157) by @chriskinal in #214
- Steer wizard: keep AutoSteer off and centre before hand-back (#154) by @chriskinal in #215
- NTRIP: forward RTCM to the modules' subnet, not a literal 192.168.5 by @chriskinal in #216
- CI: manual runs refresh the nightly; nightly shows build time + commit by @chriskinal in #217
- Use the $PAOGI yaw rate for pose prediction (#157) by @chriskinal in #220
- Steer bar shows when selected (#219) by @chriskinal in #221
- Light/steer bar: readout arrow no longer overlapped; pass number on its own line (#219) by @chriskinal in #223
- Web UI translation infrastructure (#143) by @chriskinal in #222
- Avalonia removal, phase 0: shared cleanup by @chriskinal in #224
- Coverage: fix the see-through worked area on live clients, and a memory leak by @chriskinal in #226
- Simulator: Flip turns the tractor around instead of reversing it by @chriskinal in #227
- Manual U-turn on a curve follows the curve where the tractor is by @chriskinal in #228
- Avalonia removal, phase 1: Android head on a plain Activity + WebView by @chriskinal in #229
- Avalonia removal, phase 2: iOS head on a plain UIApplicationDelegate + WKWebView by @chriskinal in #230
- Avalonia removal, phase 3: Desktop launcher on Photino.NET by @chriskinal in #231
- Avalonia removal, phase 4: docs and About page by @chriskinal in #232
- Manual U-turn at the configured radius, not half the pass offset (#156) by @chriskinal in #233
- Heading: hold the last heading on a $PANDA interlude without an IMU (#157) by @chriskinal in #234
- Bug report: include the job's coverage tiles, keep the panel open over the map by @chriskinal in #235
- Prevent module connectivity flapping over Wi-Fi during NTRIP streaming by @sakisdog in #218
- Manual U-turn ends on the target pass when the tractor is off its line (#156) by @chriskinal in #236
- Bug report GPS log: heading inputs and five minutes instead of one by @chriskinal in #237
- Vehicle config: mark the active antenna offset side (#238) by @chriskinal in #239
- Steer wizard: wait for the module to arm, and retry once, before giving up (#240) by @chriskinal in #243
- Translations doc: Weblate component licence is Apache-2.0 by @chriskinal in #244
- fix(profile): persist AHRS roll calibration settings in vehicle profile by @sakisdog in #248
- Tool profile: save the Machine tab (hydraulic lift, user values, relay pins) by @chriskinal in #250
- i18n: clean the English source before translators start (#143) by @chriskinal in #252
- Plan: RTCM forwarding by message, not by byte by @chriskinal in #253
- NTRIP: frame the RTCM stream and report what the caster sends (RTCM plan, phase 1) by @chriskinal in #254
- RTCM bench scripts, and the module-leg and long-outage measurements by @chriskinal in #255
- Guard test: the GPS fix filters are in use, not unused by @chriskinal in #256
- NTRIP: forward whole RTCM messages; newest epoch on a backlog; decode chunked replies (RTCM plan, phase 2) by @chriskinal in #257
- NTRIP: byte-budget pacing, a late sender catches up (RTCM plan, phase 3) by @chriskinal in #258
- NTRIP: send RTCM to the GPS module's own address; broadcast as fallback or by setting (RTCM plan, phase 4) by @chriskinal in #259
- Network IO: show what the caster sends and how old the receiver's corrections are (RTCM plan, phase 5) by @chriskinal in #260
- GPS heading: the first heading needs real travel; tap the vehicle to reset direction by @chriskinal in #261
- U-turn config: spell out "Distance from boundary" (#246) by @chriskinal in #262
- README: CI and translation status badges, and a pointer to Weblate (#251) by @chriskinal in #263
- Steer wizard: Ackermann Record sets neutral itself; speed target on both circle tests (#154) by @chriskinal in #264
- Network IO: System Data card for the GPS module by @chriskinal in #265
- Map taps: wider tap slop for touch, ignore hover moves (#266) by @chriskinal in #268
- Bug report: download the zip to the device in hand by @chriskinal in #269
- Desktop launcher: the AgOpenWeb icon in place of the Avalonia logo by @chriskinal in #270
- Manual U-turn: complete the turn on narrow passes; skip changes apply at once (#272) by @chriskinal in #274
- Speed unit: kph everywhere in the UI (#275) by @chriskinal in #276
- Pose prediction: don't use the GPS sentence's yaw rate by @chriskinal in #279
- Network IO: NTRIP on/off (#278) by @chriskinal in #280
- extra guide lines are extended 3,000 meters in both directions acros… by @sakisdog in #281
- Tool offset: Zero direction button sets the offset to 0 (#283) by @chriskinal in #284
- NTRIP: closing a field keeps the corrections flowing (#285) by @chriskinal in #286
- GPS data lost: stop autosteer and sections, warn over the map by @chriskinal in #287
- NMEA: decoder per sentence family; $KSXT from Bynav/Unicore receivers by @chriskinal in #288
- Plan: parsing multi-sentence receiver fixes in the app by @chriskinal in #289
- Tools: nmea-capture.py records GPS datagrams with boundaries and times by @chriskinal in #290
- Tests: code-path continuity guards by @chriskinal in #293
- CI: the CONTRIBUTING rules as checks by @chriskinal in #294
- CI: the iOS head on pull requests, with CA1305 as an error by @chriskinal in #295
- Threading model: pay down the allowlisted debt by @chriskinal in #296
- Headland section control: outside the boundary counts as headland by @chriskinal in #297
- GPS ingest: whole lines from any datagram, source ports, refusal reasons by @chriskinal in #298
- iOS: simulator builds run on the interpreter, no AOT by @chriskinal in #299
- GPS: one fix per receiver epoch from standard sentences; Unicore INSPVAX by @chriskinal in #300
- GPS: a Unicore '#' log marks the GPS source address too by @chriskinal in #301
- Tools: serial-to-udp.py, the reference bridge for a receiver on a USB port by @chriskinal in #302
- Tools: nmea-replay.py, a capture back on the wire with its original timing by @chriskinal in #303
- Plan: point the INSPVAXA firmware finding at Firmware_Teensy_AiO_26 #44 by @chriskinal in #304
- U-turn: start the turn wherever the tractor joins the path (#306); Field Tools need an open field (#305) by @chriskinal in #308
- Field close: clear the background image from the scene by @chriskinal in #309
- Field close: drop coverage and tram lines from the map by @chriskinal in #310
- Dual heading warning: not while the receiver starts up; generic text (#313) by @chriskinal in #314
- Sections: the control loop hands the section bits to the PGN sender (#311) by @chriskinal in #315
- ISOBUS task controller: read PGN 240, send PGN 241 (#312) by @chriskinal in #318
- GPS lost: switch off a section that is on by its own button (#316) by @chriskinal in #319
- Sections: only the configured sections are sent as on (#317) by @chriskinal in #320
- Field data card: total, worked, remaining, overlap, rate and trip (#321) by @chriskinal in #322
- U-turn: a path that begins inside the headland is not a missed turn by @chriskinal in #323
- Coverage edge: keep the stroke within the swept width (#325, part 2) by @chriskinal in #327
- Coverage: show worked ground the display layer was missing (#325, part 1) by @chriskinal in #326
- Simulator: travel at the speed it shows (#328) by @chriskinal in #329
- Tool profile: save the U-Turn and Tram tabs with the tool (#330) by @chriskinal in #331
- Vehicle profile: drop settings nothing reads by @chriskinal in #332
- nmea-capture: show a running count while capturing by @chriskinal in #333
- Send PGN 100 (corrected position) for seed monitors and rate controllers by @chriskinal in #338
- Cycle Lines and Auto Track on the right panel, with Cycle Back by @chriskinal in #339
- A+ at a typed heading, and AB lines from typed coordinates by @chriskinal in #340
- Network IO: offer the subnet the scan came from, as AgIO's Auto Set by @chriskinal in #341
- Nightly first: README banner, numbered releases published as prereleases by @chriskinal in #346
- Bug reports: required form, and an automatic reminder when the dump is missing by @chriskinal in #347
- Bug reports: a dump is all that's needed, and the app opens GitHub prefilled by @chriskinal in #349
- Tool overview: show the sections' total width (#345) by @chriskinal in #350
- Driven tracks start at the first pass, on a chosen side (#345) by @chriskinal in #351
- Desktop: confirm before the window closes (#348) by @chriskinal in #352
- CI: let Weblate's own PRs change language files by @chriskinal in #355
- Boundary imagery: fallback to available zoom and filter Bing placeholder tiles by @sakisdog in #344
- Roll from the steer module's IMU (PGN 253) and an external IMU (PGN 211) by @chriskinal in #356
- Heading from the steer module's IMU (PGN 253) and an external IMU (PGN 211) by @chriskinal in #357
- CI: pin the .NET SDK and Android workload set to 10.0.401 by @chriskinal in #361
- Plan: make source licence headers match LICENSE.md by @richardklasens in #360
- Licence headers: Apache 2.0 in every source file, checked in CI by @chriskinal in #363
- Translations fit the English layout: Weblate length limits + CI check by @chriskinal in #366
- GPS_Out: send PGN 214 with speed, heading and fix quality (#364) by @chriskinal in #367
- Plan: in-app bug report submission (Cloudflare Workers + R2) by @chriskinal in #369
- Bug report service: Cloudflare Workers + R2 (phase 1) by @chriskinal in #370
- Bug Report: Send Report, with an offline outbox (phase 2) by @chriskinal in #372
- Bug Report: wider description, shorter text, no Report on GitHub button by @chriskinal in #374
- One copy of the app per device (Android, desktop) by @chriskinal in #377
- Tracks manager stays open after Delete by @chriskinal in #383
- AgOpenGPS pass model: reference line is the edge between passes by @chriskinal in #382
- Translations doc: translate the meaning, English names stay by @chriskinal in #380
- i18n baseline: Hydraulic and Steer Wizard fit now by @chriskinal in #384
- Start without waiting for the network; one network watcher (#385) by @chriskinal in #386
- PGN 247: vehicle geometry for the modules (#387) by @chriskinal in #388
- Bnd. Curve: round corners to the U-turn radius by @chriskinal in #389
- CI: language-file check compares against the merge commit's parent by @chriskinal in #395
- UI Size setting: scale the controls, not the map by @chriskinal in #393
- Turn Sensor: label the switch Enable (#392) by @chriskinal in #400
- Web client: no made-up 6 m tool width (#398) by @chriskinal in #401
- Keep NTRIP passwords and the AgShare key on the host (#397, item 3) by @chriskinal in #402
- Observers change nothing: every command needs control (#397) by @chriskinal in #404
- AB draw: letter only over the map; opening a menu cancels the draw (#399) by @chriskinal in #405
- Bug reports: require a usable title, description and a way to reply by @chriskinal in #409
- U-turn: exit leg lands on the planned pass, not the skip setting's (#411) by @chriskinal in #413
- U-turn: changing the skip re-plans a planned turn (#410) by @chriskinal in #414
- Simulator: back to the operator's steer after autosteer disengages (#411) by @chriskinal in #415
- Bug reports: attach screenshots and files by @chriskinal in #416
- Fix typo: Rename Svenn Arrow to Direction Arrow by @Pesche-81 in #412
- All Edges: a curved side becomes an AB curve by @chriskinal in #417
- Bug report dump: U-turn settings and skip state by @chriskinal in #420
- U-turn: Keyhole style (loop centred between the passes) by @chriskinal in #421
- U-turn: tap the arrow to swap the turn's direction (#411) by @renatorgr in #422
- CI: hot-path work budgets for the GPS cycle and control tick by @chriskinal in #424
- Hot-path budgets: boundary-only fields, and every polygon test counted by @chriskinal in #425
- Snake: plan every pass inside the area, for a line on the fence too by @chriskinal in #426
- One point-in-polygon rule, and strip indexes for the per-tick tests by @chriskinal in #427
- U-turn: Ignore worked tracks never turns onto a worked pass by @renatorgr in #423
- Steer switch: sections follow a module switch/button engage by @sakisdog in #428
- VT cards: ISOBUS virtual terminals for the implements' own screens by @chriskinal in #429
- Strip indexes for the headland line on the GPS cycle and in U-turn planning by @chriskinal in #432
- VT: an slcan adapter on the device, and the terminal on Android and iOS by @chriskinal in #433
- Plan: how the VT reaches the implement bus in every setup by @chriskinal in #434
- VT: gateways by name, busy says who, connection on VT 1 with Disconnect by @chriskinal in #435
- VT: the library is SharpIsoTerm; build with SharpIsoTermDir by @chriskinal in #436
- VT: twelve soft keys in two columns of six; raise a card from its header by @chriskinal in #437
- VT in every build: SharpIsoTerm from its release package by @chriskinal in #439
- On-screen keyboard: double-tap Shift for caps lock by @renatorgr in #438
- On-screen keyboard: show the field's text when the keyboard hides it by @renatorgr in #441
- Log why AutoSteer turns off by @renatorgr in #442
- NTRIP: no Kansas GGA for VRS casters; Test logs in as the client does (#443) by @chriskinal in #444
- NTRIP: send the receiver's position in single and DGPS too (#443) by @sakisdog in #447
- Coverage grid within the GPU texture limit; survive a dead web view by @sakisdog in #445
- Guidance: with a tool offset the tool, not the tractor, runs on the pass (#446) by @chriskinal in #449
- Lightbar: show which side of the reference line the pass is on by @renatorgr in #452
- Desktop: no crash on close on macOS (stop the backend before the window closes) by @chriskinal in #455
- Tram: an active AB line gets tram lines parallel to it by @chriskinal in #457
- Bnd. Curve: pick which way round after tapping A and B (#450) by @chriskinal in #453
- Tram lights and AgOpenGPS's tram wheel check (#451) by @chriskinal in #454
- Bnd. Curve: a tap on a corner ends the curve where the corner starts by @chriskinal in #459
- Light bar: show the distance to the line with AutoSteer off by @renatorgr in #461
- Pass label as AgOpenGPS: "1R", larger, shown with either bar by @renatorgr in #460
- Rename the rolling nightly release to beta by @chriskinal in #462
- Plan: NTRIP main/fallback service, sturdier client, self-explaining report by @richardklasens in #463
- Menus stay open after a finger tap on Linux touchscreens (#465) by @chriskinal in #466
- Clip AB tram lines at the fence edges instead of testing every point by @chriskinal in #467
- Write the bug report off the host loop; store already-compressed files by @chriskinal in #468
- Append contour strips in place instead of rewriting contours.geojson by @chriskinal in #469
- Apply the tool offset once: coverage landed at twice the offset (#446) by @chriskinal in #470
- Boundary curve passes: round off at corners, close at the seam, guidelines from the host (#450) by @chriskinal in #471
- Map: cap the render loop at 30 fps, full rate while the map is handled by @sakisdog in #408
- Track parity: record at the pivot, recorded paths out of the track cycle, AB guidelines like the passes by @chriskinal in #472
- Nudge and snap as AgOpenGPS: Snap buttons nudge by the snap distance, a fuller nudge flyout by @chriskinal in #473
- Water pivot tracks: drive part of the way round or type the centre; passes are circles by @chriskinal in #474
- Offset passes: round the outside of a bend instead of cutting a chord by @chriskinal in #475
- Track parity: pass label with direction and nudge, hidden track stops guidance, driven curves to B by @chriskinal in #477
- Draw curve: between two taps on the fence, follow the fence by @chriskinal in #478
- Boundary curves as AgOpenGPS's, with every pass's corners rounded to the turn radius (#450) by @chriskinal in #480
- Track parity: tool band, line outline and A/B on the map; pass re-picked every 0.66 s; deleting the active track stops AutoSteer by @chriskinal in #481
- NTRIP: main and fallback service, a sturdier client, and a report that explains itself by @richardklasens in #464
- Guidance bar as AgOpenGPS: light bar or steer bar, On/Off apart, in Screen & Alerts (#479) by @chriskinal in #483
- AutoSteer: hide the "Reset all to defaults?" box until Defaults is pressed by @chriskinal in #484
- Plans: keep only current work; done plans to Completed, ideas to Ideas, references to Docs by @chriskinal in #485
- Remove field.json (FieldJsonService): never written by the app by @chriskinal in #486
- Tracks: work point headings out again on load, AB lines too; drop dead heading code by @chriskinal in #488
- Map grid: thin lines at every zoom, one colour, no major lines or axes by @richardklasens in #497
- Curve track: the current pass is extended past A and B in free-drive too (draft) by @richardklasens in #495
- Top HUD: hang from the status bar and scale with the screen height (720p) by @richardklasens in #487
- Ref Nudge: move the reference line and save it by @richardklasens in #490
- Launcher fullscreen: the status bar button and Start Fullscreen work (#498) by @chriskinal in #499
- Light bar: the cells hold still; tram lights clear of them (#479) by @chriskinal in #501
- Aerial imagery: an on/off toggle, and imagery for any boundary (#500) by @chriskinal in #502
- Web cards: add-ons' own web pages in cards, from a bookmark list by @chriskinal in #503
- Bundles: build the macOS .dmg on macos-26 (macos-14 retires 2026-11-02) by @chriskinal in #505
- Settings sliders: − / + nudge buttons and a typed value by @chriskinal in #506
- Docs: field file format spec for any tool, not only AgShare by @chriskinal in #511
- On-screen keyboard: commit the value when leaving the field; Save Profile saves the box being edited by @renatorgr in #507
- On-screen keyboard: #+= key for symbols, so web addresses can be typed by @renatorgr in #510
- Web cards: a hint line for pages that refuse to be shown in a card by @chriskinal in #512
- Card pane: VT and web cards in a pane beside the map (#456) by @chriskinal in #513
- Docs: web cards and the card pane in CLAUDE.md by @chriskinal in #514
- Rate controllers: AgOpenGPS's loopback PGNs, and remote section switches (PGN 234) by @SK21 in #509
- Plan: the card pane as a drawer (closed, split, full) by @chriskinal in #524
- Plan: split app.js and index.html by feature, no build step by @chriskinal in #525
- On-screen keyboard: first key replaces the value, Backspace edits it, Cancel restores it by @richardklasens in #517
- Web client split, step 1: serve js/ and css/, guard the client's files by @chriskinal in #526
- Web client split, step 2: CSS out of index.html into css/ by @chriskinal in #527
- Web client split, step 3: app.js into js/ by feature by @chriskinal in #528
- Web client split, step 4: comments say what the code does by @chriskinal in #529
- Web client: move four misplaced blocks to their feature files (again, onto develop) by @chriskinal in #531
- Docs: the web client's files, how they load, adding a panel by @chriskinal in #532
- i18n: keep Weblate's label limits current; a shorter label never fails the fit check by @chriskinal in #533
- Web client: the A/B letters on the track sit under panels and bars (#522) by @chriskinal in #534
- U-turn: a normal turn keeps stepping the way the last one went (#523) by @chriskinal in #535
- Plans: one plan for the add-on cards, the card pane and the drawer by @chriskinal in #536
- Out of bounds: autosteer stays on, the boundary turns red and PGN 239 sends geoStop (#494) by @chriskinal in #537
- Card pane: the drawer (#456) by @chriskinal in #538
- Bug report check: skip maintainers by their repository permission (#546) by @chriskinal in #548
- Tram lights: check the wheels where the tool is, and only on shown lines (#541) by @chriskinal in #549
- U-turn: rows wider than twice the radius follow the turn line, as AgOpenGPS (#544) by @chriskinal in #550
- Checklists: parity checklists per area, side by side with AgOpenGPS by @chriskinal in #551
- Stanley: AgOpenGPS's controller, held to its code by parity tests (checklist 2.1, 2.2) by @chriskinal in #553
- Tests: contour and U-turn steering held to AgOpenGPS's code (checklist 2.1, 2.2, 3.1, 7.15) by @chriskinal in #554
- PGN 254, 239, 252, 251: whole frames held to AgOpenGPS's; 254's cross-track byte and 251's framing fixed (checklist 9.3, 9.4, 9.6, 6.8) by @chriskinal in #555
- Hydraulic lift and tram lights in the headland as AgOpenGPS (checklist 3.13, 3.14, 6.4) by @chriskinal in #556
- Sections: off over every inner boundary, drive-through too, as AgOpenGPS (checklist 4.5) by @chriskinal in #557
- Fields: no coverage lost leaving a field, at exit or in the background (checklist 7.5, 7.9, 13.10) by @chriskinal in #558
- Tests: Delete Field and Delete Boundary (checklist 7.7, 5.7) by @chriskinal in #559
- Fields: names checked on the host; KML rings without their closing point (checklist 5.3, 7.1–7.4) by @chriskinal in #560
- Tool position: the pivot distance's sign and the jackknife rules as AgOpenGPS (checklist 11.3, 11.4, 11.10) by @chriskinal in #561
- Tests: onto the line and holding it at field speed, held to AgOpenGPS's simulator (checklist 2.4–2.6) by @chriskinal in #562
- U-turn: K-turn made, turn reaches the turn line, legs meet the arc; held to AgOpenGPS's turn builder (checklist 3.2, 3.4, 3.5) by @chriskinal in #563
- Tram: the lines come back when a field reopens; the display off sends nothing, held to AgOpenGPS (checklist 6.7, 6.10) by @chriskinal in #564
- From ISO-XML: curves imported straight, every field in the file offered, lines without a boundary accepted; held to AgOpenGPS's import (checklist 7.3) by @chriskinal in #565
- Tests: the field data figures and the field list, held to AgOpenGPS's (checklist 4.11, 7.12, 7.8) by @chriskinal in #566
- Sections, boundary recording, drive-through: worked area without the coverage margin, the added point where the drive puts it; held to AgOpenGPS (checklist 4.12, 5.1, 5.5) by @chriskinal in #567
- Small rows: A/B and curve points from the cycle's pivot, AgOpenGPS's steer defaults on Reset all, hotkey conflicts refused (checklist 1.3, 1.5, 1.14, 2.3, 8.1, 8.3, 10.7, 10.8, 12.9) by @chriskinal in #568
- Delete Boundary: the outer one only when it is the last, as AgOpenGPS by @chriskinal in #569
- Wide turn: find the next pass's crossing when it's outside the field abreast of the tractor (#544) by @chriskinal in #573
- Coverage save: an old display folder that can't be removed doesn't fail the save by @chriskinal in #574
- Desktop window: a restore size, and the size and place kept between runs (#571) by @chriskinal in #575
- U-turn: a missed turn sounds once, as AgOpenGPS (may fix #570) by @chriskinal in #576
- U-turn: the arrow's side holds through a skip change; no early turn with rows skipped (#577) by @chriskinal in #578
- U-turn: no pass to turn onto sounds the alarm once (#570) by @chriskinal in #579
- Launcher: a finger tap focuses text fields again on Linux touchscreens (#465) by @chriskinal in #586
- U-turn: a turn lands on the pass it was built for when the skip changes mid-turn (#585) by @chriskinal in #587
- U-turn: reversing out of a turn cancels it and keeps the pass (#588) by @chriskinal in #589
- U-turn lines: next pass with the nudge, direction held through the turn, guidelines meet the turn (#591) by @chriskinal in #592
- U-turn: another track drops the turn planned on the old one by @chriskinal in #593
- U-turn: manual and turn-from-here paths end on the pass they complete onto, tool offset included by @chriskinal in #594
- U-turn snake: plan every pass inside the field anywhere along it by @chriskinal in #595
- U-turn: the end of the field ends the turns instead of going back onto the pass just worked by @chriskinal in #596
- U-turn snake: an order made for another field is planned again before turning outside it by @chriskinal in #597
- Min PWM and proportional gain reach AgOpenGPS's 200 (#600) by @chriskinal in #601
- WAS offset can be set by hand, as AgOpenGPS (#599) by @chriskinal in #602
- Fix KML import list and rings on one line by @renatorgr in #603
- Broadcast loop reads no disk: lists move on a version (#604) by @chriskinal in #606
- Fit baseline: six Dutch labels waiting for the translator by @chriskinal in #607
- Fit check: allow a taller script's line; baseline 20 seeded labels by @chriskinal in #609
- Out of bounds: inside an inner boundary counts with auto U-turn on too by @chriskinal in #612
- Web client: a page loaded with a field and a line open no longer loses the frame loop by @renatorgr in #615
- Fit baseline: 21 restored volunteer labels by @chriskinal in #617
- Add-on cards plan: no network scanning; add-ons use mDNS / DNS-SD by @chriskinal in #618
- Docs: add-on cards guide for developers (web and VT) by @chriskinal in #619
- Close field: end the boundary recording and the line being made by @renatorgr in #625
- Field names that differ only in capitals: refuse the second, list both by @renatorgr in #626
- Drive AB / Draw AB: refuse B on the same spot as A by @renatorgr in #627
- Tram systems follow a renamed track and go with a deleted one by @renatorgr in #628
- Tram lines: publish new lists instead of changing them under the GPS thread by @renatorgr in #629
- Headland: refuse a distance that leaves nothing of the field, and NaN by @renatorgr in #631
- Boundary: an inner boundary needs the field's outer boundary first by @chriskinal in #634
- Headland: keep a closed inward offset by where it lies, not by the vertex average by @renatorgr in #630
- Rebuild the headland and the tram lines when the outer boundary changes by @renatorgr in #632
- Host loop: a SynchronizationContext, so an await comes back to the loop by @renatorgr in #633
- CI: run translations-fit only for changes to what it measures by @chriskinal in #635
- i18n-limits: one pass over the screens for every language by @chriskinal in #636
- Release notes: list the PRs merged since the previous version tag by @chriskinal in #638
- Bump to 26.7.1 by @chriskinal in #637
New Contributors
- @manih98 made their first contribution in #162
- @sakisdog made their first contribution in #188
- @weblate made their first contribution in #245
- @richardklasens made their first contribution in #360
- @Pesche-81 made their first contribution in #412
- @renatorgr made their first contribution in #422
- @SK21 made their first contribution in #509
Full Changelog: 26.7.0...v26.7.1