owlette docs
agent

configuration

The agent can be configured locally in the desktop app, remotely from the web dashboard, or by editing config.json directly. The local source file is C:\ProgramData\Owlette\config\config.json.

Desktop app and dashboard writes apply immediately; the agent picks up config changes on a polling listener with a 2-10 second interval.

When the desktop app is open, launch mode and schedule labels refresh from external dashboard or service changes. Text fields that are actively focused defer remote refresh until focus leaves.


the desktop app

The desktop app runs as a separate process from the service. Launch it from:

  • System tray -> Right-click -> open owlette
  • Start Menu -> Owlette
  • Directly: C:\ProgramData\Owlette\app\owlette-desktop.exe

the owlette desktop app — the process list on the left, the selected process's settings on the right

what the window shows

areacontents
Processes listEvery monitored process, in launch order, with a status dot from the service's live table. Drag a row to reorder; right-click one for restart, kill, duplicate, and delete. Add an entry with the + button in the list header, which writes a blank entry straight away, or drop an app, a script, a TouchDesigner project, or a Unity build folder anywhere in the window. A drop is never written straight through — owlette shows what it read the file as (name, executable, working directory) for review first, and the entry it adds has its launch mode off.
Process settingsThe name field shares a header row with the process's live status, a started … stamp while it is running, and restart and kill buttons — both follow whether the process is running, not its launch mode, so a running process can be restarted or killed in any mode and a stopped one has both greyed out. Below sit three collapsible sections: what to run (exe, path / args, cwd), when to run (launch mode, the schedule pencil, delay (sec), wait (sec)), and how to run (attempts, priority, visibility). The first two open by default; how to run holds the tune-once fields and starts folded, and each section remembers whether you left it open. While the launch mode is off, the timing fields and the whole how to run block are dimmed and its heading adds · applies once a launch mode is set — they stay editable, they just do not apply until a mode is set. There is no save button — a text field writes itself when it loses focus or takes an enter key, and the launch mode, priority, and visibility controls write on click.
Menu (top right)Join or leave a site, open config.json, open the logs folder, open these docs, submit a bug report, toggle start on login, restart the service, and reload the window.
FooterOne sentence saying whether this machine is being supervised and which site it belongs to, plus the version of the service that is running. On any owlette but production an amber environment chip sits beside that version — dev for a machine bound to dev.owlette.app, the bare host for anything else; a footer with no chip means production. One button sits beside the sentence when the state calls for it: start service when nothing is supervising this machine, or join site when the service is running but the machine belongs to no site. The two are mutually exclusive.

what the footer's status word means

The footer resolves to one of seven words, in this order — the first one that fits wins:

wordwhat it meanswhat to do
checkingThe app has not heard back from the service yet.Nothing — it resolves within a second or two.
service not runningOwletteService is stopped, not installed, or running but has not written its status file for over two minutes. Either way, nothing is being supervised right now.start service beside the sentence, or restart service from the menu.
disabledCloud sync is off in config.json. A machine that was installed but never paired has no firebase section at all, so this is the word it shows — it is not a fault.join site beside the sentence.
removed from siteCloud sync is on, but the machine is no longer assigned to a site.join site beside the sentence.
connectedThe service is running and reaching owlette.Nothing.
authentication requiredThe service could not authenticate with owlette — its stored tokens are missing or rejected.Re-pair the machine; see agent troubleshooting.
disconnectedThe service is running but not reaching owlette.Check the machine's internet connection and its outbound HTTPS to the configured host.

The status dot and the word share one tone: muted for checking and disabled, green for connected, amber for authentication required, and red for the rest.

Nothing has been configured yet on a freshly enrolled machine:

the owlette desktop app on a machine with no processes configured yet

The menu at the top right is where a machine joins its first site, or leaves the one it is on:

the owlette desktop app's menu, open, on a machine that belongs to a site

Joining shows a pairing phrase to approve from any device — the same device-code flow the installer uses:

the join a site dialog showing a pairing phrase

Leaving is the one destructive local action: the service is stopped while the machine is deregistered and then started again — Windows asks you to approve that — and pairing the machine again needs a fresh phrase.

the leave site dialog, warning that the service is stopped while the machine is deregistered and that pairing again needs a new phrase


config.json

The configuration file is stored at C:\ProgramData\Owlette\config\config.json.

When no config exists, the agent generates this default structure:

{
    "version": "1.7.0",
    "environment": "production",
    "processes": [],
    "logging": {
        "level": "INFO",
        "max_age_days": 90,
        "firebase_shipping": {
            "enabled": false,
            "ship_errors_only": true
        }
    },
    "sentry": {
        "enabled": false,
        "dsn": ""
    },
    "displays": {
        "enabled": true,
        "assigned": null,
        "auto_enforce": false,
        "remoteApplyEnabled": false
    },
    "temperature": {
        "enabled": true
    },
    "watchdog": {
        "enabled": true,
        "thresholds": {
            "failure_seconds": 360,
            "boot_grace_seconds": 180
        },
        "budget": {
            "max_per_window": 3,
            "window_seconds": 3600
        },
        "preconditions": {
            "require_internet": true,
            "fatal_error_suppression_seconds": 3600
        }
    }
}

If the agent regenerates a config and an existing firebase section is present, it preserves that section so pairing credentials are not lost.

top-level fields

fieldtypeeditabledescription
versionstringnoConfig schema version. The agent upgrades older configs to the current schema.
environmentstringyesproduction uses owlette.app; development uses dev.owlette.app.
processesarrayyesMonitored process entries. The generator starts with an empty array.
loggingobjectyesLocal log level, retention, and optional Firebase log shipping.
sentryobjectyesOptional Sentry reporting settings.
displaysobjectyesDisplay-topology monitoring and remote apply settings.
temperatureobjectyesCPU/GPU temperature sensor reads (3.2.0+). enabled: false stops all sensor reads; a missing section means enabled. Takes effect within one metrics tick — no restart needed.
watchdogobjectyesService watchdog thresholds, restart budget, and restart preconditions.
firebaseobjectnoPairing and cloud-sync state. The agent may preserve or write this section, but users should not edit it manually.

logging fields

fieldtypedefaultdescription
logging.levelstring"INFO"Log level: DEBUG, INFO, WARNING, ERROR, or CRITICAL.
logging.max_age_daysnumber90Delete local log files older than this many days.
logging.firebase_shipping.enabledbooleanfalseSends buffered logs to Firebase when enabled.
logging.firebase_shipping.ship_errors_onlybooleantrueWhen shipping is enabled, sends only error and critical logs unless set to false.

user-editable sections

sectionkeys
environment"production" or "development"
sentryenabled, dsn
displaysenabled, assigned, auto_enforce, remoteApplyEnabled
temperatureenabled
watchdog.thresholdsfailure_seconds, boot_grace_seconds
watchdog.budgetmax_per_window, window_seconds
watchdog.preconditionsrequire_internet, fatal_error_suppression_seconds

process configuration

A process's launch mode is the first thing to set: off leaves it alone, always on keeps it running around the clock and relaunches it if it crashes, and scheduled runs it inside the windows you define.

the process settings panel with the launch mode set to scheduled

The pencil button on the right edge of the launch-mode control opens the schedule editor. It is offered in every launch mode — editing from off or always on stores the windows without changing the mode. Windows are wall-clock times: by default they run on the machine's own clock, so a 9am window means 9am where the machine sits, even for a fleet spread across timezones. A site that has opted in to site time is the exception — its machines evaluate windows in the site's timezone instead. See timezones for which parts of owlette use site time:

the schedule editor, with one weekday block from 9am to 6pm

how to run holds the fields you set once and rarely revisit, so it starts folded. Open it to reach attempts, priority and visibility:

the how to run group open on the process settings panel, showing attempts, priority and visibility

Each process in the processes array uses the current process keys. The generator creates an empty array; entries created in the desktop app and entries created from the dashboard share most fields but are not identical.

Desktop-app-created entry:

{
    "id": "b8f1a4d2-8b1e-4df9-b7ff-7d4c3c10f9f1",
    "name": "TouchDesigner",
    "exe_path": "C:\\Program Files\\Derivative\\TouchDesigner\\bin\\TouchDesigner.exe",
    "file_path": "C:\\Projects\\MyProject.toe",
    "cwd": "C:\\Projects",
    "priority": "Normal",
    "visibility": "Normal",
    "time_delay": "0",
    "time_to_init": "10",
    "relaunch_attempts": "5",
    "launch_mode": "off",
    "autolaunch": false,
    "schedules": null
}

Dashboard-created entry:

{
    "id": "b8f1a4d2-8b1e-4df9-b7ff-7d4c3c10f9f1",
    "processId": "b8f1a4d2-8b1e-4df9-b7ff-7d4c3c10f9f1",
    "name": "TouchDesigner",
    "exe_path": "C:\\Program Files\\Derivative\\TouchDesigner\\bin\\TouchDesigner.exe",
    "file_path": "C:\\Projects\\MyProject.toe",
    "cwd": "C:\\Projects",
    "priority": "Normal",
    "visibility": "Normal",
    "time_delay": "0",
    "time_to_init": "10",
    "relaunch_attempts": "3",
    "launch_mode": "off",
    "autolaunch": false,
    "schedules": null
}

Dashboard writes include schedulePresetId only when a schedule preset is supplied.

process fields

fieldtypedescription
idstringStable UUID for the process entry.
processIdstringPublic/API process id. Current server write paths keep it in lockstep with id; legacy local entries may omit it until normalized.
namestringDisplay name for the process.
exe_pathstringFull path to the executable.
file_pathstringFile to open with the executable, or command-line arguments when the value is not a file on disk.
cwdstring or nullWorking directory. Empty string and null are treated as unset.
prioritystringPriority label stored with the process. The desktop app exposes Low, Normal, High, and Realtime.
visibilitystringWindow state used by the launcher. See accepted values below.
time_delaystring or numberSeconds to wait before launching this process during startup or scheduled activation.
time_to_initstring or numberSeconds to wait after launch before monitoring responsiveness.
relaunch_attemptsstring or numberRelaunch attempts allowed before owlette escalates to an automatic machine restart. 0 means unlimited — the process is relaunched forever and no machine restart is initiated. A missing, blank, negative, or non-numeric value falls back to the default of 3.
launch_modestringoff, always, or scheduled.
autolaunchbooleanBackward-compatible flag derived from launch_mode. Keep it aligned with launch_mode != "off".
schedulesarray or nullSchedule blocks for launch_mode: "scheduled". Null means no schedule is configured.
scheduleobject or nullLegacy/API schedule wrapper with mode and optional blocks; current dashboard writes use launch_mode plus schedules.
schedulePresetIdstring or nullOptional site schedule preset id associated with the saved schedule.

For an executable that commonly runs many instances at once — node.exe, python.exe, TouchDesigner.exe — file_path (the desktop app's path / args field) does more than pass an argument: because the value appears in the process's command line, it is what lets owlette identify this entry's process among look-alikes before it has ever launched it. With it blank, owlette does not guess between identical instances — it launches its own instance and manages that. See managed or inherited.

visibility options

The desktop app exposes Normal and Hidden. The launcher also accepts Minimized and Maximized when a process entry is edited manually.

valuedescription
"Normal"Standard visible window.
"Hidden"Hidden process. Console apps are launched without a visible console window.
"Minimized"Visible window starts minimized.
"Maximized"Visible window starts maximized.

Show and Hide values are normalized by the service to Normal and Hidden.


web-based configuration

From the dashboard, you can edit process settings remotely:

  1. Click on a machine in the dashboard.
  2. Click the process row's pencil/edit button.
  3. Edit settings such as name, paths, priority, visibility, delays, launch mode, and schedules.
  4. Click save changes.

The dashboard writes process updates to Firestore. The agent listener applies the new configuration locally and writes the updated config file without requiring a service restart.


configuration sync

  • Desktop app -> service: The desktop app writes to config.json; the service detects the file change.
  • Service -> Firestore: The service uploads local config changes.
  • Firestore -> service: The service listener applies remote config changes.
  • Dashboard -> Firestore: The dashboard writes config changes directly to Firestore.
  • Hash tracking prevents feedback loops when a local config change is echoed back from Firestore.

Don't modify the firebase section remotely

The firebase section of config.json is protected. Remote config updates never overwrite it. Changing it manually can break the agent's connection to Firestore.

On this page