
This handles the background daemon that keeps your code index fresh as you work. You run `grepai watch` once and it scans your entire codebase, chunks it into ~512 token segments, generates embeddings, then monitors for file changes in real time. The setup is straightforward with `--background` for daemon mode and `--status` to check on it. What I appreciate here is the OS-native file watching (FSEvents on macOS, inotify on Linux) and the debounce configuration that prevents your editor's multiple rapid writes from triggering constant reindexing. If you're using GrepAI for semantic code search, you'll want this running so your index doesn't go stale every time you save a file.
$ npx -y skills add yoanbernabeu/grepai-skills --skill grepai-watch-daemon --agent claude-codeInstalls into .claude/skills of the current project.
This skill covers the grepai watch command and daemon management for real-time code indexing.
The watch daemon:
cd /your/project
grepai watch
Output:
🔍 GrepAI Watch
Scanning files...
Found 245 files
Processing chunks...
████████████████████████████████ 100%
Indexed 1,234 chunks
Watching for changes...
Press Ctrl+C to stop.
grepai watch --background
Output:
🔍 GrepAI Watch (background)
Daemon started with PID 12345
Log file: ~/.grepai/daemon.log
grepai watch --status
Output:
✅ GrepAI Daemon Running
PID: 12345
Started: 2025-01-28 10:30:00
Project: /path/to/project
Statistics:
- Files indexed: 245
- Chunks: 1,234
- Last update: 2 minutes ago
grepai watch --stop
Output:
✅ Daemon stopped (PID 12345)
| Command | Description |
|---|---|
grepai watch | Start daemon in foreground |
grepai watch --background | Start daemon in background |
grepai watch --status | Check daemon status |
grepai watch --stop | Stop running daemon |
# .grepai/config.yaml
watch:
# Debounce delay in milliseconds
# Groups rapid file changes together
debounce_ms: 500
When you save a file, editors often write multiple times quickly. Debouncing waits for changes to settle:
| Value | Behavior |
|---|---|
100 | More responsive, more reindexing |
500 | Balanced (default) |
1000 | Less responsive, fewer reindexing |
The daemon indexes files:
.gitignoreLarge codebases show progress:
Scanning files...
Found 10,245 files
Processing chunks...
████████████████░░░░░░░░░░░░░░░░ 50% (5,122/10,245)
| Codebase | Files | Time (Ollama) | Time (OpenAI) |
|---|---|---|---|
| Small | 100 | ~30s | ~10s |
| Medium | 1,000 | ~5min | ~1min |
| Large | 10,000 | ~30min | ~5min |
After initial indexing, the daemon watches for:
Uses OS-native file watching:
| Action | Result |
|---|---|
| Save existing file | Re-embed file chunks |
| Create new file | Index new chunks |
| Delete file | Remove from index |
| Rename file | Update path, keep vectors |
Create ~/Library/LaunchAgents/com.grepai.watch.plist:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.grepai.watch</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/grepai</string>
<string>watch</string>
</array>
<key>WorkingDirectory</key>
<string>/path/to/your/project</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
</dict>
</plist>
Load:
launchctl load ~/Library/LaunchAgents/com.grepai.watch.plist
Create ~/.config/systemd/user/grepai-watch.service:
[Unit]
Description=GrepAI Watch Daemon
After=network.target
[Service]
Type=simple
WorkingDirectory=/path/to/your/project
ExecStart=/usr/local/bin/grepai watch
Restart=always
[Install]
WantedBy=default.target
Enable:
systemctl --user enable grepai-watch
systemctl --user start grepai-watch
Background daemons write their logs, PID files and PID locks to the log directory:
| OS | Log directory |
|---|---|
| macOS | ~/Library/Logs/grepai/ |
| Linux | $XDG_STATE_HOME/grepai/logs/ (default ~/.local/state/grepai/logs/) |
| Windows | %LOCALAPPDATA%\grepai\logs\ |
# Background daemon logs (macOS)
tail -f ~/Library/Logs/grepai/*.log
# Or with systemd
journalctl --user -u grepai-watch -f
Only one watch daemon can run per project or git worktree: the daemon holds its PID lock for its whole lifetime, so a second grepai watch on the same project fails with watcher is already running (PID ...) (or another grepai watch process is starting (lock held) when two starts race). Search, trace and MCP processes are not affected and can run alongside the daemon.
After grepai watch --stop, an empty *.pid.lock file stays in the log directory. This is expected; it is reused by the next daemon.
Run separate daemons for each project:
# Terminal 1: Project A
cd /path/to/project-a
grepai watch --background
# Terminal 2: Project B
cd /path/to/project-b
grepai watch --background
For multi-project setups:
grepai workspace create my-workspace
grepai workspace add my-workspace /path/to/project-a
grepai workspace add my-workspace /path/to/project-b
grepai watch --workspace my-workspace
❌ Problem: "Another daemon is already running" ✅ Solution:
grepai watch --stop
grepai watch --background
❌ Problem: "Config not found" ✅ Solution: Initialize first:
grepai init
grepai watch
❌ Problem: "Embedder connection failed" ✅ Solution: Start your embedding provider:
ollama serve # For Ollama
❌ Problem: Files not being indexed ✅ Solution: Check ignore patterns in config, ensure file extension is supported
❌ Problem: Indexing very slow ✅ Solutions:
❌ Problem: Index seems outdated ✅ Solution: Clear and reindex:
rm .grepai/index.gob
grepai watch
❌ Problem: Changes not detected ✅ Solutions:
echo 65536 | sudo tee /proc/sys/fs/inotify/max_user_watches
Regular health check:
grepai status
Output:
✅ GrepAI Status
Project: /path/to/project
Config: .grepai/config.yaml
Embedder: Ollama (nomic-embed-text)
Storage: GOB (.grepai/index.gob)
Index:
- Files: 245
- Chunks: 1,234
- Size: 12.5 MB
- Last updated: 2025-01-28 10:30:00
Daemon: Running (PID 12345)
Watch daemon status:
✅ Watch Daemon Active
Mode: Background
PID: 12345
Project: /path/to/project
Initial Index:
- Files scanned: 245
- Chunks created: 1,234
- Duration: 45s
Real-time Monitor:
- Debounce: 500ms
- Events processed: 23
- Last event: 5 minutes ago
Next steps:
- Run 'grepai search "query"' to search
- Run 'grepai watch --status' to check status
- Run 'grepai watch --stop' to stop daemon
Sponsors