Changelog

See what's new in each release of CheckWatch.

1.13.0

Maintenance

  • (deps)lock file maintenance (#2210)
  • (app)update python execution commands in ASC scripts to use uv run (#2679)
  • (ios)restore parallel testing with bounded worker count (#2705) (#2724)

Bug Fixes

  • (ios)improve empty and error state UX with actionable CTAs (#2237)
  • (app_ios)address Critical and High UX/UI review findings (#2253)
  • (app_ios)default debug builds to configured demo instance (#2254)
  • (app_ios)stabilize quiet hours toggle layout during state changes (#2284)
  • (app_ios)recover registration after reinstall (#2286)
  • (app_ios)harden TestFlight registration and pairing (#2292)
  • (app_ios)register purchased licenses before pairing (#2294)
  • (app_ios)surface silent registration failures and auto-recover (#2295)
  • (app_ios)expand host row tap target to full row bounds (#2298)
  • (app_ios)handle HTTP 429 and deduplicate relay registrations (#2315)
  • (app_ios)guard pairing on relay registration status (#2318)
  • (component)restore TestFlight registration flow (#2333)
  • (app_ios)add skip button to first launch QR setup screen (#2357)
  • (app_ios)add haptic feedback to StatCard button tap (#2458)
  • (app_ios)add visible affordance to HostDetailView service row actions (#2457)
  • (app_ios)replace HistoryView ProgressView spinner with skeleton loading rows (#2459)
  • (app_ios)mask license keys in LicenseManager debug logs (#2464)
  • (tooling)bump cryptography to >=46.0.6 for CVE-2026-34073 (#2549)
  • (app_ios)repair fixture path and harden #file walk-up in contract tests (#2567)
  • (deps)update dependency requests to >=2.33.1 (#2601)
  • (ci)prevent iOS test wrapper false positive on XCTest failures (#2626)
  • (ci)restore iOS LCOV artifact export in split test workflow (#2613)
  • (app_ios)skip host-authenticated StoreKit APIs during tests (#2623)
  • (ci)make four workflows fail on hidden errors (#2663)
  • (ci)combined iOS CI hardening (coverage gate, StoreKit isolation, threshold unification) (#2646)
  • (ci)add StoreKit config to scheme TestAction for CI tests (#2680)
  • (app_ios)stabilize StoreKit CI purchase tests (#2691)
  • (ios)gate coverage on app target and raise threshold to 70% (#2735) (#2754)

Refactoring

  • (app_ios)remove unused service state counters in APIService+Parsing (#2274)
  • (app_ios)flatten conditionals in asc_provisioning.py (#2454)
  • (app_ios)split PurchaseViewModelTests into domain-focused files (#2473)
  • (app_ios)simplify error property access in NetworkClient.swift (#2478)
  • (app_ios)remove legacy username keychain migration fallback (#2514)
  • (ios-tests)use xcresult as primary test result authority (#2624) (#2631)

Features

  • (app_ios)add claim-based binding support via POST /bind/claim (#2395)
  • (app_ios)redesign onboarding flow and fix notification permission timing (#2572)
  • (app_ios)support bootstrap token QR scanning and single-scan registration (#2709)

task

  • (app_ios)remove legacy QR pairing and /bind flow support (#2426)
  • (app_ios)align Swift 6 language mode and iOS 26.4 version pins (#2592)

Testing

  • (app_ios)raise ASC test coverage to 98% (#2729)

1.12.9

Bug Fixes

  • (ios)improve app UX based on Apple HIG audit (#2228)

1.12.8

Bug Fixes

  • (ios)improve UX across iOS app (#2222)

1.12.7

Bug Fixes

  • (ci)delete stale CI keychain before recreating in beta workflow (#2218)

1.12.6

Bug Fixes

  • (ios)shorten subscription descriptions to Apple 55-char limit (#2217)

1.12.5

Bug Fixes

  • (asc)GET-first strategy for subscription localizations (#2193)

1.12.4

Bug Fixes

  • (asc)verify and patch incomplete localizations on 409 (#2188)

1.12.3

Bug Fixes

  • (asc)add subscription group localization to provision command (#2187)

1.12.2

Bug Fixes

  • (ci)retry subscription check on unsellable states during preflight (#2182)

1.12.1

Bug Fixes

  • (ci)wire IAP screenshot upload into beta preflight (#2175)

1.12.0

Bug Fixes

  • (ci)make test output visible in CI logs (#1913)
  • (app_ios)shut down simulator after tests to prevent tee pipe hang (#1924)
  • (app_ios)sync device token rotation with relay registration (#1962)
  • (app_ios)serialize AVCaptureSession operations on dedicated queue (#1981)
  • (app_ios)remove undocumented fields from /register request body (#2000)
  • (app_ios)make checkmk_username required in bind request (#2131)
  • (app_ios)remove nonisolated(unsafe) data races in scanner and purchase flow (#2146)

lint

  • (app_ios)resolve all SwiftLint warnings across iOS codebase (#1908)

Refactoring

  • (app_ios)remove redundant fallbackState instance method wrapper (#1912)
  • (app_ios)parameterize API collection fetch methods (#2028)
  • (app_ios)remove redundant isRunning check before stopping capture session (#2161)

Documentation

  • (app_ios)document subscription business model for App Review (#1986)
  • restructure and reorganize docs/ directory (#2029)

security

  • (app_ios)enforce ATS on relay domain via NSExceptionDomains (#1985)
  • (app_ios)enforce whenUnlockedThisDeviceOnly on keychain items (#2116)

Features

  • (ci)upload subscription review screenshots via ASC IAP API (#2167)

1.11.7

Maintenance

  • (tooling)expand prettier coverage for json and css (#1887)

1.11.6

Refactoring

  • (component)replace app icon and changelog shell helpers with Python (#1876)

1.11.5

Documentation

  • (agents)move commands into component files (#1856)

1.11.4

Refactoring

  • (all)reduce 19 files below 600 LOC critical threshold (#1807)

1.11.3

Refactoring

  • (test)parametrize duplicate test clones in test_asc_api.py (#1799)

1.11.2

Documentation

  • (docs)improve AGENTS.md guidance quality and move test commands to component scope (#1786)

1.11.1

Refactoring

  • (app_ios)consolidate duplicate NetworkClient methods (#1716)

1.11.0

Bug Fixes

  • (app)implement Verify SSL toggle for runtime certificate validation (#1641)
  • (app)resolve data race in QRScannerView camera session (#1652)
  • (app)remove fire-and-forget Tasks and add cancellation support in ViewModels (#1664)
  • (relay)add Zod runtime validation for Firestore documents (#1667)
  • (app)route LicenseManager and RelayService through NetworkClient (#1668)
  • (app_ios)replace stale plugin setup instructions with QR pairing flow (#1680)
  • (app_ios)surface bindConnectionToken failure to UI (#1682)
  • (app_ios)accept v6 QR payloads alongside v5 in setup pairing (#1687)

Refactoring

  • (app_ios)replace duplicate error-state UI with ErrorStateView (#1670)

Features

  • (app_ios,tooling)implement StoreKit 2 TestFlight testing and purchase-gated release pipeline (#1695)

1.10.14

Documentation

  • (component)add development requirements to Required Reading sections (#1657)

1.10.13

Bug Fixes

  • (app)normalize URLError.cancelled to CancellationError in NetworkClient (#1653)

1.10.12

Bug Fixes

  • (ci)replace setup_ci with dedicated persistent CI keychain (#1628)

1.10.11

Bug Fixes

  • (app)sanitize stale debug license key in release builds (#1604)

1.10.10

Bug Fixes

  • (app)hide Done button when SettingsView is tab root (#1595)

1.10.9

Refactoring

  • (app)remove redundant catch blocks in NetworkClient.swift (#1593)

1.10.8

Bug Fixes

  • (app)populate system health metrics from CheckMK version endpoint (#1592)

1.10.7

task

  • (app)add iPad to screenshot pipeline and document landscape sizes (#1556)

1.10.6

Performance

  • (ci)consolidate iOS workflow into single job (#1551) (#1559)

1.10.5

Performance

  • (screenshots)optimize App Store screenshot generation speed (#1545)

1.10.4

Bug Fixes

  • (app)decouple TestFlight uploads from subscription readiness checks (#1557)

1.10.3

Bug Fixes

  • (app)fix screenshot workflow missing screens and framing failures (#1525)

1.10.2

Documentation

  • (app)refresh App Store metadata copy (#1549)

1.10.1

Bug Fixes

  • (app)declare collected data types in PrivacyInfo.xcprivacy (#1526)

1.10.0

Features

  • (app)add age rating questionnaire config for App Store submission (#1527)

1.9.11

Refactoring

  • (app,tooling)remove unnecessary else blocks after early returns (#1519)

1.9.10

Refactoring

  • replace broad except Exception handlers with specific types (#1520)

1.9.9

Refactoring

  • (app)consolidate redundant configuration checks in DashboardViewModel (#1517)

1.9.8

Bug Fixes

  • (app)expand screenshot workflow coverage and outputs (#1515)

1.9.7

Bug Fixes

  • (app)use top-level builds endpoint and improve availability logging (#1504)

1.9.6

Bug Fixes

  • (app)preload asc_fetch_state in test_asc_api dynamic loader (#1506)

1.9.5

Bug Fixes

  • (app)correct screenshot workflow scheme and add validation (#1495)

1.9.4

Bug Fixes

  • (ios)redact secrets and tokens from log statements (#1490)

1.9.3

Documentation

  • (app)fix broken backlog reference in asc_api.py summary (#1489)

1.9.2

Refactoring

  • (app)replace custom retry loop with tenacity in ASC API client (#1491)

1.9.1

task

  • (app)align product IDs with live App Store Connect state (#1485)

1.9.0

Features

  • (app)add full-day quiet hours suppression (#1466)

1.8.0

Features

  • (app)add script to fetch full App Store Connect app state (#1467)

1.7.15

Refactoring

  • (app)replace custom DateFormatter singletons with native FormatStyle (#1461)

1.7.14

Bug Fixes

  • (app)migrate username storage from UserDefaults to Keychain (#1460)

1.7.13

Documentation

  • (app)document App Store Connect API location and query workflow (#1454)

1.7.12

Bug Fixes

  • (app)use offline fixture data for App Store screenshot generation (#1458)

1.7.11

Refactoring

  • (app)simplify mapNotificationToEventType logic (#1456)

1.7.10

Bug Fixes

  • (app)handle versioned ASC subscription IDs (#1449)

1.7.9

Bug Fixes

  • (app)honor useSSL toggle in all builds, not just DEBUG (#1434)

1.7.8

Refactoring

  • (app)deduplicate iOS acknowledgment code (#1423)

1.7.7

Documentation

  • add signing research ADR and scope setup_ci to signing lanes (#1422)

1.7.6

Bug Fixes

  • (app)migrate pairedCheckmkUsername to Keychain, remove dead deviceTokenError writes (#1414)

1.7.5

Bug Fixes

  • (tooling)replace bare python execution with uv run (#1415)

1.7.4

Refactoring

  • (app)replace repetitive StatCard instantiations with data-driven ForEach (#1417)

1.7.3

Bug Fixes

  • (app)use v2 subscription product IDs to resolve ASC 409 conflicts (#1394)

1.7.2

Refactoring

  • (app)extract shared SearchFilterToolbar from HostsView and ServicesView (#1393)

1.7.1

Refactoring

  • (asc)remove redundant inAppPurchasesV2 check from run_full_check (#1379)

1.7.0

Features

  • (app)add screenshot framing, upload, and orchestrator lanes (#1366)

1.6.2

Refactoring

  • (app)remove redundant default implementation of removeHostAcknowledgment (#1354)

1.6.1

Maintenance

  • (app)remove unused imports in App Store Connect scripts (#1351)

1.6.0

Features

  • (app)connect screenshot tests to real CheckMK server (#1326)

1.5.1

Bug Fixes

  • (app)align StoreKit test catalog descriptions with ASC provisioning metadata (#1321)

1.5.0

Features

  • (tooling)reduce simulator boot overhead in CI (#1320)

1.4.0

Bug Fixes

  • (app)enforce subscription check fail mode in beta preflight (#1319)

Refactoring

  • (app)migrate NavigationView to NavigationStack (#1311)

Features

  • (tooling)build iOS app once and share artifacts across CI test jobs (#1299)

1.3.2

Bug Fixes

  • (app)register xctestplan files in Xcode project to fix CI test failures (#1314)

1.3.1

Bug Fixes

  • (tooling)document parallel UI testing investigation and add clone cleanup (#1308)

1.3.0

Features

  • (app)add Xcode test plans for parallel and timeout control (#1295)

1.2.1

Bug Fixes

  • (app)configure subscription localizations and pricing in ASC provisioning (#1296)

1.2.0

Features

  • (tooling)split UI tests into parallel CI jobs via matrix strategy (#1290)

1.1.0

Bug Fixes

  • (app)add 409 recovery for subscription creation in ASC provisioning (#1263)
  • (app)remove mock data fallbacks and hardcoded values (#1274)
  • (app)add retry logic for ASC subscription lookup in preflight check (#1281)
  • (ci)fix release workflow push failures and iOS beta subscription check (#1287)

Features

  • (app)integrate automatic versioning into Fastlane (#1265)

Testing

  • (app)add missing unit tests for asc_api.py core functions (#1275)

Refactoring

  • (app)remove redundant concurrency wrappers in @MainActor classes (#1282)
  • (app)DRY up duplicated view components and state mappings (#1289)

1.0.0

Refactoring

  • (app)rename app/ to app_ios/ and move app_store_connect/ inside (#973)
  • (tooling)restructure tooling directory by concern (#986)

Features

  • (relay)notification relay environment separation (staging + production) (#991)
  • (tooling)automate changelog generation with git-cliff (#990)
  • (tooling)add build provenance metadata to release artifacts (#997)
  • (app)add error handling and failure notifications to Fastlane lanes (#1028)
  • (app)unify iOS test execution via Fastlane tests lane (#1031)
  • (tooling)add shfmt formatting validation to shell CI (#1075)
  • (app)add privacy manifest for App Store compliance (#1198)

Documentation

  • (app)mark release_notes.txt as auto-generated (#1012)
  • (app)fix stale app/ path references to app_ios/ (#1072)
  • (relay)fix Cloud Function URL path in docs and iOS config (#1216)

Bug Fixes

  • (app)pre-check camera permission before presenting QR scanner (#1016)
  • (app)update Snapshotfile devices to iPhone 17 era (#1015)
  • (app)use correct ASC API endpoints for subscription provisioning (#1096)
  • (infra)replace defunct checkwatch.app domain with checkwatch.nl (#1103)
  • (app)replace UIKit subscription management with SwiftUI modifier (#1107)
  • (app)harden simulator flake detection and enable unit test retry (#1121)
  • (app)run ASC provision before check in preflight_asc lane (#1129)
  • (app)resolve double /v1 prefix in ASC API URL construction (#1135)
  • (app)resolve preflight_asc check false failure and provision 409 recovery
  • (app)add subscription-check warn mode for beta releases
  • (app)replace is_ci with ENV check in Matchfile for Ruby 4.0 compat (#1140)
  • (app)override match readonly in build_beta to allow cert creation (#1142)
  • (app)remove MATCH_READONLY env override from setup_ci (#1143)
  • (app)ensure push notifications capability and force profile regeneration (#1144)
  • (ios)resolve match profile name and add signing diagnostics
  • (ios)handle missing git-cliff tags in upload_beta lane
  • (ios)clean up fastlane_tmp_keychain after CI runs (#1161)
  • (tooling)count iOS LCOV coverage from DA records when LF/LH absent (#1180)
  • (app)use xcresult metadata for test counts when log parsing fails (#1186)
  • (app)add ITSAppUsesNonExemptEncryption to Info.plist (#1202)
  • (app)use __dir__ instead of Dir.pwd for path resolution in Fastfile (#1222)
  • (app)validate subscription saleability state in ASC preflight check (#1233)

Maintenance

  • (app)remove dead credential-based auth references (#1023)
  • (app)migrate code signing from cert/sigh to fastlane match (#1092)
  • (app)remove unused Slack notification references (#1100)
  • (app)temporarily disable match readonly for certificate bootstrap (#1141)
  • (ios)revert temporary bootstrap settings
  • (app)add SwiftPM and DerivedData caching to iOS workflows (#1192)

Testing

  • (app)add EventType and HistoryEvent presentation tests (#1200)
  • add unit tests for main() CLI routing in asc_api.py (#1219)