v1.25.0 — Selection actions and Touchpad Mode fixes (2026-08-01 10:47)
- Fixed: the wayspot list could render with zero visible rows when the sidebar didn't have enough vertical room (a short mobile viewport, or a busy Wayspots section on desktop) — every row was still there, just clipped to nothing; it now always keeps a usable minimum height
- Fixed: two-finger tap in Touchpad Mode — the only way to open the action menu on touch — never actually worked
- Right-clicking a pin, a group header, or empty map now offers Select All / Select None / Invert Selection, plus Add to Selection / Remove from Selection (and a group's Add Group to Selection) — a touch-friendly equivalent to Ctrl+click, which has no touchscreen analogue
- Fixed: long-pressing a pin or group header on touch to open its menu could also fire whatever the menu's first item happened to be (a browser ghost-click quirk after touch long-press)
- The sidebar's ☑ Select button now shows a live badge with how many wayspots are currently selected
- Fixed the "Status" label's styling to match the rest of the sidebar's section headers
v1.24.0 — Drag-and-drop fixes and cross-group dragging (2026-07-31 21:40)
- Fixed: dragging a wayspot row (or a group section header) did nothing at all in Firefox — the browser's own drag events can target a raw text node instead of an element (unlike Chrome), which crashed the drag handler before it ever got started
- Rows in the wayspot list are draggable again once groups exist — previously disabled entirely the moment any group was created
- Dragging a wayspot row onto a row in a *different* group section now moves it into that group, instead of doing nothing
- Multi-selecting several wayspots (from anywhere in the list) and dragging one of the selected rows now moves the whole selection together — landing them next to each other, in their existing relative order, in whichever group you dropped them on
- Fixed a long, unbroken error message (e.g. from a very long share link) visually overflowing the error toast instead of wrapping within it
v1.23.0 — Group section reordering, list numbering fixes (2026-07-31 15:01)
- Group sections in the wayspot list can now be manually reordered — drag a section's header (by its ⋮ handle) above or below another; persists across undo/redo, reloads (local autosave), and share links, same as the wayspots themselves. "No Group" always stays last and can't be dragged
- Fixed: dragging a group section over "No Group" never highlighted it as a drop target and could insert the section one position off — both the highlight and the insertion math now treat "No Group" as a valid drop target
- Fixed: Shift+click range-select in the wayspot list used the wayspots' underlying array order instead of the order they're actually rendered in — once grouped, a wayspot from a different section could silently drop out of a range that visually spanned it
- The sequence number shown in the list next to each wayspot now restarts at 1 within each group section, instead of jumping straight to that wayspot's plan-wide number — purely cosmetic, so the pin's own badge, conflict "✗ #N" references, and default name are unaffected
v1.22.0 — Context menu rework (2026-07-31 12:07)
- Right-clicking a wayspot always shows single-item actions for the exact one you clicked, with a further "Selected N Wayspots" branch appended wherever you're part of a real 2+ selection — instead of the menu swapping to bulk-only actions and losing single-item access
- Edit, Duplicate, Group By, Remove from Group, Hide/Show, Share, and Remove each collapse to a plain one-click action until there's an actual choice to make (an existing group to pick, or a live bulk selection), then grow into a This Wayspot / Selected N Wayspots (or, for Share, / Group) submenu — no more separate, easy-to-miss "Bulk Edit (N)"-style rows scattered further down the menu
- Group By replaces "Add to New Group": pick New Group or jump straight to an existing group in one click, instead of always creating a new group first and merging afterward
- Renamed Fit to Zoom to Fit for clarity
- Share This Wayspot / Share Group / the bulk Share leaf now scope the copied link to exactly what they say — previously every share action (including the per-wayspot one) copied a link to the *entire* board
- Reordered the info cluster to Copy Coordinates → Center on Map → Zoom to Fit → Share → Open in Google Maps
- The menu now supports nested flyout submenus (previously only a single flat list), with hover, click, and arrow-key (→/←) navigation, matching a native OS menu
v1.21.0 — Custom groups (grouping) (2026-07-30 15:28)
- Added a 🗂 Group button alongside Filter/Select — its Group Selection action selects wayspots and groups them into a custom group in one step (also right-click menu or Ctrl+Shift+G), same as Photoshop's layer grouping; running it again on an already-grouped selection ungroups it
- Auto-generated group names ("Group 1", "Group 2", ...) — click a group's name in the wayspot list to rename it inline
- The wayspot list automatically splits into a section per group (plus a "No Group" section) once any wayspot has one, instead of one flat list — manual drag-to-reorder is only available in the flat, ungrouped view
- Each group section has a fold/unfold chevron, plus a Collapse All Groups / Expand All Groups action in the Group popover
- Clicking a group's section header (not its name) selects every wayspot in it; right-clicking it offers Edit/Duplicate/Select/Fit/Hide or Show/Ungroup/Delete, applied to the whole group at once — the same actions the bulk-selection menu offers, scoped to group membership instead
- Added a Group option to the Filter popover and a Select by Group option to the Select popover, both hidden until at least one custom group exists
- CSV export/import gained a Group column (also recognizes `Layer`/`Batch` as a header alias on import)
- KML/KMZ export groups folders by group name (with an "Ungrouped" folder for anything left out) once any wayspot uses a custom group, instead of the usual Nomination/Type folders — unmodified plans export exactly as before
- Importing a KML/KMZ file — including a real Google My Maps export, where every layer is already its own folder — now recreates each unrecognized `<Folder>` as a custom group here
v1.20.0 — Search: unify link/coordinate handling with place results (2026-07-30 14:24)
- Pasting a Google Maps link or a raw `lat,lng` pair into the search bar now pans the map there and shows a single result row instead of placing a marker immediately — matches the existing place-name results, where the row itself only pans and its pin button places the marker
- Expanded the search bar's on-focus hint into a bulleted explanation of the three accepted input kinds, including which Google Maps link patterns are (and aren't — shortened `goo.gl`/`maps.app.goo.gl`) supported
v1.19.0 — Search refinements and list icon consistency (2026-07-30 13:00)
- Added a pin button next to each search result to drop a pending marker there directly, alongside the existing click-to-pan behavior
- Removed the app-wide "paste a Google Maps link anywhere on the page" shortcut — a Maps link now only works when pasted into the search bar (or via the right-click Paste Coordinates action, unchanged)
- The wayspot list's per-row Edit/Remove buttons now use the same icons as the bulk-action bar above the list, instead of plain text glyphs
v1.18.0 — Fullscreen toggle (2026-07-30 10:00)
- Added a fullscreen button to the header (next to the theme toggle) that fullscreens the whole app — header and sidebar included, not just the map
- Syncs correctly with the browser's native Esc-to-exit fullscreen path, and re-fits the map afterward
- Hidden automatically in browsers without Fullscreen API support
- The button's icon now swaps to a "collapse" arrangement while fullscreen is active, instead of staying on the same expand icon the whole time — same current-state convention the theme toggle's sun/moon icon already uses, with the title staying static either way
v1.17.0 — Place search (2026-07-29 16:20)
- Added a 🔍 Search bar (top-center of the map, below the header, or Ctrl+Shift+L to focus it) to look up a place by name and jump the map there, using OpenStreetMap's Nominatim geocoder — no API key needed
- Search only runs when you press Enter or click the search icon, never while typing, per Nominatim's usage policy against client-side auto-complete
- Submitting a Google Maps link or a raw `lat,lng` pair in the search bar drops a pending marker there directly instead of running a place search — same "paste a Maps link" detection the map/right-click paste actions already use
- Focusing the search bar shows a brief hint explaining all three accepted inputs (place name, Google Maps link, `lat,lng` pair), since the placeholder text alone isn't visible once you start typing
- Fixed: tapping the search bar on mobile could drop a pending marker on the map underneath (or show the map's coordinate-readout tooltip there) — the search bar was missing from the same overlay-exclusion lists the other floating map controls already use
- Fixed: clicking a search result also dropped a pending marker at the click's map coordinates — the result row's own click handler removed the results list from the DOM before the click event finished bubbling, which broke the propagation stop happening further up
v1.16.0 — Group drag, and selection fixes around the context menu and undo (2026-07-29 11:14)
- Dragging a marker that's part of a multi-wayspot group selection now moves the whole group together, instead of only the grabbed wayspot
- Dismissing a wayspot's right-click action menu with a left click (on the map or elsewhere on the page) now also deselects it, matching a plain map click
- Undo/Redo no longer clears your current selection — a select, then move, then Ctrl+Z now leaves the same wayspot(s) selected instead of deselecting them
v1.15.0 — Select All / Select None / Invert Selection (2026-07-28 17:35)
- Right-click empty map now also offers Select All, Select None, and Invert Selection (each shown only when it would actually change the current selection)
- Added a ☑ Select button in the Wayspots sidebar section, next to Filter, opening a popover with the same three actions
- Added Ctrl+Shift+A (Select All) and Ctrl+Shift+D (Select None) keyboard shortcuts
- The Status stat tiles (All/Valid/Conflict) now filter the list/map view instead of selecting — clicking one is a shortcut for the Filter popover's own Status option (both stay in sync), and no longer touches your current selection or moves the map. Ctrl+Shift+Left/Right cycles the same filter instead of a selection group
- Select All and Invert Selection now only ever consider wayspots the Filter popover currently leaves shown, instead of every wayspot regardless of the active filter
- Added Select by Type / Nomination / Status to the Select popover — selects only the currently-shown PokéStop/Gym/Power Spot, Regular/Ambassador, or Valid/Conflict wayspots; each option shows its type icon and a colored label/border matching the marker colors, tuned separately per theme
- The active Type/Nomination/Status color everywhere it appears (New Wayspot form, Edit modal, Filter popover, and the new Select popover) switched from a solid fill to a colored label + border on a neutral background — reads calmer with several options visible/colored at once, and now has explicit dark-theme variants instead of reusing the light-theme shade
v1.14.0 — Right-click action menu (2026-07-28 17:02)
- Right-clicking a wayspot (map marker or list row) now opens an action menu — Edit, Duplicate, Copy Coordinates, Center on Map, Open in Google Maps, Copy Share Link, Hide/Show, Remove — instead of instantly removing it; right-clicking a wayspot that's part of the current multi-selection shows selection-wide actions (Edit/Duplicate/Fit/Hide/Remove *N* Wayspots) instead, with their keyboard shortcuts shown alongside
- Right-clicking a wayspot also selects it, so the menu's shortcut hints always match the current selection
- Right-clicking empty map opens a menu with New Wayspot Here, Center Map, and Paste Coordinates (reads a coordinate pair or Google Maps link from the clipboard)
- A second right-click near the same spot zooms out around it (mirroring double-click-to-zoom-in), closing whatever menu the first click opened
- Right-click (or a two-finger tap) in Touchpad Mode acts on whatever's at the crosshair, same as every other tap there
v1.13.0 — Range-select, marquee-select, and box zoom (2026-07-28 14:37)
- Shift+click a row in the wayspot list to select every row between it and the last-clicked one (range-select); repeated Shift+clicks re-measure from the same anchor
- Ctrl/Cmd+Shift+drag a box on the map to select every wayspot inside it (marquee-select)
- Shift+drag a box on the map to zoom to that area, replacing the browser default box-zoom behavior; press Escape to cancel a drag in progress
v1.12.50 — Fix missing Ambassador star badge in GO Pin KMZ exports (2026-07-25 10:14)
- The GO Pin badged icon for Ambassador wayspots (PokéStop, Gym, and Power Spot) is baked from a triple-nested SVG-in-SVG-in-PNG data URI, a structure some browsers won't fully resolve — flattened to a single SVG-to-PNG reference so the purple star badge always renders
v1.12.49 — Add a Log button/modal and error toasts (2026-07-24 18:10)
- Added a Log button (footer, next to About) opening a log modal: a level filter (Error/Warn/Info/Debug, persisted across reloads), Clear, Copy (to clipboard), and Download (saves a `.txt` file)
- Uncaught exceptions and unhandled promise rejections are now caught globally, logged, and shown as a dismissible red toast in the bottom-left corner regardless of whether the log modal is open
v1.12.48 — Fix double-click side effects leaking into mouse mode (2026-07-24 17:55)
- Double-clicking empty map to zoom no longer also leaves behind a pending marker — the two `click` events that precede the zoom's `dblclick` had already placed one
- Double-clicking a not-yet-selected wayspot straight to Edit no longer leaves it selected once the modal closes — the first of those two `click`s had already selected it
- Both revert to whatever existed immediately before the double-click gesture once its trailing `dblclick` confirms what actually happened
v1.12.47 — Stop Touchpad Mode from silently re-arming a pending marker (2026-07-24 17:40)
- Placing/detaching an attached wayspot, turning Ruler off, removing the attached wayspot, and `+ Create` all used to unconditionally re-arm a fresh (now-visible) pending marker as a leftover from before the pending marker became tap-gated — none of those are a request to start a new placement, so none of them do this anymore; the coordinate preview still refreshes
v1.12.46 — Fix a double-click race that could open Edit alongside attach (2026-07-24 17:20)
- A double-click's trailing `dblclick` is now redirected through the same crosshair passthrough as `click`/`contextmenu` — previously it fired wherever the cursor literally was, which usually wasn't the marker itself, so the marker's own `dblclick` handler (and its veto of a wrongly-queued Edit-open) never ran and Edit could pop open right alongside the attach
- Widened the window a marker's `click` handler waits to see whether a trailing `dblclick` follows before opening Edit, since a real double-click/double-tap's timing can outlast a same-tick check
- Two slow, separate taps on an already-selected wayspot (no fast double-tap) still open Edit, same as mouse mode's "tap again to edit" shortcut
v1.12.45 — Touchpad Mode: the pending marker only appears from an actual tap (2026-07-24 16:30)
- The create-wayspot pending marker used to auto-arm (hidden) just from turning Touchpad Mode on or from panning alone — it now only springs into existence, visibly, from a deliberate tap on an empty spot, matching mouse mode; panning alone just keeps the coordinate preview live
- Once tapped, the marker stays pinned where it was placed instead of continuing to track the crosshair through further panning — a fresh tap relocates it, same as mouse mode
- An attached *existing* wayspot renders a small fixed offset bottom-right of the crosshair for the whole attach/pan session (instead of exactly underneath it), so the reticle stays visible; the coordinate tooltip now stays live while attached instead of freezing at the attach moment
v1.12.44 — Replace double-tap-drag with double-click attach/pan/detach (2026-07-20 03:30)
- Reworked how an existing wayspot is repositioned in Touchpad Mode: double-click it (or double-click anywhere, if it's at the crosshair — a native `dblclick` isn't redirected there like a plain tap is) to attach it to the crosshair and select it, pan the map (any number of separate pans) to move it, then double-click again to place it and deselect — replacing v1.12.41-43's single continuous double-tap-then-hold-drag gesture
- `doubleClickZoom` is now simply disabled for all of Touchpad Mode (double-click is fully repurposed), rather than the previous fragile disable/re-enable-around-one-gesture timing dance
- A single continuous drag directly on a marker's icon is unchanged — this only adds the attach/detach alternative for imprecise taps
v1.12.43 — Actually fix double-tap-drag still zooming the map (2026-07-20 02:05)
- v1.12.42's `doubleClickZoom.disable()` was undone too early — `dtdOnRelease` re-enabled it inline on `mouseup`, but the trailing native `dblclick` that ends a real double-click-then-drag fires *after* mouseup's own listeners finish (same synchronous dispatch), so the re-enable landed before the zoom-triggering `dblclick` arrived. Deferred the re-enable past that with a `setTimeout(0)`, guarded by a generation counter so a brand-new gesture starting in the meantime doesn't get its own disable clobbered by a stale re-enable
v1.12.42 — Fix double-tap-drag zooming the map and widen its touch tolerances (2026-07-20 01:10)
- The double-tap + drag gesture (v1.12.41) was releasing into a native `dblclick`, which zoomed the map instead of just dropping the drag — `doubleClickZoom` is now disabled for the gesture's duration, same as `map.dragging`
- Widened the double-tap timing window and tap/snap radius so a real finger's slower, less precise double-tap-then-hold is recognized reliably, not just a quick mouse double-click
- Added a `touchcancel` handler so an interrupted gesture re-enables map and marker dragging instead of leaving them stuck disabled
v1.12.41 — Double-tap + drag to move existing wayspots in Touchpad Mode (2026-07-20 00:20)
- In Touchpad Mode, a quick double-tap on (or near) an existing wayspot, whose second tap continues into a drag instead of lifting, now moves it — an alternative to the existing single-touch drag that doesn't need pixel-precise finger placement on the small icon
v1.12.40 — Tap-to-place parity for Touchpad Mode's crosshair (2026-07-19 15:10)
- In Touchpad Mode, a single tap now arms/moves the pending wayspot marker at the crosshair directly, matching a mouse-mode click — previously only panning kept it in sync
- Ruler taps in Touchpad Mode now add a point at the crosshair directly, same as a tap in mouse mode; removed the now-redundant + Point button
v1.12.39 — Add a Wiki section to the About modal (2026-07-19 14:00)
- Added a Wiki section to the About modal, under Keyboard Shortcuts, linking to the project's GitLab Wiki
v1.12.38 — Redirect touchpad taps to the crosshair (2026-07-19 13:30)
- In Touchpad Mode, tapping (or two-finger tapping for right-click) anywhere on the map now fires as if it landed exactly on the crosshair, since a finger can't reliably hit the crosshair itself or whatever tiny marker/ruler dot/segment happens to sit there
v1.12.37 — Ruler dot click & cascade-delete fixes (2026-07-19 13:02)
- Fixed ruler dot clicks sometimes missing and dropping a new, slightly-off point instead of connecting to the existing dot
- Right-clicking a dot shared by multiple measurements now deletes all of them, instead of only whichever measurement happened to be on top
v1.12.36 — Ruler support in Touchpad Mode (2026-07-19 12:26)
- Added a + Point button (in the ruler popover) to drop a ruler point at the crosshair while Touchpad Mode is active, and raw map taps are now ignored while both the ruler and Touchpad Mode are active
- The ruler's × Clear button now shows whenever the ruler is active, instead of only when there's a measurement left to clear
v1.12.35 — Fix S2 grid overlay gaps (2026-07-19 09:29)
- Fixed the S2 grid overlay's cell-size estimate being roughly 2.4x too large, which left large visible gaps in the mesh (measured at 52-58% of cells missing before this fix, 0% after)
- Layer L14 now consistently redraws above L17 and is drawn thicker, so it stays readable wherever the two grids overlap
v1.12.34 — Split conflict indicators into Glow/Line switches (2026-07-19 09:29)
- The Map Settings Conflict Indicators toggle is now two independent switches — Glow (red marker border) and Line (dashed connector) — plus a master switch that still turns both off/on together
v1.12.33 — Map Settings toggle for conflict indicators (2026-07-19 07:11)
- Added an On/Off switch in Map Settings to hide the red glow and dashed connecting lines on conflicting wayspots, independent of the existing conflict-zone circle toggle
v1.12.32 — Pending wayspot preview in the list (2026-07-18 22:30)
- The not-yet-created pending marker now shows a live preview row pinned to the top of the wayspot list, tracking its name/type/colour/nomination/coordinates/conflict status as you edit the New Wayspot form
- Fixed the pending marker's on-map circles/icon not refreshing when its colour swatch was changed
v1.12.31 — Purple nomination toggle (2026-07-18 21:55)
- The Regular/Ambassador nomination toggle now uses the same purple shade as its star badge, instead of the generic orange used by other switches
v1.12.30 — Restore Ambassador star badge (2026-07-18 21:52)
- Fixed the purple star badge on the Ambassador toggle label silently disappearing after the switch-based redesign — the badge targeted a CSS class the old button carried that the new toggle didn't
v1.12.29 — Single Ambassador toggle (2026-07-18 21:43)
- Replaced the separate Regular/Ambassador buttons in the New Wayspot form and Edit modal with a single toggle switch, matching the existing map-layer toggle style
v1.12.28 — "GO Pin" label (2026-07-18 21:22)
- Renamed the KMZ custom-icon export style's label from "GO Icon" to "GO Pin" (cosmetic only — the underlying export option is unchanged)
v1.12.27 — Rename Sponsored to Ambassador (2026-07-18 21:07)
- Renamed the "Sponsored" nomination to "Ambassador" everywhere (data model, UI, share links, CSV/KML export) — existing local drafts and share links saved under the old name still load correctly
- Added Ambassador-specific icon variants (purple star badge, per-wayspot-colour shape) for the KMZ "GO Icon" export style
v1.12.26 — Exclude hidden wayspots from conflicts (2026-07-18 12:24)
- Hidden wayspots no longer count toward conflict detection against other non-Regular wayspots — no connecting line, and they no longer affect another wayspot's Valid/Conflict status — unless the other side is Regular, since a Regular conflict always needs to surface
- Fixed a regression where a manually-hidden wayspot's list row (and its only Show button) vanished for good once deselected
v1.12.25 — Multi-select filters everywhere, drop Fade toggle (2026-07-18 11:40)
- Nomination and Status filters (sidebar popover and export modal) now support selecting more than one value at once, matching Type
- Removed the separate "Filtered-out wayspots" (Fade/Hide) and "Manually hidden" (Hide/Show) display toggles from the filter popover — filtered-out and manually-hidden wayspots are now always fully removed from the map instead of just dimmed
v1.12.24 — Wayspot list fills freed sidebar space (2026-07-18 11:40)
- The wayspot list now grows to fill the space freed when the New Wayspot panel is collapsed, instead of leaving dead space below a fixed-height list
v1.12.23 — Export icon choice, PNG filtering, multi-select filters (2026-07-18 09:42)
- The Export modal now offers a Google Pin / Custom Icon choice (Custom Icon is KMZ-only, since plain KML can't embed an icon file); the modal resets to defaults every time it's reopened instead of remembering the last session's picks
- PNG export now respects the "Wayspots To Export" filter, temporarily applying it to the map before capture and restoring the real view afterward
- The "Import Into Google My Maps" instructions now only show for KML/KMZ, not CSV, since CSV needs a different import flow
- The Type filter (sidebar popover and export modal) now supports selecting more than one value at once
v1.12.22 — Bake wayspot colour into exported icons (2026-07-18 07:36)
- Exported KML/KMZ wayspot icons now have their colour baked into the image itself (recoloured client-side before export) instead of relying on Google My Maps' icon-colour tinting, which only applies to My Maps' own stock icons and left custom icons showing in their native, untinted colour
v1.12.21 — Omit "Regular" label, name conflicts by wayspot (2026-07-17 22:12)
- "Regular" (the default nomination) no longer appears in the KML layer name or placemark description — only "Sponsored" is called out, as the exception
- Conflict descriptions in exported KML now name the conflicting wayspot (falling back to its type label) instead of showing its meaningless internal sequence number
v1.12.20 — Fold nomination into the KML layer name (2026-07-17 22:01)
- KML/KMZ export folders are now grouped as one folder per nomination+type combination (e.g. "Sponsored PokeStop") instead of nesting a nomination folder inside a type folder — Google My Maps flattens nested folders on import, which was silently dropping the nomination
- Reverted the previous version's placemark-name nomination prefix, now redundant since the layer name carries it instead
v1.12.19 — Equalize selection button widths (2026-07-17 19:12)
- Hide/Edit/Remove selection buttons in the Wayspots section now have equal width
v1.12.18 — KML export color & nomination-name fix (2026-07-17 18:41)
- Exported KML/KMZ pins are now recolored correctly on import into Google My Maps — a bare `<color>` with no `<Icon><href>` was being silently ignored, so colors previously vanished on import
- Auto-generated placemark names are now prefixed with the nomination (Regular/Sponsored), since My Maps flattens nested folders on import and the type folder was the only way to tell them apart
v1.12.17 — Sidebar action button cleanup (2026-07-17 18:24)
- Bulk toolbar and per-row wayspot buttons now consistently order Hide/Edit/Remove (previously mismatched)
- Renamed the bulk Delete selection button to Remove selection to match the per-row "Remove" wording used elsewhere (the Ctrl+Delete shortcut is unaffected)
v1.12.16 — Hide/show wayspots (2026-07-17 16:48)
- Added a hide/show toggle for individual wayspots and a bulk Ctrl+Shift+H shortcut, for decluttering the plan without deleting anything
- Added a Filter popover option to fully hide (instead of just fading) wayspots excluded by the active filters
- Hidden wayspots still round-trip through undo/redo, local drafts, and share links, and remain included in CSV/KML export regardless of the sidebar's current view
v1.12.15 — Bulk delete button (2026-07-17 13:54)
- Added a Delete button next to Bulk Edit for removing the current multi-selection, alongside the existing Ctrl+Delete shortcut
v1.12.14 — Fix import file chip layout (2026-07-17 13:11)
- The chosen-file name and size in the Import modal's file chip now sit on one line instead of stacking
v1.12.13 — Sponsored star badge (2026-07-17 12:03)
- Sponsored wayspots now show a star badge as a corner overlay on their shape icon in the sidebar list and read-only import/share preview rows, matching the badge already shown on map markers
- Wayspot names in the list use the default text color; type/nomination labels in the meta line now use their own AA-contrast colors
- Enlarged the star badge on map markers, ghost markers, and the list icon for better visibility
v1.12.12 — Import modal staged confirm flow (2026-07-16 18:37)
- Picking a file (via the Choose file... button, drag-and-drop, or the hidden input) no longer imports immediately — it shows a file chip with a Remove option, and the bottom Import button only commits it once the chip is showing
- The modal's Cancel/Import buttons now sit together in one bottom action row, matching the Export modal's layout
v1.12.11 — Combined export modal (2026-07-16 17:48)
- Replaced the four separate CSV/KML/KMZ/PNG export buttons with a single Export button that opens a modal to pick a file format and filter which wayspots to include (type/nomination/status), with numbered steps for importing the result into Google My Maps
- Moved the Import button next to Export/Share for a clearer grouping
v1.12.10 — Touchpad mode fixes (2026-07-16 16:26)
- The Cancel button is now hidden in touchpad mode, since the pending marker always re-arms itself and Cancel had no visible effect
- Selecting a wayspot, cycling selection, fitting to selection/all, or filtering by status no longer drags the touchpad-mode pending marker onto whatever got recentered
v1.12.9 — Fix stale distance tooltip (2026-07-16 11:20)
- Fixed a distance tooltip that could get stuck showing a stale selection after Ctrl+click group-selection changes, since that gesture doesn't fire a mouseout
v1.12.8 — DMS coordinates, Maps link paste & drag-and-drop import (2026-07-16 11:15)
- The New Wayspot form, Edit modal, and CSV/TSV import now accept degrees/minutes/seconds coordinates (e.g. `13°48'47.3"N`) alongside plain decimals
- Paste a Google Maps link anywhere on the page to drop a pending marker at that location
- Drag-and-drop an import file directly onto the page
- Redesigned the Import modal with format help and My Maps export instructions
v1.12.7 — Status bar as full-width footer (2026-07-15 00:06)
- The status bar now spans the full viewport width as a footer below the map/sidebar, instead of being scoped inside the sidebar column where it disappeared whenever the sidebar was collapsed
v1.12.6 — Touchpad mode (2026-07-14 15:10)
- Added touchpad mode: a screen-fixed crosshair reticle you pan the map underneath instead of dragging a marker with your finger (which would otherwise obscure it) — toggle via a new floating button or Ctrl+Shift+T
- Fixed Leaflet's map container size going stale against the mobile `dvh`-based height, which had been silently drifting every marker's position from anything CSS-native
- Coordinate precision (previously an inconsistent mix of 5/6/7 decimals across the app) is now centralized into one `fmtCoord()` helper at 7 decimals everywhere, matching Google Maps' share-link precision
v1.12.5 — Sidebar scrollbar rework (2026-07-14 11:42)
- The sidebar and wayspot list now use a wider (11px), more visible themed scrollbar with distinct track/thumb/hover/active colors and a stable gutter
v1.12.4 — Map Settings cursor & coordinate-readout fixes (2026-07-14 00:17)
- Fixed the crosshair cursor and a stuck coordinate readout that persisted while hovering the Map Settings panel, ruler config, or floating map controls
- Fixed the same stuck-readout issue over Leaflet's own zoom/locate/fit buttons
- The coordinate readout now flips to the free side of the cursor near the map's edges instead of getting clipped
v1.12.3 — Themed scrollbars (2026-07-13 19:08)
- Custom thin scrollbars (using the existing theme colors) now replace the browser default, matching light/dark mode automatically
v1.12.2 — Fix Thai/non-Latin text in exported CSV (2026-07-13 15:04)
- Exported CSV files now start with a UTF-8 byte-order mark, so Excel correctly detects the encoding and displays Thai (and other non-Latin) names/remarks instead of mojibake — text was always valid UTF-8 and looked fine in Notepad++ or on re-import, only Excel's own auto-detection was affected
- CSV import already stripped a leading BOM, so re-importing your own exports is unaffected
v1.12.1 — Right-click to cancel, live conflict warning, zone circles (2026-07-11 02:21)
- Right-clicking the temporary pending marker now discards it too, same as the Cancel button
- The pending marker now shows a live spacing-conflict warning (red marker + message + connecting line to each conflicting wayspot) if it's too close to an existing wayspot, before you ever click Create — same as the check applied after creation
- The pending marker now also shows its spacing-zone and interaction-zone circles (matching whichever toggles are on and whichever type is selected), same as real wayspots
- The connecting line between conflicting wayspots is now always visible, not just when Conflict Zone circles are toggled on
- Zone circles now use the wayspot's own color at two paleness levels (spacing zone, then interaction zone half as opaque again) instead of a fixed green
- Added Opacity number inputs to the Conflict Zone and Interaction Zone sections of Map Settings, defaulting to 50% and 25%
- Fixed the pending marker being difficult to drag — it now sets the same interaction options real wayspot markers use, so the map no longer fights the marker for the drag gesture
v1.12.0 — Two-step wayspot placement (2026-07-11 01:09)
- Tapping the map no longer creates a wayspot instantly — it drops a temporary marker and fills in the New Wayspot lat/lng fields, so you can fine-tune the spot before committing
- Drag the temporary marker, or tap a different spot on the map, to readjust it before placing
- The + Add button is now + Create, and a new Cancel button discards the temporary marker without creating anything
v1.11.6 — Code modernisation (2026-07-10 09:29)
- Adopted modern JavaScript APIs throughout (no behaviour changes): Number.isNaN/parseFloat/parseInt, optional chaining, replaceAll, .includes(), .at(), Math.hypot, and Blob.arrayBuffer() for KMZ import
- Dropped the deprecated document.execCommand copy fallback — the clipboard API covers https and localhost; elsewhere the share link is shown in a prompt for manual copy
- Removed two unused internal functions and documented every intentionally-ignored exception
- This clears the last of the 122 issues from the initial SonarCloud scan: 0 bugs, 0 vulnerabilities, 0 code smells
v1.11.5 — Accessibility & contrast (2026-07-10 09:05)
- Every form control now has a proper accessible name: real labels in the edit modal, screen-reader names for the Map Settings toggle switches, and aria-labels on the sidebar inputs — fixes all 11 accessibility bugs flagged by static analysis
- Active Type/Nomination/Filter chips use slightly deeper shades of the same colours so their white text meets WCAG AA contrast; map markers and colour swatches are unchanged
- Ruler distance labels and the dark-theme map attribution also bumped to AA contrast
- Pinch-zoom is no longer blocked on mobile (removed the viewport maximum-scale cap)
- More internal cleanup guided by SonarCloud: stateless helpers hoisted to script scope, modernised DOM calls, linear-time changelog parsing in the build script, and a flake-resistant persistence test
v1.11.4 — Internal refactoring (2026-07-09 22:10)
- Simplified the most complex internal functions (map refresh, CSV/KML import, edit-save, keyboard shortcuts, startup loading, ruler redraw) into smaller, single-purpose helpers — no behaviour changes
- Deduplicated logic along the way: type/nomination detection is now shared between the CSV and KML importers, and wayspot removal paths share one teardown helper
- Clears all 12 critical issues reported by SonarCloud static analysis
v1.11.3 — Accessibility & code health (2026-07-09 15:22)
- The All / Valid / Conflict status tiles in the sidebar are now real buttons — keyboard activation (Enter/Space) and screen-reader semantics come natively instead of via ARIA workarounds; appearance and behaviour are unchanged
- Internal code modernisation across the app (no behaviour changes): `let`/`const` everywhere, `.includes()`, `for...of`, optional chaining, and flatter nesting — driven by a full SonarQube static-analysis pass that now reports 0 bugs and 0 vulnerabilities
- Added SonarQube scanning config plus real line-coverage reporting from the Playwright suite (V8 coverage mapped back to source, no new dependencies)
- 12 new end-to-end tests covering bulk edit, multi-select, keyboard cycling, share-link viewing (including local-data preview and restore), KML import with colours, the S2 grid overlay, and the sidebar resizer — line coverage now 77% overall
v1.11.2 — About modal keyboard shortcuts & trademark cleanup (2026-07-09 11:58)
- Added a Keyboard Shortcuts section to the About modal listing all existing shortcuts (Undo/Redo, remove selection, multi-select, edit selection, fit selection, toggle ruler, cycle wayspot/status group, close popover), with key combos styled as key-cap chips and a mouse-icon badge for click
- Removed the unused Ingress and Campfire trademark mentions from the About modal and comment header — neither is referenced anywhere else in the app
v1.11.1 — Status bar readability (2026-07-09 11:17)
- Status bar text/background now uses higher-contrast colours instead of blending into the sidebar
- Cursor coordinates moved out of the status bar into a larger, bolder tooltip that follows the cursor on the map
- Long status messages (e.g. selection hints) now scroll left to reveal the full text instead of being cut off, pausing briefly at the start and end of each loop, and reset/pause when you hover over the status bar
v1.11.0 — Bulk edit (2026-07-09 10:52)
- Ctrl+Shift+E now opens a bulk-edit modal when multiple wayspots are selected, letting you apply Type, Nomination, Colour, and/or Remark to the whole selection at once — only the fields you touch are changed, everything else is left as-is per wayspot
- Name and coordinates are left out of bulk edit since they're inherently per-wayspot
- Added a dedicated Edit button next to Filter in the Wayspots sidebar section as a shortcut for the same edit/bulk-edit action — enabled whenever there's a selection
v1.10.23 — Click-to-edit selected marker (2026-07-08 16:20)
- Clicking a marker that's already selected now opens the Edit modal instead of deselecting it
- Clicking empty map now deselects the current selection instead of placing a new wayspot; with nothing selected, clicking the map still places a new wayspot as before
v1.10.22 — Keyboard shortcuts (2026-07-08 14:42)
- Added keyboard shortcuts: Ctrl+Delete/Backspace removes the selected wayspot(s), Ctrl+Shift+E opens the edit modal, Ctrl+Shift+M toggles the ruler, Ctrl+Shift+F fits the map to the selection (press again to fit all), Ctrl+Shift+Left/Right cycles the status group (All/Valid/Conflict/deselect), and Ctrl+Shift+Up/Down cycles through wayspots
- The floating Fit button now shares the same fit-selection/fit-all toggle behaviour as the Ctrl+Shift+F shortcut
v1.10.20 — Scrollable wayspot list (2026-07-07 17:24)
- The wayspot list now scrolls within its own area (capped height) instead of growing indefinitely, while the rest of the sidebar keeps scrolling as before
v1.10.19 — Fit button now fits all when nothing's selected (2026-07-07 17:11)
- The "Fit" map button now zooms/pans to fit all wayspots when nothing is selected, instead of doing nothing
- Moved the Fit button from the bottom-left Ruler/Map Settings cluster to the bottom-right stack, directly above the zoom in/out buttons
v1.10.18 — Grouped KML/KMZ export (2026-07-07 15:32)
- KML/KMZ export now nests Placemarks in Folders by Nomination (Sponsored/Regular), then by Type (PokéStop/Gym/Power Spot), instead of a flat list — lets you toggle groups on/off in Google Earth/My Maps
v1.10.17 — Multi-select and zoom-to-fit (2026-07-07 15:16)
- Ctrl+click (or Cmd+click on Mac) a wayspot marker on the map, or a row in the Wayspot list, to add/remove it from a multi-selection — works interchangeably between map and list
- Added a floating "Fit" map button (next to Ruler/Map Settings) that zooms/pans to fit whatever is currently selected (single or multiple wayspots)
v1.10.16 — Status stat wording/default fix (2026-07-07 14:33)
- Renamed the "Total" stat label to "All" so it matches the wording used by the Filter popover's Status group (All/Valid/Conflict)
- The "All" stat is now shown pre-selected (highlighted) by default instead of no stat being highlighted until one is clicked
v1.10.15 — Regular nomination restyle (2026-07-07 14:25)
- Removed the "Badge" label above the color swatch row in the New Wayspot form, and centered the swatches
- Regular nomination buttons/badges (New Wayspot form, Edit modal, Filter popover) are now white instead of green, and no longer show the star icon — Sponsored keeps its purple color and star
v1.10.14 — Floating map button polish (2026-07-07 14:10)
- Removed the faint border/shadow box around the zoom and locate buttons
- Zoom, locate, ruler, and map settings buttons are now bigger (42px) on desktop for easier clicking
- Both floating button groups now sit at the same height above the map edge with a comfortable gap from the scale bar / attribution text
v1.10.13 — Fix blank tiles at max zoom (2026-07-07 13:35)
- Tile layers now cap their native zoom per provider (OSM/Esri 19, CartoDB 20) so zooming past that level upscales the last loaded tile instead of requesting a nonexistent one and rendering blank
v1.10.12 — Edit panel color picker (2026-07-07 13:14)
- The Edit Wayspot modal's Color field now uses the same swatch palette + custom color picker as the New Wayspot panel, instead of a plain native color input
v1.10.11 — Internal nomination rename (2026-07-07 12:23)
- Renamed the internal wayspot data field and all related code (CSS classes, data-attributes, function/variable names) from "category" to "nomination" for consistency with the user-facing wording — local drafts and share/import data saved by previous versions still load correctly, since the old field name is still read as a fallback
v1.10.10 — Nomination label wording (2026-07-07 12:23)
- Renamed the "Nomination Category" label to "Nomination" in the Edit Wayspot modal, matching the wording already used by the Filter popover
v1.10.9 — Click stats to select and zoom (2026-07-07 11:46)
- Clicking the Total / Valid / Conflict numbers in the sidebar now selects that group of wayspots (highlighted on the map and in the list) and zooms the map to fit them; clicking the same number again deselects
v1.10.8 — Share link field order (2026-07-07 11:40)
- Share-link rows are now ordered [name, type, nomination, color, lat, lng, remark] (previously remark and nomination were in different slots) — matches the column order already used by CSV/TSV export and the internal wayspot data model
- Share links generated by v1.10.7 are no longer compatible and will fail to load correctly
v1.10.7 — Shorter share links (2026-07-07 01:31)
- Share links are now much shorter — wayspot data is packed into compact arrays instead of verbose objects, and text is base64-encoded directly from UTF-8 bytes instead of being percent-escaped first (which especially bloated non-ASCII names, e.g. Thai text)
- Share links generated by previous versions are no longer compatible and will fail to load
v1.10.6 — Sponsored map marker badge (2026-07-07 01:10)
- The small map marker badge now marks Sponsored wayspots (previously it marked Regular ones) — Regular markers are unbadged, matching the tool's default look
- The marker badge is now the same purple star icon used on the Regular/Sponsored buttons, replacing the small circle-with-letter badge
v1.10.5 — Zone toggle reload fix (2026-07-07 01:01)
- Fixed Conflict Zone / Interaction Zone / S2 Cell toggles sometimes showing "On" right after loading the page without actually drawing anything — some browsers restore a checkbox's checked state on reload without re-running its logic, so the switch and the real state could get out of sync; toggles now always start in sync with the (off) state on load
v1.10.4 — Selection highlight fix (2026-07-07 00:51)
- Selecting a wayspot no longer leaves unrelated conflicting pairs highlighted elsewhere on the map — only the selected wayspot and anything it actually conflicts with stay at full opacity; everything else fades, same as before
v1.10.3 — CSV column rename (2026-07-07 00:32)
- Renamed the CSV/TSV "Category" column to "Nomination" in export, the blank CSV template, and import column detection (older files with a "Category" or "Nomination Type" header still import fine)
v1.10.2 — Nomination badge colors (2026-07-07 00:17)
- Regular nomination badges/buttons are now green and Sponsored ones are purple, replacing the previous silver/gold scheme (New Wayspot form, Edit modal, Filter popover, and map markers)
- Added a star badge icon next to the Regular/Sponsored labels
v1.10.1 — Undo/redo fix (2026-07-06 23:24)
- Fixed an off-by-one bug where Undo/Redo needed two clicks to move one step — e.g. adding two wayspots then clicking Undo once used to jump straight past the last one to an empty list
- Removing a wayspot from the list (the trash icon) is now also undoable, matching every other add/edit/remove/reorder/clear action
v1.10.0 — Filter popover (2026-07-06 21:54)
- Replaced the wayspot type tabs above the Wayspots list with a single Filter button that opens a popover
- The popover now also filters by nomination category (Regular / Sponsored) and conflict status (Valid / Conflict), in addition to wayspot type
- The Filter button shows a badge with the number of active filters, and includes a Reset filters button
- Regular nomination badges/buttons are now silver and Sponsored ones are gold, consistently across the New Wayspot form, Edit modal, Filter popover, and map markers
- New wayspots now default to the Regular nomination category instead of Sponsored
v1.9.1 — Cleanup (2026-07-06 15:40)
- Removed legacy compatibility code for the old "notes" field name (renamed to "remark" in v1.7.2) — old share links/local drafts using "notes" are no longer read, and CSV import no longer matches a "notes"/"note" column header
v1.9.0 — Nomination category (2026-07-06 15:34)
- Wayspots can now be marked Sponsored or Regular, in the New Wayspot form and the Edit Wayspot modal
- Regular wayspots no longer conflict with each other on spacing checks (Sponsored wayspots still do)
- Regular wayspots are marked with a small green "R" badge on the map, and the category shows in the wayspot list
- CSV import/export and the CSV template now include a Category column; KML/KMZ import/export also carries the category
v1.8.1 — Form layout polish (2026-07-06 15:09)
- Remark box moved below the coordinates fields in both the New Wayspot form and Edit Wayspot modal
- Edit Wayspot modal labels now use Title Case instead of ALL CAPS
- Tightened spacing around the coordinates fields so an empty error message no longer reserves extra room
v1.8.0 — Wayspot type tabs (2026-07-06 14:53)
- Added All / PokéStop / Gym / Power Spot filter tabs above the Wayspots list, each with its icon and full type name
- Selecting a type tab dims markers and range circles for other types on the map, so the selected type stands out
- Updated the Power Spot icon artwork
v1.7.2 — Remark at creation (2026-07-06 14:29)
- Remark field added to the New Wayspot form — no more editing a wayspot just to add a remark
- CSV export now includes a Remark column, matching CSV import
- CSV import template updated with a Remark column
v1.7.1 — Floating button fixes (2026-07-03 19:44)
- Fixed double-clicking a floating map button (Ruler, Map Settings) or its popover triggering a map zoom underneath
- Bottom-right Zoom/My Location buttons now match the same card style (size, radius, shadow) as the bottom-left Ruler/Map Settings buttons
v1.7.0 — Consolidated Map Settings panel (2026-07-03 19:24)
- The five floating map/planning buttons are now one Map Settings panel (Google Maps “layers” style) with Tile Type, Conflict Zone, Interaction Zone, and S2 Cell sections
- Tile picker replaced with a visual grid of live preview thumbnails (real map tiles, centered on Thailand’s Kilometre Zero Marker) instead of a plain dropdown
- Conflict Zone, Interaction Zone, and S2 Cell each get an orange on/off toggle switch, synced with their existing fine-grained controls
- Ruler kept as its own floating button and popover, separate from Map Settings
- Floating map controls moved to the bottom-left of the map, above the scale bar
- Reset Sidebar Layout button resized to match the Theme toggle button; button spacing standardized (6px) across header, floating controls, modals, and export rows
- Removed the green highlight from the CSV export button for consistency with KML/KMZ/PNG
v1.6.0 — KMZ export & export panel reorder (2026-07-03 09:45)
- New KMZ export (zipped KML) alongside CSV/KML/PNG — lazily loads the same small zip library already used for KMZ import
- Export panel reordered: Import, Undo, Redo, and Clear now sit together in the top row; CSV, KML, KMZ, PNG, and Share moved to the row below
- Undo/Redo icons switched to circular ccw/cw arrows; Clear button now has a text label
v1.5.0 — Non-destructive import & share viewing (2026-07-02 20:35)
- Opening a share link or importing a file no longer overwrites your plan immediately — it loads as a preview with a banner to Merge, Override, or Close and go back to what you had
- New Show local data toggle while previewing: ghost markers on the map plus a separated, read-only “Local, not merged” group in the wayspot list, so you can compare before deciding
- Your plan now autosaves to your browser and is restored automatically on reload, even without a share link
- Import dialog simplified — files load straight into the new preview/banner flow instead of a separate Append/Replace choice
- Export panel reorganized into two rows; CSV export columns simplified to Name, Type, Color, Latitude, Longitude; TSV export removed (TSV import is still supported)
- New Wayspot panel spacing increased for a more comfortable layout
v1.4.1 — Floating controls polish (2026-07-01 10:43)
- Ruler button now toggles the ruler tool directly; popover only shows the Clear button when active
- Conflict circles default to hidden; the toggle button in the Conflict Range popover controls visibility (eye icon)
- Interaction Range popover now has a custom distance input and per-type circle toggles (PokéStop / Gym / Power Spot)
- Sidebar spacing increased for better readability
- All tooltip labels corrected to Title Case
v1.4.0 — Google My Maps round-trip (2026-07-01 01:22)
- Import now accepts .kmz files (zipped KML) in addition to .kml — lazily loads a small unzip library only when a .kmz is selected
- This makes import/export fully round-trippable with Google My Maps: export KML here → import into My Maps, or export from My Maps as KML/KMZ → import here
v1.3.7 — Security hardening (2026-07-01 00:45)
- Fixed a cross-site scripting (XSS) issue where a crafted share link or KML import could inject HTML via a wayspot's color value
- Fixed a crash when loading a share link containing an unrecognized wayspot type — now falls back to PokéStop instead of breaking the page
- KML and share-link imports now validate color/type the same way CSV/TSV imports already did
- Added a Subresource Integrity (SRI) check to the dynamically-loaded PNG export library
- Internal: extracted the inlined Leaflet library into its own source file for easier maintenance
v1.3.6 — Floating map controls (2026-07-01 00:16)
- Map and Planning settings moved out of the sidebar into floating icon buttons over the top-left of the map, freeing up sidebar space and keeping tools next to what they affect
- Clicking a floating control button no longer places a wayspot underneath it
- New default badge colours and an updated swatch palette for PokéStop / Gym / Power Spot
- Fixed the My Location button occasionally swallowing its own click
v1.3.5 — Esri tile authentication (2026-06-30 22:55)
- Esri Satellite & Street tiles now authenticated via API key — more reliable, less likely to be rate-limited
v1.3.4 — About & attribution (2026-06-30 22:04)
- About button added to status bar — shows affiliation disclaimer, trademark notices, and open-source credits
- Esri tile attribution corrected — full source list now shown on map for World Imagery and World Street Map
- S2 Geometry Library (Google LLC, Apache 2.0) credited in source
v1.3.3 — Performance & code cleanup (2026-06-04 12:02)
- S2 grid rendering debounced — map drag/zoom is visibly smoother
- Icon cache fixed — icons now persist across refreshes instead of being discarded every time
- Internal refactor: extracted helpers, removed duplicated teardown/creation code, improved conflict-check performance
v1.3.2 — Layout & map fixes (2026-05-22 23:50)
- Fixed page overflowing viewport due to UTF-8 BOM corrupting the CSS reset
- Leaflet controls now properly clipped and isolated within map bounds
- Sidebar height reliably matches map height across all browsers
- Leaflet attribution pinned flush to map corner with no gap
v1.3.1 — UI fixes (2026-05-22 17:16)
- Export panel and status bar pinned to sidebar bottom
- Sidebar sections now scroll independently
- Entire section header row clickable to collapse/expand
- Fixed Leaflet attribution and status bar clipping at viewport edge
v1.3.0 — Rebranded to Community Wayspot Planner (2026-05-22 16:49)
- Renamed to Community Wayspot Planner (short: Wayspot Planner)
- Export filenames updated to wayspot-planner.*
v1.2.1 — Mobile UI improvements (2026-05-22 15:55)
- Larger touch targets throughout (buttons, inputs, wayspot list rows)
- Export panel buttons taller and easier to tap
- Sidebar height increased on mobile for more content space
v1.2.0 — Type labels update (2026-05-22 15:10)
- Export type values simplified to Stop, Gym, Max
- Import accepts both old (PokéStop, Power Spot) and new (Stop, Max) names
- Changed default map tile to OpenStreetMap
- Fixed header title to "Wayspot Planner"
v1.1.1 — Bug fixes (2026-05-22 14:16)
- Fixed theme toggle button not rendering as a square
- Aligned theme button height to match Reset Layout button
v1.1.0 — Feature update (2026-05-22 13:53)
- S2 Level 14 & 17 cell grid overlay
- Undo / Redo — Ctrl+Z / Ctrl+Y with full history
- Share link via URL hash
- Per-wayspot notes field
- Distance display on hover when a wayspot is selected
- Type-prefixed auto-naming (e.g. PokéStop 1, Gym 2)
- PNG map export
- 80 m interaction range circles toggle
v1.0.0 — Initial release (2026-05-21 18:41)
- Wayspot placement — PokéStop, Gym, Power Spot with custom badge colours
- Conflict detection with configurable radius (default 40 m)
- Ruler — multi-segment distance measurement with snap-to-wayspot
- CSV / TSV / KML import & export
- Drag-to-move markers, drag-to-reorder list
- Dark / light theme with system preference detection
- Sidebar resizable and collapsible