Commit 6e9dea95d0

6e9dea95d015c0f2d335d9b89b8ee843b4c2b05e

parent: fd8ca178a3

Unsigned

cmc <hello@cleberg.net> · 2026-07-17 16:20 UTC

v4.8.0: Bump version and mark shipped in roadmap

Bump AppVersion/marketing version to 4.8.0 and build number to 40 across the
app, widget, and share extension targets. Mark v4.8.0 (markdown/PDF export,
scheduled reports, stronger share affordances, verified local API consistency)
shipped in RELEASE_ROADMAP.md.

Layout: unified · split

DomainDig.xcodeproj/project.pbxproj +12 −12
@@ -495,7 +495,7 @@
495495 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
496496 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements;
497497 CODE_SIGN_STYLE = Automatic;
498 CURRENT_PROJECT_VERSION = 39;
498 CURRENT_PROJECT_VERSION = 40;
499499 DEVELOPMENT_TEAM = ZCNAX3VL9D;
500500 ENABLE_PREVIEWS = YES;
501501 GENERATE_INFOPLIST_FILE = YES;
@@ -512,7 +512,7 @@
512512 "$(inherited)",
513513 "@executable_path/Frameworks",
514514 );
515 MARKETING_VERSION = 4.7.0;
515 MARKETING_VERSION = 4.8.0;
516516 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig;
517517 PRODUCT_NAME = "$(TARGET_NAME)";
518518 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -532,7 +532,7 @@
532532 ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
533533 CODE_SIGN_ENTITLEMENTS = DomainDig/DomainDig.entitlements;
534534 CODE_SIGN_STYLE = Automatic;
535 CURRENT_PROJECT_VERSION = 39;
535 CURRENT_PROJECT_VERSION = 40;
536536 DEVELOPMENT_TEAM = ZCNAX3VL9D;
537537 ENABLE_PREVIEWS = YES;
538538 GENERATE_INFOPLIST_FILE = YES;
@@ -549,7 +549,7 @@
549549 "$(inherited)",
550550 "@executable_path/Frameworks",
551551 );
552 MARKETING_VERSION = 4.7.0;
552 MARKETING_VERSION = 4.8.0;
553553 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig;
554554 PRODUCT_NAME = "$(TARGET_NAME)";
555555 STRING_CATALOG_GENERATE_SYMBOLS = YES;
@@ -568,7 +568,7 @@
568568 APPLICATION_EXTENSION_API_ONLY = YES;
569569 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements;
570570 CODE_SIGN_STYLE = Automatic;
571 CURRENT_PROJECT_VERSION = 39;
571 CURRENT_PROJECT_VERSION = 40;
572572 DEVELOPMENT_TEAM = ZCNAX3VL9D;
573573 GENERATE_INFOPLIST_FILE = NO;
574574 INFOPLIST_FILE = DomainDigWidget/Info.plist;
@@ -579,7 +579,7 @@
579579 "@executable_path/Frameworks",
580580 "@executable_path/../../Frameworks",
581581 );
582 MARKETING_VERSION = 4.7.0;
582 MARKETING_VERSION = 4.8.0;
583583 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget;
584584 PRODUCT_NAME = "$(TARGET_NAME)";
585585 SKIP_INSTALL = YES;
@@ -597,7 +597,7 @@
597597 APPLICATION_EXTENSION_API_ONLY = YES;
598598 CODE_SIGN_ENTITLEMENTS = DomainDigWidget/DomainDigWidget.entitlements;
599599 CODE_SIGN_STYLE = Automatic;
600 CURRENT_PROJECT_VERSION = 39;
600 CURRENT_PROJECT_VERSION = 40;
601601 DEVELOPMENT_TEAM = ZCNAX3VL9D;
602602 GENERATE_INFOPLIST_FILE = NO;
603603 INFOPLIST_FILE = DomainDigWidget/Info.plist;
@@ -608,7 +608,7 @@
608608 "@executable_path/Frameworks",
609609 "@executable_path/../../Frameworks",
610610 );
611 MARKETING_VERSION = 4.7.0;
611 MARKETING_VERSION = 4.8.0;
612612 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigWidget;
613613 PRODUCT_NAME = "$(TARGET_NAME)";
614614 SKIP_INSTALL = YES;
@@ -626,7 +626,7 @@
626626 APPLICATION_EXTENSION_API_ONLY = YES;
627627 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements;
628628 CODE_SIGN_STYLE = Automatic;
629 CURRENT_PROJECT_VERSION = 39;
629 CURRENT_PROJECT_VERSION = 40;
630630 DEVELOPMENT_TEAM = ZCNAX3VL9D;
631631 GENERATE_INFOPLIST_FILE = NO;
632632 INFOPLIST_FILE = DomainDigShareExtension/Info.plist;
@@ -637,7 +637,7 @@
637637 "@executable_path/Frameworks",
638638 "@executable_path/../../Frameworks",
639639 );
640 MARKETING_VERSION = 4.7.0;
640 MARKETING_VERSION = 4.8.0;
641641 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension;
642642 PRODUCT_NAME = "$(TARGET_NAME)";
643643 SKIP_INSTALL = YES;
@@ -655,7 +655,7 @@
655655 APPLICATION_EXTENSION_API_ONLY = YES;
656656 CODE_SIGN_ENTITLEMENTS = DomainDigShareExtension/DomainDigShareExtension.entitlements;
657657 CODE_SIGN_STYLE = Automatic;
658 CURRENT_PROJECT_VERSION = 39;
658 CURRENT_PROJECT_VERSION = 40;
659659 DEVELOPMENT_TEAM = ZCNAX3VL9D;
660660 GENERATE_INFOPLIST_FILE = NO;
661661 INFOPLIST_FILE = DomainDigShareExtension/Info.plist;
@@ -666,7 +666,7 @@
666666 "@executable_path/Frameworks",
667667 "@executable_path/../../Frameworks",
668668 );
669 MARKETING_VERSION = 4.7.0;
669 MARKETING_VERSION = 4.8.0;
670670 PRODUCT_BUNDLE_IDENTIFIER = net.cleberg.DomainDig.DomainDigShareExtension;
671671 PRODUCT_NAME = "$(TARGET_NAME)";
672672 SKIP_INSTALL = YES;
DomainDig/AppVersion.swift +1 −1
@@ -2,6 +2,6 @@ import Foundation
22
33enum AppVersion {
44 nonisolated static var current: String {
5 "4.7.0"
5 "4.8.0"
66 }
77}
RELEASE_ROADMAP.md +25 −5
@@ -6,7 +6,7 @@ ports, geolocation, subdomains, availability). The next several releases invest
66in *reach and surfacing* — getting that data onto more iOS surfaces and into more
77workflows — rather than adding raw protocol checks.
88
9Current version: `v4.7.0`.
9Current version: `v4.8.0`.
1010
1111## v4.4.1 Patch: Release Readiness — ✅ shipped
1212
@@ -68,13 +68,33 @@ Goal: help users interpret and organize, not just collect.
6868 domain, tag filter chips, and named saved filter/sort/tag presets
6969 (UserDefaults-backed; not yet part of backup/restore).
7070
71## v4.8.0 Minor: Reporting & Sharing
71## v4.8.0 Minor: Reporting & Sharing — ✅ shipped
7272
7373Goal: turn point-in-time snapshots into shareable, scheduled deliverables.
7474
75- Scheduled report generation (markdown/json/pdf) for tracked domains.
76- Stronger share affordances for reports and audit evidence.
77- Export polish and consistency across app and local API output.
75- **Markdown and PDF export formats** — `DomainExportFormat` gains `.markdown`
76 and `.pdf` alongside text/csv/json. Markdown reuses the existing text-export
77 content via a line-based transform (never drifts from the text export); PDF
78 renders that Markdown via `UIGraphicsPDFRenderer`, mirroring the approach
79 `AuditExporter` already used for audit sessions.
80- **Scheduled report generation** — `ScheduledReportService` /
81 `ScheduledReportScheduler` (Settings → Scheduled Reports): a BGTaskScheduler-
82 driven daily/weekly job that builds a markdown/PDF/JSON report bundle for all
83 tracked domains, writes it locally, logs the run, and notifies when ready.
84 Mirrors `DomainMonitoringService`'s headless, storage-backed design; gated
85 behind the same Pro `.automatedMonitoring` capability.
86- **Stronger share affordances** — "Export Markdown"/"Export PDF" added to the
87 single-result, batch, watchlist, and workflow export menus; generated
88 scheduled reports are individually shareable from their log.
89- **Export consistency verified** — the local API already serves the canonical
90 `DomainReport` directly (no field allowlist), so `reputation`, `domainPricing`,
91 and every other field added since v4.7.0 already flow through automatically.
92 No code change was needed there.
93
94Deferred/scoped out: scheduled-report settings and logs are UserDefaults-only
95(not part of `DomainDataPortabilityService` backup/restore), same reasoning as
96v4.7.0's watchlist saved views — this is local automation config, not
97user-authored content.
7898
7999## v5.0.0 Major: Contract Stabilization & Engineering Health
80100