Skip to content

Troubleshooting: Daemon ​

Daemon Will Not Start ​

"Triggerfish is already running" ​

This message appears when the log file is locked by another process. On Windows, this is detected via an EBUSY / "os error 32" when the file writer tries to open the log file.

Fix:

bash
triggerfish status    # Check if there is actually a running instance
triggerfish stop      # Stop the existing instance
triggerfish start     # Start fresh

If triggerfish status reports the daemon is not running but you still get this error, another process is holding the log file open. Check for zombie processes:

bash
# Linux
ps aux | grep triggerfish

# macOS
ps aux | grep triggerfish

# Windows
tasklist | findstr triggerfish

Kill any stale processes, then try again.

Port 18789 or 18790 already in use ​

The gateway listens on port 18789 (WebSocket) and Tidepool on 18790 (A2UI). If another application occupies these ports, the daemon will fail to start.

Find what is using the port:

bash
# Linux
ss -tlnp | grep 18789

# macOS
lsof -i :18789

# Windows
netstat -ano | findstr 18789

No LLM provider configured ​

If triggerfish.yaml is missing the models section or the primary provider has no API key, the gateway logs:

No LLM provider configured. Check triggerfish.yaml.

Fix: Run the setup wizard or configure manually:

bash
triggerfish dive                    # Interactive setup
# or
triggerfish config set models.primary.provider anthropic
triggerfish config set models.primary.model claude-sonnet-4-20250514
triggerfish config set-secret provider:anthropic:apiKey sk-ant-...

Config file not found ​

The daemon exits if triggerfish.yaml does not exist at the expected path. The error message differs by environment:

  • Native install: Suggests running triggerfish dive
  • Docker: Suggests mounting the config file with -v ./triggerfish.yaml:/data/triggerfish.yaml

Check the path:

bash
ls ~/.triggerfish/triggerfish.yaml      # Native
docker exec triggerfish ls /data/       # Docker

Secret resolution failed ​

If your config references a secret (secret:provider:anthropic:apiKey) that does not exist in the keychain, the daemon exits with an error naming the missing secret.

Fix:

bash
triggerfish config set-secret provider:anthropic:apiKey <your-key>

Service Management ​

systemd: daemon stops after logout ​

By default, systemd user services stop when the user logs out. Triggerfish enables loginctl enable-linger during installation to prevent this. If linger failed to enable:

bash
# Check linger status
loginctl show-user $USER | grep Linger

# Enable it (may require sudo)
sudo loginctl enable-linger $USER

Without linger, the daemon only runs while you are logged in.

systemd: service fails to start ​

Check the service status and journal:

bash
systemctl --user status triggerfish.service
journalctl --user -u triggerfish.service --no-pager -n 50

Common causes:

  • Binary moved or deleted. The unit file has a hardcoded path to the binary. Re-install the daemon: triggerfish dive --install-daemon
  • PATH issues. The systemd unit captures your PATH at install time. If you installed new tools (like MCP servers) after daemon installation, re-install the daemon to update the PATH.
  • DENO_DIR not set. The systemd unit sets DENO_DIR=~/.cache/deno. If this directory is not writable, SQLite FFI plugins will fail to load.

launchd: daemon not starting on login ​

Check the plist status:

bash
launchctl list | grep triggerfish
launchctl print gui/$(id -u)/dev.triggerfish.agent

If the plist is not loaded:

bash
launchctl load ~/Library/LaunchAgents/dev.triggerfish.agent.plist

Common causes:

  • Plist removed or corrupted. Re-install: triggerfish dive --install-daemon
  • Binary moved. The plist has a hardcoded path. Re-install after moving the binary.
  • PATH at install time. Like systemd, launchd captures PATH when the plist is created. Re-install if you added new tools to PATH.

Windows: service does not start ​

Check service status:

powershell
sc query Triggerfish
Get-Service Triggerfish

Common causes:

  • Service not installed. Re-install: run the installer as Administrator.
  • Binary path changed. The service wrapper has a hardcoded path. Re-install.
  • .NET compilation failed during install. The C# service wrapper requires .NET Framework 4.x csc.exe.

Upgrading breaks the daemon ​

After running triggerfish update, the daemon restarts automatically. If it does not:

  1. The old binary may still be running. Stop it manually: triggerfish stop
  2. On Windows, the old binary gets renamed to .old. If the rename fails, the update will error. Stop the service first, then update.

Log File Issues ​

Log file is empty ​

The daemon writes to ~/.triggerfish/logs/triggerfish.log. If the file exists but is empty:

  • The daemon may have just started. Wait a moment.
  • The log level is set to quiet, which only logs ERROR-level messages. Set it to normal or verbose:
bash
triggerfish config set logging.level normal

Logs are too noisy ​

Set the log level to quiet to see only errors:

bash
triggerfish config set logging.level quiet

Level mapping:

Config valueMinimum level logged
quietERROR only
normalINFO and above
verboseDEBUG and above
debugTRACE and above (everything)

Log rotation ​

Logs rotate automatically when the current file exceeds 1 MB. Up to 10 rotated files are kept:

triggerfish.log        # Current
triggerfish.1.log      # Most recent backup
triggerfish.2.log      # Second most recent
...
triggerfish.10.log     # Oldest (deleted when a new rotation happens)

There is no time-based rotation, only size-based.