Simple, fast, local ingestion of your photo / video / audio rushes from SD cards, USB and SSD.
100% local · no network by default · zero telemetry · macOS
Coming back from a shoot, offloading cards is a fragile chore: unverified copies, duplicates, scattered files, and the fear of losing something. KontentManager does that job cleanly, without cloud and without an account: plug in a drive, browse its contents, choose what to import and to which project / disk, and let the app copy with hash verification and automatic dedup.
Built for creators juggling multiple cameras and projects who want a fast, readable and safe offload — entirely on their Mac.
The latest macOS app is on the
Releases page (KontentManager.dmg).
- Open the
.dmg, drag KontentManager into Applications. - First launch (ad-hoc signed, not notarized): right-click → Open.
- On the first card plug, allow access to removable volumes.
Required for video thumbnails, metadata reading and compression:
brew install ffmpeg exiftool. Browsing and importing work without them.
Dashboard — every connected drive and its contents at a glance:
| Drives | H.265 compression |
|---|---|
![]() |
![]() |
- Automatic drive detection (DiskArbitration) — even a card already inserted at launch.
- Browse hub per drive: a Gallery view (thumbnails generated on the fly, before import) and a Files column view (folder/subfolder navigation, Finder-style).
- Preview before import: photos, videos (playback + seek), audio — straight from the card.
- Targeted or bulk import: select individual files or whole folders; everything flows through a single import bar.
- Verified atomic copy: write to
.kmtmp, hash source/destination in parallel, double re-read, atomic rename. Group rollback keeps a clip and its sidecars together. - Hash-based deduplication (never by filename) — already-imported files are flagged.
- Readable destination tree:
Client / Project / YYYY-MM-DD / Device, internal or external disk (exFAT-compatible). - Per-project backup drive: register a hard drive, recognized by UUID and auto-selected when you plug it in.
- Smart project detection (card → project mapping, scoring on camera / dates / GPS).
- Hardware recognition: Sony, Insta360 (
.insv/.insp), DJI +.SRTtelemetry, GoPro, iPhone, FPV. - Opt-in H.265 compression (non-destructive, thermal throttling) with per-device presets.
- Manual triage: physically reassign files from one project to another.
- Optional cloud via rclone (Google Drive / Dropbox / MEGA), off by default: nothing leaves the machine without an explicit action.
KontentManager is local-first by design:
- No outbound network requests by default. The only possible flow is the opt-in cloud upload that you enable and trigger yourself.
- No telemetry, no analytics, no third-party crash reporting.
- No account, no authentication, no cloud dependency.
- The local server binds strictly to
127.0.0.1on a random port at startup. - Your data stays in
~/Library/Application Support/KontentManager/and your library.
| Backend | Python 3.12+, FastAPI, SQLAlchemy 2 (SQLite WAL), pyobjc, xxhash, exiftool, ffmpeg, rawpy, pillow-heif |
| Frontend | React 19 + strict TypeScript, Vite, Tailwind v4, TanStack Query, framer-motion |
| Desktop | pywebview (native window), packaged as a .app via PyInstaller |
The UI is served by the FastAPI backend and shown in a pywebview window: no Electron, a light footprint.
Requirements: macOS, Python 3.12+ (3.13 supported), Node 18+, and ffmpeg + exiftool
(brew install ffmpeg exiftool).
git clone https://github.com/soclosesociety/kontentmanager.git
cd kontentmanager
./scripts/dev.sh # venv + deps, Vite (5173), backend (8770), pywebview window./scripts/build_macos.sh
# -> dist-app/KontentManager.app and dist-app/KontentManager.dmgOpen the .dmg, drag KontentManager into Applications. Ad-hoc signed (not notarized): on first
launch, right-click → Open. See packaging/README.md for details and the
auto-open-on-plug LaunchAgent.
.venv/bin/python -m pytest backend/tests -q # tests
.venv/bin/ruff check backend # lint
.venv/bin/mypy backend/app # types (strict, 0 errors)
cd frontend && npx tsc --noEmit # frontend typesContributions are welcome — see CONTRIBUTING.md and the Code of Conduct.
MIT © SoClose Society.


