Neon Pilot Download

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 spawns the daemon as a child process on launch and sends SIGTERM on quit. The daemon communicates over a local Unix socket.

Desktop app ←──→ Daemon (child process)
                    │
                    ├── Runtime DB (SQLite)
                    ├── Automation store
                    ├── Run logs

If the daemon crashes or is killed, the desktop app restarts it automatically.

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 set a unique namespace per invocation unless one is explicitly provided, so multiple dev/test apps can run without sharing sockets, pid locks, runtime DBs, or logs. If NEON_PILOT_DAEMON_SOCKET_PATH is set, daemon runtime files live beside that explicit socket path instead and the namespace is ignored; this lets dev hosts pin a specific isolated runtime DB.

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.