User manual, plugin version 1.3. Encrypt layers and columns inside an ordinary GeoPackage, grant access by key, and open what you are allowed to read.
A GeoPackage is one file with layers and tables; anyone who can copy it can read all of it. SecureGeoPackage locks chosen layers (geometry included) or chosen columns (the map stays visible) inside that same file. Everything else stays a normal GeoPackage that opens in any GIS.
There are no passwords. Every person has an identity: a pair of keys made on their own computer.
The public ID is what you hand out, always as a small file name.publicid (Save public
ID...); it holds nothing private. The private ID never leaves your computer: it is not shown, not
copied, not mailed, and every button that comes near it warns you first. Anyone who has your private ID
is you. The admin of a file grants you access by adding your public ID to the file. The file carries its own
list of who may do what (the roster), under pseudonyms, and an admin signs the whole header, so
tampering is detected when the file is opened.
| Role | May |
|---|---|
| Reader | open the locked parts |
| Contributor | open; edit layers with encrypted columns and save the rows as pending contributions |
| Writer | open; edit any encrypted layer and save it back; validate contributions |
| Admin | everything, and alone: choose what is encrypted, grant, revoke, change the roster |
The plugin, the standalone program and the ArcGIS Pro add-in share one look: the same sections in the same
order (Identity, File, Layers, the verbs, Roster, Contributions, Log), the same words (Open...,
Decrypt, Encrypt, Readable copy..., Verify, Grant..., Set up...),
and the same colours: one action blue; a coloured chip for every role (admin, writer, contributor, reader) and
every row state (definitive, validated, pending, untrusted); a lock for an encrypted layer, green when your key
opens it, grey BLOB when it does not. The theme switch at the top right offers Auto, which
follows QGIS, Light and Dark; the choice is remembered.
Own identity: your fingerprint, where the identity is stored, Unlock (when the
authenticator is on), Set up..., Save public ID.... The private ID is not shown.
Access control: the roster of the current file (pseudonym, role, fingerprint, since, expiry,
contact, and the name when you can read it); Grant..., Change role...,
Revoke, Request access....
File control: the public notice and the encryption algorithm.
Update access writes File control changes into the file and signs it.
Open... and the name of the open file; a status line; Output (for a file that is not encrypted yet); the tree of layers and columns with a tick per encrypted item; Tick all, Untick all, Readable copy..., Decrypt (Add to QGIS for an unencrypted file), Add from QGIS...; and Encrypt.
The tree shows an encrypted file as your key opens it. A layer your key opens is listed as it
really is: its original type (features or attributes), its geometry with the geometry type, every column
with its declared type, and the row count. A layer your key does not open is shown as what it is on
disk: one egpkg_payload BLOB column. For an encrypted file the Output field is hidden,
because Encrypt writes the file in place; the status line says how many encrypted layers your key
opens, or that you are not on the roster.
The change log of the file (time, pseudonym, what), the filter Show edits since my last decrypt, and the Contributions section with Validate and Verify.
name.gpkg beside the original and opens. If name.gpkg
already exists you are asked whether to open it or make a new one.name.secure.gpkg. Change it if you like.name.publicid to mail you, and Request access... (section 7) does that and opens the
mail in one go.2027-12-31 means the end of that day) and, if you wish, the real name, organisation and
contact for the encrypted directory.Change role... and Revoke work on the selected roster row. Revoking removes the person's permit: they can no longer open the file. Copies they already made stay readable to them (section 17).
Without a key you still see the unencrypted layers in any GIS, the notice, the roster (pseudonyms and roles) and whether the signature holds.
Open the file, Access, Request access.... Your public ID is saved as name.publicid
and, if the file's admins published a contact address, your mail program opens with a message to them:
attach that file and send. Otherwise send the file to whoever gave you the file.
Writers and admins. Open the file, Decrypt, edit the layers in QGIS as usual (start editing, change, save). Then press Encrypt: the edited layers are written back into the encrypted file under its existing keys, so everyone who had access keeps it; the file is re-signed by you; the log records edited layers under your pseudonym; the layers leave the project and the working copy is removed. A writer cannot change which layers are encrypted; ticking a new layer or adding one is for an admin, whose Encrypt then re-encrypts with fresh keys.
Admins only. Open the file, press Add from QGIS... and tick the project layers to add. They are copied into the working copy and appear in the tree; tick the ones that must be encrypted and press Encrypt. A layer whose name already exists in the file is refused: rename it in QGIS first. For an unencrypted working file, Add from QGIS... copies straight into the file.
A contributor opens the file, presses Decrypt (layers with encrypted columns are editable; wholly encrypted layers are not), adds or changes rows, and presses Encrypt. The new and changed rows go into the file with the contributor's signature; deleted rows are not carried over.
In a layer with encrypted columns every row carries the signature of the person who wrote it. The Log tab shows, per such layer, how many rows are pending (written by a contributor, not yet validated) and how many are untrusted (no valid signature, or signed by someone without write rights). A writer or admin presses Validate to countersign them. Editing a validated row makes it pending again, because its content changed. Verify checks the file signature and the integrity of every fully encrypted layer.
The Log tab lists what happened to the file: layers encrypted or decrypted, access granted, revoked or changed, notice changed, an admin who resigned, layers edited or added. Each line carries the time and the pseudonym of the admin who did it. The log lives in the encrypted part, so only key holders see it, and it survives re-encryption.
Show edits since my last decrypt keeps only the lines newer than the moment you last opened the file's content on this computer (added layers to QGIS, exported, or decrypted). The label shows that moment, or "never".
Readable copy... asks where to write the copy (proposed: name.open.gpkg beside
the file). Readers, contributors and writers get a readable copy: everything they hold keys for
restored, everything else removed, no trace of the extension left. Admins get a full decrypt of the
whole file. Untick all unticks every layer; Encrypt then removes the encryption in place
(admin).
Manage identity, Enable authenticator.... Scan the QR code with an authenticator app (Microsoft Authenticator, Google Authenticator, Aegis, any RFC 6238 app) or type the setup key, then enter the six-digit code once. From then on the plugin asks a code when it starts and again before admin actions after five minutes. Disable authenticator... asks a code too.
| Share freely | Never share |
|---|---|
Your public ID file (Save public ID...): name.publicid, a text file with
a line that starts with egpkg-id:1:. Holding someone's public ID gives you nothing of theirs;
it only lets an admin grant them. |
Your private ID: a .privateid file (starts with egpkg-identity:1:), a
backup file together with its code, your QGIS master password, your authenticator setup key. Anyone
with these is you for every file you were granted. The plugin never shows it and warns before every
button that touches it. |
The encrypted file itself may be copied and mailed: without a key it shows only its public side.
| Message or symptom | What to do |
|---|---|
| "is held by another program (a layer in QGIS?)" | Remove the layers of that file from the QGIS project (the plugin's own layers leave when you press Encrypt) and try again. |
| "An identity is stored but cannot be loaded" | Enter the QGIS master password (Settings, Options, Authentication) and reopen the plugin. Do not create a new identity: that would replace the stored one. |
| "Signature: INVALID - do not trust this file" | The header was altered after the last admin signed it, or the issuer was replaced. Ask an admin for a fresh copy. Nothing in it should be trusted. |
| "You hold no key for this file" | You are on the roster but your permit is missing or expired, or the file was re-encrypted without you. Ask an admin to grant you again. |
| "These layers exist already" | Rename the QGIS layer before Add from QGIS. |
| "Choose an output file" | For an unencrypted file the output must differ from the input; for an encrypted one it may be the file itself. |
| A working copy stays in the temp folder | QGIS still held the file, or QGIS crashed or lost power. The plugin retries on close and sweeps leftovers of earlier sessions at the next start, and says so in the QGIS log (SecureGeoPackage). Disk encryption on the computer (BitLocker, FileVault, LUKS) is the control for the minutes in between. |
| The code from the app is refused | Check the clock of the phone and the computer; each code is valid once. |
| Identity | your key pair: the public ID, shared as a file, and the private ID, kept. |
| Public ID | the public half as a .publicid file, with your pseudonym and contact. |
| Private ID | the private half; never shown, never shared. |
| Fingerprint | 16 characters that identify a public half; check it out of band. |
| Roster | the public list in the file of who has which role, under pseudonyms. |
| Permit | the keys of a file, wrapped for one identity; made when access is granted. |
| Notice | public text in the file, shown to everyone. |
| Working copy | a temporary decrypted copy the plugin uses to show and edit layers. |
| Pending, validated, definitive, untrusted | the four states of a row in a column-encrypted layer, derived from its signatures and the roster. |
| egpkg_encryption | the GeoPackage extension the files use; proposed to the OGC GeoPackage working group. |
SecureGeoPackage, a private production by Captain Ahab & Cosmo, GPL-3.0-or-later. The embedded egpkg library is MIT. Manual for version 1.4.0, September 2026.