Merge branch 'apache:main' into docc-integration
diff --git a/Sources/ApacheBeam/Client/ApiServiceDescriptor.swift b/Sources/ApacheBeam/Client/ApiServiceDescriptor.swift
index 66aeaea..359e3e0 100644
--- a/Sources/ApacheBeam/Client/ApiServiceDescriptor.swift
+++ b/Sources/ApacheBeam/Client/ApiServiceDescriptor.swift
@@ -37,6 +37,8 @@
 }
 
 extension ApiServiceDescriptor {
+    /// Populate the ``ApiServiceDescriptor`` from the Beam protobuf representation
+    /// - Parameter proto: A valid protocol buffer
     init(proto: Org_Apache_Beam_Model_Pipeline_V1_ApiServiceDescriptor) {
         url = proto.url
     }
@@ -51,6 +53,14 @@
 extension ApiServiceDescriptor: Hashable {}
 
 public extension ApiServiceDescriptor {
+    /// Convenience function to decode an ApiServiceDescriptor from a text or JSON encoded protocol buffer passed as environment variable.
+    /// This technique is used by Runners when launching containers.
+    ///
+    /// - Parameters:
+    ///   - env: The name of the environment variable to check
+    ///   - format: The variable's encoding.
+    /// - Returns: An ``ApiServiceDescriptor`` for the specified service.
+    /// 
     static func from(env: String, format: EncodedAs = .textproto) throws -> ApiServiceDescriptor {
         switch format {
         case .textproto:
diff --git a/Sources/ApacheBeam/Internal/Array+Helpers.swift b/Sources/ApacheBeam/Internal/Array+Helpers.swift
index 9718f32..12d8411 100644
--- a/Sources/ApacheBeam/Internal/Array+Helpers.swift
+++ b/Sources/ApacheBeam/Internal/Array+Helpers.swift
@@ -17,6 +17,8 @@
  */
 
 extension [(String, String)] {
+    /// Convenience function that converts an aray of (String,String) elements into a dictionary type.
+    /// - Returns: A dictionary of `[String:String]`
     func dict() -> [String: String] {
         reduce(into: [:]) { $0[$1.0] = $1.1 }
     }
diff --git a/Sources/ApacheBeam/Internal/Data+Decoding.swift b/Sources/ApacheBeam/Internal/Data+Decoding.swift
index f6cd290..35ddb34 100644
--- a/Sources/ApacheBeam/Internal/Data+Decoding.swift
+++ b/Sources/ApacheBeam/Internal/Data+Decoding.swift
@@ -19,8 +19,10 @@
 import Foundation
 
 extension Data {
-    /// advanced(by:) has issues on non-macOS Foundation implementations
     @inlinable
+    /// A safer version of `advanced(by:)`. On non-macOS Foundation implementations ``advanced(by:)`` segfaults on ``Data`` elements with size 0.
+    /// - Parameter by: Number of elements to advance
+    /// - Returns: A possibly different ``Data`` element.
     func safeAdvance(by: Int) -> Data {
         #if os(macOS)
             return advanced(by: by)
@@ -36,6 +38,7 @@
     }
 
     /// Read a variable length integer from the current data
+    /// - Returns: An integer of up to 64 bits.
     mutating func varint() throws -> Int {
         var advance = 0
         let result = try withUnsafeBytes {
@@ -68,20 +71,27 @@
         return result
     }
 
+    
+    /// Decodes a Beam time value, which is a Java Instant that has been encoded to sort properly
+    /// - Returns: A Date value
     mutating func instant() throws -> Date {
         let millis = try next(Int64.self) &+ Int64(-9_223_372_036_854_775_808)
         return Date(millisecondsSince1970: millis)
     }
 
-    /// Read a length prefixed chunk of data
+    
+    /// Implements the Beam length-prefixed byte blob encoding
+    /// - Returns: A ``Data`` with a size defined by the length encoding
     mutating func subdata() throws -> Data {
         let length = try varint()
         let result = subdata(in: 0 ..< length)
         self = safeAdvance(by: length)
         return result
     }
-
-    /// Extracts a fixed width type. Coming off the wire this will always be bigendian
+    
+    /// Read a fixed length integer of the specified type. In Beam the wire encoding is always a Java-style bigendian value
+    /// - Parameter _: The integer type of read
+    /// - Returns: The integer value read.
     mutating func next<T: FixedWidthInteger>(_: T.Type) throws -> T {
         let size = MemoryLayout<T>.size
         let bigEndian = withUnsafeBytes {
@@ -91,6 +101,10 @@
         return T(bigEndian: bigEndian)
     }
 
+    
+    /// Read a fixed length floating point value of the specified type.
+    /// - Parameter _: The floating point type to read
+    /// - Returns: The floating point value
     mutating func next<T: FloatingPoint>(_: T.Type) throws -> T {
         let result = withUnsafeBytes {
             $0.load(as: T.self)
diff --git a/Sources/ApacheBeam/Internal/Data+Encoding.swift b/Sources/ApacheBeam/Internal/Data+Encoding.swift
index 3b0d6ae..82c2b19 100644
--- a/Sources/ApacheBeam/Internal/Data+Encoding.swift
+++ b/Sources/ApacheBeam/Internal/Data+Encoding.swift
@@ -19,6 +19,8 @@
 import Foundation
 
 extension Data {
+    /// Encode a variable length integer up to 64-bits
+    /// - Parameter value: The value to encode
     mutating func varint(_ value: Int) {
         var current = UInt64(value)
         while current >= 0x80 {
@@ -28,21 +30,27 @@
         append(UInt8(current))
     }
 
+    
+    /// Append a Date as a modified Java Instant onto the. Resolution will be milliseconds.
+    /// - Parameter value: the date/time value to encode.
     mutating func instant(_ value: Date) {
         let be = (Int64(value.millisecondsSince1970) &- Int64(-9_223_372_036_854_775_808)).bigEndian
         Swift.withUnsafeBytes(of: be) {
             self.append(contentsOf: $0)
         }
     }
-
-    // In Beam integers go on and off the wire in bigEndian format. This matches the original Java lineage.
+    
+    /// Append a fixed-width integer in a Java way (bigendian) to match Beam
+    /// - Parameter value: the value to encode
     mutating func next(_ value: some FixedWidthInteger) {
         let be = value.bigEndian
         Swift.withUnsafeBytes(of: be) {
             self.append(contentsOf: $0)
         }
     }
-
+    
+    /// Append fixed-width floating point values in IEEE format.
+    /// - Parameter value: floating point value to append
     mutating func next(_ value: some FloatingPoint) {
         Swift.withUnsafeBytes(of: value) {
             self.append(contentsOf: $0)
diff --git a/Sources/ApacheBeam/Internal/Date+Timestamp.swift b/Sources/ApacheBeam/Internal/Date+Timestamp.swift
index 63dd57b..6a54cb2 100644
--- a/Sources/ApacheBeam/Internal/Date+Timestamp.swift
+++ b/Sources/ApacheBeam/Internal/Date+Timestamp.swift
@@ -19,10 +19,13 @@
 import Foundation
 
 extension Date {
+    /// Convenience property to extract Java-style milliseconds since the UNIX epoch
     var millisecondsSince1970: Int64 {
         Int64((timeIntervalSince1970 * 1000.0).rounded())
     }
-
+    
+    /// Create a ``Date`` from UNIX epoch milliseconds
+    /// - Parameter millisecondsSince1970: Milliseconds to convert
     init(millisecondsSince1970: Int64) {
         self = Date(timeIntervalSince1970: Double(millisecondsSince1970) / 1000.0)
     }
diff --git a/Sources/ApacheBeam/Internal/Dictionary+Helpers.swift b/Sources/ApacheBeam/Internal/Dictionary+Helpers.swift
index feedd19..52814ea 100644
--- a/Sources/ApacheBeam/Internal/Dictionary+Helpers.swift
+++ b/Sources/ApacheBeam/Internal/Dictionary+Helpers.swift
@@ -17,7 +17,9 @@
  */
 
 public extension Dictionary where Key: Comparable {
-    /// Return key-value pairs sorted by key.
+    
+    /// Return the elements of a dictionary in a stable ordering
+    /// - Returns: An array of pairs sorted by key
     func sorted() -> [(Key, Value)] {
         map { ($0, $1) }.sorted(by: { $0.0 < $1.0 })
     }
diff --git a/Sources/ApacheBeam/Internal/PipelineProto+Coder.swift b/Sources/ApacheBeam/Internal/PipelineProto+Coder.swift
index a8c2603..7479e93 100644
--- a/Sources/ApacheBeam/Internal/PipelineProto+Coder.swift
+++ b/Sources/ApacheBeam/Internal/PipelineProto+Coder.swift
@@ -17,6 +17,9 @@
  */
 
 extension PipelineProto {
+    /// Construct an appropriate coder representation from the current pipeline, perhaps also encoding component coders.
+    /// - Parameter from: The ``Coder`` to convert.
+    /// - Returns: ``PipelineComponent`` representing this coder
     mutating func coder(from: Coder) -> PipelineComponent {
         let componentCoders: [String] = switch from {
         case let .keyvalue(keyCoder, valueCoder):
diff --git a/Sources/ApacheBeam/Internal/PipelineProto+Environment.swift b/Sources/ApacheBeam/Internal/PipelineProto+Environment.swift
index ba130bd..f8f0034 100644
--- a/Sources/ApacheBeam/Internal/PipelineProto+Environment.swift
+++ b/Sources/ApacheBeam/Internal/PipelineProto+Environment.swift
@@ -17,6 +17,9 @@
  */
 
 extension PipelineProto {
+    /// Encode a native ``Environment`` into its protobuf form as a ``PipelineComponent``
+    /// - Parameter from: the ``Environment`` to encode
+    /// - Returns: A ``PipelineComponent`` representation 
     mutating func environment(from: Environment) throws -> PipelineComponent {
         try environment { _ in
             try .with {
diff --git a/Sources/ApacheBeam/Internal/PipelineProto+Initializers.swift b/Sources/ApacheBeam/Internal/PipelineProto+Initializers.swift
index d17ef35..502ed64 100644
--- a/Sources/ApacheBeam/Internal/PipelineProto+Initializers.swift
+++ b/Sources/ApacheBeam/Internal/PipelineProto+Initializers.swift
@@ -16,6 +16,8 @@
  * limitations under the License.
  */
 
+/// An enumeration for representing various elements of a pipeline protocol buffer. This enum is used
+/// when constructing the pipeline for submission to a portable runner.
 enum PipelineComponent {
     case none
     case transform(String, PTransformProto)
@@ -23,7 +25,8 @@
     case coder(String, CoderProto)
     case windowingStrategy(String, WindowingStrategyProto)
     case environment(String, EnvironmentProto)
-
+    
+    /// The name of the pipeline component. Most components in the protocol buffer have a name used to reference the component throughout the pipeline structure.
     var name: String {
         switch self {
         case .none:
@@ -41,6 +44,8 @@
         }
     }
 
+    
+    /// The PTransfrom protocol buffer for this component. Returns ``nil`` for everything except a ``transform`` type.
     var transform: PTransformProto? {
         if case let .transform(_, pTransformProto) = self {
             return pTransformProto
@@ -50,16 +55,23 @@
     }
 }
 
-/// Convenience function for creating new pipeline elements. Note that these shouldn't be accessed concurrently
-/// but this isn't a problem itself since trying to access the proto concurrently throws an error.
+// Convenience function for creating new pipeline elements. Note that these shouldn't be accessed concurrently
+// but this isn't a problem itself since trying to access the proto concurrently throws an error.
 extension PipelineProto {
+    
+    /// Adds a new `PTransform` protocol buffer to the pipeline along with an internal reference name to be used by other parts of the pipeline.
+    /// - Parameter mapper: A closure that returns the `PTransform` protocol buffer. Includes the reference id as a parameter in case it is needed.
+    /// - Returns: A ``PipelineComponent`` representing this `PTransform`
     mutating func transform(_ mapper: @escaping (String) throws -> PTransformProto) throws -> PipelineComponent {
         let name = "ref_PTransform_\(components.transforms.count + 1)"
         let proto = try mapper(name)
         components.transforms[name] = proto
         return .transform(name, proto)
     }
-
+    
+    /// Adds a new `PCollection` protocol buffer to the pipeline along with an internal reference name to be used elsewhere (e.g. `PTransform`s)
+    /// - Parameter mapper: A closure that returns the `PCollection` protocol buffer. It is passed the reference name in case that is useful
+    /// - Returns: A ``PipelineComponent`` representing the `PCollection`
     mutating func collection(_ mapper: @escaping (String) throws -> PCollectionProto) throws -> PipelineComponent {
         let name = "ref_PCollection_\(components.pcollections.count + 1)"
         let proto = try mapper(name)
diff --git a/Sources/ApacheBeam/Transforms/Basic.swift b/Sources/ApacheBeam/Transforms/Basic.swift
index ed9b452..71d70a3 100644
--- a/Sources/ApacheBeam/Transforms/Basic.swift
+++ b/Sources/ApacheBeam/Transforms/Basic.swift
@@ -18,9 +18,22 @@
 
 import Foundation
 
-/// Creating Static Values
+// Utility Transforms
 public extension PCollection {
-    /// Each time the input fires output all of the values in this list.
+    /// For each item from the input ``PCollection`` emit all of the items in a static list of values.
+    ///
+    /// This transform is most commonly used with ``impulse()`` to create an intial set of inputs for the pipeline. The values passed to
+    /// this transform are encoded in the pipeline submission making it suitable for passing information from input parameters, such as a set
+    /// of files to process.
+    ///
+    /// Note that because these values are encoded in the pipeline itself that they are subject to the maximum size of a protocol buffer (2GB)
+    /// and large inputs can affect submitting the pipeline to the runner.
+    ///
+    /// - Parameters:
+    ///     - values: An array of ``Codable`` values to be emitted for each input record
+    ///     - name: An optional name for this transform. By default it will use the source file and line number for easy debugging
+    ///
+    /// - Returns: A ``PCollection`` containing contaings items of type `Value`
     func create<Value: Codable>(_ values: [Value], name: String? = nil, _file: String = #fileID, _line: Int = #line) -> PCollection<Value> {
         pstream(name: name ?? "\(_file):\(_line)", type: .bounded, values) { values, input, output in
             for try await (_, ts, w) in input {
@@ -32,7 +45,7 @@
     }
 }
 
-/// Convenience logging mappers
+// Logging Transforms
 public extension PCollection {
     @discardableResult
     func log(prefix: String, _ name: String? = nil, _file: String = #fileID, _line: Int = #line) -> PCollection<Of> where Of == String {
@@ -58,16 +71,37 @@
     }
 }
 
-/// Modifying Values
+// Mapping Operations
 public extension PCollection {
-    /// Modify a value without changing its window or timestamp
+    /// Perform a scalar transformation of input values from a ``PCollection`` to another type without modifying the window or the timestamp.
+    ///
+    ///  For example, the following code would return a ``PCollection<String>`` if applied to an input ``PCollection`` whose value has
+    ///  a ``String`` property named `name`
+    ///  ```swift
+    ///    input.map { $0.name }
+    ///  ```
+    /// Note: The return type of the mapping function is treated as a scalar even if it is an iterable type. To return multiple values from a single input
+    /// use ``flatMap(name:_file:_line:_:)`` instead.
+    ///
+    /// - Parameters:
+    ///     - name: An optional name for this transform. By default it will use the file name and line number for easy debugging.
+    ///     - fn: A trailing closure specifying the mapping function
+    ///
+    /// - Returns: A ``PCollection<Out>`` of scalar transformations.
     func map<Out>(name: String? = nil, _file: String = #fileID, _line: Int = #line, _ fn: @Sendable @escaping (Of) -> Out) -> PCollection<Out> {
         pardo(name: name ?? "\(_file):\(_line)") { input, output in
             output.emit(fn(input.value))
         }
     }
 
-    /// Map function to convert a tuple pair into an encodable key-value pair
+    /// Map a scalar input into a tuple representing a key-value pair. This is most commonly used in conjunction with ``groupByKey()`` transformations but can
+    /// be used as a scalar transform to Beam's native key-value coding type.
+    ///
+    /// - Parameters:
+    ///   - name: An optional name for this transform. By default it will use the file name and line number for easy debugging.
+    ///   - fn: A trailing closure specifying the mapping function
+    ///
+    /// - Returns: A ``PCollection<KV<K,V>>`` which is encoded using Beam's native key value coding.
     func map<K, V>(name: String? = nil, _file: String = #fileID, _line: Int = #line, _ fn: @Sendable @escaping (Of) -> (K, V)) -> PCollection<KV<K, V>> {
         pardo(name: name ?? "\(_file):\(_line)") { input, output in
             let (key, value) = fn(input.value)
@@ -75,9 +109,16 @@
         }
     }
 
-    /// Produce multiple outputs as a single value without modifying window or timestamp
-    func flatMap<Out>(name: String? = nil, _file: String = #fileID, _line: Int = #line, _ fn: @Sendable @escaping (Of) -> [Out]) -> PCollection<Out> {
-        pardo(name: name ?? "\(_file):\(_line)") { input, output in
+    /// Map a ``PCollection`` to zero or more outputs by returning a ``Sequence``
+    ///
+    /// - Parameters:
+    ///   - name: An optional name for this transform. By default it will use the source filename and line number for easy debugging.
+    ///   - fn: A trailing closure that returns a ``Sequence``.
+    ///
+    /// - Returns: A ``PCollection`` of values with the type ``Sequence.Element``
+    ///
+    func flatMap<S:Sequence>(name: String? = nil,_file: String = #fileID,_line: Int = #line,_ fn: @Sendable @escaping (Of) -> S) -> PCollection<S.Element> {
+        pardo(name: name ?? "\(_file):\(_line)") { input,output in
             for i in fn(input.value) {
                 output.emit(i)
             }
@@ -85,8 +126,15 @@
     }
 }
 
-/// Modifying Timestamps
+// Timestamp Operations
 public extension PCollection {
+    /// Modifies the timestamps of values in the input ``PCollection`` according to user specified logic
+    /// - Parameters:
+    ///   - name: An optional name for this transform. By default it will use the source filename and line number for easy debugging.
+    ///   - fn: A trailing closure that returns the new timestamp for the input value.
+    ///
+    /// - Returns: A ``PCollection`` with modified timestamps.
+    ///
     func timestamp(name: String? = nil, _file: String = #fileID, _line: Int = #line, _ fn: @Sendable @escaping (Of) -> Date) -> PCollection<Of> {
         pstream(name: name ?? "\(_file):\(_line)") { input, output in
             for try await (value, _, w) in input {
@@ -97,7 +145,12 @@
 }
 
 public extension PCollection<Never> {
-    /// Convenience function to add an impulse when we are at the root of the pipeline
+    /// A convience implementation of ``create(_:name:_file:_line:)-38du`` that prepends an ``impulse()`` transform to a pipeline root.
+    /// - Parameters:
+    ///   - values: The values to emit when the impulse item is received
+    ///   - name: An optional name for this transform. By default it will use the source filename and line number for easy debugging.
+    ///
+    /// - Returns: A ``PCollection`` of values from the static list
     func create<Value: Codable>(_ values: [Value], name: String? = nil, _file: String = #fileID, _line: Int = #line) -> PCollection<Value> {
         impulse().create(values, name: name, _file: _file, _line: _line)
     }
diff --git a/Sources/ApacheBeam/Transforms/BuiltIn+Elements.swift b/Sources/ApacheBeam/Transforms/BuiltIn+Elements.swift
index 5c10295..0743bd5 100644
--- a/Sources/ApacheBeam/Transforms/BuiltIn+Elements.swift
+++ b/Sources/ApacheBeam/Transforms/BuiltIn+Elements.swift
@@ -20,6 +20,10 @@
 
 public extension PCollection {
     // No Output
+    /// Apply a closure-based ``DoFn`` to an input ``PCollection`` that returns no output.
+    /// - Parameters:
+    ///   - name: A name for this transform
+    ///   - fn: A closure that implements a DoFn by taking a single ``PInput`` and emitting no outputs
     func pardo(name: String, _ fn: @Sendable @escaping (PInput<Of>) async throws -> Void) {
         pstream(name: name) { input in
             for try await element in input {
@@ -29,6 +33,11 @@
     }
 
     // One Output
+    /// Apply a closure-based ``DoFn`` to an input ``PCollection`` that emits to a single output ``PCollection``
+    /// - Parameters:
+    ///   - name: A name for this transform
+    ///   - fn: <#fn description#>
+    /// - Returns: <#description#>
     func pardo<O0>(name: String, _ fn: @Sendable @escaping (PInput<Of>, POutput<O0>) async throws -> Void) -> PCollection<O0> {
         pstream(name: name) { input, output in
             for try await element in input {
diff --git a/Sources/ApacheBeam/Transforms/BuiltIn.swift b/Sources/ApacheBeam/Transforms/BuiltIn.swift
index cf0d8b2..5ee71d5 100644
--- a/Sources/ApacheBeam/Transforms/BuiltIn.swift
+++ b/Sources/ApacheBeam/Transforms/BuiltIn.swift
@@ -203,7 +203,9 @@
 }
 
 public extension PCollection {
-    /// Core GroupByKey transform. Requires a pair input
+    /// The built-in Beam GroupByKey transform. Requires that the input be a Beam key-value type.
+    ///
+    /// - Returns: A ``PCollection`` of type `KV<K,V>` where the value of the key-value pair is a `Sequence` of all values associated with the key `K`
     func groupByKey<K, V>() -> PCollection<KV<K, V>> where Of == KV<K, V> {
         // Adjust the coder for the pcollection to reflect GBK semantcs
         let output = PCollection<KV<K, V>>(coder: .keyvalue(.of(type: K.self)!, .of(type: [V].self)!), type: streamType)
diff --git a/Sources/ApacheBeam/Transforms/IO/FileIO.swift b/Sources/ApacheBeam/Transforms/IO/FileIO.swift
index 5bd2079..e7b6e15 100644
--- a/Sources/ApacheBeam/Transforms/IO/FileIO.swift
+++ b/Sources/ApacheBeam/Transforms/IO/FileIO.swift
@@ -18,12 +18,33 @@
 
 import Foundation
 
+/// Defines a protocol for transforms that know how to read from external File-like systems given an input
+/// collection of paths.
 public protocol FileIOSource {
+    /// A static function definition that takes `(path,matched_filename)` pairs output by ``readFiles(matching:)`` or some other source
+    /// and reads them as a single data output.
+    ///
+    /// - Parameter matching: An input ``PCollection`` of pairs representing a `(path,matched_filename)`
+    /// where `path` and `matched_filename` are dependent on the specific source.
+    /// - Returns: A ``PCollection`` of binary `Data` elements. Note that the original path and filename is not carried with the data.
     static func readFiles(matching: PCollection<KV<String, String>>) -> PCollection<Data>
+   
+    /// Static function definition for reading a list of files matching some pattern at a given path. The definition of "path" largely depends on the
+    /// source type. For example, for remote object stores that might be a bucket or a bucket prefix while for a local filesystem it would be a
+    /// standard file path. It is best to check the specific transform's documentation to verify
+    ///
+    ///
+    /// - Parameter matching: A pair representing the path to check and pattern to check with.
+    ///
+    /// - Returns: A list of pairs of the form `(path,matched_filename)`
     static func listFiles(matching: PCollection<KV<String, String>>) -> PCollection<KV<String, String>>
 }
 
 public extension PCollection<KV<String, String>> {
+    /// A transform for reading files from a concrete ``FileIOSource``.
+    /// - Parameter `_`: The type of ``FileIOSource`` to use. For example ``LocalStorage.self``
+    ///
+    /// - Returns: The data elements from the ``readFiles(matching:)`` implementation for this ``FileIOSource``
     func readFiles<Source: FileIOSource>(in _: Source.Type) -> PCollection<Data> {
         Source.readFiles(matching: self)
     }
diff --git a/Sources/ApacheBeam/Transforms/IO/GoogleCloud/GoogleStorage.swift b/Sources/ApacheBeam/Transforms/IO/GoogleCloud/GoogleStorage.swift
index b289f94..0481f7e 100644
--- a/Sources/ApacheBeam/Transforms/IO/GoogleCloud/GoogleStorage.swift
+++ b/Sources/ApacheBeam/Transforms/IO/GoogleCloud/GoogleStorage.swift
@@ -69,7 +69,13 @@
             }
         }
     }
-
+    
+    /// Match files in a Google Cloud Storage Bucket matching the prefix given by `(bucket,prefix)` string pairs.
+    ///
+    /// Note: Currently only the DefaultTokenProvider is supported.
+    ///
+    /// - Parameter matching: A ``PCollection`` of `(bucket,prefix)` pairs.
+    /// - Returns: A ``PCollection`` of `(bucket,file)` pairs.
     public static func listFiles(matching: PCollection<KV<String, String>>) -> PCollection<KV<String, String>> {
         matching.pstream(type: .bounded) { matching, output in
 
diff --git a/Sources/ApacheBeam/Transforms/IO/Local/LocalStorage.swift b/Sources/ApacheBeam/Transforms/IO/Local/LocalStorage.swift
index 51a04a5..aea4820 100644
--- a/Sources/ApacheBeam/Transforms/IO/Local/LocalStorage.swift
+++ b/Sources/ApacheBeam/Transforms/IO/Local/LocalStorage.swift
@@ -32,7 +32,6 @@
 
     public static func listFiles(matching: PCollection<KV<String, String>>) -> PCollection<KV<String, String>> {
         matching.pstream(type: .bounded) { input, output in
-            let fm = FileManager.default
             for try await (pathAndPattern, ts, w) in input {
                 let path = pathAndPattern.key
                 let patterns = try pathAndPattern.values.map { try Regex($0) }
diff --git a/Sources/Documentation.docc/ApacheBeam.md b/Sources/Documentation.docc/ApacheBeam.md
new file mode 100644
index 0000000..d0920b0
--- /dev/null
+++ b/Sources/Documentation.docc/ApacheBeam.md
@@ -0,0 +1,13 @@
+# ``ApacheBeam``
+
+<!--@START_MENU_TOKEN@-->Summary<!--@END_MENU_TOKEN@-->
+
+## Overview
+
+<!--@START_MENU_TOKEN@-->Text<!--@END_MENU_TOKEN@-->
+
+## Topics
+
+### <!--@START_MENU_TOKEN@-->Group<!--@END_MENU_TOKEN@-->
+
+- <!--@START_MENU_TOKEN@-->``Symbol``<!--@END_MENU_TOKEN@-->