Error Reporting
When your bot module (or any extension) throws errors in production, Lumio collects anonymized error reports and makes them available in the developer dashboard. You get full visibility into what went wrong without accessing any personally identifiable information from the accounts that have your extension installed.
What you can see
The developer error dashboard shows:
| Data | Visible | Example |
|---|---|---|
| Error message | Yes (sanitized) | TypeError: Cannot read property 'balance' of null |
| Stack trace | Yes | at points (server/functions.ts:5:42) |
| Handler name | Yes | points |
| Trigger type | Yes | command |
| Platform | Yes | twitch |
| Extension version | Yes | 1.2.0 |
| Sanitized arguments | Yes | ["100"] |
| Config key names | Yes | [pointsPerMessage, gamblingEnabled] |
| User role | Yes | subscriber |
| Execution time | Yes | 12ms |
| Occurrence count | Yes | 34 |
| Affected install count | Yes | 3 of 150 |
| Anonymous account hash | Yes | anon_a1b2c3 |
| Anonymous install hash | Yes | anon_d4e5f6 |
What you cannot see
| Data | Why |
|---|---|
| Account ID | HMAC-hashed, not reversible |
| Install ID | HMAC-hashed, not reversible |
| User ID | Stripped entirely, never stored |
| Username / display name | Stripped entirely |
| Channel name | Stripped entirely |
| IP address | Never collected |
| Chat message content | Stripped entirely |
| Config values | Masked to * |
| Platform message ID | Stripped entirely |
Anonymization details
HMAC account hashing
Account and install IDs are hashed using HMAC-SHA256 with a per-extension salt (auto-generated, not accessible to you). The resulting anon_* hashes are:
- Consistent — the same account always produces the same hash, so you can group errors by account
- Not reversible — you cannot determine which account generated the error
- Per-extension — different extensions produce different hashes for the same account
Error message sanitization
Error messages are sanitized before storage:
- UUIDs matching
[0-9a-f]{8}-...are replaced with[UUID] @usernamementions are replaced with[USER]- URLs containing tokens or auth parameters are replaced with
[URL] - Strings longer than 50 characters in
argsare truncated
Config value masking
Config key names are visible (you defined them in config_schema), but all values are masked to *. This prevents accidental PII exposure from free-text config fields.
Error grouping
Errors are grouped by a hash of handler + sanitized_error_message + first_line_of_stack. The same error from different accounts and users groups under one entry, with occurrence counts and affected install counts.
Using error reports for debugging
Identifying account-specific issues
The anon_account hash lets you see error distribution:
Error: TypeError: Cannot read property 'balance' of null
Occurrences: 34
anon_account anon_a1b2c3: 28 hits
anon_account anon_x7y8z9: 4 hits
anon_account anon_m3n4o5: 2 hits
28 of 34 errors from the same anonymous account suggests a config-specific issue — perhaps that account has an unusual config combination.
Identifying platform-specific issues
Filter by platform to see if an error only occurs on a specific chat platform.
Identifying version-specific issues
The version field shows when an error was introduced. If errors spike after a version release, you can quickly identify the regression.
Identifying role-specific issues
The user role field (subscriber, moderator, etc.) can reveal issues that only affect certain permission levels.
Retention
Error reports are retained for 30 days, then automatically deleted.
Account owner view
Accounts that have your extension installed see their own errors and logs — not anonymized, since it is their own data. This is separate from the developer view:
| View | Who sees it | Anonymized? | Scope |
|---|---|---|---|
| Developer Error Dashboard | Extension developer | Yes | All installs, all accounts |
| Account Install Logs | Account owner | No (own data) | Only this account's install |
Account owners see their own usernames, chat content, and config values. Extension secrets and API keys are always masked regardless of viewer.
Accessing error reports
Developer dashboard
Navigate to your extension in the developer dashboard and open the Errors tab.
CLI
lumio logs --level error
API
Error reports are available via the REST API:
GET /v1/developer/extensions/{extension_id}/errors?since=2026-05-19T00:00:00Z&handler=points
This endpoint requires the feature:extension_development feature flag and extension ownership verification.