diff --git a/Splunk.xcworkspace/contents.xcworkspacedata b/Splunk.xcworkspace/contents.xcworkspacedata
index 90c549bd..467ef177 100644
--- a/Splunk.xcworkspace/contents.xcworkspacedata
+++ b/Splunk.xcworkspace/contents.xcworkspacedata
@@ -43,6 +43,9 @@
+
+
diff --git a/SplunkCustomData/.gitignore b/SplunkCustomData/.gitignore
new file mode 100644
index 00000000..0023a534
--- /dev/null
+++ b/SplunkCustomData/.gitignore
@@ -0,0 +1,8 @@
+.DS_Store
+/.build
+/Packages
+xcuserdata/
+DerivedData/
+.swiftpm/configuration/registries.json
+.swiftpm/xcode/package.xcworkspace/contents.xcworkspacedata
+.netrc
diff --git a/SplunkCustomData/.swiftpm/xcode/xcshareddata/xcschemes/SplunkCustomData.xcscheme b/SplunkCustomData/.swiftpm/xcode/xcshareddata/xcschemes/SplunkCustomData.xcscheme
new file mode 100644
index 00000000..f92b1bca
--- /dev/null
+++ b/SplunkCustomData/.swiftpm/xcode/xcshareddata/xcschemes/SplunkCustomData.xcscheme
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/SplunkCustomData/Package.swift b/SplunkCustomData/Package.swift
new file mode 100644
index 00000000..80d26c52
--- /dev/null
+++ b/SplunkCustomData/Package.swift
@@ -0,0 +1,33 @@
+// swift-tools-version: 5.9
+
+import PackageDescription
+
+let package = Package(
+ name: "SplunkCustomData",
+ platforms: [
+ .iOS(.v13),
+ .tvOS(.v13),
+ .visionOS(.v1)
+ ],
+ products: [
+ .library(
+ name: "SplunkCustomData",
+ targets: ["SplunkCustomData"]
+ )
+ ],
+ dependencies: [
+ .package(name: "SplunkSharedProtocols", path: "../SplunkSharedProtocols")
+ ],
+ targets: [
+ .target(
+ name: "SplunkCustomData",
+ dependencies: [
+ "SplunkSharedProtocols"
+ ]
+ ),
+ .testTarget(
+ name: "SplunkCustomDataTests",
+ dependencies: ["SplunkCustomData"]
+ )
+ ]
+)
diff --git a/SplunkCustomData/Sources/SplunkCustomData/CustomData+Module.swift b/SplunkCustomData/Sources/SplunkCustomData/CustomData+Module.swift
new file mode 100644
index 00000000..b2e709bd
--- /dev/null
+++ b/SplunkCustomData/Sources/SplunkCustomData/CustomData+Module.swift
@@ -0,0 +1,64 @@
+//
+/*
+Copyright 2025 Splunk Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import Foundation
+import SplunkSharedProtocols
+
+// `Data` can be used as an event type that the module produces.
+extension Data: ModuleEventData {}
+
+// Struct `EventMetadataCustomData` describes event metadata.
+// This type must be unique in the module/agent space.
+extension EventMetadataCustomData: ModuleEventMetadata {
+ public static func == (lhs: EventMetadataCustomData, rhs: EventMetadataCustomData) -> Bool {
+ lhs.id == rhs.id
+ }
+}
+
+// Defines CustomData conformance to `Module` protocol
+// and implements methods that are missing in the original `CustomData`.
+extension CustomData: Module {
+
+
+ // MARK: - Module types
+
+ public typealias Configuration = CustomDataConfiguration
+ public typealias RemoteConfiguration = CustomDataRemoteConfiguration
+
+ public typealias EventData = Data
+
+
+ // MARK: - Module methods
+
+ public func install(with configuration: (any ModuleConfiguration)?, remoteConfiguration: (any RemoteModuleConfiguration)?) {
+ if let configuration = configuration as? CustomDataConfiguration {
+ print("known configuration")
+ print(configuration)
+ }
+ }
+
+
+ // MARK: - Type transparency helpers
+
+ public func deleteData(for metadata: any ModuleEventMetadata) {
+ // TODO: Code TBD
+ }
+
+ public func onPublish(data: @escaping (EventMetadataCustomData, EventData) -> Void) {
+ // TODO: Code TBD
+ }
+}
diff --git a/SplunkCustomData/Sources/SplunkCustomData/CustomData.swift b/SplunkCustomData/Sources/SplunkCustomData/CustomData.swift
new file mode 100644
index 00000000..9bc5aa7b
--- /dev/null
+++ b/SplunkCustomData/Sources/SplunkCustomData/CustomData.swift
@@ -0,0 +1,46 @@
+//
+/*
+Copyright 2025 Splunk Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import Foundation
+import SplunkSharedProtocols
+
+protocol CustomDataRepresentable: PropertyList {}
+
+public final class CustomData {
+
+
+ // MARK: - Private properties
+
+ private var config = CustomDataConfiguration(enabled: true)
+
+
+ // MARK: - CustomData lifecycle
+
+ public required init() {} // see install() in Module extension for startup tasks
+
+
+ // MARK: - CustomData helper functions
+
+
+ // MARK: - CustomData Reporting
+
+ // This is a placeholder for temporary use only. Will be replaced by
+ // real data population and output.
+ private func reportCustom(data: CustomDataRepresentable) {
+ print(String(describing: data))
+ }
+}
diff --git a/SplunkCustomData/Sources/SplunkCustomData/CustomDataConfiguration.swift b/SplunkCustomData/Sources/SplunkCustomData/CustomDataConfiguration.swift
new file mode 100644
index 00000000..9eda24f7
--- /dev/null
+++ b/SplunkCustomData/Sources/SplunkCustomData/CustomDataConfiguration.swift
@@ -0,0 +1,36 @@
+//
+/*
+Copyright 2025 Splunk Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import Foundation
+import SplunkSharedProtocols
+
+public struct CustomDataConfiguration: ModuleConfiguration {
+
+
+ // MARK: - Public
+
+ public var enabled: Bool
+ public var threshold: CFTimeInterval
+
+
+ // MARK: init()
+
+ public init(enabled: Bool, threshold: CFTimeInterval = 2.0) {
+ self.enabled = enabled
+ self.threshold = threshold
+ }
+}
diff --git a/SplunkCustomData/Sources/SplunkCustomData/CustomDataRemoteConfiguration.swift b/SplunkCustomData/Sources/SplunkCustomData/CustomDataRemoteConfiguration.swift
new file mode 100644
index 00000000..ef469cd3
--- /dev/null
+++ b/SplunkCustomData/Sources/SplunkCustomData/CustomDataRemoteConfiguration.swift
@@ -0,0 +1,34 @@
+//
+/*
+Copyright 2025 Splunk Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import Foundation
+import SplunkSharedProtocols
+
+public struct CustomDataRemoteConfiguration: RemoteModuleConfiguration {
+
+
+ // MARK: - Public
+
+ public var enabled: Bool
+
+
+ // MARK: init()
+
+ public init?(from data: Data) {
+ enabled = true
+ }
+}
diff --git a/SplunkCustomData/Sources/SplunkCustomData/EventMetadataCustomData.swift b/SplunkCustomData/Sources/SplunkCustomData/EventMetadataCustomData.swift
new file mode 100644
index 00000000..105a5525
--- /dev/null
+++ b/SplunkCustomData/Sources/SplunkCustomData/EventMetadataCustomData.swift
@@ -0,0 +1,31 @@
+//
+/*
+Copyright 2025 Splunk Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+import Foundation
+
+public struct EventMetadataCustomData {
+
+
+ // MARK: - Public
+
+ public var timestamp = Date()
+
+
+ // MARK: - Internal
+
+ let id: String
+}
diff --git a/SplunkCustomData/Tests/SplunkCustomDataTests/SplunkCustomDataTests.swift b/SplunkCustomData/Tests/SplunkCustomDataTests/SplunkCustomDataTests.swift
new file mode 100644
index 00000000..3b84bd8b
--- /dev/null
+++ b/SplunkCustomData/Tests/SplunkCustomDataTests/SplunkCustomDataTests.swift
@@ -0,0 +1,29 @@
+//
+/*
+Copyright 2025 Splunk Inc.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+@testable import SplunkCustomData
+import XCTest
+
+final class SplunkCustomDataTests: XCTestCase {
+ func testExample() throws {
+ // XCTest Documentation
+ // https://developer.apple.com/documentation/xctest
+
+ // Defining Test Cases and Test Methods
+ // https://developer.apple.com/documentation/xctest/defining_test_cases_and_test_methods
+ }
+}