|
|
||
|---|---|---|
| AutoIngest | ||
| publish | ||
| publish-standalone | ||
| .gitignore | ||
| AutoIngest.sln | ||
| BLOG.md | ||
| LICENSE | ||
| QUICKSTART.md | ||
| README.md | ||
| publish-standalone.bat | ||
| publish.bat | ||
README.md
AutoIngest
Author: Jeremy Anderson
Contact: info@dcos.net
Website: dcos.net
What It Does
AutoIngest is a Windows tray-resident tool that silently moves photos off an SD card or USB drive into a dated folder on your PC. Plug in the card, the .jpgs are moved (not copied) to ~/Pictures/YYYY-MM-DD/, and any RAW/HEIC/PNG files are converted to JPG and the originals removed from the card. A small toast pops into the corner while it's working, then disappears. Duplicate-aware within a single day — if you re-insert the same card on the same day, byte-identical files are skipped.
Built for eBay sellers who just want the photos off the camera and into a folder, with nothing to click.
Features
Silent move-import (the core)
- Polls for removable drives every 4 seconds via kernel32
GetDriveTypeandGetVolumeInformationW - Probes DCIM, Pictures, and root folders for image files
- Moves JPG/JPEG files directly to
~/Pictures/<today's date>/— no dupes left on the device - Converts all other formats (RAW, HEIC, PNG, etc.) to progressive JPG, then deletes the original from the card
- Same-day duplicate aware: within today's import folder, byte-identical files (matched by size then SHA-256) are skipped rather than re-imported
- Verify-before-delete: a file is only removed from the card after the destination is confirmed present and correctly sized
- Single-instance enforcement via named mutex
Toast UI
- Lives in the system tray by default — no window at startup
- A small borderless toast pops into the bottom-right corner when an import starts
- Shows live status (
Moving 3/12: IMG_004.jpg) and a scrolling log - Auto-hides ~4 seconds after the import completes
- Left-click the tray icon to peek at status on demand; right-click for the menu (show status, open import folder, reset drive memory, about, exit)
Image Conversion
- Powered by Magick.NET (ImageMagick 7 bindings)
- Handles 30+ input formats: JPG, PNG, BMP, TIFF, WebP, CR2, CR3, NEF, ARW, DNG, HEIC, HEIF, SVG, RAW, and more
- Converts at native resolution (no downscaling) to preserve full image detail
- Outputs progressive, optimized JPG
Architecture
AutoIngest/
├── AutoIngest.csproj Project file, package reference, assembly metadata
├── App/ WinForms UI layer (namespace AutoIngest.App)
│ ├── Program.cs Entry point, single-instance mutex
│ ├── MainForm.cs Tray icon, toast show/hide, monitor wiring
│ ├── MainForm.Designer.cs Toast popup layout (WinForms Designer)
│ ├── MainForm.resx Designer resource header
│ └── app.manifest Windows 10/11 compatibility manifest
├── Core/ Config/models layer (namespace AutoIngest.Core)
│ └── ConfigManager.cs JSON config persistence
└── Engine/ Import/conversion layer (namespace AutoIngest.Engine)
├── SDCardMonitor.cs Background drive polling, photo discovery, move/convert pipeline
└── ImageConverter.cs Magick.NET wrapper for universal format-to-JPG conversion
Single NuGet dependency: Magick.NET-Q16-AnyCPU
Design Decisions
| Decision | Rationale |
|---|---|
| Move, not copy | The card is the source of truth; leaving dupes after import causes confusion. Move it once, done. |
| Same-day dedupe | Re-inserting a card on the same day shouldn't double-import. Within today's folder, byte-identical files are skipped; name collisions with different content get a _1, _2 suffix. (We are not a cross-day dedupe tool — different days go in different folders.) |
| Tray + toast, no main window | This is a silent utility. You shouldn't have to manage a window — it just tells you when it's working. |
| C# / .NET 8 over Python | Single-exe deployment. No runtime, pip, or native extension installation on the end user's PC. |
| WinForms over WPF | Simple, direct control layout, no XAML complexity. |
| Magick.NET over System.Drawing | One library handles all 30+ formats including RAW, HEIC, SVG. |
| kernel32 P/Invoke over WMI | Deterministic, fast drive detection without COM initialization overhead. |
| Polling (4s interval) over WMI events | WMI event subscriptions require COM apartment threading and have inconsistent delivery across Windows versions. |
| Flat output directory | Matches the workflow: pull to date folder, open in browser, attach to listing. |
Building
Prerequisites
- Windows 10/11
- Visual Studio 2022 Community (free) with ".NET desktop development" workload
- .NET 8 SDK (installed by VS2022 with the desktop workload)
Build from Visual Studio
- Open
AutoIngest.sln - Build → Build Solution (or Ctrl+Shift+B)
- The output exe is in
AutoIngest/bin/Debug/net8.0-windows/
Build from command line
cd AutoIngest
dotnet restore
dotnet build -c Release
Publish as single exe
REM Framework-dependent (~15 MB, requires .NET 8 desktop runtime on target PC)
publish.bat
REM Self-contained (~60-80 MB, runs on any Win10/11 PC)
publish-standalone.bat
Deployment
Copy the resulting AutoIngest.exe to the target PC. No installer required.
- Framework-dependent build: Requires .NET 8 Desktop Runtime. Windows 11 includes this by default. Windows 10 may need it from dotnet.microsoft.com.
- Self-contained build: No prerequisites. Runs on any Windows 10/11 PC.
Configuration
Config file: ~/.autoingest_config.json — created automatically on first run. Holds JPG quality and auto-import toggle.
Tech Stack
| Component | Technology |
|---|---|
| Language | C# 12 / .NET 8 |
| UI Framework | Windows Forms |
| Image Processing | Magick.NET-Q16-AnyCPU (ImageMagick 7) |
| Drive Detection | kernel32 GetDriveType + GetVolumeInformationW via P/Invoke |
| Serialization | System.Text.Json |
| Target | Windows 10 1809+ / Windows 11 |
License
MS-PL (Microsoft Public License). See LICENSE. Author: Jeremy Anderson (info@dcos.net, https://dcos.net).