```swift title="Swift"
import Kreuzberg
import os.log

let logger = Logger(subsystem: "com.example.plugins", category: "MyPlugin")

final class MyPlugin: PostProcessor {
    func name() -> String {
        "my-plugin"
    }

    func version() -> String {
        "1.0.0"
    }

    func initialize() -> String {
        logger.info("Initializing plugin: my-plugin")
        return "{\"ok\": null}"
    }

    func shutdown() -> String {
        logger.info("Shutting down plugin: my-plugin")
        return "{\"ok\": null}"
    }

    func process(result: ExtractionResult, config: ExtractionConfig) -> String {
        let contentLen = result.content().count
        logger.info("Processing \(result.mimeType()) (\(contentLen) bytes)")

        if contentLen == 0 {
            logger.warning("Processing resulted in empty content")
        }

        return "{\"ok\": null}"
    }

    func shouldProcess(result: ExtractionResult, config: ExtractionConfig) -> Bool {
        true
    }

    func processingStage() -> String {
        "early"
    }

    func priority() -> Int32 {
        50
    }

    func estimatedDurationMs(result: ExtractionResult) -> UInt64 {
        10
    }
}

let plugin = MyPlugin()
try Kreuzberg.registerPostProcessor(plugin)
```
