DeviceDock
Files phone photos by the date the shutter fired, not the date you copied them.
Free right now — no account, no card
Preview
1 interface design, then a screenshot of it running. Drag, scroll or use the arrows.
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
- How to send a file from your phone to your computer Run a small web server on the computer and open its address on the phone. The file goes straight across you...
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