# What changed in watchdog

> 51 changes in watchdog 6 to 7 from its official release notes, upgrade guides and advisories: 19 breaking, 3 deprecations, 11 new APIs and options. Each one cited. Sources checked 2026-11-05. HTML: https://unstale.sh/pypi/watchdog/

To see which of these apply to a repository, run `npx @unstale/cli init` in it.

## watchdog 7

### Breaking changes

- Replaces the deprecated DelayedQueue.delay_sec attribute. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Adds an event for directory metadata modifications, separate from content modifications; these events no longer trigger on_modified(). (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- EventDispatcher rejects bool values for timeout instead of treating True as one second. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- EventEmitter rejects bool values for timeout instead of treating True as one second. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Adds an event for file metadata modifications, separate from content modifications; these events no longer trigger on_modified(). (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Registration errors for a requested root path are no longer suppressed; a missing root raises FileNotFoundError. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Implement on_attrib() to handle file and directory metadata modification events. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Pattern matching now uses full-match semantics; users must update patterns to glob-like syntax, such as changing *.py to **/*.py. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Adds ignore_policy to configure multi-path event filtering for moves and renames; matching is now strict by default. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- The default changes from "*" to "**" to match absolute paths at any depth under full_match() semantics. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Support for Python 3.9 and 3.10 is dropped. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)

### Deprecations

- Replaces the deprecated debounce_interval_seconds argument and attribute of EventDebouncer and AutoRestartTrick. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- The EventDebouncer and AutoRestartTrick argument and attribute are deprecated in favor of debounce_interval; the old names still work with a DeprecationWarning. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- The attribute is deprecated in favor of delay; the old name still works with a DeprecationWarning. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)

### New APIs and options

- The inotify and fsevents backends support the follow_symlink keyword argument. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- FSEventsEmitter and FSEventsObserver accept a latency keyword argument; raising it coalesces duplicate events. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Returns the total number of changes in a DirectorySnapshotDiff. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- ObservedWatch supports the follow_symlink keyword argument. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Observer supports use as a context manager for automatic start and stop management. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- watchmedo can now be run with python -m watchdog. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Adds ignore_policy to configure multi-path event filtering for moves and renames. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- ShellCommandTrick and watchmedo shell-command allow configuring shell_executable and cwd. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Adds a time-duration type alias; duration parameters previously hinted as int now accept float. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)

### Behavior and default changes

- With ignore_device=True, moved files and directories are detected when the device ID changes between snapshots. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Supports inotify on FreeBSD 15 and newer. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- The path annotation reflects pathlib.Path support, and watches can now be scheduled on individual files. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- File system events are now shown by default. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)

### Fixes and other changes

- Watches directories moved in from outside a recursively watched directory so changes inside them are reported. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- Creates the inotify instance lazily, allowing observer and polling imports to succeed when the instance limit is reached. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- Reconciles recursive watches after a queue overflow so subsequent filesystem changes are observed. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- Prevents a KeyError from killing the inotify thread when a directory tree is copied or extracted into a recursively watched directory. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- BaseObserver now uses on_thread_start() instead of overriding start(), aligning it with BaseThread. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- Fixes building the fsevents extension on PyPy by updating the bundled compatibility header. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- Reconciles recursively watched directories renamed before their source watch was registered and reports initial changes in existing descendants. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- Generates YAML that watchmedo tricks can load, with trick options nested under the trick name rather than unsupported args/kwargs keys. (7.1.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.1.0)
- case_sensitive=False matching now ignores case on Python versions below 3.13. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Transient polling OSErrors are logged and retried instead of emitting a directory deletion event and stopping the emitter. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)
- Adds support for Python 3.15. (7.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v7.0.0)

## watchdog 6

### Breaking changes

- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the unused function from the echo module. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Removed the --trace CLI argument because events are logged by default at the LoggerTrick class level. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)

### New APIs and options

- Added the __repr__() method to the HelpFormatter class. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
- Added the __repr__() method to the Trick class. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)

### Performance

- Uses select.poll() instead of deprecated select.select(), if available. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)

### Behavior and default changes

- The stop_signal keyword argument can now be either a signal.Signals or an int. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)

### Fixes and other changes

- Fixed reading the inotify file descriptor after closing it. (6.0.0) — [release notes](https://github.com/gorakhargosh/watchdog/releases/tag/v6.0.0)
