blurry-opsec 0.1.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. blurry_opsec-0.1.0/.gitignore +18 -0
  2. blurry_opsec-0.1.0/CHANGELOG.md +23 -0
  3. blurry_opsec-0.1.0/LICENSE +21 -0
  4. blurry_opsec-0.1.0/PKG-INFO +239 -0
  5. blurry_opsec-0.1.0/README.it.md +217 -0
  6. blurry_opsec-0.1.0/README.md +214 -0
  7. blurry_opsec-0.1.0/THIRD_PARTY_LICENSES.md +50 -0
  8. blurry_opsec-0.1.0/THREAT_MODEL.it.md +61 -0
  9. blurry_opsec-0.1.0/THREAT_MODEL.md +59 -0
  10. blurry_opsec-0.1.0/licenses/GPL-2.0.txt +338 -0
  11. blurry_opsec-0.1.0/licenses/GPL-3.0.txt +674 -0
  12. blurry_opsec-0.1.0/licenses/Geist-OFL-1.1.txt +93 -0
  13. blurry_opsec-0.1.0/licenses/LGPL-3.0.txt +165 -0
  14. blurry_opsec-0.1.0/licenses/NumPy-BSD-3-Clause.txt +935 -0
  15. blurry_opsec-0.1.0/licenses/OpenCV-Apache-2.0.txt +202 -0
  16. blurry_opsec-0.1.0/licenses/OpenCV-third-party.txt +3603 -0
  17. blurry_opsec-0.1.0/licenses/Pillow-MIT-CMU.txt +1574 -0
  18. blurry_opsec-0.1.0/licenses/PyAV-BSD-3-Clause.txt +23 -0
  19. blurry_opsec-0.1.0/licenses/YuNet-MIT.txt +21 -0
  20. blurry_opsec-0.1.0/licenses/opencv-python-MIT.txt +21 -0
  21. blurry_opsec-0.1.0/licenses/pi-heif-BSD-3-Clause.txt +30 -0
  22. blurry_opsec-0.1.0/pyproject.toml +72 -0
  23. blurry_opsec-0.1.0/src/blurry_opsec/__init__.py +3 -0
  24. blurry_opsec-0.1.0/src/blurry_opsec/__main__.py +53 -0
  25. blurry_opsec-0.1.0/src/blurry_opsec/cli.py +202 -0
  26. blurry_opsec-0.1.0/src/blurry_opsec/detect.py +48 -0
  27. blurry_opsec-0.1.0/src/blurry_opsec/engine.py +217 -0
  28. blurry_opsec-0.1.0/src/blurry_opsec/files.py +96 -0
  29. blurry_opsec-0.1.0/src/blurry_opsec/fonts/Geist-SemiBold.otf +0 -0
  30. blurry_opsec-0.1.0/src/blurry_opsec/fonts/GeistMono-Medium.otf +0 -0
  31. blurry_opsec-0.1.0/src/blurry_opsec/fonts/OFL.txt +93 -0
  32. blurry_opsec-0.1.0/src/blurry_opsec/gui/__init__.py +1 -0
  33. blurry_opsec-0.1.0/src/blurry_opsec/gui/app.py +41 -0
  34. blurry_opsec-0.1.0/src/blurry_opsec/gui/canvas.py +257 -0
  35. blurry_opsec-0.1.0/src/blurry_opsec/gui/main_window.py +643 -0
  36. blurry_opsec-0.1.0/src/blurry_opsec/gui/model.py +110 -0
  37. blurry_opsec-0.1.0/src/blurry_opsec/gui/native.py +96 -0
  38. blurry_opsec-0.1.0/src/blurry_opsec/gui/picker.py +162 -0
  39. blurry_opsec-0.1.0/src/blurry_opsec/gui/prefs.py +82 -0
  40. blurry_opsec-0.1.0/src/blurry_opsec/gui/review.py +556 -0
  41. blurry_opsec-0.1.0/src/blurry_opsec/gui/style.py +119 -0
  42. blurry_opsec-0.1.0/src/blurry_opsec/gui/widgets.py +181 -0
  43. blurry_opsec-0.1.0/src/blurry_opsec/gui/worker_client.py +129 -0
  44. blurry_opsec-0.1.0/src/blurry_opsec/i18n/__init__.py +170 -0
  45. blurry_opsec-0.1.0/src/blurry_opsec/image_io.py +159 -0
  46. blurry_opsec-0.1.0/src/blurry_opsec/levels.py +77 -0
  47. blurry_opsec-0.1.0/src/blurry_opsec/model/LICENSE +21 -0
  48. blurry_opsec-0.1.0/src/blurry_opsec/model/__init__.py +37 -0
  49. blurry_opsec-0.1.0/src/blurry_opsec/model/face_detection_yunet_2023mar.onnx +0 -0
  50. blurry_opsec-0.1.0/src/blurry_opsec/netguard.py +61 -0
  51. blurry_opsec-0.1.0/src/blurry_opsec/plan.py +259 -0
  52. blurry_opsec-0.1.0/src/blurry_opsec/redact.py +59 -0
  53. blurry_opsec-0.1.0/src/blurry_opsec/tempfiles.py +72 -0
  54. blurry_opsec-0.1.0/src/blurry_opsec/tracking.py +87 -0
  55. blurry_opsec-0.1.0/src/blurry_opsec/video_io.py +345 -0
  56. blurry_opsec-0.1.0/src/blurry_opsec/watermark.py +52 -0
  57. blurry_opsec-0.1.0/src/blurry_opsec/worker.py +349 -0
@@ -0,0 +1,18 @@
1
+ # Real media of real people: local only, never committed (PIANO_BLURRY §6, §9)
2
+ tests/fixtures/private/*
3
+ !tests/fixtures/private/.gitkeep
4
+
5
+ .venv/
6
+ __pycache__/
7
+ *.py[cod]
8
+ .pytest_cache/
9
+ .ruff_cache/
10
+ build/
11
+ dist/
12
+ *.egg-info/
13
+ *.blurry-partial
14
+ .DS_Store
15
+
16
+ # macOS app (SwiftPM)
17
+ macos/.build/
18
+ macos/.swiftpm/
@@ -0,0 +1,23 @@
1
+ # Changelog
2
+
3
+ All notable changes are listed here. Versions follow [Semantic Versioning](https://semver.org/).
4
+
5
+ ## [0.1.0] — unreleased
6
+
7
+ First public release: the desktop app and the `blurry` command.
8
+
9
+ - Desktop app (PySide6, optional `gui` extra): drag and drop queue, image editor with detected and
10
+ manual boxes, video review with timeline, review flags, track on/off and manual boxes over a
11
+ span of time, result preview, explicit confirmation for files with no faces, Italian and
12
+ English. Processing runs in a separate, cancellable worker process. Preferences limited to
13
+ sensitivity, cover, margin and language; a custom file picker that remembers nothing.
14
+
15
+ - Face covering with YuNet (solid black box by default, or pixelation), three detection levels,
16
+ adjustable padding; tracks held half a second before and after in videos.
17
+ - Metadata removal for JPEG, PNG, WebP, HEIC/HEIF photos and MP4, MOV, M4V, MKV, WebM, AVI videos;
18
+ output as JPEG/PNG and H.264 MP4. Rotation applied to the pixels.
19
+ - Offline by construction: network sockets blocked in-process, FFmpeg restricted to local files and
20
+ whitelisted demuxers.
21
+ - Nothing written besides the chosen output; originals never overwritten.
22
+ - Review flags (no faces, near-threshold detections, small faces, track gaps), `--strict`,
23
+ `--json` reports and `__PROGRESS__` lines.
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Chrono-Web contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,239 @@
1
+ Metadata-Version: 2.5
2
+ Name: blurry-opsec
3
+ Version: 0.1.0
4
+ Summary: Cover faces and strip metadata from photos and videos, locally and offline.
5
+ Project-URL: Homepage, https://github.com/Chrono-Web/BLURRY
6
+ Project-URL: Releases, https://github.com/Chrono-Web/BLURRY/releases
7
+ Author: Chrono-Web contributors
8
+ License-Expression: MIT
9
+ License-File: LICENSE
10
+ Classifier: Operating System :: MacOS
11
+ Classifier: Operating System :: Microsoft :: Windows
12
+ Classifier: Operating System :: POSIX :: Linux
13
+ Classifier: Programming Language :: Python :: 3.12
14
+ Classifier: Topic :: Multimedia :: Graphics
15
+ Classifier: Topic :: Security
16
+ Requires-Python: <3.13,>=3.12
17
+ Requires-Dist: av>=18.1
18
+ Requires-Dist: numpy>=1.26
19
+ Requires-Dist: opencv-python-headless<5,>=4.8
20
+ Requires-Dist: pi-heif>=0.18
21
+ Requires-Dist: pillow>=10.4
22
+ Provides-Extra: gui
23
+ Requires-Dist: pyside6-essentials>=6.7; extra == 'gui'
24
+ Description-Content-Type: text/markdown
25
+
26
+ <p align="center">
27
+ <img src="docs/icona.png" width="128" height="128" alt="Blurry icon">
28
+ </p>
29
+
30
+ <h1 align="center">Blurry</h1>
31
+
32
+ <p align="center">
33
+ Cover faces and strip metadata from photos and videos,<br>
34
+ on your own computer, with no network.
35
+ </p>
36
+
37
+ <p align="center">
38
+ <a href="https://github.com/Chrono-Web/BLURRY/releases/latest/download/Blurry.dmg"><b>⬇ Download for Mac</b></a>
39
+ &nbsp;·&nbsp;
40
+ <a href="#with-python-windows-linux-command-line"><b>Windows and Linux (with Python)</b></a>
41
+ <br>
42
+ <sub>Version 0.1.0 · Mac with Apple Silicon, macOS 14+ · free and open source (MIT)</sub>
43
+ <br>
44
+ <sub><a href="README.it.md">Italiano</a> · <a href="THREAT_MODEL.md">Threat model</a> · <a href="SECURITY.md">Security</a></sub>
45
+ </p>
46
+
47
+ Blurry finds faces, covers them with a solid black box (or pixelation), and writes a new file with
48
+ no metadata: no GPS position, no camera model, no dates, no hidden thumbnail of the original. It
49
+ runs entirely offline. It has no server, no account, no telemetry and no update check, and it
50
+ refuses to open network connections even if something tries.
51
+
52
+ > **Always check the result before you share it:** the detector can miss faces, and Blurry
53
+ > does not hide bodies, voices or places. See [What it does not do](#what-it-does-not-do).
54
+
55
+ ## Install
56
+
57
+ ### Mac
58
+
59
+ Apple Silicon (M1 or later), macOS 14 or later.
60
+
61
+ 1. Download [`Blurry.dmg`](https://github.com/Chrono-Web/BLURRY/releases/latest/download/Blurry.dmg)
62
+ from the [Releases](https://github.com/Chrono-Web/BLURRY/releases) page.
63
+ 2. Open it and drag Blurry onto the Applications folder.
64
+ 3. The first time, macOS warns that it cannot verify the developer: Blurry is not signed by Apple.
65
+ Open System Settings › Privacy & Security, scroll down and click **Open Anyway** next to
66
+ Blurry. You only do this once.
67
+
68
+ ### With Python (Windows, Linux, command line)
69
+
70
+ You need Python 3.12. The simplest way is [pipx](https://pipx.pypa.io/) (or `uv tool`). With the
71
+ desktop app:
72
+
73
+ ```bash
74
+ pipx install "blurry-opsec[gui]"
75
+ ```
76
+
77
+ Command line only:
78
+
79
+ ```bash
80
+ pipx install blurry-opsec
81
+ ```
82
+
83
+ ## The app
84
+
85
+ **On a Mac** (`Blurry.dmg`):
86
+
87
+ 1. **Drop** photos and videos on the window, or use *Choose Files…* (⌘O).
88
+ 2. A **guide** takes one file at a time: the file in the middle, and below it one choice at a
89
+ time (sensitivity, cover, margin, and the sound for videos). From the cover step on, the
90
+ picture shows exactly what will be exported; on a video you can play the covered result.
91
+ 3. **Correct the boxes** by hand if needed: draw, move, resize or remove boxes on photos; in
92
+ videos switch off a track that is not a face, or draw a still box over a span of time.
93
+ 4. **Export…** opens the save panel on the original's folder, with `<name>_blurry`. The original
94
+ is never touched. If no face was found, Blurry asks first.
95
+
96
+ Every file of the session is in View › Queue (⌘L). A short guide accompanies the first file
97
+ (Help › Show the Guide Again).
98
+
99
+ **On Windows and Linux**, run `blurry` with no arguments (or `blurry-app`) to open the app
100
+ installed with Python:
101
+
102
+ 1. **Drop** photos and videos on the window, or use *Choose files…*. Each file is analysed in a
103
+ separate process; nothing leaves your computer.
104
+ 2. **Review** any file. Boxes found by the detector are yellow, boxes you add are teal. Drag on an
105
+ empty area to add a box, drag a box to move it, drag its corners to resize it, press Delete to
106
+ remove it. *Preview result* shows exactly what will be exported.
107
+ In videos, scrub the timeline (uncertain moments are marked in red), turn off a track that is
108
+ not a face, or draw a box that covers an area for a span of time.
109
+ 3. **Export.** If a file has no face and you added none, Blurry asks before exporting it.
110
+
111
+ Both apps remember only a few settings (sensitivity, cover, margin, language, and on the Mac
112
+ whether the guide was seen): never file names, folders or recent files. The Qt app uses its own
113
+ file picker, because Qt's dialogs keep a list of recent folders; the Mac app uses the system's
114
+ panels and removes what they record as soon as they close.
115
+
116
+ ## What it does
117
+
118
+ - **Covers faces** in photos and videos, using the YuNet face detector (bundled; its SHA-256 is
119
+ checked on every start, and Blurry refuses to run if it does not match).
120
+ - **Removes all metadata**:
121
+ - photos: EXIF (including the embedded thumbnail), GPS, XMP, IPTC, colour profiles and comments;
122
+ - videos: container and track tags (QuickTime location, device, dates), chapters, subtitles,
123
+ data tracks (such as GoPro and drone GPS) and cover art.
124
+ - **Applies the rotation** of phone photos and videos to the pixels first, so sideways faces are
125
+ not missed, and the output looks the same as before without carrying rotation metadata.
126
+ - **Drops audio by default**, because voices can identify people. Keep it with `--keep-audio`.
127
+ - **Never overwrites anything**: the original stays untouched, and if the output name is taken a
128
+ numbered name is used.
129
+ - **Never stays silent when no face is found**: it warns, and with `--strict` it writes nothing
130
+ and exits with code 2.
131
+
132
+ ## What it does not do
133
+
134
+ Read the [threat model](THREAT_MODEL.md) before relying on Blurry. In short, it does **not** hide
135
+ bodies, clothes, tattoos, voices, places, reflections, or the camera sensor's fingerprint; it
136
+ cannot cover a face the detector does not find; it does not delete your original, which may also
137
+ be synced to iCloud or Google Photos.
138
+
139
+ **The detector can miss faces**, especially faces in profile, in the dark, very small, or turned
140
+ sideways. Always look at the result before sharing it. Files with uncertain detections are listed
141
+ under `flags` in the `--json` report.
142
+
143
+ ## Uninstall
144
+
145
+ **Mac:** drag Blurry from Applications to the Bin. Blurry keeps no data: its only preferences
146
+ (sensitivity, cover, margin, and whether the guide was seen) live in
147
+ `~/Library/Preferences/com.chronocol.blurry.plist`, which you can delete.
148
+
149
+ **With Python:** `pipx uninstall blurry-opsec`.
150
+
151
+ ## Report a problem
152
+
153
+ Something does not work, or a face is not covered? Open an
154
+ [issue](https://github.com/Chrono-Web/BLURRY/issues/new): say what you did and what happened,
155
+ **without attaching photos or videos of real people**. Security vulnerabilities do not go in
156
+ public issues: follow [SECURITY.md](SECURITY.md).
157
+
158
+ ## From the command line
159
+
160
+ ```bash
161
+ blurry photo.jpg
162
+ ```
163
+
164
+ writes `photo.blurry.jpg` next to the original.
165
+
166
+ ```bash
167
+ blurry IMG_0001.HEIC clip.mov -o ~/Desktop/clean
168
+ ```
169
+
170
+ writes `IMG_0001.blurry.jpg` and `clip.blurry.mp4` in `~/Desktop/clean`.
171
+
172
+ ```
173
+ blurry INPUT... [-o FOLDER] [--level base|medium|high] [--mode solid|pixel]
174
+ [--padding 0.25] [--keep-audio] [--no-faces] [--watermark TEXT]
175
+ [--strict] [--json] [--debug]
176
+ ```
177
+
178
+ | Option | Meaning | Default |
179
+ |---|---|---|
180
+ | `-o FOLDER` | Where to write the outputs | next to each original |
181
+ | `--level` | Detection sensitivity: `base` (clear frontal faces only), `medium`, `high` (also small or partly hidden faces) | `high` |
182
+ | `--mode` | `solid` black box or `pixel` (pixelation) | `solid` |
183
+ | `--padding` | Margin around each face, as a fraction of its long side, on every side | `0.25` |
184
+ | `--keep-audio` | Keep the audio track (re-encoded to AAC) | audio removed |
185
+ | `--no-faces` | Only remove metadata, cover nothing | |
186
+ | `--watermark TEXT` | Add a text watermark | off |
187
+ | `--strict` | If a file has no faces, write nothing for it and exit with code 2 | |
188
+ | `--json` | Print one JSON report per file on stdout | |
189
+ | `--debug` | Debug output on stderr | off |
190
+
191
+ **Accepted files.** Photos: JPEG, PNG, WebP (still), HEIC/HEIF. Videos: MP4, MOV, M4V, MKV, WebM,
192
+ AVI. GIFs and animated images are refused. Photos come out as JPEG (PNG stays PNG); videos come
193
+ out as MP4 (H.264).
194
+
195
+ **Exit codes.** `0` all good · `1` an error · `2` no face found with `--strict`.
196
+
197
+ Progress is printed on stderr as `__PROGRESS__ {json}` lines, for scripts and integrations.
198
+
199
+ ## Verify what you download
200
+
201
+ Every release on GitHub comes with a `SHA256SUMS` file, a CycloneDX SBOM, and a GitHub
202
+ build-provenance attestation for each file, which proves it was built by this repository's
203
+ release workflow.
204
+
205
+ - macOS / Linux, in the folder with the downloads:
206
+
207
+ ```bash
208
+ shasum -a 256 -c SHA256SUMS
209
+ ```
210
+
211
+ - Windows (compare the result with the line in `SHA256SUMS`):
212
+
213
+ ```
214
+ CertUtil -hashfile <file> SHA256
215
+ ```
216
+
217
+ - Provenance, with the [GitHub CLI](https://cli.github.com/):
218
+
219
+ ```bash
220
+ gh attestation verify <file> --repo Chrono-Web/BLURRY
221
+ ```
222
+
223
+ The PyPI package is published from the same workflow with Trusted Publishing (no tokens), and
224
+ PyPI shows its provenance on the project page.
225
+
226
+ ## Known limits
227
+
228
+ - Faces in profile, in the dark, very small or turned sideways can be missed (see above).
229
+ - HDR videos from phones (10-bit HEVC) come out as 8-bit SDR H.264: colours can look flatter.
230
+ - On macOS, processing a video prints a harmless `objc ... implemented in both` warning, because
231
+ OpenCV and PyAV each bundle their own FFmpeg.
232
+
233
+ ## Licence
234
+
235
+ Blurry is MIT-licensed. The PyPI package contains only Blurry's code, the YuNet model (MIT) and the
236
+ Geist font (OFL). The Mac app (`Blurry.dmg`) also contains FFmpeg with **x264 and x265, which
237
+ are GPL-2.0-or-later**, and the PyInstaller bootloader (GPL-2.0 with an exception for the
238
+ programs it runs): see [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) for every licence
239
+ and the exact sources.
@@ -0,0 +1,217 @@
1
+ <p align="center">
2
+ <img src="docs/icona.png" width="128" height="128" alt="Icona di Blurry">
3
+ </p>
4
+
5
+ <h1 align="center">Blurry</h1>
6
+
7
+ <p align="center">
8
+ Copre i volti e cancella i metadati di foto e video,<br>
9
+ sul tuo computer e senza rete.
10
+ </p>
11
+
12
+ <p align="center">
13
+ <a href="https://github.com/Chrono-Web/BLURRY/releases/latest/download/Blurry.dmg"><b>⬇ Scarica per Mac</b></a>
14
+ &nbsp;·&nbsp;
15
+ <a href="#con-python-windows-linux-comando-da-terminale"><b>Windows e Linux (con Python)</b></a>
16
+ <br>
17
+ <sub>Versione 0.1.0 · Mac con Apple Silicon, macOS 14+ · gratuito e open source (MIT)</sub>
18
+ <br>
19
+ <sub><a href="README.md">English</a> · <a href="THREAT_MODEL.it.md">Modello delle minacce</a> · <a href="SECURITY.md">Sicurezza</a></sub>
20
+ </p>
21
+
22
+ Blurry trova i volti, li copre con un rettangolo nero (o con la pixelazione) e scrive un file nuovo
23
+ senza metadati: niente posizione GPS, niente modello della fotocamera, niente date, niente
24
+ miniatura nascosta dell'originale. Funziona tutto senza rete: niente server, account, telemetria o
25
+ controllo degli aggiornamenti, e rifiuta di aprire connessioni anche se qualcosa ci prova.
26
+
27
+ > **Guarda sempre il risultato prima di condividerlo:** il rilevatore può mancare dei volti, e
28
+ > Blurry non nasconde corpi, voci o luoghi. Vedi [Che cosa non fa](#che-cosa-non-fa).
29
+
30
+ ## Installare
31
+
32
+ ### Mac
33
+
34
+ Apple Silicon (M1 o successivi), macOS 14 o successivo.
35
+
36
+ 1. Scarica [`Blurry.dmg`](https://github.com/Chrono-Web/BLURRY/releases/latest/download/Blurry.dmg)
37
+ dalla pagina delle [Release](https://github.com/Chrono-Web/BLURRY/releases).
38
+ 2. Aprilo e trascina Blurry sulla cartella Applicazioni.
39
+ 3. La prima volta macOS avvisa che non può verificare lo sviluppatore: Blurry non è firmato da
40
+ Apple. Apri Impostazioni di Sistema › Privacy e sicurezza, scorri in fondo e premi **Apri
41
+ comunque** accanto a Blurry. Serve una volta sola.
42
+
43
+ ### Con Python (Windows, Linux, comando da terminale)
44
+
45
+ Serve Python 3.12. Il modo più semplice è [pipx](https://pipx.pypa.io/) (oppure `uv tool`). Con
46
+ l'app:
47
+
48
+ ```bash
49
+ pipx install "blurry-opsec[gui]"
50
+ ```
51
+
52
+ Solo il comando da terminale:
53
+
54
+ ```bash
55
+ pipx install blurry-opsec
56
+ ```
57
+
58
+ ## L'app
59
+
60
+ **Su Mac** (`Blurry.dmg`):
61
+
62
+ 1. **Trascina** foto e video nella finestra, oppure usa *Scegli file…* (⌘O).
63
+ 2. Una **guida** prende un file alla volta: il file al centro e sotto una scelta alla volta
64
+ (sensibilità, copertura, margine e, per i video, l'audio). Dalla copertura in poi l'immagine
65
+ mostra esattamente quello che verrà esportato; in un video puoi riprodurre il risultato coperto.
66
+ 3. **Correggi i riquadri** a mano se serve: nelle foto disegna, sposta, ridimensiona o togli i
67
+ riquadri; nei video spegni una traccia che non è un volto, o disegna un riquadro fermo su un
68
+ intervallo di tempo.
69
+ 4. **Esporta…** apre il pannello di salvataggio sulla cartella dell'originale, con
70
+ `<nome>_blurry`. L'originale non viene mai toccato. Se non ha trovato volti, Blurry chiede prima.
71
+
72
+ Tutti i file della sessione sono in Vista › Coda (⌘L). Una breve guida accompagna il primo file
73
+ (Aiuto › Rivedi la guida).
74
+
75
+ **Su Windows e Linux**, lancia `blurry` senza argomenti (oppure `blurry-app`) per aprire l'app
76
+ installata con Python:
77
+
78
+ 1. **Trascina** foto e video nella finestra, oppure usa *Scegli file…*. Ogni file si analizza in
79
+ un processo separato; niente esce dal tuo computer.
80
+ 2. **Rivedi** i file. I riquadri trovati dal rilevatore sono gialli, quelli che aggiungi tu verde
81
+ acqua. Trascina su un'area vuota per aggiungere un riquadro, trascina un riquadro per spostarlo,
82
+ i suoi angoli per ridimensionarlo, premi Canc per eliminarlo. *Anteprima del risultato* mostra
83
+ esattamente quello che verrà esportato.
84
+ Nei video scorri la linea del tempo (i momenti incerti sono segnati in rosso), spegni una
85
+ traccia che non è un volto, o disegna un riquadro che copre un'area per un intervallo di tempo.
86
+ 3. **Esporta.** Se in un file non c'è nessun volto e non ne hai aggiunti, Blurry chiede conferma.
87
+
88
+ Le due app ricordano solo poche impostazioni (sensibilità, copertura, margine, lingua e, su Mac,
89
+ se la guida è già stata vista): mai nomi di file, cartelle o file recenti. L'app Qt usa un suo
90
+ selettore di file, perché i dialoghi di Qt tengono un elenco delle cartelle recenti; l'app per Mac
91
+ usa i pannelli del sistema e toglie quello che registrano appena si chiudono.
92
+
93
+ ## Che cosa fa
94
+
95
+ - **Copre i volti** in foto e video, con il rilevatore YuNet (incluso; il suo SHA-256 si controlla
96
+ a ogni avvio, e se non corrisponde Blurry non parte).
97
+ - **Toglie tutti i metadati**:
98
+ - foto: EXIF (compresa la miniatura incorporata), GPS, XMP, IPTC, profili colore e commenti;
99
+ - video: tag del contenitore e delle tracce (luogo QuickTime, dispositivo, date), capitoli,
100
+ sottotitoli, tracce dati (come il GPS di GoPro e droni) e copertine.
101
+ - **Applica prima la rotazione** di foto e video del telefono ai pixel, così i volti di lato non
102
+ sfuggono, e il risultato si vede come prima senza portarsi dietro i metadati di rotazione.
103
+ - **Toglie l'audio di default**, perché le voci possono identificare. Per tenerlo: `--keep-audio`.
104
+ - **Non sovrascrive mai niente**: l'originale resta intatto, e se il nome di uscita è già preso
105
+ ne usa uno numerato.
106
+ - **Non tace mai se non trova volti**: avvisa, e con `--strict` non scrive niente ed esce con
107
+ codice 2.
108
+
109
+ ## Che cosa non fa
110
+
111
+ Leggi il [modello delle minacce](THREAT_MODEL.it.md) prima di fidarti di Blurry. In breve, **non**
112
+ nasconde corpi, vestiti, tatuaggi, voci, luoghi, riflessi né l'impronta del sensore della
113
+ fotocamera; non può coprire un volto che il rilevatore non trova; non cancella l'originale, che può
114
+ essere sincronizzato anche su iCloud o Google Foto.
115
+
116
+ **Il rilevatore può mancare dei volti**, soprattutto di profilo, al buio, molto piccoli o girati di
117
+ lato. Guarda sempre il risultato prima di condividerlo. I file con rilevamenti incerti sono elencati
118
+ sotto `flags` nel resoconto `--json`.
119
+
120
+ ## Disinstallare
121
+
122
+ **Mac:** trascina Blurry da Applicazioni al Cestino. Blurry non tiene dati: le sole preferenze
123
+ (sensibilità, copertura, margine e il segno della guida già vista) stanno in
124
+ `~/Library/Preferences/com.chronocol.blurry.plist`, che puoi buttare.
125
+
126
+ **Con Python:** `pipx uninstall blurry-opsec`.
127
+
128
+ ## Segnalare un problema
129
+
130
+ Qualcosa non funziona, o un volto non viene coperto? Apri una
131
+ [issue](https://github.com/Chrono-Web/BLURRY/issues/new): descrivi che cosa hai fatto e che cosa
132
+ è successo, **senza allegare foto o video di persone reali**. Le vulnerabilità di sicurezza invece
133
+ non vanno nelle issue pubbliche: segui [SECURITY.md](SECURITY.md).
134
+
135
+ ## Dal terminale
136
+
137
+ ```bash
138
+ blurry foto.jpg
139
+ ```
140
+
141
+ scrive `foto.blurry.jpg` accanto all'originale.
142
+
143
+ ```bash
144
+ blurry IMG_0001.HEIC clip.mov -o ~/Desktop/puliti
145
+ ```
146
+
147
+ scrive `IMG_0001.blurry.jpg` e `clip.blurry.mp4` in `~/Desktop/puliti`.
148
+
149
+ ```
150
+ blurry INPUT... [-o CARTELLA] [--level base|medium|high] [--mode solid|pixel]
151
+ [--padding 0.25] [--keep-audio] [--no-faces] [--watermark TESTO]
152
+ [--strict] [--json] [--debug]
153
+ ```
154
+
155
+ | Opzione | Significato | Default |
156
+ |---|---|---|
157
+ | `-o CARTELLA` | Dove scrivere i file | accanto a ogni originale |
158
+ | `--level` | Sensibilità: `base` (solo volti evidenti e frontali), `medium`, `high` (anche volti piccoli o in parte nascosti) | `high` |
159
+ | `--mode` | Rettangolo nero `solid` o pixelazione `pixel` | `solid` |
160
+ | `--padding` | Margine attorno a ogni volto, in frazione del lato lungo, per ogni lato | `0.25` |
161
+ | `--keep-audio` | Tiene la traccia audio (ricodificata in AAC) | audio tolto |
162
+ | `--no-faces` | Toglie solo i metadati, non copre niente | |
163
+ | `--watermark TESTO` | Aggiunge una filigrana di testo | spenta |
164
+ | `--strict` | Se un file non ha volti, non scrive niente ed esce con codice 2 | |
165
+ | `--json` | Stampa su stdout un resoconto JSON per ogni file | |
166
+ | `--debug` | Messaggi di debug su stderr | spento |
167
+
168
+ **File accettati.** Foto: JPEG, PNG, WebP (statico), HEIC/HEIF. Video: MP4, MOV, M4V, MKV, WebM,
169
+ AVI. GIF e immagini animate si rifiutano. Le foto escono in JPEG (il PNG resta PNG); i video in
170
+ MP4 (H.264).
171
+
172
+ **Codici di uscita.** `0` tutto bene · `1` un errore · `2` nessun volto con `--strict`.
173
+
174
+ L'avanzamento va su stderr come righe `__PROGRESS__ {json}`, per script e integrazioni.
175
+
176
+ ## Verificare quello che scarichi
177
+
178
+ Ogni release su GitHub ha un file `SHA256SUMS`, un SBOM CycloneDX e un'attestazione GitHub di
179
+ provenienza per ogni file, che dimostra che è stato costruito dal workflow di rilascio di questa
180
+ repository.
181
+
182
+ - macOS / Linux, nella cartella dei file scaricati:
183
+
184
+ ```bash
185
+ shasum -a 256 -c SHA256SUMS
186
+ ```
187
+
188
+ - Windows (confronta il risultato con la riga in `SHA256SUMS`):
189
+
190
+ ```
191
+ CertUtil -hashfile <file> SHA256
192
+ ```
193
+
194
+ - Provenienza, con la [GitHub CLI](https://cli.github.com/):
195
+
196
+ ```bash
197
+ gh attestation verify <file> --repo Chrono-Web/BLURRY
198
+ ```
199
+
200
+ Il pacchetto su PyPI si pubblica dallo stesso workflow con Trusted Publishing (senza token), e PyPI
201
+ ne mostra la provenienza nella pagina del progetto.
202
+
203
+ ## Limiti noti
204
+
205
+ - Volti di profilo, al buio, molto piccoli o girati di lato possono sfuggire (vedi sopra).
206
+ - I video HDR del telefono (HEVC a 10 bit) escono in H.264 SDR a 8 bit: i colori possono sembrare
207
+ più spenti.
208
+ - Su macOS, elaborando un video compare un avviso innocuo `objc ... implemented in both`, perché
209
+ OpenCV e PyAV portano ciascuno la propria copia di FFmpeg.
210
+
211
+ ## Licenza
212
+
213
+ Blurry ha licenza MIT. Il pacchetto su PyPI contiene solo il codice di Blurry, il modello YuNet
214
+ (MIT) e il font Geist (OFL). L'app per Mac (`Blurry.dmg`) contiene anche FFmpeg con **x264 e x265,
215
+ che sono GPL-2.0-or-later**, e il bootloader di PyInstaller (GPL-2.0 con un'eccezione per i
216
+ programmi che avvia): in [THIRD_PARTY_LICENSES.md](THIRD_PARTY_LICENSES.md) trovi tutte le
217
+ licenze e i sorgenti esatti.