djpi offloads DJI Osmo Action 6 and Pocket 3 cameras. When a camera is plugged in, it copies every file to my archives (local disk, S3, and Immich), checks each copy byte for byte, and reports when the card is safe to clear.

Problem

Offloading footage by hand is slow and error-prone: the wrong folder, a half-finished copy, or a card wiped too early. I wanted plugging in the camera to be the only step.

Work

flowchart LR
  C[Camera on USB] --> D[djpi]
  D --> L[Local] & S[S3] & I[Immich]
  L & S & I --> V{SHA-256 check}
  V --> R[Safe to clear]
  • udev starts ingest when the camera is plugged in, with no manual steps.
  • Every copy is re-read and verified with SHA-256. An audit command re-verifies everything later.
  • Resumable: a restart picks up where it left off without re-uploading anything.
  • Never deletes originals.

Tested on real cameras: a full card of 293 files (8.43 GB) from an Action 6 to S3, every file verified.

Stack

Go, NixOS module, udev, S3, the Immich API.

Status

Pre-1.0. Wired ingest works. Wireless and Bluetooth control are in progress.