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.
- blurry_opsec-0.1.0/.gitignore +18 -0
- blurry_opsec-0.1.0/CHANGELOG.md +23 -0
- blurry_opsec-0.1.0/LICENSE +21 -0
- blurry_opsec-0.1.0/PKG-INFO +239 -0
- blurry_opsec-0.1.0/README.it.md +217 -0
- blurry_opsec-0.1.0/README.md +214 -0
- blurry_opsec-0.1.0/THIRD_PARTY_LICENSES.md +50 -0
- blurry_opsec-0.1.0/THREAT_MODEL.it.md +61 -0
- blurry_opsec-0.1.0/THREAT_MODEL.md +59 -0
- blurry_opsec-0.1.0/licenses/GPL-2.0.txt +338 -0
- blurry_opsec-0.1.0/licenses/GPL-3.0.txt +674 -0
- blurry_opsec-0.1.0/licenses/Geist-OFL-1.1.txt +93 -0
- blurry_opsec-0.1.0/licenses/LGPL-3.0.txt +165 -0
- blurry_opsec-0.1.0/licenses/NumPy-BSD-3-Clause.txt +935 -0
- blurry_opsec-0.1.0/licenses/OpenCV-Apache-2.0.txt +202 -0
- blurry_opsec-0.1.0/licenses/OpenCV-third-party.txt +3603 -0
- blurry_opsec-0.1.0/licenses/Pillow-MIT-CMU.txt +1574 -0
- blurry_opsec-0.1.0/licenses/PyAV-BSD-3-Clause.txt +23 -0
- blurry_opsec-0.1.0/licenses/YuNet-MIT.txt +21 -0
- blurry_opsec-0.1.0/licenses/opencv-python-MIT.txt +21 -0
- blurry_opsec-0.1.0/licenses/pi-heif-BSD-3-Clause.txt +30 -0
- blurry_opsec-0.1.0/pyproject.toml +72 -0
- blurry_opsec-0.1.0/src/blurry_opsec/__init__.py +3 -0
- blurry_opsec-0.1.0/src/blurry_opsec/__main__.py +53 -0
- blurry_opsec-0.1.0/src/blurry_opsec/cli.py +202 -0
- blurry_opsec-0.1.0/src/blurry_opsec/detect.py +48 -0
- blurry_opsec-0.1.0/src/blurry_opsec/engine.py +217 -0
- blurry_opsec-0.1.0/src/blurry_opsec/files.py +96 -0
- blurry_opsec-0.1.0/src/blurry_opsec/fonts/Geist-SemiBold.otf +0 -0
- blurry_opsec-0.1.0/src/blurry_opsec/fonts/GeistMono-Medium.otf +0 -0
- blurry_opsec-0.1.0/src/blurry_opsec/fonts/OFL.txt +93 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/__init__.py +1 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/app.py +41 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/canvas.py +257 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/main_window.py +643 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/model.py +110 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/native.py +96 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/picker.py +162 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/prefs.py +82 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/review.py +556 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/style.py +119 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/widgets.py +181 -0
- blurry_opsec-0.1.0/src/blurry_opsec/gui/worker_client.py +129 -0
- blurry_opsec-0.1.0/src/blurry_opsec/i18n/__init__.py +170 -0
- blurry_opsec-0.1.0/src/blurry_opsec/image_io.py +159 -0
- blurry_opsec-0.1.0/src/blurry_opsec/levels.py +77 -0
- blurry_opsec-0.1.0/src/blurry_opsec/model/LICENSE +21 -0
- blurry_opsec-0.1.0/src/blurry_opsec/model/__init__.py +37 -0
- blurry_opsec-0.1.0/src/blurry_opsec/model/face_detection_yunet_2023mar.onnx +0 -0
- blurry_opsec-0.1.0/src/blurry_opsec/netguard.py +61 -0
- blurry_opsec-0.1.0/src/blurry_opsec/plan.py +259 -0
- blurry_opsec-0.1.0/src/blurry_opsec/redact.py +59 -0
- blurry_opsec-0.1.0/src/blurry_opsec/tempfiles.py +72 -0
- blurry_opsec-0.1.0/src/blurry_opsec/tracking.py +87 -0
- blurry_opsec-0.1.0/src/blurry_opsec/video_io.py +345 -0
- blurry_opsec-0.1.0/src/blurry_opsec/watermark.py +52 -0
- 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
|
+
·
|
|
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
|
+
·
|
|
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.
|