From 5c130c57f5a2b340812dad1993e83022ede192ff Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 15:03:25 -0500 Subject: [PATCH 01/16] Add Pulse as a dependency --- Modules/Package.resolved | 11 ++++++++++- Modules/Package.swift | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Modules/Package.resolved b/Modules/Package.resolved index 773acdfae160..cf147ce159bc 100644 --- a/Modules/Package.resolved +++ b/Modules/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "fa20aa25a9175838313543f726c7d0e88ab8ab5d611ea8d159bc549c27b0cda7", + "originHash" : "c040183dbb87d4f7ca1aa256a2faed284172acf4e4d9f8173ef207b01b5d415d", "pins" : [ { "identity" : "alamofire", @@ -232,6 +232,15 @@ "version" : "9.1.0" } }, + { + "identity" : "pulse", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kean/Pulse", + "state" : { + "revision" : "6125ce7fb51b114ba71b761d18cfd5557923bd4d", + "version" : "5.1.4" + } + }, { "identity" : "reachability", "kind" : "remoteSourceControl", diff --git a/Modules/Package.swift b/Modules/Package.swift index 05537222fc35..fa366a57a7d3 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -62,6 +62,7 @@ let package = Package( revision: "bf141adc75e2769eb469a3e095bdc93dc30be8de" ), .package(url: "https://github.com/wordpress-mobile/AztecEditor-iOS", from: "1.20.0"), + .package(url: "https://github.com/kean/Pulse", from: "5.0.0") ], targets: XcodeSupport.targets + [ .target(name: "AsyncImageKit", dependencies: [ @@ -371,6 +372,8 @@ enum XcodeSupport { .product(name: "MediaEditor", package: "MediaEditor-iOS"), .product(name: "NSObject-SafeExpectations", package: "NSObject-SafeExpectations"), .product(name: "NSURL-IDN", package: "NSURL-IDN"), + .product(name: "Pulse", package: "Pulse"), + .product(name: "PulseUI", package: "Pulse"), .product(name: "Reachability", package: "Reachability"), .product(name: "Starscream", package: "Starscream"), .product(name: "SVProgressHUD", package: "SVProgressHUD"), From 5bf5136b11df45a2d761749e931c1f9c431eda5c Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 15:05:16 -0500 Subject: [PATCH 02/16] Add FF --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 9f344b213e5f..50497c7447c8 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -27,6 +27,7 @@ public enum FeatureFlag: Int, CaseIterable { case intelligence case newSupport case nativeBlockInserter + case pulse /// Returns a boolean indicating if the feature is enabled. /// @@ -86,6 +87,8 @@ public enum FeatureFlag: Int, CaseIterable { return false case .nativeBlockInserter: return true + case .pulse: + return BuildConfiguration.current == .debug } } @@ -130,6 +133,7 @@ extension FeatureFlag { case .intelligence: "Intelligence" case .newSupport: "New Support" case .nativeBlockInserter: "Native Block Inserter" + case .pulse: "In-App Logger" } } } From cdd57b766a7c370e2262e0bd1503b446fca66a80 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 15:19:52 -0500 Subject: [PATCH 03/16] Integrate PulseUI.MainViewController --- .../App Settings/AppSettingsViewController.swift | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift b/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift index 65c553953360..3bcaacfd5805 100644 --- a/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift +++ b/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift @@ -7,6 +7,7 @@ import WordPressData import WordPressShared import ShareExtensionCore import SVProgressHUD +import PulseUI import WordPressFlux import DesignSystem import WordPressUI @@ -550,6 +551,11 @@ private extension AppSettingsViewController { action: pushDebugMenu() ) + let loggerRow = NavigationItemRow(title: Strings.logger, icon: UIImage(systemName: "record.circle")) { [weak self] _ in + let mainVC = PulseUI.MainViewController() + self?.present(mainVC, animated: true) + } + let designSystem = NavigationItemRow( title: NSLocalizedString("Design System", comment: "Navigates to design system gallery only available in development builds"), icon: UIImage(systemName: "paintpalette"), @@ -586,6 +592,10 @@ private extension AppSettingsViewController { rows.append(designSystem) } + if FeatureFlag.pulse.enabled { + rows.append(loggerRow) + } + if let presenter = RootViewCoordinator.shared.whatIsNewScenePresenter as? WhatIsNewScenePresenter, presenter.versionHasAnnouncements, FeatureFlag.whatsNew.enabled { @@ -636,5 +646,11 @@ extension AppSettingsViewController { value: "Experimental Features", comment: "The list item of experimental features that users can choose to enable" ) + + static let logger = NSLocalizedString( + "applicationSettings.logger", + value: "Logger", + comment: "A item in the menu" + ) } } From 12c2e0f30e89c160ce72d92d1e4511ed2642b41d Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 15:24:04 -0500 Subject: [PATCH 04/16] Disable Pulse Pro prompts --- .../ViewRelated/Me/App Settings/AppSettingsViewController.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift b/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift index 3bcaacfd5805..0dbff9b4d51a 100644 --- a/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift +++ b/WordPress/Classes/ViewRelated/Me/App Settings/AppSettingsViewController.swift @@ -552,6 +552,7 @@ private extension AppSettingsViewController { ) let loggerRow = NavigationItemRow(title: Strings.logger, icon: UIImage(systemName: "record.circle")) { [weak self] _ in + UserDefaults.standard.set(false, forKey: "pulse-disable-support-prompts") let mainVC = PulseUI.MainViewController() self?.present(mainVC, animated: true) } From 74b788e6a917b634d42b6eb9040a1cf17443a974 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 15:34:06 -0500 Subject: [PATCH 05/16] Add Bolt to enable super-experimental features --- .../ExperimentalFeaturesList.swift | 113 +++++++++++++++++- 1 file changed, 107 insertions(+), 6 deletions(-) diff --git a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift index a37733385d74..39b3268cbc51 100644 --- a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift +++ b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift @@ -5,6 +5,15 @@ public struct ExperimentalFeaturesList: View { @ObservedObject var viewModel: ExperimentalFeaturesViewModel + @AppStorage("superExperimentalFeaturesEnabled") + private var superExperimentalFeaturesEnabled = false + + @AppStorage("pulseEnabled") + private var pulseEnabled = false + + @State private var tapCount = 0 + @State private var showPulseAlert = false + package init(viewModel: ExperimentalFeaturesViewModel) { self.viewModel = viewModel } @@ -16,15 +25,39 @@ public struct ExperimentalFeaturesList: View { Toggle(item.name, isOn: viewModel.binding(for: item)) } } footer: { - if !viewModel.notes.isEmpty { - VStack(alignment: .leading, spacing: 4) { - ForEach(viewModel.notes, id: \.self) { note in - Text(note) - .font(.footnote) - .foregroundColor(.secondary) + VStack(alignment: .leading, spacing: 12) { + if !viewModel.notes.isEmpty { + VStack(alignment: .leading, spacing: 4) { + ForEach(viewModel.notes, id: \.self) { note in + Text(note) + .font(.footnote) + .foregroundColor(.secondary) + } + } + } + + if !superExperimentalFeaturesEnabled { + HStack { + Spacer() + boltButton + Spacer() } } } + .padding(.top, 8) + } + + if superExperimentalFeaturesEnabled { + Section { + Toggle("Pulse", isOn: $pulseEnabled) + .onChange(of: pulseEnabled) { oldValue, newValue in + if newValue { + showPulseAlert = true + } + } + } header: { + Text("Super Experimental Features") + } } } .listStyle(.insetGrouped) @@ -32,6 +65,50 @@ public struct ExperimentalFeaturesList: View { .task { await viewModel.loadItems() } + .alert(Strings.pulseAlertTitle, isPresented: $showPulseAlert) { + Button(Strings.pulseAlertCancel, role: .cancel) { + pulseEnabled = false + } + Button(Strings.pulseAlertConfirm) { + // User confirmed, keep pulseEnabled = true + // In a real implementation, this would trigger an app restart + } + } message: { + Text(Strings.pulseAlertMessage) + } + } + + private var boltButton: some View { + Image(systemName: "bolt.fill") + .font(.system(size: 20)) + .foregroundColor(.secondary) + .symbolEffect(.bounce.up, value: tapCount) + .onTapGesture { + handleBoltTap() + } + } + + private func handleBoltTap() { + tapCount += 1 + + let generator = UIImpactFeedbackGenerator(style: impactStyle(for: tapCount)) + generator.impactOccurred() + + if tapCount >= 5 { + withAnimation { + superExperimentalFeaturesEnabled = true + } + } + } + + private func impactStyle(for count: Int) -> UIImpactFeedbackGenerator.FeedbackStyle { + switch count { + case 1: return .light + case 2: return .medium + case 3: return .heavy + case 4: return .rigid + default: return .rigid + } } public static func asViewController( @@ -50,6 +127,30 @@ public struct ExperimentalFeaturesList: View { value: "Experimental Features", comment: "The title for the experimental features list" ) + + static let pulseAlertTitle = NSLocalizedString( + "experimentalFeaturesList.pulse.alert.title", + value: "Enable Pulse Logging?", + comment: "Alert title when enabling Pulse logging feature" + ) + + static let pulseAlertMessage = NSLocalizedString( + "experimentalFeaturesList.pulse.alert.message", + value: "This will enable extensive local logging for debugging purposes and add a new Logger row in App Settings. This is not recommended unless you know what you're doing. The app will restart to apply changes.", + comment: "Alert message explaining Pulse logging feature and warning users" + ) + + static let pulseAlertConfirm = NSLocalizedString( + "experimentalFeaturesList.pulse.alert.confirm", + value: "Apply & Restart", + comment: "Button to confirm enabling Pulse logging and restart the app" + ) + + static let pulseAlertCancel = NSLocalizedString( + "experimentalFeaturesList.pulse.alert.cancel", + value: "Cancel", + comment: "Button to cancel enabling Pulse logging" + ) } } From 01c88de5418e4626c50586645f66e1e8b8182926 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 15:56:41 -0500 Subject: [PATCH 06/16] Add Pulse to super experimental features --- .../ExperimentalFeaturesList.swift | 64 ++++++------------- .../ExperimentalFeatures/Feature.swift | 4 +- .../ExperimentalFeaturesDataProvider.swift | 22 ++++++- 3 files changed, 42 insertions(+), 48 deletions(-) diff --git a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift index 39b3268cbc51..4d6ed073f0d5 100644 --- a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift +++ b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift @@ -8,20 +8,24 @@ public struct ExperimentalFeaturesList: View { @AppStorage("superExperimentalFeaturesEnabled") private var superExperimentalFeaturesEnabled = false - @AppStorage("pulseEnabled") - private var pulseEnabled = false - @State private var tapCount = 0 - @State private var showPulseAlert = false package init(viewModel: ExperimentalFeaturesViewModel) { self.viewModel = viewModel } + private var regularFeatures: [Feature] { + viewModel.items.filter { !$0.isSuperExperimental } + } + + private var superExperimentalFeatures: [Feature] { + viewModel.items.filter { $0.isSuperExperimental } + } + public var body: some View { List { Section { - ForEach(viewModel.items) { item in + ForEach(regularFeatures) { item in Toggle(item.name, isOn: viewModel.binding(for: item)) } } footer: { @@ -47,16 +51,13 @@ public struct ExperimentalFeaturesList: View { .padding(.top, 8) } - if superExperimentalFeaturesEnabled { + if superExperimentalFeaturesEnabled && !superExperimentalFeatures.isEmpty { Section { - Toggle("Pulse", isOn: $pulseEnabled) - .onChange(of: pulseEnabled) { oldValue, newValue in - if newValue { - showPulseAlert = true - } - } + ForEach(superExperimentalFeatures) { item in + Toggle(item.name, isOn: viewModel.binding(for: item)) + } } header: { - Text("Super Experimental Features") + Text(Strings.superExperimentalSectionTitle) } } } @@ -65,17 +66,6 @@ public struct ExperimentalFeaturesList: View { .task { await viewModel.loadItems() } - .alert(Strings.pulseAlertTitle, isPresented: $showPulseAlert) { - Button(Strings.pulseAlertCancel, role: .cancel) { - pulseEnabled = false - } - Button(Strings.pulseAlertConfirm) { - // User confirmed, keep pulseEnabled = true - // In a real implementation, this would trigger an app restart - } - } message: { - Text(Strings.pulseAlertMessage) - } } private var boltButton: some View { @@ -128,28 +118,10 @@ public struct ExperimentalFeaturesList: View { comment: "The title for the experimental features list" ) - static let pulseAlertTitle = NSLocalizedString( - "experimentalFeaturesList.pulse.alert.title", - value: "Enable Pulse Logging?", - comment: "Alert title when enabling Pulse logging feature" - ) - - static let pulseAlertMessage = NSLocalizedString( - "experimentalFeaturesList.pulse.alert.message", - value: "This will enable extensive local logging for debugging purposes and add a new Logger row in App Settings. This is not recommended unless you know what you're doing. The app will restart to apply changes.", - comment: "Alert message explaining Pulse logging feature and warning users" - ) - - static let pulseAlertConfirm = NSLocalizedString( - "experimentalFeaturesList.pulse.alert.confirm", - value: "Apply & Restart", - comment: "Button to confirm enabling Pulse logging and restart the app" - ) - - static let pulseAlertCancel = NSLocalizedString( - "experimentalFeaturesList.pulse.alert.cancel", - value: "Cancel", - comment: "Button to cancel enabling Pulse logging" + static let superExperimentalSectionTitle = NSLocalizedString( + "experimentalFeaturesList.superExperimental.section.title", + value: "Super Experimental Features", + comment: "Section title for super experimental features" ) } } diff --git a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/Feature.swift b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/Feature.swift index c7d2ca856f9f..8e385076512d 100644 --- a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/Feature.swift +++ b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/Feature.swift @@ -3,12 +3,14 @@ import Foundation public struct Feature: Identifiable { public let name: String public let key: String + public let isSuperExperimental: Bool public var id: String { key } - public init(name: String, key: String) { + public init(name: String, key: String, isSuperExperimental: Bool = false) { self.name = name self.key = key + self.isSuperExperimental = isSuperExperimental } package static let SampleData: [Feature] = [ diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift b/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift index c77d900f071a..3c6c06add5f0 100644 --- a/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift +++ b/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift @@ -11,6 +11,7 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid FeatureFlag.allowApplicationPasswords, RemoteFeatureFlag.newGutenberg, FeatureFlag.newSupport, + FeatureFlag.pulse, ] private let flagStore = FeatureFlagOverrideStore() @@ -23,7 +24,8 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid flags.map { flag in WordPressUI.Feature( name: flag.description, - key: flag.key + key: flag.key, + isSuperExperimental: flag.key == FeatureFlag.pulse.key ) } } @@ -56,6 +58,19 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid self.presentViewController(UIHostingController(rootView: view)) return } + + if feature.key == FeatureFlag.pulse.key && newValue { + let alert = UIAlertController(title: Strings.pulseAlertTitle, message: Strings.pulseAlertMessage, preferredStyle: .alert) + alert.addAction(UIAlertAction(title: Strings.pulseAlertCancel, style: .cancel, handler: { _ in + self.flagStore.override(self.flag(for: feature), withValue: false) + })) + alert.addAction(UIAlertAction(title: Strings.pulseAlertConfirm, style: .default, handler: { _ in + fatalError("Restarting") + })) + + self.presentViewController(alert) + return + } } private func flag(for feature: WordPressUI.Feature) -> OverridableFlag { @@ -81,5 +96,10 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid static let editorFeedbackDecline = NSLocalizedString("experimentalFeatures.editorFeedbackDecline", value: "Not now", comment: "Dismiss button title for the alert asking for feedback") static let editorFeedbackAccept = NSLocalizedString("experimentalFeatures.editorFeedbackAccept", value: "Send feedback", comment: "Accept button title for the alert asking for feedback") static let editorNote = NSLocalizedString("experimentalFeatures.editorNote", value: "Experimental Block Editor will become the default in a future release and the ability to disable it will be removed.", comment: "Communicates the future removal of the option to disable the experimental editor, displayed beneath the experimental features list") + + static let pulseAlertTitle = NSLocalizedString("experimentalFeatures.pulse.alert.title", value: "Enable Pulse Logging?", comment: "Alert title when enabling Pulse logging feature") + static let pulseAlertMessage = NSLocalizedString("experimentalFeatures.pulse.alert.message", value: "This will enable extensive local logging for debugging purposes and add a new Logger row in App Settings. This is not recommended unless you know what you're doing. The app will restart to apply changes.", comment: "Alert message explaining Pulse logging feature and warning users") + static let pulseAlertConfirm = NSLocalizedString("experimentalFeatures.pulse.alert.confirm", value: "Apply & Restart", comment: "Button to confirm enabling Pulse logging and restart the app") + static let pulseAlertCancel = NSLocalizedString("experimentalFeatures.pulse.alert.cancel", value: "Cancel", comment: "Button to cancel enabling Pulse logging") } } From 088284b3d2af45990dd5bda2ed46ac0e56b7aef7 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 16:01:12 -0500 Subject: [PATCH 07/16] Bootstrap the logging system --- Modules/Package.resolved | 11 ++++++++++- Modules/Package.swift | 4 +++- WordPress/Classes/System/WordPressAppDelegate.swift | 8 ++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Modules/Package.resolved b/Modules/Package.resolved index cf147ce159bc..cfb2464cb779 100644 --- a/Modules/Package.resolved +++ b/Modules/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "c040183dbb87d4f7ca1aa256a2faed284172acf4e4d9f8173ef207b01b5d415d", + "originHash" : "59de63b94ce4574b3d48daf7de838b9ef1ed2aa2d691b4b29b2744a372eaf408", "pins" : [ { "identity" : "alamofire", @@ -241,6 +241,15 @@ "version" : "5.1.4" } }, + { + "identity" : "pulseloghandler", + "kind" : "remoteSourceControl", + "location" : "https://github.com/kean/PulseLogHandler", + "state" : { + "revision" : "477e9ef76615f0b76b43bb502af432fe6750b704", + "version" : "5.1.0" + } + }, { "identity" : "reachability", "kind" : "remoteSourceControl", diff --git a/Modules/Package.swift b/Modules/Package.swift index fa366a57a7d3..dfb92b3e7be4 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -62,7 +62,8 @@ let package = Package( revision: "bf141adc75e2769eb469a3e095bdc93dc30be8de" ), .package(url: "https://github.com/wordpress-mobile/AztecEditor-iOS", from: "1.20.0"), - .package(url: "https://github.com/kean/Pulse", from: "5.0.0") + .package(url: "https://github.com/kean/Pulse", from: "5.0.0"), + .package(url: "https://github.com/kean/PulseLogHandler", from: "5.0.0"), ], targets: XcodeSupport.targets + [ .target(name: "AsyncImageKit", dependencies: [ @@ -374,6 +375,7 @@ enum XcodeSupport { .product(name: "NSURL-IDN", package: "NSURL-IDN"), .product(name: "Pulse", package: "Pulse"), .product(name: "PulseUI", package: "Pulse"), + .product(name: "PulseLogHandler", package: "PulseLogHandler"), .product(name: "Reachability", package: "Reachability"), .product(name: "Starscream", package: "Starscream"), .product(name: "SVProgressHUD", package: "SVProgressHUD"), diff --git a/WordPress/Classes/System/WordPressAppDelegate.swift b/WordPress/Classes/System/WordPressAppDelegate.swift index 64e938f2129d..f09ef711d3a2 100644 --- a/WordPress/Classes/System/WordPressAppDelegate.swift +++ b/WordPress/Classes/System/WordPressAppDelegate.swift @@ -5,6 +5,9 @@ import AutomatticTracks import BuildSettingsKit import CocoaLumberjackSwift import DesignSystem +import Logging +import Pulse +import PulseLogHandler import Reachability import SFHFKeychainUtils import SVProgressHUD @@ -80,6 +83,9 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { DesignSystem.FontManager.registerCustomFonts() AssertionLoggerDependencyContainer.logger = AssertionLogger() UITestConfigurator.prepareApplicationForUITests(in: application, window: window) + if FeatureFlag.pulse.enabled { + LoggingSystem.bootstrap(PersistentLogHandler.init) + } AppAppearance.overrideAppearance() MemoryCache.shared.register() @@ -115,6 +121,8 @@ public class WordPressAppDelegate: UIResponder, UIApplicationDelegate { public func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? = nil) -> Bool { DDLogInfo("didFinishLaunchingWithOptions state: \(application.applicationState)") + Logger(label: "App") + .info("didFinishLaunchingWithOptions state: \(application.applicationState)") ABTest.start() From fd769495989713e1fc6f92ea88d5c863cb107168 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 16:05:35 -0500 Subject: [PATCH 08/16] Rename flag --- WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift index 50497c7447c8..a0b504322b5a 100644 --- a/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift +++ b/WordPress/Classes/Utility/BuildInformation/FeatureFlag.swift @@ -133,7 +133,7 @@ extension FeatureFlag { case .intelligence: "Intelligence" case .newSupport: "New Support" case .nativeBlockInserter: "Native Block Inserter" - case .pulse: "In-App Logger" + case .pulse: "Extensive Logging" } } } From 0b0e05b69018b21b3a3646d95915a1b12b466d2e Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Fri, 21 Nov 2025 16:07:45 -0500 Subject: [PATCH 09/16] Update copy --- .../App Settings/ExperimentalFeaturesDataProvider.swift | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift b/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift index 3c6c06add5f0..9714cf6af43f 100644 --- a/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift +++ b/WordPress/Classes/ViewRelated/Me/App Settings/ExperimentalFeaturesDataProvider.swift @@ -61,7 +61,7 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid if feature.key == FeatureFlag.pulse.key && newValue { let alert = UIAlertController(title: Strings.pulseAlertTitle, message: Strings.pulseAlertMessage, preferredStyle: .alert) - alert.addAction(UIAlertAction(title: Strings.pulseAlertCancel, style: .cancel, handler: { _ in + alert.addAction(UIAlertAction(title: SharedStrings.Button.cancel, style: .cancel, handler: { _ in self.flagStore.override(self.flag(for: feature), withValue: false) })) alert.addAction(UIAlertAction(title: Strings.pulseAlertConfirm, style: .default, handler: { _ in @@ -97,9 +97,8 @@ class ExperimentalFeaturesDataProvider: ExperimentalFeaturesViewModel.DataProvid static let editorFeedbackAccept = NSLocalizedString("experimentalFeatures.editorFeedbackAccept", value: "Send feedback", comment: "Accept button title for the alert asking for feedback") static let editorNote = NSLocalizedString("experimentalFeatures.editorNote", value: "Experimental Block Editor will become the default in a future release and the ability to disable it will be removed.", comment: "Communicates the future removal of the option to disable the experimental editor, displayed beneath the experimental features list") - static let pulseAlertTitle = NSLocalizedString("experimentalFeatures.pulse.alert.title", value: "Enable Pulse Logging?", comment: "Alert title when enabling Pulse logging feature") - static let pulseAlertMessage = NSLocalizedString("experimentalFeatures.pulse.alert.message", value: "This will enable extensive local logging for debugging purposes and add a new Logger row in App Settings. This is not recommended unless you know what you're doing. The app will restart to apply changes.", comment: "Alert message explaining Pulse logging feature and warning users") - static let pulseAlertConfirm = NSLocalizedString("experimentalFeatures.pulse.alert.confirm", value: "Apply & Restart", comment: "Button to confirm enabling Pulse logging and restart the app") - static let pulseAlertCancel = NSLocalizedString("experimentalFeatures.pulse.alert.cancel", value: "Cancel", comment: "Button to cancel enabling Pulse logging") + static let pulseAlertTitle = NSLocalizedString("experimentalFeatures.extensiveLogging.alert.title", value: "Enable Extensive Logging?", comment: "Alert title when enabling Pulse logging feature") + static let pulseAlertMessage = NSLocalizedString("experimentalFeatures.extensiveLogging.alert.message", value: "This will enable extensive local logging for debugging purposes and add a new Logger row in App Settings. This is not recommended unless you know what you're doing. The app will restart to apply changes.", comment: "Alert message explaining Pulse logging feature and warning users") + static let pulseAlertConfirm = NSLocalizedString("experimentalFeatures.extensiveLogging.alert.confirm", value: "Apply & Restart", comment: "Button to confirm enabling Pulse logging and restart the app") } } From 942aeec5bcc5aacdb78a3a7b31a7c3d48e5f0784 Mon Sep 17 00:00:00 2001 From: Alex Grebenyuk Date: Mon, 24 Nov 2025 08:16:01 -0500 Subject: [PATCH 10/16] Rename to Developer Tools --- .../ExperimentalFeaturesList.swift | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift index 4d6ed073f0d5..3adb87ea98fb 100644 --- a/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift +++ b/Modules/Sources/WordPressUI/Views/Settings/ExperimentalFeatures/ExperimentalFeaturesList.swift @@ -5,8 +5,8 @@ public struct ExperimentalFeaturesList: View { @ObservedObject var viewModel: ExperimentalFeaturesViewModel - @AppStorage("superExperimentalFeaturesEnabled") - private var superExperimentalFeaturesEnabled = false + @AppStorage("isDeveloperModeEnabled") + private var isDeveloperModeEnabled = false @State private var tapCount = 0 @@ -18,7 +18,7 @@ public struct ExperimentalFeaturesList: View { viewModel.items.filter { !$0.isSuperExperimental } } - private var superExperimentalFeatures: [Feature] { + private var developerFeatures: [Feature] { viewModel.items.filter { $0.isSuperExperimental } } @@ -40,7 +40,7 @@ public struct ExperimentalFeaturesList: View { } } - if !superExperimentalFeaturesEnabled { + if !isDeveloperModeEnabled { HStack { Spacer() boltButton @@ -51,13 +51,13 @@ public struct ExperimentalFeaturesList: View { .padding(.top, 8) } - if superExperimentalFeaturesEnabled && !superExperimentalFeatures.isEmpty { + if isDeveloperModeEnabled && !developerFeatures.isEmpty { Section { - ForEach(superExperimentalFeatures) { item in + ForEach(developerFeatures) { item in Toggle(item.name, isOn: viewModel.binding(for: item)) } } header: { - Text(Strings.superExperimentalSectionTitle) + Text(Strings.developerToolsSectionTitle) } } } @@ -86,7 +86,7 @@ public struct ExperimentalFeaturesList: View { if tapCount >= 5 { withAnimation { - superExperimentalFeaturesEnabled = true + isDeveloperModeEnabled = true } } } @@ -118,10 +118,10 @@ public struct ExperimentalFeaturesList: View { comment: "The title for the experimental features list" ) - static let superExperimentalSectionTitle = NSLocalizedString( - "experimentalFeaturesList.superExperimental.section.title", - value: "Super Experimental Features", - comment: "Section title for super experimental features" + static let developerToolsSectionTitle = NSLocalizedString( + "experimentalFeaturesList.developTools.section.title", + value: "Developer Tools", + comment: "Section title for developer tools" ) } } From e849f5da4f043deae07af095d746910bf7ad27bb Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Fri, 21 Nov 2025 23:16:33 -0700 Subject: [PATCH 11/16] Add Pulse Middleware --- .../Classes/Networking/PulseMiddleware.swift | 59 +++++++++++++++++++ .../Classes/Networking/WordPressClient.swift | 5 +- 2 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 WordPress/Classes/Networking/PulseMiddleware.swift diff --git a/WordPress/Classes/Networking/PulseMiddleware.swift b/WordPress/Classes/Networking/PulseMiddleware.swift new file mode 100644 index 000000000000..90a187181f1a --- /dev/null +++ b/WordPress/Classes/Networking/PulseMiddleware.swift @@ -0,0 +1,59 @@ +import Pulse +import WordPressAPI +import WordPressAPIInternal + +final class PulseMiddleware: Middleware { + + private static let errorStatusCodes: [UInt16] = [ + 400, 401, 402, 403, 404, 419, 429, + 500 + ] + + func process( + requestExecutor: any RequestExecutor, + response: WpNetworkResponse, + request: WpNetworkRequest, + context: RequestContext? + ) async throws -> WpNetworkResponse { + + LoggerStore.shared.storeRequest( + convertToUrlRequest(request), + response: try convertToUrlResponse(response), + error: Self.errorStatusCodes.contains(response.statusCode) ? parseBodyAsError(response.body) : nil, + data: response.body + ) + return response + } + + private func convertToUrlRequest(_ original: WpNetworkRequest) -> URLRequest { + let url = URL(string: original.url())! + var request = URLRequest(url: url) + request.httpMethod = "\(original.method())" + request.allHTTPHeaderFields = original.headerMap().toFlatMap() + request.httpBody = original.body()?.contents() + return request + } + + private func convertToUrlResponse(_ original: WpNetworkResponse) throws -> URLResponse? { + HTTPURLResponse( + url: try original.requestUrl.asURL(), + statusCode: Int(original.statusCode), + httpVersion: nil, + headerFields: original.responseHeaderMap.toFlatMap() + ) + } + + // TODO: This implementation should probably use the underlying Rust implementation + private func parseBodyAsError(_ data: Data) -> Error? { + try? JSONDecoder().decode(WpError.self, from: data) + } + + struct WpError: Codable, Error { + let code: Int + let message: String + + var description: String { + message + } + } +} diff --git a/WordPress/Classes/Networking/WordPressClient.swift b/WordPress/Classes/Networking/WordPressClient.swift index 6fa599adcc8b..18625576bcaa 100644 --- a/WordPress/Classes/Networking/WordPressClient.swift +++ b/WordPress/Classes/Networking/WordPressClient.swift @@ -40,7 +40,10 @@ extension WordPressClient { urlSession: session, apiUrlResolver: resolver, authenticationProvider: provider, - appNotifier: notifier + middlewarePipeline: MiddlewarePipeline(middlewares: [ + PulseMiddleware() + ]), + appNotifier: notifier, ) self.init(api: api, rootUrl: apiRootURL) } From 22ca14a4fee13183eab634f22d66af5db9a002a6 Mon Sep 17 00:00:00 2001 From: Jeremy Massel <1123407+jkmassel@users.noreply.github.com> Date: Sun, 23 Nov 2025 21:05:18 -0700 Subject: [PATCH 12/16] Integration WIP --- .../Editor/EditorConfiguration+Blog.swift | 1 + ...CommentGutenbergEditorViewController.swift | 7 +++++ .../NewGutenbergViewController.swift | 28 +++++++++++++++++++ .../xcshareddata/xcschemes/Jetpack.xcscheme | 2 +- 4 files changed, 37 insertions(+), 1 deletion(-) diff --git a/WordPress/Classes/Utility/Editor/EditorConfiguration+Blog.swift b/WordPress/Classes/Utility/Editor/EditorConfiguration+Blog.swift index e226119311c7..81e3b8a52077 100644 --- a/WordPress/Classes/Utility/Editor/EditorConfiguration+Blog.swift +++ b/WordPress/Classes/Utility/Editor/EditorConfiguration+Blog.swift @@ -46,6 +46,7 @@ extension EditorConfiguration { // Limited to Jetpack-connected sites until editor assets endpoint is available in WordPress core .setShouldUsePlugins(Self.shouldEnablePlugins(for: blog, appPassword: applicationPassword)) .setLocale(WordPressComLanguageDatabase.shared.deviceLanguage.slug) + .setEnableNetworkLogging(true) if let blogUrl = blog.url { builder = builder.setSiteUrl(blogUrl) diff --git a/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift b/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift index f37e02d0f65c..6c8dd1c479a7 100644 --- a/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift +++ b/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift @@ -37,6 +37,7 @@ final class CommentGutenbergEditorViewController: UIViewController { let configuration = EditorConfigurationBuilder(content: initialContent ?? "") .setShouldHideTitle(true) + .setEnableNetworkLogging(true) .build() let editorVC = GutenbergKit.EditorViewController(configuration: configuration) @@ -61,6 +62,7 @@ final class CommentGutenbergEditorViewController: UIViewController { } extension CommentGutenbergEditorViewController: GutenbergKit.EditorViewControllerDelegate { + func editorDidLoad(_ viewContoller: GutenbergKit.EditorViewController) { // Do nothing } @@ -108,4 +110,9 @@ extension CommentGutenbergEditorViewController: GutenbergKit.EditorViewControlle func editor(_ viewController: GutenbergKit.EditorViewController, didCloseModalDialog dialogType: String) { // Do nothing } + + func editor(_ viewController: GutenbergKit.EditorViewController, didLogNetworkRequest request: GutenbergKit.NetworkRequest) { + + } + } diff --git a/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift b/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift index 62d4625ab5b0..e9779dff36ab 100644 --- a/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift +++ b/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift @@ -10,6 +10,7 @@ import WordPressShared import WebKit import CocoaLumberjackSwift import Photos +import Pulse class NewGutenbergViewController: UIViewController, PostEditor, PublishingEditor { @@ -527,6 +528,7 @@ class NewGutenbergViewController: UIViewController, PostEditor, PublishingEditor } extension NewGutenbergViewController: GutenbergKit.EditorViewControllerDelegate { + func editorDidLoad(_ viewContoller: GutenbergKit.EditorViewController) { if !editorSession.started { // Note that this method is also used to track startup performance @@ -681,6 +683,32 @@ extension NewGutenbergViewController: GutenbergKit.EditorViewControllerDelegate return WPMediaType(rawValue: mediaType) } + + func editor(_ viewController: GutenbergKit.EditorViewController, didLogNetworkRequest request: NetworkRequest) { + + guard let url = URL(string: request.url) else { + return + } + + var urlRequest = URLRequest(url: url) + urlRequest.httpMethod = request.method + urlRequest.allHTTPHeaderFields = request.requestHeaders + urlRequest.httpBody = request.requestBody?.data(using: .utf8) + + let httpResponse = HTTPURLResponse( + url: url, + statusCode: request.status, + httpVersion: nil, + headerFields: request.responseHeaders + ) + + LoggerStore.shared.storeRequest( + urlRequest, + response: httpResponse, + error: nil, + data: request.responseBody?.data(using: .utf8) + ) + } } // MARK: - GutenbergBridgeDelegate diff --git a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme index 148389f3fadf..aecd83286d44 100644 --- a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme +++ b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme @@ -125,7 +125,7 @@ + isEnabled = "YES"> From 51e6c646f4f49e1863dc5d5c0490252bac433e2b Mon Sep 17 00:00:00 2001 From: David Calhoun Date: Mon, 24 Nov 2025 16:19:37 -0500 Subject: [PATCH 13/16] build: Update GutenbergKit version --- Modules/Package.resolved | 5 ++--- Modules/Package.swift | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Modules/Package.resolved b/Modules/Package.resolved index cfb2464cb779..02dd3b81eac5 100644 --- a/Modules/Package.resolved +++ b/Modules/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "59de63b94ce4574b3d48daf7de838b9ef1ed2aa2d691b4b29b2744a372eaf408", + "originHash" : "f1807a1862f77fb4503c59a1809a86c290dc226c6e361e0cb51314b5c597af66", "pins" : [ { "identity" : "alamofire", @@ -149,8 +149,7 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/wordpress-mobile/GutenbergKit", "state" : { - "revision" : "df43b1d70fef11fb9035b1d9da7d4a80503c2a6f", - "version" : "0.10.1" + "revision" : "df607f9380891970d0d296010abf93d582fecdb0" } }, { diff --git a/Modules/Package.swift b/Modules/Package.swift index dfb92b3e7be4..20bed167572c 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -54,7 +54,7 @@ let package = Package( .package(url: "https://github.com/wordpress-mobile/wpxmlrpc", from: "0.9.0"), .package(url: "https://github.com/wordpress-mobile/NSURL-IDN", revision: "b34794c9a3f32312e1593d4a3d120572afa0d010"), .package(url: "https://github.com/zendesk/support_sdk_ios", from: "8.0.3"), - .package(url: "https://github.com/wordpress-mobile/GutenbergKit", from: "0.10.1"), + .package(url: "https://github.com/wordpress-mobile/GutenbergKit", revision: "df607f9380891970d0d296010abf93d582fecdb0"), // We can't use wordpress-rs branches nor commits here. Only tags work. .package(url: "https://github.com/Automattic/wordpress-rs", revision: "alpha-20251101"), .package( From 02d0e76cb33a9269e09c99db92664a59f825531c Mon Sep 17 00:00:00 2001 From: David Calhoun Date: Mon, 1 Dec 2025 13:46:08 -0500 Subject: [PATCH 14/16] build: Upgrade GutenbergKit version --- Modules/Package.resolved | 5 +++-- Modules/Package.swift | 2 +- .../Editor/CommentGutenbergEditorViewController.swift | 2 +- .../NewGutenberg/NewGutenbergViewController.swift | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/Modules/Package.resolved b/Modules/Package.resolved index 02dd3b81eac5..4a583c9e88fc 100644 --- a/Modules/Package.resolved +++ b/Modules/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "f1807a1862f77fb4503c59a1809a86c290dc226c6e361e0cb51314b5c597af66", + "originHash" : "00e356be49694f361ebf54e56d39729aa3a31081e292e453ae34f75f9a1838e7", "pins" : [ { "identity" : "alamofire", @@ -149,7 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/wordpress-mobile/GutenbergKit", "state" : { - "revision" : "df607f9380891970d0d296010abf93d582fecdb0" + "revision" : "55b8b9a2373b7a6e734c5a6ffd1668da4bd7bdf6", + "version" : "0.11.0" } }, { diff --git a/Modules/Package.swift b/Modules/Package.swift index 20bed167572c..783c8af26d02 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -54,7 +54,7 @@ let package = Package( .package(url: "https://github.com/wordpress-mobile/wpxmlrpc", from: "0.9.0"), .package(url: "https://github.com/wordpress-mobile/NSURL-IDN", revision: "b34794c9a3f32312e1593d4a3d120572afa0d010"), .package(url: "https://github.com/zendesk/support_sdk_ios", from: "8.0.3"), - .package(url: "https://github.com/wordpress-mobile/GutenbergKit", revision: "df607f9380891970d0d296010abf93d582fecdb0"), + .package(url: "https://github.com/wordpress-mobile/GutenbergKit", from: "0.11.0"), // We can't use wordpress-rs branches nor commits here. Only tags work. .package(url: "https://github.com/Automattic/wordpress-rs", revision: "alpha-20251101"), .package( diff --git a/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift b/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift index 6c8dd1c479a7..4c7ac4578d3b 100644 --- a/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift +++ b/WordPress/Classes/ViewRelated/Comments/Controllers/Editor/CommentGutenbergEditorViewController.swift @@ -111,7 +111,7 @@ extension CommentGutenbergEditorViewController: GutenbergKit.EditorViewControlle // Do nothing } - func editor(_ viewController: GutenbergKit.EditorViewController, didLogNetworkRequest request: GutenbergKit.NetworkRequest) { + func editor(_ viewController: GutenbergKit.EditorViewController, didLogNetworkRequest request: GutenbergKit.RecordedNetworkRequest) { } diff --git a/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift b/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift index e9779dff36ab..6533b7bac0f6 100644 --- a/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift +++ b/WordPress/Classes/ViewRelated/NewGutenberg/NewGutenbergViewController.swift @@ -684,7 +684,7 @@ extension NewGutenbergViewController: GutenbergKit.EditorViewControllerDelegate return WPMediaType(rawValue: mediaType) } - func editor(_ viewController: GutenbergKit.EditorViewController, didLogNetworkRequest request: NetworkRequest) { + func editor(_ viewController: GutenbergKit.EditorViewController, didLogNetworkRequest request: RecordedNetworkRequest) { guard let url = URL(string: request.url) else { return From b2ed5de238d5d34f79001215b1661b41b127994e Mon Sep 17 00:00:00 2001 From: David Calhoun Date: Mon, 1 Dec 2025 13:46:17 -0500 Subject: [PATCH 15/16] task: Reset GutenbergKit environment variable to default: `NO` We should only enable this for development environments. --- .../WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme index aecd83286d44..148389f3fadf 100644 --- a/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme +++ b/WordPress/WordPress.xcodeproj/xcshareddata/xcschemes/Jetpack.xcscheme @@ -125,7 +125,7 @@ + isEnabled = "NO"> From e164a07306a6475639f7c8d0324e9b75da6d19d4 Mon Sep 17 00:00:00 2001 From: David Calhoun Date: Wed, 3 Dec 2025 10:59:13 -0500 Subject: [PATCH 16/16] build: Upgrade GutenbergKit to v0.11.1 --- Modules/Package.resolved | 6 +++--- Modules/Package.swift | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/Package.resolved b/Modules/Package.resolved index 4a583c9e88fc..eb4ec63773ec 100644 --- a/Modules/Package.resolved +++ b/Modules/Package.resolved @@ -1,5 +1,5 @@ { - "originHash" : "00e356be49694f361ebf54e56d39729aa3a31081e292e453ae34f75f9a1838e7", + "originHash" : "669195a560c78fbb3d49bdaad67a26bf3c9dc3e16d03ce8348afdce8d597541e", "pins" : [ { "identity" : "alamofire", @@ -149,8 +149,8 @@ "kind" : "remoteSourceControl", "location" : "https://github.com/wordpress-mobile/GutenbergKit", "state" : { - "revision" : "55b8b9a2373b7a6e734c5a6ffd1668da4bd7bdf6", - "version" : "0.11.0" + "revision" : "54b2444d94216222c8d4a70f76a9bc189af18b5f", + "version" : "0.11.1" } }, { diff --git a/Modules/Package.swift b/Modules/Package.swift index 783c8af26d02..70b26c4ded4b 100644 --- a/Modules/Package.swift +++ b/Modules/Package.swift @@ -54,7 +54,7 @@ let package = Package( .package(url: "https://github.com/wordpress-mobile/wpxmlrpc", from: "0.9.0"), .package(url: "https://github.com/wordpress-mobile/NSURL-IDN", revision: "b34794c9a3f32312e1593d4a3d120572afa0d010"), .package(url: "https://github.com/zendesk/support_sdk_ios", from: "8.0.3"), - .package(url: "https://github.com/wordpress-mobile/GutenbergKit", from: "0.11.0"), + .package(url: "https://github.com/wordpress-mobile/GutenbergKit", from: "0.11.1"), // We can't use wordpress-rs branches nor commits here. Only tags work. .package(url: "https://github.com/Automattic/wordpress-rs", revision: "alpha-20251101"), .package(