Skip to content

Operations

Running the daemon

One long-lived process per machine, holding the connection pool, caches, write queue, and peer endpoint. It auto-starts on first use — these commands are for explicit control.

Terminal window
sigil daemon status
sigil daemon start [--foreground]
sigil daemon stop
sigil daemon restart
sigil daemon logs [--follow]
sigil daemon open # open the dashboard
sigil daemon url # print the URL with its auth token

A hook runs on every prompt you type. Cold-starting Node, connecting to Postgres, and loading an embedding client costs 200–400ms — noticeable on every interaction.

The daemon keeps that warm, so hooks and CLI calls are a Unix socket round trip against an already-connected process. It also gives you one writer (a serialized queue, which matters enormously for the embedded PGlite database), one shared embedding cache, and one stable peer identity for device pairing.

Path
~/.sigil/sockUnix socket — hooks, CLI, stdio MCP
~/.sigil/sigild.pidPID file
~/.sigil/sigild.logAppend-only log
~/.sigil/heartbeat.jsonLiveness
~/.sigil/.spawn.lockPrevents concurrent spawn races
~/.sigil/.daemon-breaker.jsonCircuit breaker state

All recreated on start. Safe to delete while stopped.

If the daemon fails to spawn repeatedly, a breaker trips and stops further attempts rather than retrying forever — which would turn a broken install into a fork bomb on every prompt.

When tripped, hooks fail silently and fast, your prompts still work, and sigil doctor tells you what happened.

Terminal window
sigil daemon logs # what actually failed
sigil daemon start # clears the breaker on success
SettingDefault
http.enabledtrue(restart required)
http.host127.0.0.1Loopback only (restart)
http.port7777(restart)

Serves the dashboard and the HTTP MCP transport, gated by a bearer token at ~/.sigil/gui.token.

The daemon auto-starts on demand, so a service definition is optional. It’s worth it on a server where agents run unattended and you want the daemon up before they are.

~/.config/systemd/user/sigil.service
[Unit]
Description=Sigil memory daemon
After=network.target
[Service]
Type=simple
ExecStart=%h/.sigil/bin/sigil daemon start --foreground
Restart=on-failure
RestartSec=5
[Install]
WantedBy=default.target
Terminal window
systemctl --user enable --now sigil
~/Library/LaunchAgents/dev.sigil.daemon.plist
<?xml version="1.0" encoding="UTF-8"?>
<plist version="1.0">
<dict>
<key>Label</key> <string>dev.sigil.daemon</string>
<key>ProgramArguments</key>
<array>
<string>/Users/you/.sigil/bin/sigil</string>
<string>daemon</string>
<string>start</string>
<string>--foreground</string>
</array>
<key>RunAtLoad</key> <true/>
<key>KeepAlive</key> <true/>
</dict>
</plist>
Terminal window
launchctl load ~/Library/LaunchAgents/dev.sigil.daemon.plist
Terminal window
sigil daemon logs --follow

The dashboard’s Activity screen is better for most debugging — it streams each hook fire, search, classification, and LLM call with model and latency, filterable by agent.

The Engine screen shows worker pool state, queue depth, and database connection detail. If ingest feels slow, that’s where the answer is.

Most configuration changes apply live — the in-memory config cache updates on every patch. Settings that need a restart are marked in Configuration and the dashboard restarts for you when you apply them.

Terminal window
sigil daemon restart

sigil update restarts it automatically after fast-forwarding.

If a daemon from an older version is still running after an update, Sigil detects the mismatch and restarts it — otherwise the stale process keeps serving and the update silently does nothing.

Terminal window
sigil daemon status # shows the running version
Terminal window
sigil daemon stop

Memory is not lost — it’s in your database. Hooks fail silently while it’s down, and it auto-starts again on the next CLI call or hook fire.