A modern web-based user interface for MRTKLIB,
running entirely in a Docker container. MRTKLIB is a modernized C11
implementation of RTKLIB with MADOCA-PPP, CLAS PPP-RTK, and advanced
GNSS positioning capabilities. No compilation required — just
docker compose up and start processing GNSS data from your browser.
Status: v0.1.0-alpha — core features are functional. Known limitations are listed in Known Issues.
- Sidebar navigation covering all MRTKLIB configuration options (Positioning, AR, Kalman Filter, Adaptive Filter, CLAS PPP-RTK, Environment, Output, Files, Server)
- Full TOML configuration import / export
- Named preset management (saved to
/workspace/presets/) - Support for all positioning modes: Single, DGPS, Kinematic, Static, PPP-Kinematic, PPP-Static, PPP-AR, CLAS PPP-RTK, MADOCA PPP, VRS-RTK
- Live position display (Lat / Lon / Height / AR Ratio / Satellites / Age / GPST)
- Fix quality badges: FIXED / FLOAT / SINGLE color-coded
- Position scatter plot (E/N, 1:1 aspect ratio, quality colors)
- Time series chart
- Sky plot + SNR bar chart (per-constellation color coding, used/unused satellite highlighting)
- Solution and trace output streaming
- Multi-stream configuration (up to 4 simultaneous streams)
- Per-stream Start / Stop control with live console output
- Supports all convbin formats: u-blox, Septentrio SBF, NovAtel, BINEX, Trimble RT17, RTCM2/3, RINEX re-processing
- Collapsible option groups (Time Range, Signal Options, RINEX Header, Debug)
- Live command preview before execution
- RINEX file preview after conversion (header + first 5–10 epochs)
- Direct connection to GNSS receiver without invoking
mrtk run - Parses NMEA GGA/RMC, UBX NAV-PVT, SBF PVTGeodetic
- Live position visualization identical to Real-Time tab
- Raw data file logging to
/workspace/logs/
- GNSS Time Converter: fully bidirectional conversion between Calendar/UTC, GPS Week/ToW, and Day of Year/Session
- Data Downloader: QZSS L6D (CLAS) and L6E (MADOCA) file download; IGS atx update; IGS products and GSI CORS data (NASA Earthdata and GSI credentials required for the latter two)
- Two-volume Docker setup:
/workspace(read-write) and/data(read-only host data directory) - Server-side preset management with import / export
- TOML import with lossless round-trip (unknown keys preserved)
- IBM Plex Sans + IBM Plex Mono typography
- Dark / light mode toggle
- Docker and Docker Compose
- GNSS data files (RINEX observation and navigation files)
-
Clone the repository
git clone https://github.com/h-shiono/mrtklib-docker-ui.git cd mrtklib-docker-ui -
Configure directories
mkdir -p ./workspace ./data cp .env.example .env # Edit .env to set DATA_DIR to your GNSS data directory -
Build and run
docker compose up --build
-
Open the UI
http://localhost:8080
| Mount | Default | Purpose | Access |
|---|---|---|---|
/workspace |
./workspace |
Output files, presets, logs | Read-write |
/data |
./data |
Input GNSS data files | Read-only |
# .env
DATA_DIR=/path/to/your/gnss-dataTo connect to a GNSS receiver via serial port, add the device
to docker-compose.yml:
services:
app:
devices:
- /dev/ttyUSB0:/dev/ttyUSB0The Data Downloader supports three credential sources
(priority order: .netrc mount > environment variables > UI):
# .env
EARTHDATA_USER=your_username # NASA Earthdata (IGS products)
EARTHDATA_PASSWORD=your_password
GSI_USER=your_username # GSI CORS FTP
GSI_PASSWORD=your_passwordQZSS L6D/L6E files require no authentication.
- Language: Python 3.11+
- Framework: FastAPI
- Process Management: asyncio.subprocess
- Real-time Communication: WebSocket
- Data Validation: Pydantic v2
- Framework: React 18 + TypeScript
- Build Tool: Vite
- UI Library: Mantine v7
- Charts: Chart.js, uPlot, Recharts
- Typography: IBM Plex Sans + IBM Plex Mono
- Container: Multi-stage Docker build
- MRTKLIB Binary: Built from source via CMake (
mrtkunified binary) - Volumes:
/workspace(read-write),/data(read-only)
uv sync
uv run uvicorn mrtklib_web_ui.main:app --reload --host 0.0.0.0 --port 8000cd frontend
npm install
npm run dev # http://localhost:5173The frontend dev server runs on http://localhost:5173 and proxies
API requests to the backend at http://localhost:8000.
| Version | Description |
|---|---|
| v0.1.0-alpha (current) | Core UI for all mrtk subcommands, presets, TOML I/O, Monitor tab |
| v0.2.0 | Configuration reference full verification, template presets, coordinate converter, Monitor Sky+SNR |
| v0.3.0 | IGS/GSI downloader (auth), GitHub Container Registry publish |
This is an alpha release. Many features have been implemented but not yet thoroughly tested in real-world conditions. Bug reports and feedback are very welcome — please open an issue.
- Real-Time positioning (
mrtk run): basic operation confirmed; edge cases (stream reconnection, dual-channel CLAS, long runs) not yet validated - Monitor tab (NMEA/UBX/SBF): parser logic implemented but not tested against real receiver hardware
- Data Downloader: QZSS L6D/L6E endpoints implemented; IGS products (NASA Earthdata) and GSI CORS (FTP) untested
- TOML import round-trip: basic cases work; complex configs with all options may have edge cases
- Configuration option coverage: UI covers all options from the reference, but default values and conditional logic have not been exhaustively verified
- RINEX preview: implemented but not tested across all receiver formats
- Monitor tab Sky+SNR: not yet implemented (planned for v0.2.0)
- Coordinate converter: not yet implemented (planned for v0.2.0)
- Template presets: not yet implemented (planned for v0.2.0)
- Tested on: Linux (Ubuntu 22.04), macOS (Apple Silicon)
- Windows (Docker Desktop): untested
All bug reports are appreciated, including partial or unclear ones.
Contributions of all kinds are welcome — bug reports, feature requests, documentation improvements, and pull requests.
The most helpful thing right now is real-world testing. If you try MRTKLIB Web UI with your own receiver or dataset and something does not work as expected, please open an issue. You do not need to have a fix ready — a clear description of what happened is enough.
When reporting a bug, please include:
- Which tab / feature was affected
- What you expected to happen
- What actually happened
- Browser and OS (and Docker version if relevant)
- Any error messages from the browser console or Docker logs
For feature requests, a brief description of the use case is more useful than a specific implementation proposal.
For small fixes (typos, obvious bugs), a PR is welcome directly. For larger changes, please open an issue first to discuss the approach — this avoids duplicated effort.
- Python: PEP 8, type hints throughout
- TypeScript: strict mode, functional components
- Commits: conventional commits (
feat:,fix:,docs:) - Do not modify MRTKLIB source code in this repository
The Docker image includes correction files from MRTKLIB for quick-start CLAS PPP-RTK and MADOCA PPP processing:
| File | Purpose |
|---|---|
clas_grid.def |
CLAS grid definition |
clas_grid.blq |
Ocean tide loading coefficients |
igu00p01.erp |
Earth rotation parameters |
igs14_L5copy.atx |
Satellite/receiver antenna PCV |
isb.tbl |
Inter-system bias table |
l2csft.tbl |
L2C signal phase correction |
| File | Purpose |
|---|---|
igs20.atx |
IGS antenna model (satellite + receiver PCO/PCV) |
These files are available at /opt/mrtklib/corrections/ inside
the container and can be selected directly from the UI's
Files configuration panel. Use the "Apply CLAS PPP-RTK profile"
or "Apply MADOCA PPP profile" buttons to set all paths at once.
To use a newer version of any file, place it in your /data
directory and select it manually via the file browser.
MIT License. See LICENSE.
MRTKLIB is distributed under the BSD 2-Clause License. This project provides a web interface only and does not modify MRTKLIB source code.
Built on MRTKLIB by Hayato Shiono, which is a modernized fork of RTKLIB by Tomoji Takasu.
Developed with assistance from Claude (Anthropic) and Gemini (Google).
Key dependencies: FastAPI · React · Mantine · Vite · Chart.js · uv
