# RTKBase: a browser-driven base station for Ublox, Septentrio and Unicore receivers

> RTKBase puts a GNSS receiver, RTKlib and a set of service units behind a Python web interface, so a Raspberry Pi or Orange Pi can publish corrections over Ntrip. It fits a specific receiver list well and says little about base coordinates or antenna siting.

**Stefal/rtkbase** — Your own GNSS base station for RTK localization with a Web GUI

- Repository: https://github.com/Stefal/rtkbase
- Stars: 782 · Forks: 216
- Language: Python
- License: AGPL-3.0
- Published: 2026-10-20 · Updated: 2026-10-20 · Language: en
- Canonical page: https://hysenlabs.com/projects/stefal-rtkbase

## A base station that fits inside a waterproof enclosure

RTKBase solves one narrow problem: turning a single board computer and a GNSS receiver into a base station that publishes correction data to a rover, without asking you to assemble a service stack by hand. The project describes itself as a web frontend with bash scripts and services for a simple headless GNSS base station.

The hardware example is unusually concrete. It pairs a GentleBOX JE-200 waterproof enclosure with cable glands for the antenna and ethernet cable, a Raspberry Pi 3 or an Orange Pi Zero with 512MB, a U-Blox ZED-F9P from Drotek, a DA910 antenna covering GPS L1/L2, Glonass L1/L2, Beidou B1/B2/B3 and Galileo E1/E5b/E6, a male SMA to male TNC outdoor cable, and a Trendnet TPE-115GI POE+ injector with a TPE-104GS extractor and splitter. A 512MB Orange Pi Zero is the entire computer.

The people this fits are surveyors, mapping hobbyists and anyone running a rover who wants a base of their own rather than leaning on a public CORS station. The project is written in Python, carries an AGPL-3.0 license, and works from the master branch.

## The browser page is the receiver control panel

The control surface is a web page served by the rtkbase_web service. The README lists what that page exposes: satellite signal levels, the base location on a map, detection and configuration of the GNSS receiver, start and stop controls for the data services, an editor for the service settings, conversion of raw data to Rinex, and download or deletion of raw data.

Detection covers Ublox F9P, Septentrio Mosaic-X5 and Unicore UM980 / UM982. Everything the frontend changes goes through a settings file, and the repository root carries settings.conf.default. The install script writes the detected port into that file, and the --no-write-port option suppresses that write, which is the escape hatch for a receiver the script misidentifies.

The first login is a weak point worth naming plainly. The README states the default password is admin, and the interface is reached at http://ip_of_your_sbc on the local network. Nothing in the documentation describes TLS termination, a reverse proxy, or how that password is changed, so treat the service as trusted LAN traffic rather than an endpoint you expose to the internet.

## install.sh --all release covers the whole stack in one run

The installer is a single bash script, and the short path is the one the README recommends. Copy it, make it executable, and run it with root privileges:

```bash
cd ~
wget https://raw.githubusercontent.com/Stefal/rtkbase/master/tools/install.sh -O install.sh
chmod +x install.sh
sudo ./install.sh --all release
```

The README advises making coffee at that point, because the script installs the needed software and, for a supported receiver, detects the hardware and sets it up to work as a base station. With an unsupported receiver you are left configuring it yourself and choosing the correct port on the settings page.

The same script can be split into individual steps. The help output lists the main ones:

```
    -a | --all <rtkbase source>
    -d | --dependencies
    -e | --detect-gnss
    -s | --start-services
```

The --all option takes a source argument, where release fetches the latest published release, repo needs the --rtkbase-repo argument with a branch name, url needs the --rtkbase-custom-source argument with an url, and bundled extracts files shipped with the script. Other flags cover dependencies, the RTKlib build, the release download, unit files, gpsd and chrony, receiver detection, receiver configuration and service start. The RTKlib step pulls RTKlib 2.4.3b34j from GitHub and compiles it, and the --gpsd-chrony step installs gpsd and chrony so the clock can be set from the GNSS receiver itself.

## A ready to flash Armbian image removes the first install entirely

Before any of that runs, there is a shorter path. A ready to flash Armbian image is published under Stefal/build releases, built for Raspberry Pi, Orange Pi Zero, Orange Pi Zero 2 and Orange Pi Zero 3 single board computers. Flashing it means the base station starts from a system image that already carries the intended configuration, which is the practical choice when your first installation attempt would otherwise happen over a serial console or a monitor you do not have.

Older Raspberry Pi releases are covered by jancelin/pi-gen releases instead.

The distinction matters for how you get help. The script path installs on whatever you have and then adapts to the receiver, while the image path is tied to a fixed set of boards. The documentation does not say which of the two receives an update first after a release, and the Armbian image lives in a separate repository rather than in this one, so the two can drift apart.

## Base coordinates have no button in the settings page

Entering the base coordinates is left entirely to the operator. The README sends readers to tutorials on post-processing RTK for single and dual frequency receivers, on PPP for dual frequency receivers, and to the Centipede documentation, which is in french, for base positioning. No single value in the documentation states what positional accuracy to expect, and no baseline length is recommended for a rover that will use the base. The settings page accepts whatever values you type in, and that is the extent of the guidance.

Antenna siting gets the same treatment. The example lists a DA910 antenna and a TNC cable, and the enclosure has a cable gland for it, but nothing describes antenna height, the need for an unobstructed sky view, or a mounting reference point. The same silence covers how a site should be surveyed before coordinates are entered.

That is a boundary rather than a defect. RTKBase handles the plumbing between hardware and network, and leaves the geodetic work to whoever owns the survey.

## Receiver support ends at three vendor families

The sharpest limit is the receiver list, and it is a list rather than a fallback path. Detection and configuration are built for Ublox F9P, Septentrio Mosaic-X5 and Unicore UM980 / UM982, and the base example uses the U-Blox ZED-F9P from Drotek. Anything outside those families is not configured for you, and the manual path asks you to configure the receiver and then pick the correct port on the settings page.

A second, quieter limit sits in the service layout. The services the script starts are rtkbase_web, str2str_tcp, gpsd and chrony, and the frontend's data paths are tied to that arrangement. The project does not document a supported way to add another receiver type, another transport, or a different service set. It also does not document rollback when an edit to the settings file breaks the setup, and no backup step is automated. Copying that file by hand before you change it is the only protection the documentation offers.

## AGPL-3.0 covers the frontend, not the whole stack it assembles

RTKBase is licensed under AGPL-3.0, but the parts it assembles are not covered the same way. The web frontend and the installer live in this repository under that license, while the RTKlib step pulls RTKlib 2.4.3b34j from another project and compiles it locally. Whether that matters depends on how you distribute and modify the combined system, so read the license text and the RTKlib license yourself rather than treating any summary as a legal opinion.

On upgrades, the script can fetch the last published release with the rtkbase-release step, and a branch can be pulled with the rtkbase-repo step and a branch name. The recorded releases are v2.7.0 on 2025-12-01, v2.6.4 on 2025-11-26 and v2.6.3 on 2025-02-16, and the last push to the repository was on 2026-05-07. The repository is not archived, and the distance between the last release and that last push is the number worth watching before you rely on a particular build.

## Conclusion

Adopt RTKBase if you already own one of the three supported receiver families and want a browser-driven base station instead of a pile of shell scripts you maintain yourself. Skip it if your hardware sits outside that list, or if the unanswered parts around base coordinates, antenna siting and rollback have to be answered from somewhere other than the documentation. Before installing anything, check that your receiver model is on the supported list, and change the default admin password the first time the interface answers on http://ip_of_your_sbc.

## FAQ

### What hardware does RTKBase support for a GNSS base station?

The install script detects and configures Ublox F9P, Septentrio Mosaic-X5 and Unicore UM980 / UM982 receivers. The documented example pairs a Raspberry Pi 3 or an Orange Pi Zero with a U-Blox ZED-F9P from Drotek and a DA910 antenna. A receiver outside those families has to be configured by hand and pointed at the right port on the settings page.

### How do I install RTKBase on a Raspberry Pi or Orange Pi?

Download install.sh, make it executable, then run sudo ./install.sh --all release, which installs dependencies, compiles RTKlib, fetches the latest release, deploys the services and detects the receiver. A ready to flash Armbian image is also published for Raspberry Pi, Orange Pi Zero, Orange Pi Zero 2 and Orange Pi Zero 3.

### What is the default password for the RTKBase web interface?

The README states the default password is admin, and the interface is reached at http://ip_of_your_sbc on the local network. The documentation does not describe a reverse proxy or TLS in front of the service.

### Can RTKBase store and convert raw GNSS data?

Yes. One of the listed services logs raw data to files, the frontend converts raw data to Rinex, and it offers download and deletion of those raw data files.

## Sources

- [Issues](https://github.com/Stefal/rtkbase/issues)
- [License: AGPL-3.0](https://github.com/Stefal/rtkbase/blob/master/LICENSE)
- [README](https://github.com/Stefal/rtkbase/blob/master/README.md)
- [Releases](https://github.com/Stefal/rtkbase/releases)
- [Stefal/rtkbase on GitHub](https://github.com/Stefal/rtkbase)

---

Hysen Labs editorial analysis, written from the project's own repository and release notes. Cite the canonical page: https://hysenlabs.com/projects/stefal-rtkbase
