Command Reference
All commands support --json for structured output and --debug for verbose error details. Configuration & Scripting covers output modes in detail.
Every command except run queries a running instance — start the server with hassette run first. Each command wraps a REST endpoint, noted per command for scripting and direct HTTP access.
hassette run
Starts the Hassette framework server, connects to Home Assistant, loads apps, and starts the web API. The process runs in the foreground — keep the terminal open, or use a process manager like systemd or Docker. Press Ctrl+C to stop.
hassette run
Flags
| Flag | Description |
|---|---|
--token, -t |
Home Assistant access token. Overrides config file and environment. |
--base-url, -u, --url |
Base URL of the Home Assistant instance. |
--verify-ssl |
Whether to verify SSL certificates. |
--dev-mode |
Enables developer mode. |
All flags are optional. Values resolve from hassette.toml (see Configuration) and environment variables when not provided on the command line.
hassette status
Reports system health: connection state, uptime, app count, entity count, and version.
$ hassette status
╭──────────────────── System Status ───────────────────────────╮
│ status ok │
│ websocket_connected True │
│ uptime_seconds 16.57 │
│ entity_count 103 │
│ app_count 3 │
│ services_running ["EventStreamService", ...] │
│ version 0.32.0 │
│ boot_issues [] │
╰──────────────────────────────────────────────────────────────╯
boot_issues lists apps that failed to initialize. An empty list means all apps started cleanly. When an app appears here, check hassette log --app <key> for the error.
API endpoint: GET /api/health
hassette app
Lists all loaded apps with key, display name, status, instance count, and recent invocation counts. The app key is the [hassette.apps.<key>] section name from hassette.toml — the identifier every --app flag takes. An instance is one running copy of an app class; most apps run a single instance at index 0, but the same class can run multiple times with different configs.
$ hassette app
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━┓
┃ App Key ┃ Status ┃ Display ┃ Instances ┃ Invoc/1h ┃ Enabled ┃ File ┃
┃ ┃ ┃ Name ┃ ┃ ┃ ┃ ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━┩
│ config_app │ running │ ConfigApp │ 1 │ 0 │ True │ config_app.py │
│ trivial_app │ running │ TrivialApp │ 1 │ 0 │ True │ trivial_app.py │
│ bus_handler_app │ running │ BusHandler… │ 1 │ 0 │ True │ bus_handler_app.py│
└─────────────────┴─────────┴─────────────┴───────────┴──────────┴─────────┴───────────────────┘
Subcommands
| Subcommand | Description | API endpoint |
|---|---|---|
hassette app |
Lists all apps. | GET /api/apps/manifests |
hassette app health <key> |
Health metrics for one app. | GET /api/telemetry/app/{key}/health |
hassette app activity <key> |
Recent activity feed. | GET /api/telemetry/app/{key}/activity |
hassette app config <key> |
Resolved configuration. | GET /api/apps/{key}/config |
hassette app source <key> |
Source file path. | GET /api/apps/{key}/source |
hassette app health <key>
Reports health metrics for an app: error rate, average handler and job duration, and overall health status.
$ hassette app health bus_handler_app
╭──────── AppHealthResponse ────────╮
│ error_rate 0.0 │
│ error_rate_class good │
│ handler_avg_duration 0.0 │
│ job_avg_duration 0.0 │
│ last_activity_ts │
│ health_status excellent │
╰───────────────────────────────────╯
--instance and --since scope the metrics window:
hassette app health my-app --instance office --since 6h
hassette app activity <key>
Recent handler invocations and job executions for an app, as a unified activity feed. Columns: ID, kind (handler or job), status, app key, handler name, duration, timestamp, and error type.
hassette app activity my-app --since 30m --limit 20
hassette app config <key>
The resolved configuration for an app, as loaded from all sources (TOML, env vars, defaults).
hassette app config my-app
hassette app source <key>
The source file path for an app.
hassette app source my-app
Flags
| Flag | Applies to | Description |
|---|---|---|
--instance |
health, activity |
Filters to a specific app instance (index or name). |
--since |
health, activity |
Time window for metrics. See formats. |
--source-tier |
health |
Filters by source tier — app is your code, framework is Hassette internals. See Shared Flags. |
--limit |
activity |
Maximum records to return. |
--json |
all | Outputs as JSON. |
hassette listener
Lists all registered event bus listeners, or shows invocation history for a specific listener. A listener is the registered subscription that connects a handler (a function in your app) to an event — see Bus.
$ hassette listener
┏━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━┳━━━━┳━━━━━━┳━━━━━┳━━━━━━┓
┃ ID ┃ App ┃ Target ┃ Kind ┃ Handler ┃ Total ┃ OK ┃ Fail ┃ Avg ┃ Last ┃
┡━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━╇━━━━╇━━━━━━╇━━━━━╇━━━━━━┩
│ 10 │ bus_handler_app │ light.kitchen_main │ state_cha… │ on_light_change │ 0 │ 0 │ 0 │ 0ms │ │
└────┴──────────────────┴───────────────────────────┴────────────┴──────────────────────┴───────┴────┴──────┴─────┴──────┘
Each row shows the listener ID, app key, target entity, listener kind, handler method, invocation counts (total, successful, failed), average duration, and last invocation time.
Passing a listener ID shows its invocation history:
hassette listener 10 --since 1h --limit 20
The invocation table shows status, duration, error type, error message, timestamp, and execution ID for each invocation.
Flags
| Flag | Description |
|---|---|
--app <key> |
Filters to listeners belonging to this app. |
--instance <n> |
Filters to a specific app instance. Requires --app. |
--since <duration> |
Time window for invocation counts and history. |
--source-tier <tier> |
Filters by app, framework, or all. |
--limit <n> |
Maximum invocation records (when viewing a specific listener). |
--json |
Outputs as JSON. |
API endpoints:
hassette listenerhitsGET /api/bus/listenershassette listener --app <key>hitsGET /api/telemetry/app/{key}/listenershassette listener <id>hitsGET /api/telemetry/listener/{id}/executions
hassette job
Lists all scheduled jobs, or shows execution history for a specific job. A job is a function registered with the Scheduler to run at a time or interval.
$ hassette job
┏━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━┳━━━━┳━━━━━━┳━━━━━┳━━━━━━━━━━┓
┃ ID ┃ App ┃ Handler ┃ Trigger ┃ Schedule ┃ Total ┃ OK ┃ Fail ┃ Avg ┃ Next Run ┃
┡━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━╇━━━━╇━━━━━━╇━━━━━╇━━━━━━━━━━┩
│ 1 │ config_app │ StateProxy.sync_all │ interval │ every │ 0 │ 0 │ 0 │ 0ms │ soon │
└────┴──────────────────┴──────────────────────┴──────────┴──────────┴───────┴────┴──────┴─────┴──────────┘
Each row shows the job ID, app key, handler method, trigger type, schedule label, execution counts, average duration, and next scheduled run time.
Passing a job ID shows its execution history:
hassette job 1 --limit 20
The execution table shows status, duration, error type, error message, timestamp, and execution ID for each run.
Flags
| Flag | Description |
|---|---|
--app <key> |
Filters to jobs belonging to this app. |
--instance <n> |
Filters to a specific app instance. Requires --app. |
--since <duration> |
Time window for execution history. |
--source-tier <tier> |
Filters by app, framework, or all. |
--limit <n> |
Maximum execution records (when viewing a specific job). |
--json |
Outputs as JSON. |
API endpoints:
hassette jobhitsGET /api/scheduler/jobshassette job --app <key>hitsGET /api/telemetry/app/{key}/jobshassette job <id>hitsGET /api/telemetry/job/{id}/executions
hassette log
Recent log entries from the in-memory log buffer.
$ hassette log --limit 5
┏━━━━━━━━━┳━━━━━━━┳━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ When ┃ Level ┃ App ┃ Instance ┃ Function ┃ Message ┃
┡━━━━━━━━━╇━━━━━━━╇━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━━━━━━━┩
│ 31s ago │ INFO │ │ │ run_forever │ Hassette is running. │
│ 31s ago │ INFO │ │ │ run_forever │ All services started │
│ │ │ │ │ │ successfully. │
│ 32s ago │ INFO │ │ │ serve │ Web API server starting │
│ │ │ │ │ │ on 0.0.0.0:8126 │
│ 32s ago │ INFO │ │ │ _auto_wait_depend… │ Waiting for dependencies: │
│ │ │ │ │ │ [RuntimeQueryService, …] │
│ 32s ago │ INFO │ │ │ _auto_wait_depend… │ Waiting for dependencies: │
│ │ │ │ │ │ [BusService, StateProxy, …]│
└─────────┴───────┴─────┴──────────┴─────────────────────┴────────────────────────────┘
--instance is not supported on this command; the CLI exits with a usage error if provided. --app filters by app key.
Flags
| Flag | Description |
|---|---|
--app <key> |
Filters to log entries from this app. |
--since <duration> |
Time window filter. |
--limit <n> |
Maximum number of entries to return. |
--source-tier <tier> |
Filters by app, framework, or all. |
--json |
Outputs as JSON. |
API endpoint: GET /api/logs/recent
hassette execution
Log entries for a specific execution — a single run of a handler or job, identified by its UUID. Get the UUID from the Execution ID column of hassette listener <id> or hassette job <id> output.
hassette execution a1b2c3d4-e5f6-7890-abcd-ef1234567890
The execution UUID appears in the Execution ID column of hassette listener <id> and hassette job <id> output. Workflows covers the full drill-down pattern.
The table shows timestamp, level, function name, line number, and message for each log entry captured during that execution.
Flags
| Flag | Description |
|---|---|
--limit <n> |
Maximum number of log entries to return. |
--json |
Outputs as JSON. |
API endpoint: GET /api/executions/{execution_id}
hassette event
Recent Home Assistant events received by the WebSocket connection.
$ hassette event --limit 5
┏━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━━━┓
┃ Event Type ┃ Entity ┃ When ┃
┡━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━━━┩
│ service_status │ │ 35s ago │
│ service_status │ │ 35s ago │
│ service_status │ │ 35s ago │
│ service_status │ │ 35s ago │
│ service_status │ │ 35s ago │
└────────────────┴────────┴─────────┘
The Entity column is populated for state_changed events. Other event types leave it blank.
Flags
| Flag | Description |
|---|---|
--limit <n> |
Maximum number of events to return. |
--json |
Outputs as JSON. |
API endpoint: GET /api/events/recent
hassette dashboard
Per-app health status, invocation counts, error counts, average duration, and last activity. Mirrors the dashboard grid in the web UI.
$ hassette dashboard
┏━━━━━━━━━━━━━━━━━┳━━━━━━━━━┳━━━━━━━┳━━━━━━┳━━━━━━━━━┳━━━━━━━━━━━━━┳━━━━━━━━━━━┓
┃ App ┃ Status ┃ Invoc ┃ Errs ┃ Avg Dur ┃ Last Active ┃ Health ┃
┡━━━━━━━━━━━━━━━━━╇━━━━━━━━━╇━━━━━━━╇━━━━━━╇━━━━━━━━━╇━━━━━━━━━━━━━╇━━━━━━━━━━━┩
│ config_app │ running │ 0 │ 0 │ 0ms │ │ excellent │
│ trivial_app │ running │ 0 │ 0 │ 0ms │ │ excellent │
│ bus_handler_app │ running │ 0 │ 0 │ 0ms │ │ excellent │
└─────────────────┴─────────┴───────┴──────┴─────────┴─────────────┴───────────┘
API endpoint: GET /api/telemetry/dashboard/app-grid
hassette config
The resolved Hassette configuration, as loaded from all sources (TOML, env vars, defaults). Renders as a key-value panel showing the full configuration tree, including nested sections like web_api, apps, and lifecycle.
hassette config
API endpoint: GET /api/config
hassette telemetry
Hassette records every handler invocation and job execution to an internal database. This command shows its statistics: record counts, whether any records were dropped under load or shutdown, and error handler failures.
$ hassette telemetry
╭──── TelemetryStatusResponse ────╮
│ degraded False │
│ dropped_overflow 0 │
│ dropped_exhausted 0 │
│ dropped_shutdown 0 │
│ error_handler_failures 0 │
╰─────────────────────────────────╯
All-zero counters indicate the telemetry pipeline is healthy and no records have been lost.
API endpoint: GET /api/telemetry/status
Shared Flags
These flags appear across multiple commands.
| Flag | Format | Commands | Description |
|---|---|---|---|
--app <key> |
string | listener, job, log |
Filters results to a specific app key. |
--instance <n> |
int or string | listener, job, app health, app activity |
Filters to a specific app instance. Requires --app or a positional <key> argument. |
--since <duration> |
relative or absolute | listener, job, log, app health, app activity |
Time window for filtering. See --since format. |
--limit <n> |
integer | log, event, execution, app activity, per-ID commands |
Maximum number of records to return. |
--source-tier <tier> |
app, framework, or all |
listener, job, log, app health |
Filters by source tier. app returns user automation records. framework returns internal Hassette component records. all returns both. |
--json |
n/a | all commands | Outputs as JSON. See Output Modes. |
Global flags
These flags apply to every command and are placed before the subcommand name.
| Flag | Aliases | Description |
|---|---|---|
--config-file |
-c |
Path to the TOML configuration file. |
--env-file |
-e, --env |
Path to the .env file. |
--json |
n/a | Outputs results as JSON. |
--debug |
n/a | Shows the full HTTP response on CLI errors. |
--since format
--since accepts relative durations and absolute timestamps.
Relative durations use a number followed by a unit suffix:
| Suffix | Unit | Example |
|---|---|---|
s |
seconds | 30s |
m |
minutes | 15m |
h |
hours | 1h |
d |
days | 7d |
w |
weeks | 2w |
Compound durations such as 1h30m are not supported — use the closest single unit instead, like --since 90m. Month and year units are not supported; use days.
Absolute timestamps use ISO 8601 format:
| Format | Example | Interpretation |
|---|---|---|
| Date only | 2026-05-22 |
Midnight in local time. |
| Date and time (naive) | 2026-05-22T14:00:00 |
Local time. |
| Date and time (UTC) | 2026-05-22T18:00:00Z |
UTC. |
| Date and time (offset) | 2026-05-22T14:00:00-04:00 |
Explicit offset. |
Invalid values cause a non-zero exit with an error listing accepted formats.
--instance resolution
--instance requires --app (or a positional <key> argument on app health and app activity). It accepts:
- Integer index, passed directly to the API as
instance_index. Most apps have a single instance at index0. - Instance name, resolved to an index by fetching the app manifest. If no instance matches the name, the CLI exits non-zero and lists available instance names.
--instance without an app context exits non-zero with a usage error.