Skip to content

Releases: Staros-Labs/scrutiny

v1.68.0

Choose a tag to compare

@Starosdev Starosdev released this 30 Jul 21:44

v1.68.0 (2026-07-30)

Features

  • Improved server alert emails (#690)
    • Redesigned shared HTML notification layout for responsive desktop and mobile rendering.
    • Added Scrutiny branding, alert severity badges, clearer detail tables, and consistent spacing.
    • Updated SMART, missed-ping, heartbeat, collector-error, replacement-risk, and missed-ping digest emails.
    • Improved host-aware subjects and removed duplicate device fields.
    • Retained plain-text fallback delivery; no database or configuration migration is required.

v1.67.1

Choose a tag to compare

@Starosdev Starosdev released this 28 Jul 07:33

v1.67.1 (2026-07-28)

Bug Fixes

  • Preserve jmb39x-q device type and accept usable SMART JSON (#677) - Fixes #663

    • QNAP TR-004 enclosures in Individual mode address each bay through the smartmontools jmb39x-q,N backend. Two independent collector defects made those disks unmonitorable. Both are fixed here.
  • Pass explicitly configured smartctl device types verbatim (#678) - Fixes #664

    • Some Hitachi and Toshiba drives answer an auto-detected smartctl query with no identity, SMART support is: Unavailable and no attributes. Scrutiny renders that as a failed disk with zero metrics. The documented remedy is to pin the device type in collector.yaml; for most of these drives that type is sat, which already reached smartctl. A configured type of scsi or ata did not.
    • All three smartctl call sites (detection --info, collection --xall, FARM log) carried a hand-copied guard:
    • go
    • if len(deviceType) > 0 && deviceType != "scsi" && deviceType != "ata" {
    • args = append(args, "--device", deviceType)
    • }
    • The guard is correct for a type that came from smartctl --scan: container scans routinely mislabel ATA disks as SCSI, and forcing -d scsi on one loses its ATA attributes. It is wrong for a type the user wrote down, but models.Device carries no provenance, so the two were indistinguishable. The comparison was also exact-case, so type: 'ATA' was passed through while type: 'ata' was dropped.
  • Keep scroll position when a menu closes (#679) - Fixes #672

Release Highlights

  • Promote develop to master: collector device-type fixes and menu scroll fix (#680) - Fixes #663, Fixes #664, Fixes #672

v1.67.0

Choose a tag to compare

@Starosdev Starosdev released this 17 Jul 02:08

Upgrade action required: Omnibus users

v1.67.0 upgrades the embedded InfluxDB runtime from 2.2 to 2.9.1. Existing Omnibus installations must back up their InfluxDB data before the first 2.9.1 startup.

  1. Stop the Scrutiny container.
  2. Back up the complete host directory mounted at /opt/scrutiny/influxdb. For the example Compose deployment, this is ./influxdb. For the Unraid template, the default is /mnt/user/appdata/scrutiny/influxdb.
  3. Set SCRUTINY_INFLUXDB_29_BACKUP_CONFIRMED=true.
  4. Start Scrutiny and confirm the application and InfluxDB health checks are healthy.

The updated Omnibus image blocks InfluxDB startup when existing data is detected without this acknowledgement. Fresh installations start normally and do not require confirmation. After a confirmed upgrade, a persistent marker prevents repeated prompts.

If an earlier latest image already started InfluxDB 2.9.1, stop Scrutiny and back up the current InfluxDB directory before making further changes.

See the Omnibus InfluxDB 2.9 upgrade instructions and rollback guidance.

Highlights

InfluxDB 2.9.1

  • Upgrades the embedded Omnibus database from InfluxDB 2.2 to 2.9.1.
  • Keeps token hashing disabled for rollback compatibility.
  • Documents downgrade and token-recovery procedures.
  • Adds a pre-start backup-confirmation gate for existing Omnibus data.

Collector omnibus image

  • Adds ghcr.io/starosdev/scrutiny:latest-collector-omnibus for hub-and-spoke deployments.
  • Bundles SMART, ZFS, MDADM, Btrfs, filesystem, and performance collectors in one spoke image.
  • Includes Docker Compose, Unraid, documentation, and image-build support.

MDADM reliability

  • Persists host_id during array re-registration so RAID arrays group correctly by host.
  • Handles MDADM discovery variants and missing device lists without crashing the RAID Arrays page.
  • Existing arrays need one fresh MDADM collection to backfill host_id before host headings appear.

Logging

  • Honors configured startup log levels across Scrutiny containers.
  • Allows the startup banner to be suppressed.
  • Improves structured service-startup logging.

Fixed issues

  • #636: Suppress the ASCII startup logo and honor log settings.
  • #640: Group MDADM arrays by host.
  • #642: Provide a combined collector omnibus image.
  • #652: Prevent null MDADM device lists from crashing the RAID Arrays page.

Pull requests

  • #661: Promote tested develop changes to master.
  • #662: Require backup confirmation before the InfluxDB 2.9 upgrade.

Full comparison

v1.66.0

Choose a tag to compare

@Starosdev Starosdev released this 08 Jul 03:41

1.66.0 (2026-07-08)

Drive Health And SMART

  • Prevent false FAILED: SCRUTINY ATA SSD results by skipping generic HDD observed-threshold scoring for vendor-specific ATA SSD SMART attributes when the smartctl-reported name does not semantically match bundled generic ATA metadata, and add an exact-family Crucial/Micron RealSSD m4/C400/P400 compatibility profile. Closes #587.
  • Expand ATA consumer-drive profile matching, inspection, and observability so profile behavior is easier to understand and troubleshoot. Includes #552.
  • Detect Power-On Hours 16-bit counter rollover so wrapped ATA values do not inflate age and replacement-risk interpretation. Includes #595 and #625.
  • Add ATA SMART self-test history persistence, API support, and device-details UI coverage. Includes #491.

UI

  • Add dashboard column-count and card-density controls. Includes #471.
  • Fix dark-mode tokens for settings dialogs and dropdowns. Fixes #634.

CI And Maintenance

  • Harden branch-sync automation so beta is protected from cleanup and recreated automatically if missing. Includes #630.
  • Roll in dependency and workflow maintenance already carried on beta, including actions/checkout v7 and frontend dependency security updates.

v1.65.0

Choose a tag to compare

@Starosdev Starosdev released this 29 Jun 01:01

v1.65.0 (2026-06-29)

Features

  • V1.65.0 - PoH rollover detection, dashboard density controls, settings fix (#629)
    • Promotes the 1.65.0 beta line to master (1.64.0 -> 1.65.0). Scope below is limited to changes that are actually new versus master; features merged to master earlier (per-URL heartbeat, navigation visibility, host grouping, ATA self-test history, contextual help) are already shipped and are NOT part of this delta.
    • Features
    • Fixes
    • Refactors (cognitive complexity)
    • Power-On Hours 16-bit counter rollover detection (#595, #625) - new smart_rollover_test.go, thresholds logic
    • Dashboard layout controls: max column count + card density ('comfortable' | 'compact') (#471)
    • Preserve server-capability flags on settings save: server_version and collector_trigger_enabled were dropped from the POST /api/settings response, so the "Run collectors" button vanished after any settings change. Backend now echoes both flags (shared collectorTriggerEnabled() helper); frontend config setter preserves them with a current-value fallback. Adds handler regression tests.
    • smart.go, measurement models, repository, migration runner, middleware/monitors, notify senders, SMTP sender, device detection, collector commands, frontend components (#616-#624)

Refactoring

  • Reduce cognitive complexity in smart.go (#616)

    • Reduces SonarQube cognitive complexity (go:S3776) across all 10 flagged functions in webapp/backend/pkg/models/measurements/smart.go. The functions ranged from complexity 17 to 43; all now sit at or below the allowed limit of 15.
  • Reduce cognitive complexity in collector commands (#617)

    • Reduces SonarQube cognitive complexity (go:S3776) in main() across all five collector command entrypoints. They ranged from complexity 17 to 47; all functions now sit at or below the allowed limit of 15.
    • | Command | Before | After |
    • |---------|--------|-------|
    • | collector-performance | 47 | ≤15 |
    • | collector-filesystem | 45 | ≤15 |
    • | collector-btrfs | 45 | ≤15 |
    • | collector-zfs | 17 | ≤15 |
    • | collector-mdadm | 17 | ≤15 |
  • Reduce cognitive complexity in notification senders (#618)

    • Reduces SonarQube cognitive complexity (go:S3776) across the notify package. All flagged functions now sit at or below the allowed limit of 15.
    • | Function | File | Before | After |
    • |----------|------|--------|-------|
    • | ShouldNotify | notify.go | 58 | ≤15 |
    • | SendShoutrrrNotification | notify.go | 19 | ≤15 |
    • | SendSMTPNotification | smtp_sender.go | 30 | ≤15 |
    • | sendSMTPRecipient | smtp_sender.go | 16 | ≤15 |
    • | maskAppriseURL | mask.go | 24 | ≤15 |
    • | mockSMTPServer.serve | notify_test.go | 17 | ≤15 |
  • Reduce cognitive complexity in device detection (#619)

    • Reduces SonarQube cognitive complexity (go:S3776) across the collector device-detection code. All flagged functions now sit at or below the allowed limit of 15.
    • | Function | File | Before | After |
    • |----------|------|--------|-------|
    • | TransformDetectedDevices | detect/detect.go | 38 | ≤15 |
    • | btrfs parseScrubStatus | btrfs/detect.go | 25 | ≤15 |
    • | zfs parseScrubStatus | zfs/detect/detect.go | 21 | ≤15 |
    • | getArrayDetail | mdadm/detect/detect.go | 20 | ≤15 |
    • | findMissingDevices | detect/devices_darwin.go | 19 | ≤15 |
    • | getMountUsage | mdadm/detect/mount_linux.go | 19 | ≤15 |
  • Reduce cognitive complexity in components (#620)

    • Reduces SonarQube cognitive complexity (typescript:S3776) for all three flagged frontend functions. Each now sits well below the allowed limit of 15.
    • | Function | File | Before | After |
    • |----------|------|--------|-------|
    • | buildAppriseUrl | dashboard-settings.component.ts | 24 | <15 |
    • | set range | @treo/date-range.component.ts | 22 | <15 |
    • | _generateSmartAttributeTableDataSource | detail.component.ts | 21 | <15 |
  • Reduce cognitive complexity in repository (#621)

    • Reduces SonarQube cognitive complexity (go:S3776) across the database repository. Every flagged function (except the migration runner) now sits at or below the allowed limit of 15.
    • | Function | File | Before |
    • |----------|------|--------|
    • | GetSummary | scrutiny_repository.go | 56 |
    • | EnsureTasks | scrutiny_repository_tasks.go | 30 |
    • | computeEndurance | scrutiny_repository_workload.go | 26 |
    • | GetSmartTemperatureHistory | scrutiny_repository_temperature.go | 24 |
    • | newScrutinyRepository | scrutiny_repository.go | 19 |
    • | GetDevicesLastSeenTimes | scrutiny_repository.go | 19 |
    • | reconcileLegacyDeviceIdentity | scrutiny_repository_device.go | 17 |
    • | GetWorkloadInsights | scrutiny_repository_workload.go | 17 |
    • | summaryRiskScore | summary_risk.go | 16 |
    • | EnsureBuckets | scrutiny_repository.go | 16 |
    • All now ≤15.
  • Reduce cognitive complexity in measurement models (#622)

    • Reduces SonarQube cognitive complexity (go:S3776) across the measurement models and threshold parsing. All flagged functions now sit at or below the allowed limit of 15.
    • | Function | File | Before |
    • |----------|------|--------|
    • | NewBtrfsMetricsFromInfluxDB | measurements/btrfs_metrics.go | 34 |
    • | NewPerformanceFromInfluxDB | measurements/performance.go | 32 |
    • | ValidateThreshold | measurements/smart_ata_attribute.go | 27 |
    • | parseConsumerDriveProfiles | thresholds/consumer_drive_profiles.go | 23 |
    • | NewMDADMMetricsFromInfluxDB | measurements/mdadm_metrics.go | 18 |
  • Reduce cognitive complexity in middleware and monitors (#623)

    • Reduces SonarQube cognitive complexity (go:S3776) across the web middleware and background monitors. All flagged functions now sit at or below the allowed limit of 15.
    • | Function | File | Before |
    • |----------|------|--------|
    • | AuthMiddleware | middleware/auth.go | 25 |
    • | GetStatus | missed_ping_monitor.go | 21 |
    • | checkAndSendHeartbeat | heartbeat_monitor.go | 19 |
    • | LoggerMiddleware | middleware/logger.go | 17 |
  • Reduce cognitive complexity in the migration runner (#624)

    • Final SonarQube Group 5 cluster. Reduces cognitive complexity (go:S3776) in the database migration runner — the two highest-complexity functions in the project.
    • | Function | Before | After |
    • |----------|--------|-------|
    • | Migrate | 166 | ≤15 |
    • | m20201107210306_From...SmartResults... | 17 | ≤15 |

v1.65.0-beta.1

v1.65.0-beta.1 Pre-release
Pre-release

Choose a tag to compare

@Starosdev Starosdev released this 20 Jun 00:52

v1.65.0-beta.1 (2026-06-20)

Code Improvements

  • Simplified Smart Measurement Functions (#616) - Closes #N

    • Improved readability and maintainability of smart measurement functions.
    • All flagged functions now meet the complexity limit.
  • Simplified Collector Command Functions (#617) - Closes #N

    • Enhanced clarity in collector command entrypoints.
    • All functions now meet the complexity limit.
    • | Command | Before | After |
    • |---------|--------|-------|
    • | collector-performance | 47 | ≤15 |
    • | collector-filesystem | 45 | ≤15 |
    • | collector-btrfs | 45 | ≤15 |
    • | collector-zfs | 17 | ≤15 |
    • | collector-mdadm | 17 | ≤15 |
  • Simplified Notification Functions (#618) - Closes #N

    • Improved clarity in notification sending functions.
    • All flagged functions now meet the complexity limit.
    • | Function | File | Before | After |
    • |----------|------|--------|-------|
    • | ShouldNotify | notify.go | 58 | ≤15 |
    • | SendShoutrrrNotification | notify.go | 19 | ≤15 |
    • | SendSMTPNotification | smtp_sender.go | 30 | ≤15 |
    • | sendSMTPRecipient | smtp_sender.go | 16 | ≤15 |
    • | maskAppriseURL | mask.go | 24 | ≤15 |
    • | mockSMTPServer.serve | notify_test.go | 17 | ≤15 |
  • Simplified Device Detection Functions (#619) - Closes #N

    • Enhanced clarity in device detection code.
    • All flagged functions now meet the complexity limit.
    • | Function | File | Before | After |
    • |----------|------|--------|-------|
    • | TransformDetectedDevices | detect/detect.go | 38 | ≤15 |
    • | btrfs parseScrubStatus | btrfs/detect.go | 25 | ≤15 |
    • | zfs parseScrubStatus | zfs/detect/detect.go | 21 | ≤15 |
    • | getArrayDetail | mdadm/detect/detect.go | 20 | ≤15 |
    • | findMissingDevices | detect/devices_darwin.go | 19 | ≤15 |
    • | getMountUsage | mdadm/detect/mount_linux.go | 19 | ≤15 |
  • Simplified Frontend Component Functions (#620) - Closes #N

    • Improved clarity in frontend component functions.
    • All flagged functions now meet the complexity limit.
    • | Function | File | Before | After |
    • |----------|------|--------|-------|
    • | buildAppriseUrl | dashboard-settings.component.ts | 24 | <15 |
    • | set range | @treo/date-range.component.ts | 22 | <15 |
    • | _generateSmartAttributeTableDataSource | detail.component.ts | 21 | <15 |
  • Simplified Repository Functions (#621) - Closes #N

    • Enhanced clarity in database repository functions.
    • All flagged functions now meet the complexity limit.
    • | Function | File | Before |
    • |----------|------|--------|
    • | GetSummary | scrutiny_repository.go | 56 |
    • | EnsureTasks | scrutiny_repository_tasks.go | 30 |
    • | computeEndurance | scrutiny_repository_workload.go | 26 |
    • | GetSmartTemperatureHistory | scrutiny_repository_temperature.go | 24 |
    • | newScrutinyRepository | scrutiny_repository.go | 19 |
    • | GetDevicesLastSeenTimes | scrutiny_repository.go | 19 |
    • | reconcileLegacyDeviceIdentity | scrutiny_repository_device.go | 17 |
    • | GetWorkloadInsights | scrutiny_repository_workload.go | 17 |
    • | summaryRiskScore | summary_risk.go | 16 |
    • | EnsureBuckets | scrutiny_repository.go | 16 |
    • All now ≤15.
  • Simplified Measurement Model Functions (#622) - Closes #N

    • Improved clarity in measurement models and threshold parsing.
    • All flagged functions now meet the complexity limit.
    • | Function | File | Before |
    • |----------|------|--------|
    • | NewBtrfsMetricsFromInfluxDB | measurements/btrfs_metrics.go | 34 |
    • | NewPerformanceFromInfluxDB | measurements/performance.go | 32 |
    • | ValidateThreshold | measurements/smart_ata_attribute.go | 27 |
    • | parseConsumerDriveProfiles | thresholds/consumer_drive_profiles.go | 23 |
    • | NewMDADMMetricsFromInfluxDB | measurements/mdadm_metrics.go | 18 |
  • Simplified Middleware and Monitor Functions (#623) - Closes #N

    • Enhanced clarity in middleware and background monitor functions.
    • All flagged functions now meet the complexity limit.
    • | Function | File | Before |
    • |----------|------|--------|
    • | AuthMiddleware | middleware/auth.go | 25 |
    • | GetStatus | missed_ping_monitor.go | 21 |
    • | checkAndSendHeartbeat | heartbeat_monitor.go | 19 |
    • | LoggerMiddleware | middleware/logger.go | 17 |
  • Simplified Migration Runner Functions (#624) - Closes #N

    • Reduced complexity in the database migration runner.
    • The two highest-complexity functions now meet the complexity limit.
    • | Function | Before | After |
    • |----------|--------|-------|
    • | Migrate | 166 | ≤15 |
    • | m20201107210306_From...SmartResults... | 17 | ≤15 |

v1.64.0

Choose a tag to compare

@Starosdev Starosdev released this 18 Jun 01:19

v1.64.0 (2026-06-18)

Release Highlights

  • New features for URL monitoring and navigation (#613) - Closes #492, Closes #579, Closes #588
    • Users can now enable or disable heartbeat monitoring for individual URLs.
    • New options to show or hide navigation items for ZFS, MDADM, Btrfs, and Workload.
    • MDADM and Workload pages can now be grouped by host for easier navigation.
    • Added contextual help links to assist users with settings and Consumer Drive Profiles.
    • Improved mobile formatting and functionality.
    • Simplified database migration process for better performance.
    • Updated dependencies for enhanced stability and features.

v1.63.0

Choose a tag to compare

@Starosdev Starosdev released this 11 Jun 20:10

v1.63.0 (2026-06-11)

Release Highlights

  • Improved Navigation and User Assistance (#602) - Closes #588, Closes #579, Closes #492
    • Users can now customize navigation visibility to show or hide ZFS Pools, MDADM RAID, Btrfs, and Workload links.
    • MDADM and Workload dashboard pages are now organized by host for easier access.
    • Contextual help links have been added throughout settings and the dashboard to guide users.
    • The styling of the "learn more" link for Consumer Drive Profiles has been improved.
    • Users can toggle heartbeat notifications for specific URLs.
    • Navigation visibility settings are now supported via environment variables.

Dependencies

  • Update Gormigrate Library (#584)

  • Update Shoutrrr Library (#597)

  • Update Angular ESLint Schematics (#525)

  • Update ng-apexcharts Library (#526)

  • Update Prettier ESLint Plugin (#527)

  • Update Development Dependencies (#598)

v1.62.4

Choose a tag to compare

@Starosdev Starosdev released this 09 Jun 00:23

v1.62.4 (2026-06-09)

Release Highlights

  • Collector and frontend stability fixes (#600)
    • Updated AppArmor profile for Ubuntu 26.04 compatibility -- adds binary ix rules, PAM/auth resolution, dac_read_search, login accounting, and runc signal; tested across Ubuntu 24.04/26.04 on four hosts
    • Fixed security: replace Math.random() with crypto.randomUUID() in mock GUID utility
    • Fixed lint: readonly private members, deduplicated string literals, documented empty functions, error return checks in Linux device detection, govet/gocritic findings
    • Fixed collector: skip empty device names from smartctl scan output, handle megaraid duplicate scan paths
    • Fixed frontend: flex-col layout on stat cards in detail views
    • Fixed collector: add --host-id flag to MDADM collector
    • Fixed database: prevent orphan blank device rows after registration
    • Fixed frontend: mobile drives tab redirect on phones

Other Changes

  • Update a drive profile entry to include 4TB variant of the BX500 (#596)
    • Following our discussion on the simimar PR #581.
    • The Crucial BX500 consumer drive profile regex only matches the 250GB, 500GB, 1TB and 2TB variants.
    • The 4TB model (CT4000BX500SSD1) is missing, causing Scrutiny to fall back to generic ATA rules with the message "Using generic ATA rules. No vetted consumer drive profile matched this drive."

v1.62.3

Choose a tag to compare

@Starosdev Starosdev released this 05 Jun 00:43

v1.62.3 (2026-06-05)

Release Highlights

  • Fix for zero temperature readings (#594) - Closes #587
    • Users can now see zero-temperature summaries correctly.
    • The frontend display has been improved for better clarity.
    • Dialog tests have been stabilized to enhance user experience.

Dependencies

  • Update quic-go library (#589)

  • Update tmp package in frontend (#571)

  • Address frontend npm security issues (#591)

    • Specific npm overrides have been added to fix security vulnerabilities.
    • The webapp/frontend/package-lock.json has been regenerated to address Dependabot alerts.
    • Broader npm audit issues have been resolved for several packages.