ENCs are the electronic navigational charts of the sea and its ports, Inland ENCs those of the inland waterways; the postProcessor works both, in S-57 and in S-101, and audits S-102 depth surfaces. The navigation systems on board and the displays of traffic centres draw them.
Every chart describes the water as a skin: areas of known depth, areas never surveyed, and land. That skin must fit together without gaps, overlaps or edges that cross. A fault can make a ship's system refuse the chart, or draw it wrongly.
The postProcessor is a plug-in for QGIS, the free desktop GIS. Before the office issues a set of charts, it finds those faults, proposes the smallest repair that breaks nothing else, and — once a cartographer approves it — writes the repairs into a copy of the set.
<set>_alt1, _alt2, …Free and open-source software under the GNU General Public License, version 3 or later
(GPL-3.0-or-later). The office may use it without a fee, read and change its code, and pass it on. Whoever
passes on a changed version passes on its source, under the same licence. There is no warranty. Its text
comes with it: LICENSE.
Copyright (C) 2026 W.D. de Pooter
| Software | QGIS 3.34 or later, up to 4.x. Tested on QGIS 4.2.1 on Windows 11; QGIS 3 not yet in use. |
|---|---|
| Python packages | shapely 2, GDAL's Python, numpy — all come with QGIS. The plugin checks them at its start and says what is missing. |
| Processors | Any. The review runs up to 8 processes side by side, the map as many again: more cores, shorter waits. |
| Memory | 16 GB recommended; 8 GB will do for small sets. (Drawn from the measurement below.) |
| Disk | The workspace, in the home directory on a fixed disk: one review of a large set writes about 3 GB, and the workspace is emptied at every start. Keep 50 GB free for sets of a hundred charts and more. (Recommended.) |
| Network | Not needed. Used through QGIS for the background map (switchable off), the office's GIS service (Q&A). |
| Rights | No administrator rights: it installs into the user's QGIS profile. |
On a laptop workstation with 8 cores and 16 threads (Intel Core i9-9980HK), 64 GB of memory, Windows 11, with the set U6 Aanloop Amsterdam: 128 charts, 196 MB.
| Copied in | 1.0 s |
|---|---|
| Reviewed | 8 min 36 s, the map beside it |
| Map complete | 2 min 28 s |
| Written | 873 repairs, 44 charts: 58 s; 5 cures: 2 min 15 s |
| Heaviest step | 2.4 million soundings merged and thinned for the map, when asked for: 7 min 15 s, about 3.5 GB in one process (09-16) |
Does the plugin make outside connections?
Only through QGIS's own network access, never on its own: no sockets of its own, no telemetry, no update check, no error report sent anywhere. Its worker processes make no connection at all.
QGIS reaches outside for it in four cases, each through QGIS's own network access and data providers — so with QGIS's own network, proxy, certificate and authentication settings:
tile.openstreetmap.org over HTTPS. Without a connection it simply draws
nothing. The office can switch it off: with background map (OpenStreetMap) unticked in officeSettings,
no set brings it in, and nothing reaches that address for the plugin. One a QGIS project already holds stays
that project's.Does it send data out?
No. It reads services; it never uploads, posts or reports anything.
What does it write, and where?
pdm_postprocess\reference.gpkg.production, the new
set with the repairs, <set>_altN — when asked, a set of copies, a set for a traffic
centre and the S-101 set a conversion makes, <set>_S101; reviews, the delivery report of every write; a workspace, emptied at every start.Does it keep passwords?
It keeps none. A service that needs a login should use QGIS's authentication manager: only the name of that
entry (authcfg) is kept, and the secret stays in QGIS's own encrypted store.
The private key that signs an S-101 set is treated the same: its path is asked at every conversion, goes to the worker that signs and is kept nowhere — not in the settings, not in the job file, not in a report. The certificate's path is kept in the settings file.
When a model is registered or exported, every secret written into a service address is taken out first: a
user name, a password, an API key, a token, a signature, and an HTTP header that carries one, such as
Authorization or Cookie. An address the plugin cannot read completely is not kept at
all, and the plugin says to use the authentication manager.
What does it record about people and machines?
The journal and the delivery report record file paths (a path under the user's profile shows the account name), the plugin's and QGIS's versions, and the number of processors. No user name or machine name is looked up.
Does it run other programs?
Only its own worker processes: QGIS's own Python, running the plugin's worker script on this machine, for the heavy work. No shell, no downloads, no installers. Help pages and reports open in the system's browser.
Does it need administrator rights?
No. It installs into the user's QGIS profile, like any QGIS plug-in.
How is the code checked?
A version ships only when its gate finds nothing: bandit (a security scanner) over what ships, detect-secrets over every tracked file, flake8 style, a type check of every function, and the ZIP searched for stray or personal files. The whole test harness must pass as well. XML is read defensively: a document that declares a DOCTYPE or an entity is refused. There is no compiled code in it: it is Python, readable as shipped.
Can we check a delivery?
Every delivery's SHA-256 is recorded, and given with the ZIP. Compare it before installing (PowerShell:
Get-FileHash).
Can we read the source?
Yes: under the GPL the office that receives the plugin may have its source. The S-57 to S-101 converter it
carries, s57to101, is GPL-3.0-or-later too (the same author), unchanged: each file's checksum is in
engine/pp_s57to101/CARRIED.md.
Does it sign the S-100 data it writes?
Not yet: the IHO has postponed S-100's signatures, and signing is the next version. A dataset it changes goes out unsigned, its old signature taken out of the catalogue, never left to fail.