projects
Geo Acq
Go/Wails application for acquiring, visualizing, and saving NMEA sentences from shipboard instruments.
Status: Prototype in development
Repository: GitHub
Overview
Geo Acq is an acquisition application developed in Go to decode NMEA sentences from shipboard instruments, display them during acquisition, and save them locally.
The project targets very practical field use cases: monitoring navigation data (GPS) or measurements, such as an echo sounder, during an operation, quickly checking that an RS-232 serial or UDP stream is being received correctly, preserving raw sentences, and preparing usable extraction after the session.
There is currently a CLI version and a graphical version built with Wails. This interface provides a modern desktop front end for the Go acquisition engine while keeping the technical base simple: TOML configuration, serial or network acquisition, SQLite storage, and command-line tools for complementary processing. The application can also simulate some instruments for testing or when the hardware is not available.
In the 1990s, we had already developed acquisition software for a thermosalinograph (TSG + GPS), written first in C and then in C++, designed for deployment on merchant vessels to collect continuous sea surface temperature and salinity measurements along commercial shipping routes. Several variants were also produced, for example for dissolved CO2 measurements as part of the ECOA project.
That TSG program was later rewritten in LabVIEW by a colleague in Noumea under the name SODA, and the application is still used on merchant vessels in the IRD network.
With Geo Acq, the idea is to bring these proven acquisition techniques into a modern environment: a safer compiled language, a graphical interface that is easier to distribute, readable configuration, and directly usable local storage. Other approaches could produce a similar result, such as Python with PySide6, Go with Fyne, Rust with Tauri, or a more monitoring-oriented stack with Node-RED and a local database. The Go + Wails choice provides a good balance between a standalone executable, low-level serial port access, and a lightweight desktop interface.
Wails Graphical Interface
The GUI version is a desktop prototype built with Wails, combining a Go backend and a lightweight web frontend. It provides an interface for loading a configuration, starting a session, and monitoring instruments without working only in a terminal.
The current interface provides:
- a control bar with configuration file selection, loading, editing, port refresh, and session start/stop controls
- a
Configurationtab with mission metadata and the general configuration state - a
Device panelstab, displayed by default, with one card for each configured instrument - a
Terminal raw framestab for diagnosing received sentences in real time - an
Available inputstab for checking detected serial ports

Geo-acq: data acquisition view with GPS and simulated echo sounder.
Each instrument panel displays the logical instrument name, transport, port, status, number of received sentences, expected NMEA sentences, and available decoded values. Latitudes and longitudes are shown in a form that is readable for the operator.
Acquisition Flow
A session can combine real instruments and simulators. Each instrument is configured with one mode:
ready: opens the configured real transport, either serial or UDPsimulate: generates sentences through the built-in simulator for that instrumentdisabled: ignores the instrument when the session starts
At startup, the application loads the configuration, opens the active transports, reads complete sentences, timestamps each sentence on reception, attempts NMEA decoding, updates the interface panels, and writes data to local databases when saving is enabled.

Geo-acq: configuration file selection view.
This behavior makes it possible to test a configuration before a field campaign, work with a real GPS and a simulated echo sounder, or replay a demonstration chain without having all the hardware available.

Geo-acq: editing view for the .toml configuration file.
Instruments And Sentences
The project focuses on instruments that produce NMEA sentences, especially:
- GPS
- echo sounder
- radar or other NMEA-compatible sources
Decoding already supports several common sentences, including position, speed, course, satellite, and depth data. Undecoded sentences remain visible in the raw terminal and can be preserved in the database.

Geo-acq: terminal view showing GPS and echo sounder NMEA sentences.
This separation is important: even as application-level decoding evolves, raw observations remain available for verification, reprocessing, or later analysis.
Storage And Export
Persistence is based on SQLite, with two possible levels:
- a raw database,
<mission>-raw.sqlite, centered on received NMEA sentences - a decoded database,
<mission>-data.sqlite, organized by supported sentence types
The raw database preserves the mission, acquisition session, UTC reception timestamp, instrument name, transport used, sentence type, and NMEA payload. The decoded database stores useful fields in typed columns to make later use easier.

View of the raw-frame table

View of the RMC table
A geo-export tool complements the main application. It exports a raw or decoded database to TSV or CSV, with optional selection of a specific mission or session.
$ bin/geo-export.exe -h
Export geo-acq SQLite data to TSV or CSV.
Usage: geo-export [-cCfhprT] [-m name] [-o file] [-s id] <input.sqlite>
-c, --compact write compact processed output
-C, --csv write CSV output
-f, --full write full output
-h, --help display help
-m, --mission=name
optional mission filter
-o, --output=file output file
-p, --processed export processed SQLite input
-r, --raw export raw SQLite input
-s, --session-id=id
optional session id
-T, --tsv write TSV output
Example data extraction:
$ bin/geo-export.exe -c examples/dev-data.sqlite
wrote 12 rows to examples/dev-data.tsv
$ cat examples/dev-data.tsv
# datetime_utc latitude longitude speed_knots depth_meters
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.6
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.6
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.5
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.5
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.4
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.8
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.8
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.7
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.5
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.5
2026-05-04T01:55:40Z 48.1173000 11.5166667 0.000 15.9
Key Technical Points
The project relies on the following architecture:
- main backend in
Go - desktop interface with
Wails Vitefrontend in JavaScript- configuration through
TOMLfiles RS-232serial andUDPtransports- built-in GPS and echo sounder simulators
- local raw and decoded
SQLitestorage - separate export tool for producing tabular files
- build tasks with
TaskfileandMakefile
The Wails version uses runtime events to propagate acquisition state and new sentences to the user interface. Instrument panels and the terminal are therefore updated live during the session.
Current State
Geo Acq is a project draft, but it already provides a functional base for experimenting with a robust and operational acquisition chain that can be deployed on a lightweight platform such as a Raspberry Pi 5 with an integrated touchscreen and battery power.
The current limitations are known:
- configuration editing is still done in a raw
TOMLeditor - panels do not yet expose structured forms by instrument
- decoded values remain generic, without sensor-specific operational widgets
- there is not yet a session history browser in the interface
- a real-time navigation window still needs to be implemented
- circular buffering still needs to be added for reduced data display, including outlier removal
Intended Audience
I mainly imagine Geo Acq as a field tool: the kind of application you start to check that a GPS, an echo sounder, or a serial link is talking correctly, keep a clean record of the received sentences, and leave with usable data after the test or field campaign.
- acquisition technicians
- developers of shipboard tools or test benches
- teams that need to quickly check a serial or UDP stream
- users who need to preserve raw sentences before scientific processing
Links
- Source repository: GitHub
- Binaries: GitHub releases