Feature: Built-in Device Diagnostics & Support Bundle
Problem
When users report issues (presets not playing, setup failures, connectivity problems), we currently need multiple back-and-forth exchanges asking for SSH output, logs, config files, etc. Most users are not comfortable with SSH. This slows down troubleshooting significantly (see #139).
Proposal
Build a diagnostic tool into the Web UI that collects all relevant system and device information, displays it for self-diagnosis, and optionally exports a support bundle that users can attach to GitHub issues.
Required Data Points
1. OCT Server Info (no device connection needed)
2. Device Info (per discovered device)
3. Setup Status (requires SSH/USB stick)
4. Connectivity Checks (automated)
Implementation Plan
Backend (apps/backend/)
- New module:
diagnostics/ with service, routes, models
GET /api/diagnostics/server — OCT server info (always available)
GET /api/diagnostics/device/{device_id} — device-specific diagnostics
GET /api/diagnostics/device/{device_id}/setup — SSH-based setup verification
GET /api/diagnostics/connectivity/{device_id} — run connectivity checks
GET /api/diagnostics/bundle/{device_id} — generate full support bundle as JSON
GET /api/diagnostics/bundle — generate bundle for all devices
Frontend (apps/frontend/)
- New page:
/diagnostics (or /settings/diagnostics)
- Per-device diagnostic card with traffic-light indicators (green/yellow/red)
- "Run Full Check" button that executes all checks sequentially with progress
- "Export Support Bundle" button that downloads JSON file
- "Copy to Clipboard" for easy pasting into GitHub issues
- Results formatted as collapsible sections with details
Without USB Stick (limited mode)
- Server info, device info, preset data, connectivity checks all work without SSH
- Setup verification (hosts file, config file) requires SSH access — show warning
- Suggest SSH setup instructions if not available
With USB Stick (full mode)
- All of the above, plus:
- Full
/etc/hosts verification
OverrideSdkPrivateCfg.xml verification
- Backup status check
- Automatic fix suggestions (e.g., "hosts file missing OCT redirect, run Setup Wizard Step 6")
Support Bundle Format
{
"generated_at": "2026-05-07T12:00:00Z",
"oct_version": "1.2.0",
"server": { "..." : "..." },
"devices": [
{
"device_id": "...",
"info": { "..." : "..." },
"presets": [],
"connectivity": { "..." : "..." },
"setup_status": { "..." : "..." }
}
],
"checks": [
{ "name": "hosts_redirect", "status": "fail", "detail": "bmx.bose.com not in /etc/hosts" }
]
}
Acceptance Criteria
Priority
High — this will significantly reduce support burden and improve user experience for non-technical users.
Feature: Built-in Device Diagnostics & Support Bundle
Problem
When users report issues (presets not playing, setup failures, connectivity problems), we currently need multiple back-and-forth exchanges asking for SSH output, logs, config files, etc. Most users are not comfortable with SSH. This slows down troubleshooting significantly (see #139).
Proposal
Build a diagnostic tool into the Web UI that collects all relevant system and device information, displays it for self-diagnosis, and optionally exports a support bundle that users can attach to GitHub issues.
Required Data Points
1. OCT Server Info (no device connection needed)
station_descriptor_base_url(the URL Bose devices use to reach OCT)2. Device Info (per discovered device)
/info)/now_playing)/presets)3. Setup Status (requires SSH/USB stick)
/etc/hostscontent — verify OCT redirects are present and point to correct IPOverrideSdkPrivateCfg.xml— verify BMX URL override is set/usb/)/usb/backups/)4. Connectivity Checks (automated)
bmx.bose.comresolve to OCT IP?Implementation Plan
Backend (
apps/backend/)diagnostics/with service, routes, modelsGET /api/diagnostics/server— OCT server info (always available)GET /api/diagnostics/device/{device_id}— device-specific diagnosticsGET /api/diagnostics/device/{device_id}/setup— SSH-based setup verificationGET /api/diagnostics/connectivity/{device_id}— run connectivity checksGET /api/diagnostics/bundle/{device_id}— generate full support bundle as JSONGET /api/diagnostics/bundle— generate bundle for all devicesFrontend (
apps/frontend/)/diagnostics(or/settings/diagnostics)Without USB Stick (limited mode)
With USB Stick (full mode)
/etc/hostsverificationOverrideSdkPrivateCfg.xmlverificationSupport Bundle Format
{ "generated_at": "2026-05-07T12:00:00Z", "oct_version": "1.2.0", "server": { "..." : "..." }, "devices": [ { "device_id": "...", "info": { "..." : "..." }, "presets": [], "connectivity": { "..." : "..." }, "setup_status": { "..." : "..." } } ], "checks": [ { "name": "hosts_redirect", "status": "fail", "detail": "bmx.bose.com not in /etc/hosts" } ] }Acceptance Criteria
openapi.yamlPriority
High — this will significantly reduce support burden and improve user experience for non-technical users.