Initial commit: PhotoPhetch v1.0.0

Kotlin/Compose Multiplatform desktop app for importing photos from
phones into PhotoPhile staging directory.

Features:
- Android support via ADB subprocess
- iPhone support via gphoto2 subprocess
- Smart filtering: excludes screenshots, received images, Live Photo MOVs
- HEIC -> JPEG conversion via macOS sips (built-in)
- SHA-256 verification of every copied file
- Safe delete with explicit confirmation
- Staging path convention: _staging/{date}_{device}/
- Config persistence at ~/.photophetch/config.json
This commit is contained in:
Kyle Bolen
2026-07-28 03:04:05 +00:00
commit 145b7bc955
24 changed files with 2623 additions and 0 deletions

48
build.gradle.kts Normal file
View File

@@ -0,0 +1,48 @@
import org.jetbrains.compose.desktop.application.dsl.TargetFormat
plugins {
alias(libs.plugins.kotlin.jvm)
alias(libs.plugins.kotlin.serialization)
alias(libs.plugins.compose.multiplatform)
}
group = "com.bolenpad.photophetch"
version = "1.0.0"
kotlin {
jvmToolchain(21)
}
dependencies {
implementation(compose.desktop.currentOs)
implementation(compose.material3)
implementation(compose.materialIconsExtended)
implementation(libs.coroutines.core)
implementation(libs.coroutines.swing)
implementation(libs.serialization.json)
implementation(libs.slf4j.api)
implementation(libs.logback.classic)
}
compose.desktop {
application {
mainClass = "com.bolenpad.photophetch.MainKt"
nativeDistributions {
targetFormats(TargetFormat.Dmg, TargetFormat.Msi, TargetFormat.Deb)
packageName = "PhotoPhetch"
packageVersion = "1.0.0"
description = "Import photos from phones into PhotoPhile"
vendor = "bolenpad"
macOS {
bundleID = "com.bolenpad.photophetch"
iconFile.set(project.file("src/main/resources/icon.icns"))
}
}
// Fat JAR for quick distribution
buildTypes.release.proguard {
isEnabled = false
}
}
}