Skip to content

Repository files navigation

Waaatcher

A Swift package for watching file system events on macOS using FSEvents.

Swift 5.9+macOS 12+License: MIT

Features

  • Modern Swift - Swift 5.9+ with Sendable conformance
  • Async/Await - Native AsyncSequence support
  • Combine - Publisher for reactive programming
  • Callback - Traditional callback-based API
  • File-level events - Granular notifications for file changes
  • Configurable - Latency, flags, and event filtering

Installation

Swift Package Manager

Add to your Package.swift:

dependencies:[.package(url:"https://github.com/hechen/Waaatcher.git", from:"2.0.0")]

Or in Xcode: File → Add Package Dependencies → Enter the repository URL.

Usage

Async/Await (Recommended)

import Waaatcher
letwatcher=Waaatcher(paths:["/path/to/watch"])
// Events are delivered as an AsyncSequence
forawaiteventin watcher.events {print("Event: \(event.path)")print("Flags: \(event.flags)")if event.flags.contains(.itemCreated){print("File created!")}if event.flags.contains(.itemModified){print("File modified!")}}

Combine

import Waaatcher
import Combine
letwatcher=Waaatcher(paths:["/path/to/watch"])varcancellables=Set<AnyCancellable>()
watcher.eventPublisher
.filter{ $0.flags.contains(.itemModified)}.sink{ event inprint("Modified: \(event.path)")}.store(in:&cancellables)

Callback

import Waaatcher
letwatcher=Waaatcher(paths:["/path/to/watch"]){ events inforeventin events {print("Event: \(event)")}}try watcher.start()
// Later...
watcher.stop()

Configuration

letwatcher=Waaatcher(
paths:["/path/to/watch","/another/path"],
latency:0.3, // Seconds before events are delivered
flags:[.useCFTypes,.fileEvents,.ignoreSelf])

Event Types

FSEvent

publicstructFSEvent{letpath:String // Path where event occurred
letflags:FSEventFlags // Event type flags
letid:FSEventStreamEventId // Unique event ID
}

FSEventFlags

Common flags you'll encounter:

FlagDescription
.itemCreatedFile or directory was created
.itemRemovedFile or directory was deleted
.itemRenamedFile or directory was renamed
.itemModifiedFile contents were modified
.itemIsFileEvent target is a file
.itemIsDirEvent target is a directory
.itemIsSymlinkEvent target is a symbolic link

StreamCreateFlags

FlagDescription
.fileEventsReceive file-level events (recommended)
.ignoreSelfIgnore events from current process
.watchRootWatch for path changes
.noDeferDeliver events immediately

Requirements

  • macOS 12.0+
  • Swift 5.9+
  • Xcode 15+

License

MIT License - see LICENSE for details.

Credits

Originally created by Chen He in 2019. Updated in 2026 with modern Swift concurrency support.

About

File Watcher Wrapper for macOS

Topics

Resources

Stars

2 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages