Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions PRIVACY_POLICY.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
# Privacy Policy — OpenSAK

**Open Source Geocache Manager**
*Effective date: September 29, 2026*
*Effective date: October 18, 2026*

---

Expand Down Expand Up @@ -69,14 +69,27 @@ If you set up **Pocket Queries by e-mail**, OpenSAK stores your mail server name

When you check for PQ e-mails, OpenSAK connects **only to the mail server you entered**, over an encrypted connection, and verifies the server's certificate before sending your password. It reads messages to find Pocket Query attachments and, if you chose so, deletes the e-mail after a successful import. Nothing from your mailbox is sent anywhere else.

### 2.5 Logs and crash reports

OpenSAK writes a log file (`opensak.log`, plus `opensak.log.previous` from the session before) to its application data directory. To notice crashes, it also keeps a `session.lock` file while it runs and, if it crashes hard, writes the technical details to `crash_native.log` in the same place. None of these files leave your device on their own.

When OpenSAK runs into an unexpected error, or finds at startup that the previous session crashed, it shows a crash report dialog with the **exact text** that would be shared. Your home folder path, your computer's user name, e-mail addresses and access tokens are removed from it first. Other details, such as cache or database names, may still appear, so you can check the text before sharing it.

A crash report is shared **only if you choose to**:

- **Report on GitHub** opens a prefilled issue in your browser, which you can still edit and must submit yourself. GitHub's privacy statement applies.
- **Send e-mail** opens a prefilled message to hello@opensak.com in your own mail program, which you send yourself.

Nothing is sent automatically, and you can simply close the dialog.

---

## 3. Data We Do Not Collect

OpenSAK does not collect, transmit, or process any of the following:

- Usage statistics or analytics
- Crash reports or error telemetry
- Crash reports or error telemetry (a crash report is only shared when you send it yourself, see 2.5)
- Your location or GPS data
- Your name, email address, or Geocaching.com username (except as stored in locally imported cache logs)
- Any data about how you use the application
Expand Down
5 changes: 5 additions & 0 deletions docs/Uninstalling-OpenSAK.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,11 @@ changed in version 1.14.0:
| Language only | `preferences.json` | merged into `opensak.json` |
| Database(s) | Same folder as settings | A folder you chose in the welcome wizard (can be the same folder, or a different one) |
| Logs | `opensak.log` (same folder) | `opensak.log` inside the install folder |
| Crash detection | — | `session.lock` and `crash_native.log` inside the install folder |

`session.lock` exists while OpenSAK is running (and stays behind if it was
closed abnormally); `crash_native.log` holds the technical details of the last
hard crash, if any. Both are safe to delete while OpenSAK is closed.

If you upgraded from an older version to 1.14.0+, OpenSAK automatically copied
your old settings into the new `opensak.json` the first time it ran. The old
Expand Down
8 changes: 6 additions & 2 deletions site/PRIVACY_POLICY.html
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@
<main>
<p class="doc-label">// Legal</p>
<h1>Privacy Policy</h1>
<p class="effective">Effective date: September 29, 2026</p>
<p class="effective">Effective date: October 18, 2026</p>

<h2>1. Overview</h2>
<p>OpenSAK is a free, open source desktop application for managing geocaching data locally on your own computer. It runs on Windows, Linux, and macOS.</p>
Expand Down Expand Up @@ -89,12 +89,16 @@ <h3>2.4 Pocket Query e-mail settings (optional)</h3>
<p>If you set up <strong>Pocket Queries by e-mail</strong>, your mail server, port, security setting and username are stored in OpenSAK's settings file. The <strong>password</strong> is stored in your operating system's secure credential store (macOS Keychain, Windows Credential Manager, or the Secret Service keyring on Linux) — never in plain text.</p>
<p>OpenSAK connects <strong>only to the mail server you entered</strong>, over an encrypted connection, and verifies the server's certificate before sending your password. Nothing from your mailbox is sent anywhere else.</p>

<h3>2.5 Logs and crash reports</h3>
<p>OpenSAK keeps a log file (opensak.log and opensak.log.previous) in its application data directory. To notice crashes it also keeps session.lock while it runs and, after a hard crash, crash_native.log in the same place. None of these files leave your device on their own.</p>
<p>After an unexpected error or a crash, OpenSAK shows a crash report dialog with the <strong>exact text</strong> that would be shared, with your home folder path, your computer's user name, e-mail addresses and access tokens removed. Other details, such as cache or database names, may still appear. The report is shared <strong>only if you choose to</strong>: <strong>Report on GitHub</strong> opens a prefilled issue that you submit yourself (GitHub's privacy statement applies), and <strong>Send e-mail</strong> opens a prefilled message to hello@opensak.com in your own mail program. Nothing is sent automatically.</p>

<hr class="rule">

<h2>3. Data We Do Not Collect</h2>
<ul>
<li>Usage statistics or analytics</li>
<li>Crash reports or error telemetry</li>
<li>Crash reports or error telemetry (a crash report is only shared when you send it yourself, see 2.5)</li>
<li>Your location or GPS data</li>
<li>Your name or email address</li>
<li>Any data about how you use the application</li>
Expand Down
41 changes: 32 additions & 9 deletions src/opensak/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -280,8 +280,14 @@ def main() -> None:
# Initialiser logging-systemet FØRST (issue #232) — så vi kan logge
# alt der sker under resten af opstarten, inkl. migration og wizard.
from opensak.logger import setup_logging
setup_logging()
log_path = setup_logging()
logger.info("startup: main() begin, version=%s", _ver)

# Catch crashes from here on: uncaught exceptions get a report dialog
# instead of vanishing (no console in a windowed build), and a hard
# crash of the last session is detected so it can be reported below.
from opensak import crash_report
crash_report.install(log_path.parent)
_startup_t0 = time.monotonic()

# Kør macOS-sti-migreringen (issue #825) FØR NOGET ANDET rører
Expand Down Expand Up @@ -458,16 +464,33 @@ def _close_splash():

from PySide6.QtCore import QTimer
QTimer.singleShot(400, _close_splash)
# Issue #549: after the splash has gone, tell the user if the active
# database was backed up before being migrated during startup.
QTimer.singleShot(500, window.show_premigration_backup_notices)
# Issue #1045: the last active database was unavailable (e.g. a removed
# USB drive) and startup fell back to another one.
QTimer.singleShot(550, window.show_database_fallback_notice)

# After the splash has gone, show the startup notices one after another.
# Each is modal, so separate timers would fire inside the first dialog's
# event loop and stack the others on top of it.
startup_notices = [
# Issue #549: the active database was backed up before being
# migrated during startup.
window.show_premigration_backup_notices,
# Issue #1045: the last active database was unavailable (e.g. a
# removed USB drive) and startup fell back to another one.
window.show_database_fallback_notice,
]
if settings_restore_result is not None:
QTimer.singleShot(
600, lambda: window.show_settings_restore_notice(settings_restore_result)
startup_notices.append(
lambda: window.show_settings_restore_notice(settings_restore_result)
)
startup_notices.append(lambda: crash_report.show_previous_crash_notice(window))

def _show_startup_notices():
for notice in startup_notices:
try:
notice()
except Exception:
# Report it, but don't let one broken notice hide the rest.
sys.excepthook(*sys.exc_info())

QTimer.singleShot(500, _show_startup_notices)

window.show()
exit_code = app.exec()
Expand Down
Loading
Loading