Daemon
The daemon is a long-lived background process that owns durable runtime behavior. The desktop app manages it automatically — start and stop happen with the app lifecycle.
What the Daemon Owns
| Component | Description |
|---|---|
| Background work | Detached commands and subagents, started from conversations, inspected later |
| Scheduled tasks | Recurring or one-time automations with cron or natural-language schedules |
| Wakeups | Conversation callbacks triggered by completed background work and automations |
| Follow-up queue | Tell-me-later wakeups that resume a specific conversation |
Lifecycle
The desktop app starts a backend child process after the first window has a chance to paint. That backend child owns the daemon runtime in-process and sends SIGTERM-equivalent shutdown through the daemon lifecycle when the app quits. The daemon still communicates over a local Unix socket for daemon-client APIs inside the backend boundary.
Desktop app/menu shell ←──→ Backend child process
│
└── Daemon runtime
│
├── Runtime DB (SQLite)
├── Automation store
├── Run logs
If the backend child crashes or is killed, the desktop app marks the local runtime unavailable and can restart it automatically through the local host controller.
Durable Agent Runs
Subagents and scheduled agent tasks run through the daemon's internal background agent runner. The daemon still spawns a child
process for isolation, logs, cancellation, and replay, but that child imports the same server-side agent session stack used by
live conversations instead of shelling out to the pi or pa CLI binaries.
Daemon State API
| Endpoint | Method | What it returns |
|---|---|---|
/api/daemon |
GET | Current daemon runtime status and uptime |
State response
{
"running": true,
"pid": 82341,
"uptimeMs": 2845000
}
State Storage
The daemon stores its state in <state-root>/daemon/ by default. If NEON_PILOT_DAEMON_NAMESPACE is
set, daemon runtime files live in <state-root>/daemon-<namespace>/; the namespace is sanitized for path
safety. Dev/test desktop processes use stable dev or test namespaces unless one is explicitly provided,
so scheduled automations persist across local restarts. If you need an isolated dev/test daemon, set
NEON_PILOT_DAEMON_NAMESPACE or NEON_PILOT_DAEMON_SOCKET_PATH; with an explicit socket path, daemon
runtime files live beside that socket and the namespace is ignored.
| Path | Content |
|---|---|
runtime.db |
SQLite database for durable runs, scheduled tasks, reminders |
socket |
Local Unix socket for desktop app communication |
logs/ |
Background work output logs |
On startup, the runtime DB is integrity-checked before schema setup. If SQLite reports corruption, the app tries to recover it
with sqlite3 .recover, quarantines the original files under .corrupt/, and recreates a healthy DB if
recovery is unavailable.
Configuration
Daemon settings are part of the main config.json:
{
"daemon": {}
}
Most daemon settings are managed through the desktop Settings UI and do not require manual config file edits.