Skip to content
Open
97 changes: 97 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,103 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).

---

## [1.19.0] — 2026-09-15

> First stable release of the 1.19.0 cycle. Replaces the `1.19.0-beta.1`
> … `1.19.0-beta.8` builds — see git history / the entries below for the
> detailed beta-by-beta log if needed. Headline of this cycle: MTP support
> for newer Garmin devices (Linux + Windows), Linux AppImage
> self-administration, Pocket Query e-mail retrieval, Polish and Spanish
> UI languages, and the first wave of GSAK filter-parity work (12 text
> filter operators).

### Added

- **MTP support for newer Garmin devices, Linux and Windows (#453, #822,
#826)** — Newer Garmin models (2020+) dropped USB mass-storage in
favour of MTP (Media Transfer Protocol), which the mount-point-based
device detection couldn't see, so "Send to GPS" silently found no
device for these units. On Linux, device detection now also scans
GVFS/MTP mounts (`/run/user/*/gvfs/mtp:...`); on Windows, a new
`opensak.gps.mtp` module talks to the device through the same Shell
"Folder" automation API File Explorer itself uses (via `pywin32`, a
new Windows-only dependency), wrapped in an `MTPDevice`/`MTPPath`
adapter that mirrors `pathlib.Path`'s interface — so the existing
GPX/GGZ export code needed no changes at all. With this, #453 is
resolved on both Linux and Windows; macOS remains unconfirmed. Thanks
to Brian Anderson (@blazerat) for the investigation and fix.
- **Linux AppImage: self-administration, no terminal required (#824,
#835, #836, #837)** — Replaces the originally planned external
`uninstall.sh` + AppImageUpdate approach with self-integration,
self-update, and in-app uninstall implemented directly in OpenSAK.
Linux-only; a no-op everywhere else. On first launch, OpenSAK offers
to install itself into the application menu; an "Upgrade now" button
downloads and atomically replaces the running AppImage; and a new
"Uninstall OpenSAK" button removes the desktop integration with a
choice between removing the program only or the program and all data.
- **Pocket Query e-mail retrieval (#443)** — OpenSAK can now check a
configured IMAP mailbox for Pocket Query zip attachments and import
them automatically. Settings → PQ Email configures the mailbox
(host/port/SSL/credentials), with the password stored in the OS
keyring, never in plaintext. File → "Check for PQ Email…" runs a
manual, on-demand check; an opt-in checkbox deletes the e-mail after a
successful import. An "only check new (unread) messages" option uses
IMAP's native `\Seen` flag to avoid re-importing already-read PQ
e-mails. Gmail and Outlook.com/Live.com aren't supported yet (both
need OAuth2, tracked as #697/#698); scheduled/background checking is
tracked separately as #445. Thanks to Jimbo-DK for real-world PQ-club
mailbox testing and feedback.
- **Polish and Spanish UI languages** — OpenSAK now ships with `pl` and
`es` translations, bringing the total to 10 supported languages. Both
are a machine-translated first pass; community review and corrections
are welcome before promotion to stable status.
- **Text filter operators (#557, #850)** — Name, GC code, Placed by,
Owner, Country, State and County filters now offer 12 operators
instead of a single substring match: `contains`/`not contains`,
`equals`/`not equals`, `starts with`/`ends with`, `in list`/`not in
list`, `empty`/`not empty`, and `regex`/`not regex`. Matching is
pushed down to SQL where possible; anything SQLite can't express
falls back to an in-Python check, so accented/non-Latin text still
matches correctly. Existing saved filter profiles keep working
unchanged. First part of the GSAK filter-parity work tracked in #821.
Thanks to @nagisml for the contribution.
- **Cache type icons in filter dialog (#855, #856)** — The General tab's
cache type checkboxes now show the same type icon used in the cache
table instead of plain text labels. Thanks to @nagisml.

### Fixed

- **GPX import failing on invalid XML character references (#845,
#846)** — A cache description containing a character reference to a
code point XML 1.0 forbids (e.g. from text pasted out of Word) made
lxml reject the entire file and import zero caches. Illegal character
references and raw control characters are now stripped while
streaming the file, before parsing, for GPX, PQ ZIP, and .loc imports
alike. Thanks to @nagisml for the report and fix.
- **Filter dialog: Reset didn't clear the Owner name field (fixes
#848)** — Resetting the General tab (or "Reset all") cleared Name, GC
code and Placed by but left a typed Owner name in place. Thanks to
@nagisml for the report and fix (#849).
- **Filter dialog: single-day date range failed to match caches (fixes
#844)** — The start-of-range time was hardcoded to 23:59 regardless of
whether it was the "from" or "to" bound, so filtering on a single day
produced a 59-second window instead of the full day.
- **Filter dialog: Hidden date range not restored on reopen (fixes
#857)** — Reopening the Filter dialog after setting a Hidden date
range showed the Hidden date checkboxes unchecked and the date fields
empty, even though the cache list was still correctly filtered.
`HiddenDateFilter` is now a proper filter class alongside its
siblings, with working save/reload and dialog restore. Thanks to
ianwork for the report.

### Changed

- **Filter dialog: "Save filter" pre-fills the current profile name
(#852)** — When a saved profile is selected, the save dialog now
suggests its name instead of an empty field. Thanks to @nagisml.

---

## [1.19.0-beta.8] — 2026-09-14

### Added
Expand Down
31 changes: 30 additions & 1 deletion docs/filters.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,14 @@ Filters can also be **nested**: an outer AND group can contain an inner OR group

## Filter tabs

The filter dialog is split across six tabs:
The filter dialog is split across seven tabs:

| Tab | What's on it |
|---|---|
| **General** | Cache type, container, D/T, found status, availability, distance, premium, trackables, corrected coordinates |
| **Dates** | Hidden date, found by me date, DNF date, last log date |
| **Other** | Country / State / County, user flag, DNF, FTF, favourite points, locked |
| **Line/Polygon** | Caches along a route, inside an area, or near a list of points |
| **Attributes** | ~70 standard Groundspeak attributes |
| **Text Search** | Full-text search across description, logs, notes, and (optionally) hint |
| **Where** | Raw SQL WHERE clause for advanced filtering |
Expand Down Expand Up @@ -245,6 +246,34 @@ Filter by the date of the most recent log entry for the cache.

---

## Line / polygon filter

The **Line/Polygon** tab works like GSAK's filter of the same name. Enter one point per line in the text box:

```text
53.18346, 8.71113
N 53 23.613, E 008 00.941
W,GC12345
```

- Any coordinate format OpenSAK understands works (decimal degrees, DMM, DMS), with or without a comma between latitude and longitude.
- `W,<code>` takes the coordinates of a cache (its corrected coordinates when set) or a waypoint in the current database.
- Text after `#` is ignored, so you can annotate the list.
- **Add flagged (user flag)** appends a `W,<code>` line for every cache with the user flag set.
- **Read points from file** loads a GPX file (track points, else route points, else waypoints), a KML file, or a text file in the format above — replacing or appending to the list.

Choose the filter type:

| Type | Includes caches… | Needs |
|---|---|---|
| Line | within the distance of the line through the points (a route or track) | 2+ points and a distance |
| Polygon | inside the area the points outline (closed automatically); a distance above 0 also includes caches that close to the outline | 3+ points |
| Points | within the distance of any single point | 1+ point and a distance |

Check **Exclude** to invert the filter and keep only the caches that do *not* match. The filter uses a cache's corrected coordinates when set. Distances are measured along the Earth's surface; polygon edges are straight lines in latitude/longitude. Shapes that cross the ±180° meridian are not supported.

---

## Text search filter

The **Text Search** tab searches free-text fields for a word or phrase, rather than an exact match like the *Name* or *GC code* filters.
Expand Down
10 changes: 5 additions & 5 deletions site/user-guide.html
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>OpenSAK User Guide — v1.19.0-beta.8</title>
<title>OpenSAK User Guide — v1.19.0</title>
<style>
@import url('https://fonts.googleapis.com/css2?family=Playfair+Display:wght@700&family=Source+Serif+4:ital,wght@0,300;0,400;0,600;1,400&family=JetBrains+Mono:wght@400;500&display=swap');

Expand Down Expand Up @@ -473,7 +473,7 @@
<nav>
<div class="nav-header">
<span class="nav-logo">OpenSAK</span>
<div class="nav-version">User Guide · v1.19.0-beta.8</div>
<div class="nav-version">User Guide · v1.19.0</div>
</div>

<div class="nav-section-heading">Getting Started</div>
Expand Down Expand Up @@ -535,7 +535,7 @@
<div class="hero-eyebrow">Complete User Guide</div>
<h1>OpenSAK</h1>
<p class="hero-sub">The open-source geocache management tool for Windows, Linux, and macOS.</p>
<div class="hero-meta">Version 1.19.0-beta.8 &nbsp;·&nbsp; MIT Licence &nbsp;·&nbsp; <a href="https://github.com/OpenSAK-Org/opensak">github.com/OpenSAK-Org/opensak</a></div>
<div class="hero-meta">Version 1.19.0 &nbsp;·&nbsp; MIT Licence &nbsp;·&nbsp; <a href="https://github.com/OpenSAK-Org/opensak">github.com/OpenSAK-Org/opensak</a></div>
</div>

<figure class="screenshot" style="margin-top:-0.5rem;">
Expand Down Expand Up @@ -1463,7 +1463,7 @@ <h3>Debug Log</h3>
<tr><td>Bug reports &amp; feature requests</td><td><a href="https://github.com/OpenSAK-Org/opensak/issues">github.com/OpenSAK-Org/opensak/issues</a></td></tr>
<tr><td>Community discussion</td><td><a href="https://www.facebook.com/groups/opensak">Facebook group: OpenSAK</a></td></tr>
<tr><td>Releases &amp; downloads</td><td><a href="https://github.com/OpenSAK-Org/opensak/releases">github.com/OpenSAK-Org/opensak/releases</a></td></tr>
<tr><td>Changelog</td><td><a href="https://github.com/OpenSAK-Org/opensak/blob/v1.19.0-beta.8/CHANGELOG.md">CHANGELOG.md on GitHub</a></td></tr>
<tr><td>Changelog</td><td><a href="https://github.com/OpenSAK-Org/opensak/blob/v1.19.0/CHANGELOG.md">CHANGELOG.md on GitHub</a></td></tr>
<tr><td>Contributing</td><td><a href="https://github.com/OpenSAK-Org/opensak/blob/main/CONTRIBUTING.md">CONTRIBUTING.md on GitHub</a></td></tr>
<tr><td>Support the project</td><td><a href="https://opencollective.com/opensak">opencollective.com/opensak</a></td></tr>
<tr><td>Website</td><td><a href="https://opensak.com">opensak.com</a></td></tr>
Expand All @@ -1473,7 +1473,7 @@ <h3>Debug Log</h3>
<div class="callout tip"><div class="callout-icon">💡</div><div>OpenSAK is free and open-source software released under the MIT licence. Contributions of any kind — code, translations, documentation, or testing — are very welcome.</div></div>

<p style="margin-top:2rem;color:var(--ink-light);font-size:0.85rem;font-style:italic;">
This guide was generated from the OpenSAK source code (v1.19.0-beta.8). Last updated August 2026.
This guide was generated from the OpenSAK source code (v1.19.0). Last updated August 2026.
</p>
</section>

Expand Down
2 changes: 1 addition & 1 deletion src/opensak/__init__.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
"""OpenSAK — cross-platform geocache management tool."""
__version__ = "1.19.0-beta.8"
__version__ = "1.19.0"
__author__ = "OpenSAK Contributors"
__license__ = "MIT"
2 changes: 1 addition & 1 deletion src/opensak/filters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
CacheTypeFilter, ContainerFilter, DifficultyFilter, TerrainFilter,
FoundFilter, NotFoundFilter, AvailableFilter, ArchivedFilter,
CountryFilter, StateFilter, CountyFilter, NameFilter, GcCodeFilter, PlacedByFilter,
DistanceFilter, AttributeFilter, HasTrackableFilter,
DistanceFilter, LinePolygonFilter, AttributeFilter, HasTrackableFilter,
PremiumFilter, NonPremiumFilter,
FilterSet, SortSpec, SORT_FIELDS, FILTER_REGISTRY,
FilterProfile, apply_filters,
Expand Down
Loading