Camera Toolkit is the native macOS app I use to move photos and video off my cameras, split a card into the events I actually shot, and get each event into a predictable editing and archive layout.
I built it because a camera card is not always one event. A single card can cover several shoots, and one event can span multiple cards or folders. I wanted to select those files quickly, save the event once, preview Sony RAW files without depending on Finder, and hand the resulting folders to Photomator or another editor without reorganizing everything by hand.
The safety rule is simple: the camera source stays read-only while browsing, previewing, copying, and archiving. Copy operations never overwrite conflicts, and archive operations verify checksums before reporting success. The sole destructive source action is an explicit Free Up Camera flow after verification; it re-hashes the complete selected set, requires typed confirmation, and removes nothing if any Buffer copy is missing or different.
- Plug in a camera card and browse it immediately.
- Create or reopen an event, then select its photos across as many folders or cards as needed.
- Preview the camera's embedded JPEGs, including supported Sony lossless-compressed
.ARWfiles. - Copy only that event into a temporary workspace and verify every copied file.
- Open the RAW files in Photomator and keep exports beside the event in a consistent layout.
- Archive the verified originals into my long-term photo library without overwriting conflicts.
- Optionally free the verified space on the camera after one final checksum recheck.
- Browses camera sources, buffer drives, photo-library folders, and ordinary local folders in one Finder-style window.
- Builds thumbnails and large previews from the JPEG embedded in supported Sony
.ARWfiles, including lossless-compressed RAW variants that Finder may not preview. - Opens the selected image with Space, moves through selections with the arrow keys, and opens a RAW in Photomator from the preview window.
- Saves events and assigns photos from multiple folders or camera cards to the same event.
- Shows a fast metadata-only import preview before any copy starts.
- Opens a separate persistent Transfer Queue window with per-file bytes copied, speed, verification state, and clear disconnect failures.
- Runs sequential storage speed tests inside the app: camera/card sources are read-only, while Buffer/library targets use a flushed, uncached, automatically removed temporary file. Live USB negotiation is shown beside measured read/write results to identify the actual bottleneck.
- Copies selected files to a buffer, verifies their checksums, then organizes verified originals into the photo library without overwriting conflicts.
- Offers Free Up Camera only for a completed, fully verified transfer. It shows the exact file count and size, requires typing
REMOVE, rechecks every source/Buffer checksum, and permanently removes the source set only when all files still match. - Stores event/file relationships in SQLite through GRDB and includes a bounded, read-only SQL inspector.
- Checks whether known files already exist in Immich and stores per-event album/upload preferences. Photo upload is not enabled yet.
- Labels macOS network-share capacity as an SMB estimate and can securely query the matching TrueNAS dataset and pool for authoritative free space and health.
- macOS 14 or newer
- Swift 6 and Xcode 16 or newer for source builds
- Photomator is optional, but required for the preview window's Open in Photomator action
- An Immich server and API key are optional
- A TrueNAS server and read-only API key are optional when exact NAS capacity is needed
From a clone of this repository:
swift test --jobs 1
swift run CameraToolkitPackage a locally ad-hoc-signed app bundle:
scripts/package-app.sh
open dist/CameraToolkit.appTo install that bundle into /Applications, run scripts/package-app.sh --install. Set CAMERA_TOOLKIT_INSTALL_DIR to install into a different directory.
CameraToolkitCatalogRebuilder is a non-destructive maintenance command for
recovering or reconciling an existing Camera Toolkit installation. It reads an
event plan, scans every source with the same FileScanner used by the app, and
writes separate candidate configuration and SQLite files. It preserves events
outside the plan and replaces only assignments for source roots named by the
plan. It never moves or deletes media and refuses to overwrite candidate files.
swift run CameraToolkitCatalogRebuilder \
--configuration /path/to/config.json \
--plan /path/to/event-plan.json \
--output-configuration /path/to/config.candidate.json \
--output-catalog /path/to/catalog.candidate.sqliteReview and validate the candidates before installing them. Filesystem copying and checksum verification are deliberately separate operations.
Open Camera Toolkit → Settings and choose:
- One or more camera-source folders.
- A temporary buffer folder.
- A long-term photo-library root.
- Optionally, an Immich server URL and API key.
- Optionally, a TrueNAS server URL and read-only API key. Leave the dataset blank to match it from the mounted SMB library share.
No removable-drive, network-share, username, or home-directory path is compiled into the app. API keys are stored in macOS Keychain; paths and event preferences stay in the app's local configuration.
- Create or select an event.
- Turn on selection mode and choose photos in any number of source folders.
- Assign the collected photos to the event.
- Use Preview Event for a quick path-and-size comparison.
- Use Copy Event + Verify to copy the bytes into the buffer and checksum them.
- Use Archive + Verify to organize verified originals in the library and write a manifest.
- Optionally open Transfers → Free Up Camera to recheck and remove those exact files from the source device.
The default layout is intentionally readable:
Buffer/<year>/<event>/
├── <camera>/Card Copy/
├── Photomator/
└── Exports/
├── Masters/
├── Web/
└── Social/
Photo Library/Originals/<year>/<event>/<camera>/
├── RAW/
├── Photos/
├── Video/
└── Other/
| Shortcut | Action |
|---|---|
| Space | Preview the selected file |
| Arrow keys | Move through files or the preview selection |
| Command-B | Toggle the locations sidebar |
| Command-Plus / Command-Minus | Increase or decrease thumbnail size |
| Command-C | Copy selected file references |
| Command-A | Select all files |
| Command-R | Refresh |
| Option-Command-E | Open Event Library |
| Shift-Command-I | Open the SQLite inspector |
| Shift-Command-K | Open the full shortcut reference |
- Camera browsing, previews, copies, and archives are source-read-only.
- Free Up Camera is the only source-destructive action. It is available only after full Buffer verification, requires typing
REMOVE, performs a fresh all-files checksum pass, and permanently removes nothing when any file fails that pass. - Metadata previews do not claim checksum verification.
- Copy and archive paths refuse to overwrite a different existing file.
- Archive success requires checksum verification and writes a manifest.
- Buffer-to-archive cleanup moves verified Buffer files into a recoverable
_Trash/<batch>area; permanent Buffer-trash deletion remains separate and confirmation-gated. - Tests operate only in temporary directories.
See Safety, Configuration, and Architecture for implementation details.
Camera Toolkit is early-stage macOS software. The local browsing, preview, event, verified-copy, archive, catalog, and Immich-presence paths are implemented. App signing/notarization and Immich uploads are not implemented.
Contributions are welcome; start with CONTRIBUTING.md. Camera Toolkit is available under the MIT License.