Skip to content

Releases: Starosdev/scrutiny

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.

v1.62.2

Choose a tag to compare

@Starosdev Starosdev released this 01 Jun 18:05

v1.62.2 (2026-06-01)

Release Highlights

  • Improved Metrics and Drive Support (#586) - Closes #582, Closes #580, Closes #583
    • Enhanced reliability of metrics collection with better connection handling.
    • Resolved an issue with duplicate scan paths for megaraid drives.
    • Fixed the mobile drives tab redirect for mobile users.
    • Added support for the Crucial MX500 4TB ATA profile.
    • Addressed findings from SonarQube.

Other Changes

  • Added 4TB Variant to MX500 Drive Profile (#581)
    • The drive profile now includes the 4TB model (CT4000MX500SSD1) for the Crucial MX500.
    • Previously, the profile only matched the 250GB, 500GB, 1TB, and 2TB variants, leading to fallback to generic ATA rules.

v1.62.1

Choose a tag to compare

@Starosdev Starosdev released this 29 May 00:26

v1.62.1 (2026-05-29)

Bug Fixes

  • Skip empty device names from smartctl --scan output (#574) - Closes #569

    • Skip scan entries with empty device names in TransformDetectedDevices — these cause smartctl to be invoked with a bare prefix path (e.g. /dev/) which always fails with exit code 1
    • Add secondary guard in SmartCtlInfo to return an error immediately if DeviceName is empty, preventing the issue if an empty device ever reaches that path by other means
    • Log a warning when an empty-named entry is skipped so operators can see it in debug output
  • Fix stat card layout in BTRFS, ZFS, and drive detail views (#575)

    • treo-card has display: flex (row direction) from its base SCSS, causing direct children to lay out horizontally instead of vertically
    • Stat cards in detail views need flex-col so label/value pairs stack vertically
    • Affects BTRFS filesystem detail (reported), ZFS pool detail, and drive performance metric cards
  • Add --host-id flag to MDADM collector (#576) - Closes #573

    • Adds --host-id CLI flag to the MDADM collector, matching the ZFS and metrics collectors
    • Adds COLLECTOR_MDADM_HOST_ID / COLLECTOR_HOST_ID env var support
    • The underlying detect.go already read host.id from config to generate deterministic array IDs; the flag was simply never declared in the CLI
  • Prevent orphan blank device rows after registration (#577) - Closes #567

    • Reject devices with all identifying fields empty in RegisterDevice, preventing blank orphan rows created by deviceid.Generate("","","") producing a deterministic UUID from empty inputs
    • Add migration m20260528000000 to delete any existing orphan blank rows (where device_name, model_name, serial_number, and wwn are all NULL or empty)
    • Add tests covering blank-device rejection and migration cleanup behavior

Release Highlights

  • Collector fixes, MDADM host-id, Btrfs/ZFS layout, orphan device rows (#578) - Closes #567, Closes #569, Closes #572, Closes #573
    • Fix MDADM collector missing --host-id / COLLECTOR_MDADM_HOST_ID flag (#573)
    • Fix collector skipping devices with empty names from smartctl --scan output (#569)
    • Fix orphan blank device rows created after registration when device name is empty (#567)
    • Fix Btrfs filesystem detail and ZFS pool detail stat card flex layout on mobile (#572)
    • Fix omnibus compose docs missing Btrfs env vars and environment block indentation