A remote watcher runs on your NAS and sends real-time file change notifications to Pellicle over your local network. This means new photos appear in your library instantly, without waiting for a periodic rescan.
The watcher uses a shared token to authenticate connections. Generate one by running this in Terminal:
ruby -rsecurerandom -e 'puts SecureRandom.hex(32)'
Copy the output — you'll use it in both the watcher config and in Pellicle's settings.
Create a file called config.yml on your NAS:
port: 7849
token: "paste-your-generated-token-here"
watch_roots:
- path: /data/Photography
name: Photography
mdns:
enabled: true
instance_name: "NAS Photography"
tls:
enabled: true
san:
- "192.168.1.100"
path is the path inside the container, and name is a human-readable label.All connections between Pellicle and the watcher are encrypted with TLS. This is enabled by default — no extra configuration is needed in most cases.
On first start, the watcher automatically generates a self-signed certificate and saves it to /etc/pellicle-watcher/tls/ inside the container. Mount this directory as a volume so the certificate persists across container restarts.
Pellicle uses Trust On First Use (TOFU) to verify the watcher's identity. The first time Pellicle connects, it accepts the certificate and saves its SHA-256 fingerprint. All subsequent connections must present the same certificate, protecting against man-in-the-middle attacks.
The tls section supports these options:
true). Should only be disabled for debugging./etc/pellicle-watcher/tls).Note: If you replace or regenerate the certificate (e.g. by deleting the TLS volume), Pellicle will reject the new certificate because the fingerprint has changed. Remove and re-add the watcher in Pellicle's settings to trust the new certificate.
Follow the guide for your NAS:
wss://192.168.1.100:7849) and the token you generated.Once connected, you'll see an antenna icon next to the folder in the sidebar. A green antenna means the connection is active. The icon pulses when file events are received.
mdns.enabled is true in config.yml.network_mode: host is set in docker-compose.yml. Without it, mDNS packets can't reach the local network.config.yml exactly.docker compose logs pellicle-watcher.If the watcher's certificate changes (e.g. the TLS volume was deleted, or the container was recreated without a persistent volume), Pellicle will reject the connection because the fingerprint no longer matches. To fix this:
For very large photo libraries, you may need to increase the inotify watch limit. If your NAS supports container sysctls, add this to docker-compose.yml:
sysctls:
- fs.inotify.max_user_watches=524288
Otherwise, set it on the host system:
echo 524288 | sudo tee /proc/sys/fs/inotify/max_user_watches