Phone Bridge

DeviceDock

Files phone photos by the date the shutter fired, not the date you copied them.

Free right now — no account, no card

Get DeviceDock free Windows & Mac · one file, nothing to install

Preview

1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.

Interface design DeviceDock, 1 of 1
Screenshot DeviceDock running on Windows today

Free while we’re in preview

Get DeviceDock

Files phone photos by the date the shutter fired, not the date you copied them.

The Mac button is for Apple Silicon. On an older Intel Mac, get this one instead.

One file, both ways. Double-click it for the window. Run the same file from a command prompt with arguments and it behaves as the command-line tool, because the engine is inside it. Nothing else to download and nothing to keep beside it.

Early preview. The window has been built and run, but not yet on a real Windows PC or Mac, so expect rough edges. The engine underneath it is fully tested.

  • One file — no installer
  • Runs on your machine, offline
  • Source code published below

Free while in preview. It isn’t signed yet, so Windows or macOS will ask you to confirm the first time you open it. At launch, DeviceDock is included in every plan along with the rest of the range.

Why the dates go wrong

Copying files off a phone routinely destroys their timestamps. The copy is stamped with the moment it was copied, so filing by file timestamp puts a decade of photos under “today”.

DeviceDock opens each JPEG and reads EXIF tag 0x9003, DateTimeOriginal, which is part of the image and survives copying. Missing that, it tries tag 0x0132. Missing both, it falls back to mtime and says so, per file and in the summary, so you always know how many photos were filed on a guess. The EXIF parser walks the JPEG marker chain itself, reads either byte order, and bounds-checks every offset.

“Have I already imported this?”

Answered by SHA-256 of the contents, never by filename. Phone filenames are unstable: IMG_0042.jpg gets reused after a factory reset, export tools add “(1)”. So re-running an import next month copies only the new photos, a renamed file is still recognised, and two different photos that happen to share a name are both kept. The cost is that every file is read in full on every run.

Source folder is read-only. Photos are copied, never moved. Nothing is ever deleted. Dry run until --apply.

It reads a folder, not a phone. No USB, MTP or AFC.

Reading on the job itself

Advanced & technical details Command-line builds, source code, checksums and a recorded session — for developers and IT teams

A working command-line build of the import engine: a hand-written EXIF reader that handles both byte orders with a file-date fallback, content-hash duplicate detection so a second import copies nothing, and date-based filing. The phone folder is opened read-only and nothing is written without --apply. Talking to a phone directly over USB is on the roadmap.

Naming status

Working name only — brand verdict **RENAME** (High). Collision: DeviceDock. Rename before launch.

What it draws on

Existing paid software whose best ideas shaped this program: iMazing, Wondershare MobileTrans, TouchCopy, Droid Transfer.

Command line

There is nothing extra to install. The program you download is the command-line tool as well: give it arguments instead of double-clicking it and it runs as one, with its output on your terminal. The standalone builds below are the same engine on its own, for machines where you would rather not ship a window at all.

DeviceDock - import a phone's camera folder into a dated photo library (EXIF-aware)

Usage:
  devicedock scan <phone-folder> [--json]
  devicedock import <phone-folder> --library <dir> [--layout year/month|year-month|flat] [--apply] [--json]
  devicedock verify --library <dir> [--json]
  devicedock help

scan
  Reports what is on the card: media file count, total size, the date range
  and per-month breakdown taken from each photo's EXIF capture date, and how
  many files have a usable EXIF date versus none at all. Every file is listed
  with the date that was read and where that date came from.

    --json          emit machine-readable JSON instead of text

import
  Copies (never moves) each photo from the phone folder into the library,
  under a path derived from the EXIF DateTimeOriginal tag. When a photo has
  no usable EXIF date, its file modification time is used instead and the
  file is counted as a fallback in the report.

  A photo already in the library is SKIPPED. Identity is decided by SHA-256
  CONTENT HASH, not by filename, so renaming a file on the phone does not
  cause a second copy.

    --library D     destination photo library (required)
    --layout L      year/month (default), year-month, or flat
                      year/month   <lib>/2023/2023-05/IMG_0042.jpg
                      year-month   <lib>/2023-05/IMG_0042.jpg
                      flat         <lib>/20230514-IMG_0042.jpg
    --apply         actually copy files (default: dry run, no changes made)
    --json          emit machine-readable JSON instead of text

  The source folder is never written to, and no file is ever deleted.

verify
  Audits an existing library: photos whose stored location does not match
  their own EXIF capture date (misfiled), and identical content stored under
  more than one name (duplicates).
...

Recorded from the shipped binary, not written by hand.

Source

Every file the program is built from:

console.go · console_test.go · guided.go · main.go

SHA-256 checksums · build instructions & scope notes · full build plan