<feed xmlns='http://www.w3.org/2005/Atom'>
<title>domain-dig.git/DomainDig/PurchaseService.swift, branch chore/owner-record-id-reveal</title>
<subtitle>local-first ios domain inspection toolkit. dns, tls, rdap, audit.
</subtitle>
<id>http://git.krz.sh/krz/domain-dig.git/atom?h=chore%2Fowner-record-id-reveal</id>
<link rel='self' href='http://git.krz.sh/krz/domain-dig.git/atom?h=chore%2Fowner-record-id-reveal'/>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/'/>
<updated>2026-07-20T21:27:59+00:00</updated>
<entry>
<title>v4.8.3: Clear SonarCloud new-code issues</title>
<updated>2026-07-20T21:27:59+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T21:22:28+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=bb18197860ffdb491f010648ec903003b6e1bb65'/>
<id>urn:sha1:bb18197860ffdb491f010648ec903003b6e1bb65</id>
<content type='text'>
Fixes the 4 reported bugs and ~97 code smells flagged in the new-code
period. No behavior changes.

Bugs (swift:S3923) — DomainInspectionService's confidenceFor* helpers each
returned `error == nil ? .low : .low`, an inert conditional. Simplified to
`return .low` and dropped the now-unused `error` parameter.

Smells:
- Merged 14 identical `.empty`/`.error` switch branches in DomainViewModel
- Consolidated duplicate implementations (clearPresentedResults/reset,
  String.nonEmpty/nilIfEmpty, ExportFormat.id/fileExtension)
- Extracted nested ternaries into TLSGrade.tone, EmailSecurityGrade.tone,
  and ChangeImpactClassification.color; removed ContentView.impactColor
  and the duplicate mapping in BatchResultsView
- Documented empty closures and singleton inits
- Marked unused protocol-conformance parameters `_`
- Renamed CloudSyncTrigger.`import` to `imported` (raw value preserved)
  and SSLSessionDelegate's _serverTrust/_tlsMetadata
- Merged nested ifs in the DER parser; flattened closure nesting in
  PortScanService and IntegrationService
- Replaced two-case switches with if/else

Left open: S107 (init parameter counts), S115 (constants mirroring DoH and
ipapi JSON keys), S1075 (false positives on https:// literals), and two
S117 hits on SwiftUI $binding shorthand. These want a Won't Fix resolution
in SonarCloud, not a code change.
</content>
</entry>
<entry>
<title>fix: match IAP product IDs to App Store Connect</title>
<updated>2026-07-20T20:07:40+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-07-20T19:03:36+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=024f611fbbf4d2405a10d649a59968617321732a'/>
<id>urn:sha1:024f611fbbf4d2405a10d649a59968617321732a</id>
<content type='text'>
The four product ID constants did not match the auto-renewable
subscriptions configured in App Store Connect, so Product.products(for:)
returned an empty array and tier(for:) resolved every purchase to .free.

Product IDs are permanent in App Store Connect, so the code is corrected
to match the configured values rather than the reverse:

  domaindig.pro.monthly      -&gt; domaindig.pro.month
  domaindig.pro.yearly       -&gt; domaindig.pro.annually
  domaindig.dataplus.monthly -&gt; domaindig.proplus.monthly
  domaindig.dataplus.yearly  -&gt; domaindig.proplus.annually
</content>
</entry>
<entry>
<title>DomainDig v4.1.0: Add a full local data reset flow in Data Management</title>
<updated>2026-04-25T05:41:34+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-25T05:41:34+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=535bb0ff0f64d57be1074e33ceb42f598f80205b'/>
<id>urn:sha1:535bb0ff0f64d57be1074e33ceb42f598f80205b</id>
<content type='text'>
- add a destructive Delete All Data action with confirmation, progress, success,
  and failure handling
- centralize wipe behavior in DataResetService instead of scattering delete
  logic in views
- clear local persistence, temp/export files, integration secrets,
  notifications, caches, and in-memory app state
- reset sync, purchase, and integration services after wipe so the app returns
  to a clean first-launch state

Polish batch and empty-state UX

- present the batch sweep summary after manual bulk searches complete, not only
  from Watchlist
- align the Workflows empty state styling with other empty states by removing
  the extra background card treatment

Bump the project version from 4.0.0 to 4.1.0
</content>
</entry>
<entry>
<title>DomainDig v3.8.0 — Smart Monitoring</title>
<updated>2026-04-24T20:04:54+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-24T20:04:54+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22'/>
<id>urn:sha1:3f0b7746b1bee4c2f626eb805e3fd13c5f2f5d22</id>
<content type='text'>
* Stable domain intervals
* Frequent changes decrease intervals
* Duplicate states do not trigger alerts
* Quiet hours suppress alerts
* Quiet hours across midnight work correctly
* Sensitivity levels alter behavior as expected
</content>
</entry>
<entry>
<title>feat(v3.2.0): add Data+ tier and external data integrations</title>
<updated>2026-04-22T18:47:37+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-22T18:47:37+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=6c23daaaba2a954220ece2afa7193dbdcad55c22'/>
<id>urn:sha1:6c23daaaba2a954220ece2afa7193dbdcad55c22</id>
<content type='text'>
- introduce Data+ tier for advanced data features
- add ownership history and DNS history
- expand subdomain discovery with external sources
- add domain pricing insights
- implement local usage/credit system
- integrate external data service layer with rate limiting
- extend export and CLI for Data+ features
</content>
</entry>
<entry>
<title>feat(v3​.1​.0): add ​Store​Kit integration and ​Pro tier</title>
<updated>2026-04-22T17:39:23+00:00</updated>
<author>
<name>Christian Cleberg</name>
<email>hello@cleberg.net</email>
</author>
<published>2026-04-22T17:39:23+00:00</published>
<link rel='alternate' type='text/html' href='http://git.krz.sh/krz/domain-dig.git/commit/?id=dcf4135ec376d357b8fafc0101a75b674e76329a'/>
<id>urn:sha1:dcf4135ec376d357b8fafc0101a75b674e76329a</id>
<content type='text'>
• implement Purchase​Service using StoreKit 2
• activate feature tiers based on entitlement
• add minimal paywall and restore flow
• enforce free-tier limits with upgrade paths
• integrate Pro status into settings
• ensure clean and non-intrusive monetization flow
</content>
</entry>
</feed>
