Skip to content

Keryx dependency ownership and vendored ntfy ​

Approved: 25 August 2026

This document is the P1-09 ownership and compliance packet for Keryx for SafeCall dependencies and the in-repo vendored ntfy plugin. It inventories direct Dart packages, records license notes from locked versions, assigns update and vulnerability ownership, and aligns privacy-manifest expectations with Apple privacy compliance.

It does not claim that a machine SBOM or LICENSE/NOTICE archive was produced, that every transitive Gradle/CocoaPods license was enumerated, that privacy manifests are fixed or verified on a signed binary, or that CI dependency gates exist.

Purpose and non-goals ​

Purpose

  • Establish ownership for dependency and vendored-plugin maintenance.
  • Inventory direct dependencies and known privacy-impacting surfaces for store and release evidence.
  • Approve update/advisory cadence and vulnerability response for launch.
  • Document vendored ntfy provenance, versioning, and maintainer duties.

Non-goals

  • Generating machine SBOM artifacts or packaging NOTICE into AAB/IPA.
  • Wiring CI license/supply-chain gates (#112).
  • Verifying every plugin privacy signature on a signed candidate (#109 / #110 / #125).
  • Publishing the vendored plugin to pub.dev.
  • Adding an analytics or crash SDK (prohibited at launch by P0-05).

Approved decisions ​

  • Owner and approver: Thomas Minitsios, 25 August 2026 (P0-05 RACI).
  • Vendored ntfy: in-repo, first-party-maintained path dependency keryx/vendor/ntfy at 1.0.2-keryx.1; not a pub.dev release.
  • Advisory cadence: review at least quarterly (aligned with #133) and before each store submission.
  • Launch gate: no known critical or high unmitigated advisory on direct dependencies or vendored ntfy at go/no-go.
  • Telemetry: no analytics or crash SDK at launch (P0-05).

Direct dependency inventory ​

Versions below are from keryx/pubspec.lock as of this approval (25 August 2026). Re-check the lockfile before submission. Update owner for all rows: Thomas Minitsios.

PackageLocked versionPurposePrivacy impactLicense (package LICENSE)
Flutter SDK(environment)App frameworkPlatform APIs via pluginsFlutter / Dart project licenses
cupertino_icons1.0.9Icon fontNone materialMIT
mobile_scanner7.2.0SafeCall QR camera scanCameraBSD-3-Clause
shared_preferences2.5.5Local config / history prefsDevice storage / UserDefaultsBSD-3-Clause (Flutter Authors)
http1.6.0HTTPS calls as neededNetworkBSD-3-Clause (Dart authors)
flutter_local_notifications22.0.1Local notification presentationNotifications; UserDefaults (plugin manifest)BSD-3-Clause
app_badge_plus1.3.2App icon badgeBadge APIMIT
ntfy (path)1.0.2-keryx.1Background subscribe / wake hooksNetwork; prefs/UserDefaults; Android FGS/boot today; FCM/APNs when implementedMIT (keryx/vendor/ntfy/LICENSE, Copyright 2026 Karsmiths Solutions)

Dev-only: flutter_test, flutter_lints — not shipped in release binary; owner still reviews if they affect CI trust.

Native and transitive posture ​

Android and iOS transitive native libraries arrive through Flutter plugins (Gradle / CocoaPods). This packet does not enumerate every transitive artifact.

Known privacy-impacting native surfaces for launch forms:

  • Camera stack via mobile_scanner
  • Preferences / UserDefaults via shared_preferences (+ foundation implementation) and vendored ntfy
  • Notifications / badges via flutter_local_notifications and app_badge_plus
  • Vendored ntfy Android service/boot receivers (to be removed or minimized per Android delivery)
  • Future FCM / APNs registration via client ntfy (P1-03 / P1-04)

Full transitive license aggregation and automated SBOM generation are owned by #112 and release evidence under #125.

Store Data Safety and App Privacy answers remain play-data-safety.md and apple-privacy-compliance.md.

Privacy-manifest and SDK checklist ​

Align with Apple privacy compliance. Inventory status for this packet (source / pub-cache observation — not signed-archive verification):

ComponentPrivacyInfo observationPacket requirement
App-level RunnerNo app-level PrivacyInfo.xcprivacy under keryx/ios/Add before submission
Vendored ntfySource lists empty NSPrivacyAccessedAPITypes while using UserDefaultsDeclare CA92.1 (P1-07); implement in source
shared_preferences / foundationHosted package ships PrivacyInfo.xcprivacyConfirm survives packaging on signed IPA (#110)
flutter_local_notificationsiOS manifest includes UserDefaults CA92.1Confirm on signed IPA
mobile_scannerDarwin privacy plist present (empty accessed-API array in observed version)Confirm camera purpose strings + packaging (#110)
app_badge_plusiOS/macOS privacy plist presentConfirm on signed IPA
http / cupertino_iconsNo native privacy manifest expectedN/A

Closing this item inventories expectations. It does not claim manifests are fixed in source or verified on a signed candidate.

Vendored ntfy ownership ​

TopicRecord
Pathkeryx/vendor/ntfy (path dependency from keryx/pubspec.yaml)
Version1.0.2-keryx.1 (publish_to: none)
ProvenanceIn-repo Keryx-maintained fork for SafeCall companion delivery. Compare to public ntfy clients as reference only; do not invent an external upstream URL in this packet.
MaintainerThomas Minitsios / sourcectl
LicenseMIT — keryx/vendor/ntfy/LICENSE (Copyright 2026 Karsmiths Solutions)
Modifications in scopeAndroid FCM wake + authenticated poll (perpetual dataSync FGS removed); iOS Firebase topic subscribe + poll_request / APNs hooks; SharedPreferences / UserDefaults subscription state; Dart plugin API used by Keryx
TestsKeryx Dart tests under keryx/test/; native NtfyPolicyGate / NtfyFirebaseWake / NtfyRemoteWake tests in vendor/ntfy. Deeper CI gates → #112
VersioningKeep *-keryx.N until a publishable package decision is made
Vulnerability responseOwner triages advisories affecting the plugin or its transitive native surface; patch the vendored tree or upgrade dependents; unmitigated critical/high blocks launch go/no-go

Update and advisory cadence ​

WhenAction
QuarterlyReview direct deps, vendored ntfy, and known plugin advisories; record outcome with #133
Before each store submissionRe-check pubspec.lock, vendor tree, and open critical/high advisories
On advisoryOwner triages within support/escalation norms (P0-05); patch or accept risk explicitly in roadmap with review date

This packet records the process. It does not automate scanning.

Release notice and archive plan ​

At each release candidate, archive under store/release evidence (#125 / publishing runbook):

  • keryx/pubspec.lock
  • Source commit SHA
  • Any machine-generated SBOM or NOTICE outputs once #112 produces them
  • Signed-binary privacy reports (#110) and Play/ASC form snapshots (#125)

Public NOTICE packaging inside the binary, if required by a specific license obligation discovered in the full transitive pass, is a release artifact task — not claimed complete by closing #102.

Evidence handoffs ​

EvidenceOwner
Machine SBOM + CI license/supply-chain gates#112
Implement CA92.1 + app-level privacy manifestsLater implementation (P1-07)
Production signing; AAB/IPA privacy verification#109 / #110
Archive notices with store evidence#125
Quarterly reviews#133 + this owner
Apple / Play form alignmentapple-privacy-compliance.md, play-data-safety.md

Explicit non-claims ​

Closing #102 approves this packet. It does not:

  • claim a machine SBOM or LICENSE/NOTICE zip was produced;
  • claim every transitive Gradle/Pod license was enumerated;
  • claim privacy manifests are fixed or signed-report-verified;
  • claim CI dependency gates exist;
  • claim the vendored fork is published to pub.dev.

Review record ​

  • Status: approved as the P1-09 dependency and vendored-ntfy ownership packet.
  • Date: 25 August 2026.
  • Approver: Thomas Minitsios under the P0-05 RACI.
  • Depends on: P0-05 ownership, apple-privacy-compliance.md, play-data-safety.md, android-delivery-architecture.md.
  • Evidence sources: keryx/pubspec.yaml, keryx/pubspec.lock, keryx/vendor/ntfy/ (LICENSE, manifests, native sources), hosted package LICENSE / PrivacyInfo observations in pub-cache for locked versions.