diff --git a/README.md b/README.md index 9d17171..be3ffaa 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,28 @@ Every file is stored as `.`, so names carry nothing, re-uploads are idempotent, and a retried upload can be verified server-side before it is accepted. +## Behaviour + +- **Integrity is structural.** The remote name *is* the SHA-256 of the content. + The server recomputes the hash of the bytes it receives and stores the file + only if it matches (mismatch → 409, nothing written). So a success response + is proof the server holds byte-for-byte-intact content — which is what makes + deleting the local copy safe. +- **Delete after confirmed upload.** Once an upload is confirmed, the app + removes its working copy and, best-effort, the original file. Files picked + in-app (SAF) are removed via the persisted read+write grant; a file that + arrives as a read-only share/`open with` stream cannot be deleted and is left + in place (not a failure). A removed source shows as "removed from phone". +- **Duplicates are never rewritten.** Identical content (same hash) already on + the server is detected by a `HEAD` before any bytes are sent; the item is + marked *Duplicate · already on server* and nothing is re-uploaded or + overwritten. Different content is a different hash, i.e. a different file — + not a duplicate. +- **Entry points.** Share sheet (`ACTION_SEND`), "Open with" on a downloaded + file (`ACTION_VIEW`), and an in-app file picker. "Clear history" (app-bar + button) drops finished, duplicate and failed rows; in-flight uploads keep + running. + ## Parts - `server/` — Node 22 / TypeScript. Runs as a docker container **on nas001** diff --git a/android/app/build.gradle.kts b/android/app/build.gradle.kts index c013234..fcd4f45 100644 --- a/android/app/build.gradle.kts +++ b/android/app/build.gradle.kts @@ -22,8 +22,8 @@ android { applicationId = "eu.itaz.internaluploader" minSdk = 26 targetSdk = 35 - versionCode = 1 - versionName = "1.0.0" + versionCode = 2 + versionName = "1.1.0" // The one place the server address exists. Never rendered in the UI; // a pairing QR can carry a different origin and overrides this. diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 512da86..3c144b7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -43,6 +43,15 @@ + + + + + + + +