github AnalogJ/scrutiny v0.10.0

4 hours ago
Timestamp SHA Message Author
2026-11-01T05:35Z 3ae9db2 (v0.10.0) Automated packaging of release by Packagr packagrio-bot
2026-10-31T15:56Z 87682de test(notify): expect GetDeviceDetails in irregular upload test (#1137)
  • add GetDeviceDetails mock expectation to TestMissedUploadTracker_IrregularUploadKeepsEstimate Claude-Session: https://claude.ai/code/session_01GRHbNYzX3T1jbmuDUhuJJe Co-authored-by: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-10-24T22:51Z 5e71f6a feat(notify): name devices by friendly_name in notifications (#1136) Claude-Session: https://claude.ai/code/session_012Z7GCmjBAZyr57e2q2Yeg7 Co-authored-by: Claude Opus 5.5 noreply@anthropic.com Aram Akhavan
    2026-10-24T22:50Z fa47b44 fix(notify): keep the estimated upload period while uploads settle (#1135) Claude-Session: https://claude.ai/code/session_012Z7GCmjBAZyr57e2q2Yeg7 Co-authored-by: Claude Opus 5.5 noreply@anthropic.com Aram Akhavan
    2026-10-24T02:54Z cc48b73 feat(webapp): store friendly_name in the database and edit it from device settings (#1131)
  • remove devices[].friendly_name from config
  • persist Device.FriendlyName, add m20261021150000 migration
  • add UpdateDeviceFriendlyName to DeviceRepo and regenerate mock
  • add POST /api/device/:scrutiny_uuid/friendly_name
  • drop config lookups in device details and summary handlers
  • implement DetailSettingsComponent with a full-width Friendly Name input, prefilled from the device details
  • open device settings dialog at 600px
  • add setFriendlyName to DetailService
  • replace device object after save so the detail title updates
  • add server test and update config and component specs Claude-Session: https://claude.ai/code/session_016mJ4NiUfTGspusCoqYHATc Co-authored-by: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-10-23T18:50Z a253dae feat(config): add global notify.on_missed_upload and notify.upload_period (#1133)
  • add both keys to scrutiny.yaml notify, defaulting to true and 0
  • fall back to them for devices without their own setting, or not in devices
  • make devices[].notifications.upload_period a pointer so 0 can override
  • validate notify.upload_period
  • add GetDuration to the config interface
  • update examples, README and tests Co-authored-by: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01Xn7iu3egYCo31BcvY9m1Ux
  • Aram Akhavan
    2026-10-23T18:39Z b10e260 feat(config): move per-device on_smartctl_error to scrutiny.yaml (#1128)
  • add devices[].notifications.on_smartctl_error to scrutiny.yaml
  • skip collector error notifications for devices that disable it
  • add notify.on_smartctl_error to scrutiny.yaml, defaulting to true
  • drop devices[].notify.on_smartctl_error from collector.yaml
  • update examples, README and tests Co-authored-by: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-10-23T17:34Z f51e7e6 refactor(config): look up device config by scrutiny_uuid (#1130)
  • parse devices[].scrutiny_uuid as a uuid.UUID
  • type DeviceConfig.ScrutinyUUID as uuid.UUID
  • decode it with mapstructure's text unmarshaller hook
  • reject missing UUIDs in ValidateConfig
  • drop string parsing in lookup and missed upload tracker Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01NqbhNANgXNeY3vyryKGxRf
  • Aram Akhavan
    2026-10-22T05:43Z bb2f84c feat(notify): skip notifications for devices with notifications.disabled (#1127)
  • add disabled to devices[].notifications
  • add config.GetNotificationsDisabled helper
  • store ScrutinyUUID on Notify, return early in Send() when disabled
  • document in README and example.scrutiny.yaml
  • test config parsing and Send() for each notification type Co-authored-by: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-10-22T04:46Z bd78fcd docs: add AGENTS.md (#1126) Co-authored-by: Claude Opus 5.5 noreply@anthropic.com Aram Akhavan
    2026-09-30T18:06Z c2ba6fb feat(webapp): title devices by host and friendly_name (#1100)
  • DeviceModel.friendly_name
  • deviceTitleForType returns friendly_name when set, for any title type
  • title is host_id - friendly_name; title sort uses it too Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-09-30T18:06Z 04baa9c feat(api): return each device's friendly_name from scrutiny.yaml (#1100)
  • devices entries accept friendly_name
  • config.GetFriendlyNames: scrutiny UUID -> friendly_name
  • models.Device.FriendlyName: JSON only, not stored
  • summary and details handlers fill it in
  • friendly_name in example.scrutiny.yaml Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-09-30T17:53Z df420bf feat(notify): notify when a device misses an upload (#1099)
  • MissedUploadTracker: per-UUID circular buffer of the last 3 upload times, for every device except on_missed_upload: false
  • upload_period 0: period is the average of the 2 deltas once they're within 10%; warns and waits otherwise
  • each upload stops the pending timer, then starts one for period + 10% that sends a MissedUpload notification
  • estimated periods saved to devices.estimated_upload_period (migration) and reloaded on startup
  • UploadDeviceMetrics records successful uploads; AppEngine.Setup shares one tracker
  • docs: devices in example.scrutiny.yaml, README section, SCRUTINY_FAILURE_TYPE values Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-09-30T17:45Z 6082b4f refactor(notify): share the device message body across notification types (#1099)
  • generateDeviceMessage: title, set device fields, details, date
  • GenerateCollectorErrorMessage uses it Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-09-30T17:44Z 5b80316 feat(config): accept a devices list in scrutiny.yaml (#1099)
  • config.DeviceConfig: scrutiny_uuid, notifications.on_missed_upload, notifications.upload_period
  • configuration.GetDevices decodes devices; added to config.Interface and its mock
  • ValidateConfig rejects invalid UUIDs and invalid or negative periods Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-10-12T21:51Z ac2056d build(go): bump Go to 1.27.2 and golang.org/x/net to v0.61.0 (#1115)
  • build(go): source Go toolchain version from go.mod
  • drop Makefile GOTOOLCHAIN export and lint-target override
  • add go-version-file: go.mod to setup-go actions
  • bump ci build job setup-go v3 -> v6
  • bump Docker build images
  • run release tests on go.mod toolchain
  • set GOTOOLCHAIN=auto on release Test step Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com
  • Aram Akhavan
    2026-10-12T19:31Z 73bd56d ci(docker): scan published images for vulnerabilities (#1114) Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Aram Akhavan
    2026-10-12T18:30Z 9377054 ci(dependabot): add dependabot.yml (#1113) Co-authored-by: Claude Opus 5.5 noreply@anthropic.com Aram Akhavan
    2026-10-04T22:57Z 9fc491c build(deps-dev): bump piscina from 5.3.0 to 5.3.2 in /webapp/frontend (#1106) Bumps piscina from 5.3.0 to 5.3.2. - Release notes - Changelog - Commits --- updated-dependencies: - dependency-name: piscina dependency-version: 5.3.2 dependency-type: indirect ... Signed-off-by: dependabot[bot] support@github.com Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> dependabot[bot]
    2026-10-04T22:57Z aaae0d0 build(deps): bump brace-expansion in /webapp/frontend (#1105) Bumps brace-expansion from 2.1.2 to 2.1.7. - Release notes - Commits --- updated-dependencies: - dependency-name: brace-expansion dependency-version: 2.1.7 dependency-type: indirect ... Signed-off-by: dependabot[bot] support@github.com Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> dependabot[bot]
    2026-10-04T22:56Z aee58e9 build(deps): bump moment from 2.30.1 to 2.31.0 in /webapp/frontend (#1104) Bumps moment from 2.30.1 to 2.31.0. - Release notes - Changelog - Commits --- updated-dependencies: - dependency-name: moment dependency-version: 2.31.0 dependency-type: direct:production ... Signed-off-by: dependabot[bot] support@github.com Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> dependabot[bot]
    2026-09-30T22:50Z 043758c feat(detail): show total bytes read/written on the device details card (#1097)
  • parse ATA device statistics from smartctl
  • store total_bytes_read/written per smart measurement
  • show Total Reads/Writes under Powered On in frontend details page when available Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com Claude-Session: https://claude.ai/code/session_01HRSXiP1svryqDpCQLuvBfn
  • Aram Akhavan
    2026-09-30T18:05Z 985907a chore(docker): bump omnibus InfluxDB to 2.8 (#1098) Claude-Session: https://claude.ai/code/session_01M32VXfytXy1EBddz3PKjEL Co-authored-by: Claude Opus 5.5 noreply@anthropic.com Aram Akhavan
    2026-09-25T03:26Z 1dbdc34 fix(collector): skip drives that -n left in a low power mode (#1032) Refs #942 Exit status 2 is shared: it means both "device open failed" and "device is in a low power mode and -n asked me to exit". When FAILDEV is the only bit set and the configured smart args contain -n/--nocheck, the drive is simply asleep, so the collector logs that at info level and moves on without publishing and without notifying. Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Aram Akhavan
    2026-09-25T03:25Z 245055c fix(collector): stop publishing incomplete smartctl data (#1032) Closes #944 - don't publish collector results from failed smartctl runs to avoid polluting the db - treat killed smartctl as a smartctl failure - check the backend's return code on publish and report non-200 Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Aram Akhavan
    2026-09-25T03:25Z a8ceac9 feat(collector): report smartctl failures so the webapp can notify (#1032) Closes #945 - add POST /api/collector/error, so the collector can report failures that leave a device missing from the dashboard rather than merely stale - split Detect.Start() into Scan() and Info(); Info() returns a DeviceInfoError per device, so each failure is reported with its own cause - report smartctl --scan failures and per-device smartctl --info failures, which were previously swallowed - a device that fails --info never gets a ScrutinyUUID, so it silently disappeared - new collector.yaml notify_on_smartctl_error (default true), and the same key per entry in devices:. The top level one covers --scan and any device without its own; a device's own setting takes priority The collector decides what is worth reporting, so there is no webapp setting and nothing to migrate. Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Aram Akhavan
    2026-09-25T20:27Z 05749d4 refactor(collector): type smartctl's exit status as a bitmask (#1032) - add SmartctlExitStatus mirroring smartctl.h, used by SmartInfo and Scan - LogSmartctlExitCode becomes LogSmartctlExitStatus, logging every set bit - the old if/else chain reported only the lowest bit, so status 0x18 logged "failing disk" and swallowed the pre-fail bit Co-Authored-By: Claude Opus 5 (1M context) noreply@anthropic.com Aram Akhavan

    Don't miss a new scrutiny release

    NewReleases is sending notifications on new releases.