# Subsurface: the GPL dive log that imports from your dive computer

> Subsurface is a GPL-2.0 dive logging application for Linux, Windows, macOS, Android and iOS, started by Linus Torvalds in 2011. Its value is dive computer import through libdivecomputer, and its cost is a codebase that ships nightly builds rather than tagged releases.

**subsurface/subsurface** — This is the official upstream of the Subsurface divelog program

- Repository: https://github.com/subsurface/subsurface
- Website: https://subsurface-divelog.org
- Stars: 3,192 · Forks: 605
- Language: C++
- License: GPL-2.0
- Published: 2026-09-24 · Updated: 2026-09-24 · Language: en
- Canonical page: https://hysenlabs.com/projects/subsurface-subsurface

## What Subsurface solves, and who ends up using it

Dive computers record far more than a paper logbook ever did: depth profiles, tank pressure, temperature, and in some cases setpoint and battery data. Getting that off the device and into something you can read, annotate and keep is the problem Subsurface addresses. The README traces the project to Linus Torvalds in fall 2011, who wanted decent divelog software on Linux; Dirk Hohndel took over as maintainer in fall 2012. The application now targets Linux, Windows, macOS, Android and iOS, with import from a large number of dive computers and several existing divelog programs.

The audience is narrower than "anyone who dives". If you log dives by hand and never connect a computer, Subsurface's main advantage over a spreadsheet is its profile visualization and the amount of per-dive data it can track. The moment you own a supported dive computer, the calculation changes: manual transcription of a 60 minute profile is not something most people will do twice.

## How dive data gets in: libdivecomputer and the import menu

The import path is the core mechanism. Subsurface bundles libdivecomputer as a submodule in the repository, and the README describes the workflow plainly: choose "Import from Divecomputer" from the "Import" menu, select which dive computer you have and where it is connected, then click "Download". Bluetooth dive computers have a separate selection in that dialog rather than a generic serial port entry.

Two things follow from that design. First, device support is bounded by libdivecomputer, not by Subsurface itself, so the authoritative list lives in SupportedDivecomputers.txt at the top of the repository. Second, the desktop build is where this workflow is described; the repository also carries mobile-widgets/, android/ and ios/ directories, but the README's import instructions are written for the desktop application.

Once imported, dives live in a data file. You can pass that file as a command line argument, or, after configuring it in Preferences, Subsurface picks a default file when started from the desktop or with no argument. That default-file behavior is the quiet part of the design: it makes the application feel like a document editor rather than a database client.

## Installing Subsurface from a nightly build or from source

The README points users at nightly builds rather than a current tagged release. Those builds cover Windows, macOS, Android (the README notes sideloading is required) and a Linux AppImage, and are published on the project's Latest Dev Release page, in the nightly-builds repository on GitHub, and in the Subsurface-daily repos on Ubuntu Launchpad, Fedora COPR and OpenSUSE OBS, plus the edge channel on Snapcraft. For a more stable version the README directs you to the Current Release page on the website.

To get the development sources, the README gives this command:

```bash
git clone https://github.com/Subsurface/subsurface.git
```

After cloning, the README states that detailed build instructions live in INSTALL.md, and that the repository uses CMake (CMakeLists.txt sits at the top level). It does not reproduce the build commands in the README itself, so INSTALL.md is the file to read next rather than guessing at configure flags.

Once built, the README shows how to run it locally from the build directory. On Linux:

```bash
$ ./subsurface
```

On Mac:

```bash
$ open Subsurface.app
```

One constraint worth reading before you start: native builds on Windows are, in the README's words, "not really supported", because the official Windows installers are cross-built on Linux. If you want Subsurface on Windows, the installer is the path, not a local compile.

## The OpenGL 2.1 requirement and the software renderer fallback

The integrated Google Maps feature on desktop needs a GPU driver supporting at least OpenGL 2.1. Subsurface attempts to detect when that is not available and fall back, but the README admits the detection may not fire. In that case the README tells you to set the environment variable QT_QUICK_BACKEND to the value software, as a persistent environment variable configured through your operating system rather than a per-run flag.

That is a real friction point. On a headless or virtualized desktop, or on older hardware, the first launch may show a broken or blank map before you diagnose the cause. The failure is cosmetic rather than data-destroying, which is the right trade-off, but it means a fresh install on an unusual machine can look broken when it is only missing a driver capability.

## Where Subsurface is the wrong tool

The release situation is the honest limitation. The most recent tagged release listed here is v4.9.4 from 2020, and the README's own instruction for anyone wanting current code is to take a nightly build. The repository is not archived and the last push was on 2026-09-23, so development is happening, but that activity is not reaching versioned releases. Anyone who needs a stable artifact with a version number and a changelog tied to it should read that as a warning rather than a detail.

There are two other boundaries. If your dive computer is not in SupportedDivecomputers.txt, the import workflow does not apply to you, and the README offers no generic fallback for unsupported hardware. And if you want a hosted logbook you can open from any browser without installing anything, Subsurface is a local application with local files; the README does not describe a sync service. The desktop build also carries more setup weight than a mobile app, since the Google Maps feature drags in a GPU driver requirement that has nothing to do with logging dives.

## Subsurface compared with Subsurface-mobile and the command line downloader

The most direct alternative is Subsurface's own mobile application, which lives in the same repository under mobile-widgets/ with subsurface-mobile-main.cpp as its entry point. The difference is not a fork or a competing project; it is a different front end over the same core/ and commands/ code. The mobile build is what the Android and iOS artifacts in the README refer to, and it is built for touch and for logging dives on site rather than for the desktop import dialog, the map widget and the printing templates that the desktop tree carries.

The repository also contains cli-downloader.cpp and subsurface-downloader-main.cpp, a command line downloader. That matters for a specific case: pulling dives off a computer on a machine where you do not want to run the full desktop UI, or in a script. The README does not document the downloader's flags, so treat it as something to inspect in the source or in INSTALL.md rather than something you can drive from the README alone. A separate dive log application with its own import layer would differ mainly in which devices it supports and what file format it stores; Subsurface's answer to that is its own data file plus import from several existing divelog programs, which is a migration path rather than a lock-in.

## Maintenance, licensing and what upgrading costs you

Subsurface is GPL-2.0. The repository carries both LICENSE and gpl-2.0.txt. In practical terms, that means you can read, modify and redistribute the source under the same licence, and if you distribute a modified binary you carry the corresponding source obligations. This is a description of the licence text, not legal advice; if you plan to ship a modified Subsurface, read gpl-2.0.txt and the CLA in the repository yourself.

Upgrade cost is unusual here. Because the project ships nightly builds and the newest tagged release is from 2020, staying current means tracking a moving build rather than jumping between versions. That cuts both ways: fixes for new dive computers arrive quickly, and so does any regression. A diver who wants a logbook to be boring should keep the data file backed up independently of whichever binary is installed, since the binary is the part that changes often.

Contributions are managed through CONTRIBUTING.md, and translations go through Transifex. The README is explicit that pull requests editing translation files directly are not wanted, which is a useful signal about where the project's review attention sits.

## Conclusion

Subsurface fits divers who own a supported dive computer and want their logs in one open file on their own machine, plus anyone willing to run nightly builds or build from source. It does not fit users who need a vendor-supported binary with a published release cadence, because the newest tagged release in this repository is v4.9.4 from 2020. Before adopting it, check your exact dive computer against SupportedDivecomputers.txt, confirm whether your platform needs the QT_QUICK_BACKEND software renderer, and decide whether you are comfortable running the nightly build or compiling from source yourself.

## FAQ

### How do I use Subsurface to import dives from my dive computer?

Select "Import from Divecomputer" from the "Import" menu, choose your dive computer and where it is connected, then click "Download". Bluetooth dive computers have their own selection in that dialog. Your device needs to be supported by libdivecomputer, and the list is in SupportedDivecomputers.txt.

### Where do I download Subsurface?

The README points to nightly builds for Windows, macOS, Android (sideloading required) and a Linux AppImage, available from the Latest Dev Release page on the project website and from the nightly-builds repository on GitHub. They are also published to the Subsurface-daily repos on Ubuntu Launchpad, Fedora COPR and OpenSUSE OBS, and to the edge channel on Snapcraft. For a more stable version the README directs you to the Current Release page.

### Can I build Subsurface from source, and what does it need?

Yes. The README gives the clone command and states that detailed build instructions are in INSTALL.md. The repository uses CMake, and the README notes that native builds on Windows are not really supported because the official Windows installers are cross-built on Linux.

### Why does the map in Subsurface not display correctly?

The integrated Google Maps feature on desktop requires a GPU driver supporting at least OpenGL 2.1. Subsurface tries to detect when that is missing, but the README says you may have to set the environment variable QT_QUICK_BACKEND to the value software to force the software renderer.

### Is Subsurface the same as Subsurface-mobile?

They come from the same repository. The mobile front end lives under mobile-widgets/ with subsurface-mobile-main.cpp as its entry point, and it is what the Android and iOS build artifacts refer to. The README's import instructions and the Google Maps requirement describe the desktop application.

## Sources

- [License: GPL-2.0](https://github.com/subsurface/subsurface/blob/master/LICENSE)
- [Project website](https://subsurface-divelog.org)
- [README](https://github.com/subsurface/subsurface/blob/master/README.md)
- [Releases](https://github.com/subsurface/subsurface/releases)
- [subsurface/subsurface on GitHub](https://github.com/subsurface/subsurface)

---

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