docs: remove TrueNAS references, make volume paths platform agnostic

- compose.yml: generic /path/to/winnow/... placeholder paths
- docs/setup.md: replace TrueNAS section with generic GPU passthrough guide
- docs/faq.md: remove platform-specific path example
- README.md: soften crop quality disclaimer, remove TrueNAS compose note
- CHANGELOG.md: scrub TrueNAS mentions from release notes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-12 02:13:29 +00:00
co-authored by Claude Sonnet 4.6
parent 0a67699db4
commit e4d5f603d8
5 changed files with 28 additions and 21 deletions
+3 -3
View File
@@ -29,14 +29,14 @@ First release of winnow. Forked from [if-curator](https://github.com/ds-sebastia
**Docker and scheduling**
- `Dockerfile` — multi-stage build (CUDA 12.9 on amd64, plain Ubuntu on arm64); runtime stage excludes build tools (g++, python3.12-dev, curl, gnupg)
- `compose.yml` — fully annotated with inline comments grouped by concern; TrueNAS volume paths in the example
- `compose.yml` — fully annotated with inline comments grouped by concern
- `entrypoint.sh` — runs the tool once on startup, then hands off to the scheduler if `CRON_SCHEDULE` is set
- `scheduler.py` — in-process cron scheduler that keeps the container (and loaded models) alive between runs
- `CRON_SCHEDULE` env var — standard cron expression for recurring runs; unset exits after first run
- `.dockerignore` — keeps `.venv`, `__pycache__`, test files, and logs out of the image context
- Multi-arch image: `linux/amd64` and `linux/arm64` built and merged into a single manifest on GHCR
- `tini` as PID 1 init process for correct signal handling
- Non-root container user (`appuser`, uid 568) matching TrueNAS default app UID
- Non-root container user (`appuser`, uid 568)
- `HEALTHCHECK` in Dockerfile
**Object mode**
@@ -81,7 +81,7 @@ First release of winnow. Forked from [if-curator](https://github.com/ds-sebastia
- 24 unit tests across four modules: `test_config`, `test_immich_api`, `test_jobs`, `test_upload_tracker`
**Documentation**
- `docs/setup.md` — step-by-step install guide with TrueNAS and bare-Docker sections
- `docs/setup.md` — step-by-step install and GPU passthrough guide
- `docs/troubleshooting.md` — common failure modes with fixes
- `docs/faq.md` — answers to questions new users will ask
- `.env.example` — copy-paste starting point with every env var and inline comments
+4 -4
View File
@@ -69,11 +69,11 @@ Uploaded asset IDs are recorded so the same image is never uploaded twice, even
---
## Early Stage Software
## Note on Crop Quality
winnow is functional but early. The quality filtering catches most bad crops, but some will slip through — blurry frames, partial faces, someone walking through the background. After a run you should review what was uploaded in Frigate's face management UI and manually delete anything that doesn't belong. A few bad training images won't break recognition, but a lot of them will hurt it.
winnow works well, but no automated pipeline is perfect. Occasionally a bad crop will slip through quality filtering — a partial face, someone in the background, a blurry frame. After a run it's worth a quick review in Frigate's face management UI to remove anything that doesn't belong.
Bug reports and feedback are welcome via [GitHub Issues](https://github.com/sudolulo/winnow/issues).
Issues and feedback welcome via [GitHub Issues](https://github.com/sudolulo/winnow/issues).
---
@@ -135,7 +135,7 @@ services:
capabilities: [gpu]
```
See [compose.yml](compose.yml) for the full annotated example including TrueNAS volume paths.
See [compose.yml](compose.yml) for the full annotated example.
### Scheduling Behaviour
+4 -4
View File
@@ -52,10 +52,10 @@ services:
# - CRON_SCHEDULE=0 3 1 * *
# - CRON_SCHEDULE=*/30 * * * *
volumes:
# Replace <pool> with your TrueNAS pool name, e.g. /mnt/tank/winnow/...
- /mnt/<pool>/winnow/models:/models
- /mnt/<pool>/winnow/embeddings:/app/.if_cache
- /mnt/<pool>/winnow/output:/app/frigate_train
# Replace with absolute paths on your host, e.g. /opt/winnow/models
- /path/to/winnow/models:/models
- /path/to/winnow/cache:/app/.if_cache
- /path/to/winnow/output:/app/frigate_train
stdin_open: true
tty: true
restart: unless-stopped
+1 -1
View File
@@ -49,7 +49,7 @@ ARM builds (linux/arm64) use CPU-only — CUDA is not available on ARM.
## Does it work on Unraid / Proxmox / bare Docker?
Yes — the `compose.yml` uses standard Docker volume mounts. The TrueNAS paths in the example (`/mnt/<pool>/...`) are just an example; replace them with whatever paths suit your setup.
Yes — the `compose.yml` uses standard Docker volume mounts. Replace the example paths with whatever absolute paths suit your setup.
---
+16 -9
View File
@@ -40,7 +40,16 @@ API_KEY=your-immich-api-key
FRIGATE_URL=http://192.168.1.10:5000
```
Edit the volume paths in `compose.yml` to match your storage layout (replace `/mnt/<pool>` with your actual path).
Edit the volume paths in `compose.yml` to point to directories on your host where models, cache, and output crops should be stored:
```yaml
volumes:
- /your/path/to/models:/models
- /your/path/to/cache:/app/.if_cache
- /your/path/to/output:/app/frigate_train
```
These directories will be created automatically by Docker if they don't exist.
Start it:
@@ -74,15 +83,13 @@ Without `CRON_SCHEDULE`, the container runs once and exits.
---
## TrueNAS Scale
## GPU passthrough
The included `compose.yml` uses TrueNAS-style volume paths. Replace `<pool>` with your pool name:
To enable GPU acceleration, include the `deploy` block in `compose.yml` (already present in the example) and ensure the NVIDIA container toolkit is installed on your host:
```yaml
volumes:
- /mnt/tank/winnow/models:/models
- /mnt/tank/winnow/embeddings:/app/.if_cache
- /mnt/tank/winnow/output:/app/frigate_train
```bash
# Verify GPU is accessible to Docker
docker run --rm --gpus all nvidia/cuda:12.9.2-base-ubuntu22.04 nvidia-smi
```
GPU passthrough on TrueNAS requires the NVIDIA app to be installed from the TrueNAS catalog and the `deploy.resources.reservations.devices` block in `compose.yml` (already included).
CPU mode works without any GPU setup — set `FORCE_CPU=true` to disable GPU explicitly.