User guide

How to use Dive Desk

What to expect, how the app responds, and the small details that are easy to miss. Last updated June 2026.

What Dive Desk is (and isn’t)

Dive Desk is:

  • A local-first Mac app for viewing, searching, and organizing dive logs imported from many apps and formats.
  • A read-mostly logbook with rich inline editing for notes, conditions, tanks, buddies, ratings, and more.
  • Private by design — data stays on your Mac inside the app’s sandboxed container. No account, no cloud sync.

Dive Desk is not (today):

  • A dive computer sync tool (it does not talk to watches or regulators directly).
  • A replacement for Oceanic+, Subsurface, or Shearwater’s own apps — you still export from those apps and bring the file here.
  • A two-way sync with your source app. Re-importing adds new dives; it does not push edits back to Oceanic+.

Importing dive logs

Three ways to import

MethodWhat happens
Drag & dropDrop a file anywhere on the main window. A blue overlay appears while dragging.
Import buttonIn the dive list header — opens the macOS file picker.
File pickerSupports multiple files in one go.

Auto-detection

You do not need to tell Dive Desk which format you have. The app inspects file contents (and extension as a hint) and routes to the right parser.

  • .zip archives are unpacked; every recognizable dive log inside is imported.
  • Nested zips inside a zip are handled automatically.
  • Non-dive files inside a zip (images, PDFs, etc.) are silently skipped.

What happens during import

  1. File is read and format-detected.
  2. Dives, sites, gas mixes, and computer info are parsed.
  3. Each dive is compared against your existing library.
  4. Only dives not already present are added.
  5. A status banner appears at the top with results.
  6. If new sites have coordinates, reverse geocoding may run in the background (see Dive sites).

Import progress

While parsing, a banner shows “Importing dives…” with a spinner. Large exports (hundreds of dives with full sample profiles) can take a few seconds — this is normal.

Re-importing & incremental updates

The Oceanic+ workflow

Oceanic+ (and many other apps) export your entire log every time, not just new dives since last export. Dive Desk is built for this:

You can drop the same full export again anytime. The app diffs against your library and imports only what’s new.

How Dive Desk decides “already imported”

A dive is considered a duplicate if either:

  1. Stable dive ID — the exporter’s ID matches (Oceanic+/UDDF uddfDiveID when present), or
  2. Fingerprint — same start time + max depth + duration (rounded).

If a dive matches, it is skipped, not updated.

What you’ll see on re-import

SituationBannerMeaning
5 new dives in a 100-dive exportGreen success — “Imported 5 dives…”95 skipped, 5 added
Entire export already in libraryBlue info — “No new dives in …”Nothing added; this is success, not an error
Mix of new and existingGreen success + skip countExpected for incremental Oceanic exports

What re-import does not do

  • Does not refresh profile samples on dives already in your library.
  • Does not overwrite your manual edits (rating, buddies, tanks, notes, etc.).
  • Does not merge two dives that look similar but have different IDs and slightly different timestamps.

If Oceanic revises historical dive data in an export, Dive Desk will not auto-update the stored copy — you’d need to delete the old dive and re-import, or edit manually.

What gets saved vs. what gets overwritten

From import → stored once

These come from the file on first import of that dive:

  • Start time, duration, max/average depth
  • Water temperature (when reported)
  • Profile samples (depth/temperature over time)
  • Imported site link, gas mixes, dive computer
  • Source notes and raw metadata

Your edits → never touched by re-import

Everything under “user” fields is yours and survives re-import:

  • Mode (Scuba / Freedive / etc.), dive type, water body
  • Star rating, visibility/surface/current sliders
  • Buddies, guest buddies, notes you typed
  • Tank setup (multiple tanks, pressures, gas, volume)
  • Weights, altitude, gear kit assignment
  • Site renames and location overrides

Sites — special rules

FieldOn re-import
userName / userLocation (your edits)Preserved
Imported name/coordinatesFilled in only if missing; won’t stomp your rename
Geocoded town nameCached; not re-fetched unless still pending

Sites with placeholder names like site_69b21c… are cleaned up to show coordinates or geocoded names instead.

Import feedback & status messages

Success banner (green)

  • Title: “Imported N dive(s) from filename”
  • Subtitle may include: detected format(s), duplicate skip count, new site count

Info banner (blue) — all duplicates

  • Title: “No new dives in filename”
  • Subtitle: “No new dives — all N were already in your library.”

This is intentional. You did nothing wrong.

Error banner (orange)

MessageLikely cause
File isn’t a recognized dive log formatWrong file type, corrupted export, or unsupported vendor
File didn’t contain any dive dataEmpty export, wrong file inside zip, parse failure
Import failed (generic)Permission issue, unreadable file

Recent Imports (Settings → Local Data)

Each import session is recorded with:

  • File name and relative time
  • Dive count (new dives added that session)
  • “N already imported” when duplicates were skipped
  • “No new dives” when everything was duplicate

Important: Deleting a row in Recent Imports also deletes every dive that came in with that batch. This is destructive. The trash button on an import row is not “clear history only.”

Browsing & searching dives

Layout

  • Sidebar — All Dives, Sites, Gear, Statistics, Settings
  • Middle column — dive cards (search, sort, import)
  • Right column — dive detail (when a dive is selected)

The sidebar stays visible; there is no hamburger toggle.

Selection behavior

  • The first dive is auto-selected when you open the library.
  • Your selection sticks across search and sort changes until you pick another dive or delete the selected one.
  • If the selected dive is deleted, selection moves to the first remaining dive.

Search

Search matches (case-insensitive): site name and location, notes, buddy names, dive type, and dive date (formatted string).

Sort

Sort by: Date, Depth, Duration, Site, Location, Temperature — ascending or descending. Default: Date, newest first.

Empty states

StateMessage
No dives at allPrompt to import
Search/filter has no matches“No Matches” — try clearing search

Depth range filter

A min/max depth filter exists in the app’s logic but may not be exposed in the UI yet. If you see “No Matches” with an empty search, there may be no UI to clear a depth filter — worth checking in future builds.

Dive detail & inline editing

No separate “Edit” mode

Every field on the dive detail page is editable inline. There is no Edit button or modal sheet.

  • Text fields, menus, sliders, and star rating update as you interact.
  • Changes save automatically (SwiftData autosave).
  • When you navigate away from a dive, a final save is forced so nothing is lost mid-typing.

Multi-tank dives

Dives can have multiple tanks (primary, pony, stage, etc.):

  • Use the tank pills at the top of the tank section to switch tanks.
  • “+” adds another tank.
  • Trash on a tank removes it (with save).

Legacy single-tank imports are migrated to one DiveTank row on first launch after an app update.

Header badges

Tap the SCUBA / FREEDIVE (mode), water body, and dive type badges to change them via menu — they look like labels but are interactive.

Delete dive

Use the ⋯ menu in the dive detail header → Delete Dive… Deleting a dive removes it from your local database only. Your original export file on disk is untouched.

Site assignment on a dive

If a dive has no site, you’ll see “No dive site assigned.” Full site editing (name, coordinates) lives on the Sites page, not inline on the dive card.

Dive profile charts

Three metrics

Toggle DEPTH / TEMP / ASCENT in the chart header. The entire pill segment is clickable, not just the text.

Default peak pill

When not hovering, the header shows a peak pill instead of “X points”:

MetricDefault pill shows
DepthMax depth + time at max
TempColdest temperature + time
AscentFastest ascent rate + time

Inverting the peak (Temp & Ascent only)

Click the peak pill on Temp or Ascent to toggle:

  • Temp: coldest ↔ warmest
  • Ascent: fastest ascent ↔ fastest descent

Depth peak is always max depth (not invertible).

Hover scrubbing

  • Hover over the chart to scrub through time.
  • A horizontal dotted line shows the Y-axis value at the cursor.
  • Hover details appear in the chart header (not as an overlay on the graph).

Switching dives or chart metric resets hover and peak inversion.

Dive sites & maps

Display name priority

Sites show the best available label:

  1. Your custom name (userName)
  2. Real imported name (not a placeholder ID)
  3. Reverse-geocoded town/region
  4. Coordinates
  5. “Unnamed Site”

Geocoding after import

When new sites have latitude/longitude, Dive Desk may ask Apple’s geocoder for a friendly place name (e.g. “Cozumel, Mexico”). This runs in the background, about one site per second, and requires network access.

  • Results are cached — geocoding won’t repeat for the same site.
  • If geocoding fails (offline, rate limit), it retries on a later launch.

Sites map

The Sites section can show dives on a map when coordinates exist. Sites without coordinates won’t appear.

Gear & kits

Gear library

Track individual gear items by category (including technical gear: stages, reels, lift bags, etc.).

  • Retired gear can be toggled off active lists but kept for history.
  • Gear is not automatically linked from imports — you assign kits manually on dives.

Gear kits

Create named kits (e.g. “Warm water travel”) and assign them to dives from the dive detail page.

Tank breakdown on Gear page

Tank statistics count from multi-tank dive records, with fallback to legacy single-tank fields on older dives.

Settings, units & defaults

Units (General)

Each unit is independent — mix imperial and metric if you want:

SettingOptionsDefault
Depthm / ftft
Temperature°C / °F°F
Pressurebar / psipsi
Weightkg / lbslbs
Tank volumeL / Cu FtCu Ft

Defaults match Oceanic+’s imperial presentation. Changing units affects display only — storage is always metric internally.

Diver profile

Name, home location, certification agency/level — used for display context; not sent anywhere.

Dive defaults

Default mode, tank type, and volume unit pre-fill new manual entries; they don’t rewrite existing dives.

Appearance

Auto / Light / Dark — follows system in Auto.

Supported formats

Settings → About → Supported Formats opens a sheet listing every import format with file extensions and descriptions.

Data, privacy & deletion

Where data lives

All dives, sites, gear, and preferences are stored in a local SwiftData database inside the app sandbox. No telemetry, no account, no cloud backup by Dive Desk.

Back up your Mac (Time Machine, etc.) if you care about not losing your logbook.

Erase All Dive Data

Settings → Local Data → Erase All Dive Data

  • Deletes every dive, every import record, and associated samples/tanks.
  • Does not delete gear items or site records (verify in current build — erase only loops dives + imports).
  • Cannot be undone.

Delete single dive

From dive detail ⋯ menu or list context menu. Removes one dive only.

Delete import batch

Recent Imports → trash on a row:

  • Deletes that import history row
  • Also deletes all dives imported in that batch (cascade delete)

Use with caution if you’ve edited dives from that import and want to keep them.

Supported file formats

Dive Desk auto-detects format from file contents. Common extensions:

FormatExtensionsNotes
UDDF.uddfOceanic+, many universal exporters
Subsurface XML.ssrf, .xmlSubsurface logbook export
Subsurface JSON.jsonSubsurface JSON export
Shearwater XML.xmlShearwater Cloud / Desktop
Suunto DM.xml, .sdmSuunto DiveManager
Mares.xml, .mdsMares Dive Organizer
DAN DL7.dl7, .txtPipe-delimited DAN format
Diviac JSON.jsonDiviac / Deepblu style
CSV.csv, .tsvGarmin Connect, MacDive, spreadsheets — column headers auto-mapped
Zip archive.zipOceanic+ exports; can contain multiple formats

CSV tip: Headers like Date, Max Depth (m), Duration, Water Temp (F) are recognized. Unit hints in parentheses (m), (ft), (C), (F) are converted automatically.

Non-Oceanic UDDF formats are supported but not guaranteed.

Known limitations & edge cases

Duplicate detection edge cases

  • Two dives at the same time and depth from different computers might collide on fingerprint matching (rare).
  • Slightly different depth/duration rounding between exports might create a second copy if the stable dive ID is missing.
  • Re-import will not add missing samples to an existing dive.

Import does not update existing dives

By design — protects your edits. Tradeoff: stale imported data stays stale until manual fix.

Oceanic placeholder site names

Exports often use site_<hex> instead of real names. Dive Desk hides these and prefers geocoding or coordinates.

macOS sandbox

The app can only read files you drop or pick in the file dialog. It cannot watch a folder or auto-import from iCloud Drive without you selecting the file.

Chart performance

Very long dives with thousands of samples are downsampled for chart display. Hover and peak values use the downsampled series; extrema are preserved.

Site geocoding deprecation

Geocoding uses Apple’s CLGeocoder (deprecated on newer macOS in favor of MapKit). Behavior may change in future OS updates.

No sync between Macs

Each Mac has its own library. Export/import files manually to move data.

Gear & statistics empty states

Gear and Statistics show empty states until you add gear or have imported dives.

FAQ

I re-imported my Oceanic zip and it said “No new dives.” Is that broken?
No. It means everything in that export was already in your library. Drop a fresh export after new dives and only the new ones will be added.
Will my edits survive another import?
Yes. Ratings, notes, tanks, buddies, and site renames are never overwritten by import.
Can I import from Subsurface / Shearwater / Suunto?
Yes. Export from that app in a supported format and drop the file. See Supported Formats in Settings.
Why does my site say “Unnamed Site”?
The export had no real name and geocoding hasn’t finished (or coordinates are missing). Edit the site on the Sites page or wait for background geocoding.
I deleted an import in Recent Imports and lost dives. Why?
Import rows own their dives. Deleting the batch deletes those dives. Use single-dive delete if you only want to remove one.
Where is my data?
On this Mac only, inside the app’s container. Not in iCloud unless you back up the whole Mac.
Do I need to pick .zip vs .uddf?
No. Drop either. The app figures it out.
Can I import multiple files at once?
Yes, via the file picker (multi-select). Drag-drop also accepts multiple URLs when the OS provides them.
Does quitting the app lose unsaved edits?
Usually no — SwiftData autosaves. Navigating away from a dive forces a save. Avoid force-quitting mid-typing.