--- a/core/build.gradle.kts	Wed Mar 12 19:00:20 2025 -0400
+++ b/core/build.gradle.kts	Wed Mar 12 19:49:58 2025 -0400
@@ -1,3 +1,5 @@
+import org.jetbrains.kotlin.gradle.dsl.JvmTarget
+
 /*
  * AboutOss is an utility library to retrieve and display
  * opensource licenses in Android applications.
@@ -21,7 +23,7 @@
  */
 plugins {
     id("com.android.library")
-    kotlin("android")
+    kotlin("multiplatform")
     id("com.geekorum.build.source-license-checker")
     `maven-publish`
 }
@@ -29,6 +31,34 @@
 group = "com.geekorum.aboutoss"
 version = "0.1.0"
 
+kotlin {
+    androidTarget {
+        compilerOptions {
+            jvmTarget.set(JvmTarget.JVM_17)
+        }
+    }
+
+    jvm("desktop")
+
+    listOf(
+        iosX64(),
+        iosArm64(),
+        iosSimulatorArm64(),
+    ).forEach { iosTarget ->
+        iosTarget.binaries.framework {
+            baseName = "aboutoss-core"
+            isStatic = true
+        }
+    }
+
+    sourceSets {
+        commonMain.dependencies {
+            implementation(libs.okio)
+            implementation(libs.kotlinx.coroutines)
+        }
+    }
+}
+
 android {
     namespace = "com.geekorum.aboutoss.core"
     compileSdk = 35
@@ -53,11 +83,8 @@
         }
     }
     compileOptions {
-        sourceCompatibility = JavaVersion.VERSION_1_8
-        targetCompatibility = JavaVersion.VERSION_1_8
-    }
-    kotlinOptions {
-        jvmTarget = "1.8"
+        sourceCompatibility = JavaVersion.VERSION_17
+        targetCompatibility = JavaVersion.VERSION_17
     }
 
     publishing {
@@ -69,8 +96,6 @@
 }
 
 dependencies {
-    implementation(libs.okio)
-    implementation(libs.kotlinx.coroutines)
 
     testImplementation(libs.junit)
     androidTestImplementation(libs.androidx.test.ext.junit)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/src/commonMain/kotlin/gms/OssLicenseParser.kt	Wed Mar 12 19:49:58 2025 -0400
@@ -0,0 +1,105 @@
+/*
+ * AboutOss is an utility library to retrieve and display
+ * opensource licenses in Android applications.
+ *
+ * Copyright (C) 2023 by Frederic-Charles Barthelery.
+ *
+ * This file is part of AboutOss.
+ *
+ * AboutOss is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AboutOss is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AboutOss.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.geekorum.aboutoss.core.gms
+
+import okio.ByteString
+import okio.Source
+import okio.buffer
+import okio.use
+
+/**
+ * Parse licences data generated by the "com.google.android.gms.oss-licenses-plugin" gradle plugin.
+ */
+class OssLicenseParser {
+
+    /**
+     * Parse licenses
+     * @param [thirdPartyLicensesInput] is usually res/raw/third_party_licenses file
+     * @param [thirdPartyLicensesMetadataInput] is usually res/raw/third_party_license_metadata file
+     */
+    fun parseLicenses(
+        thirdPartyLicensesInput: Source, thirdPartyLicensesMetadataInput: Source
+    ): Map<String, String> {
+        val licenses = readLicensesFile(thirdPartyLicensesInput)
+        return buildLicenseInfo(licenses, thirdPartyLicensesMetadataInput)
+    }
+
+    private fun readLicensesFile(thirdPartyLicensesInput: Source): ByteString {
+        return thirdPartyLicensesInput.buffer().use {
+            it.readByteString()
+        }
+    }
+
+    private fun buildLicenseInfo(license: ByteString, thirdPartyLicensesMetadataInput: Source): Map<String, String> {
+        return thirdPartyLicensesMetadataInput.buffer().use {
+            buildMap {
+                while (true) {
+                    val line = it.readUtf8Line() ?: break
+                    if (line.isNotBlank()) {
+                        with(line.toLineParser()) {
+                            val start = readStartIdx()
+                            val length = readLength()
+                            val dependency = readName()
+                            val licenseTxt = license.substring(
+                                beginIndex = start,
+                                endIndex = start + length + 1
+                            ).utf8()
+                            put(dependency, licenseTxt)
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    companion object
+}
+
+private class LicenseMetadataLineParser(
+    private val line: String
+) {
+
+    private var idx = 0
+
+    fun readStartIdx(): Int {
+        val end = line.indexOf(':', startIndex = idx)
+        val result = line.substring(idx, end).toInt()
+        idx = end + 1
+        return result
+    }
+
+    fun readLength(): Int {
+        val end = line.indexOf(' ', startIndex = idx)
+        val result = line.substring(idx, end).toInt()
+        idx = end + 1
+        return result
+    }
+
+    fun readName(): String {
+        val result = line.substring(idx)
+        idx = line.length + 1
+        return result
+    }
+
+}
+
+private fun String.toLineParser() = LicenseMetadataLineParser(this)
\ No newline at end of file
--- a/core/src/main/java/com/geekorum/aboutoss/core/LicenseInfoRepository.kt	Wed Mar 12 19:00:20 2025 -0400
+++ b/core/src/main/java/com/geekorum/aboutoss/core/LicenseInfoRepository.kt	Wed Mar 12 19:49:58 2025 -0400
@@ -22,8 +22,11 @@
 package com.geekorum.aboutoss.core
 
 import android.content.Context
+import com.geekorum.aboutoss.core.gms.OssLicenseParser
+import com.geekorum.aboutoss.core.gms.openRawResourcesByName
 import kotlinx.coroutines.CoroutineDispatcher
 import kotlinx.coroutines.withContext
+import okio.source
 
 /**
  * Retrieve License information stored in application resources
@@ -58,8 +61,8 @@
                         .use { licensesMetadataInput ->
                             val parser = OssLicenseParser()
                             parser.parseLicenses(
-                                thirdPartyLicensesInput = licensesInput,
-                                thirdPartyLicensesMetadataInput = licensesMetadataInput
+                                thirdPartyLicensesInput = licensesInput.source(),
+                                thirdPartyLicensesMetadataInput = licensesMetadataInput.source()
                             )
                         }
                 }
--- a/core/src/main/java/com/geekorum/aboutoss/core/OssLicenseParser.kt	Wed Mar 12 19:00:20 2025 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-/*
- * AboutOss is an utility library to retrieve and display
- * opensource licenses in Android applications.
- *
- * Copyright (C) 2023 by Frederic-Charles Barthelery.
- *
- * This file is part of AboutOss.
- *
- * AboutOss is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * AboutOss is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with AboutOss.  If not, see <http://www.gnu.org/licenses/>.
- */
-package com.geekorum.aboutoss.core
-
-import android.annotation.SuppressLint
-import android.content.Context
-import okio.ByteString
-import okio.buffer
-import okio.source
-import java.io.InputStream
-
-/**
- * Parse licences data generated by the "com.google.android.gms.oss-licenses-plugin" gradle plugin.
- */
-class OssLicenseParser {
-
-    /**
-     * Parse licenses
-     * @param [thirdPartyLicensesInput] is usually res/raw/third_party_licenses file
-     * @param [thirdPartyLicensesMetadataInput] is usually res/raw/third_party_license_metadata file
-     */
-    fun parseLicenses(
-        thirdPartyLicensesInput: InputStream, thirdPartyLicensesMetadataInput: InputStream
-    ): Map<String, String> {
-        val licenses = readLicensesFile(thirdPartyLicensesInput)
-        return buildLicenseInfo(licenses, thirdPartyLicensesMetadataInput)
-    }
-
-    private fun readLicensesFile(thirdPartyLicensesInput: InputStream): ByteString {
-        return thirdPartyLicensesInput.source().use { source ->
-            source.buffer().use {
-                it.readByteString()
-            }
-        }
-    }
-
-    private fun buildLicenseInfo(license: ByteString, thirdPartyLicensesMetadataInput: InputStream): Map<String, String> {
-        return thirdPartyLicensesMetadataInput.source().use { source ->
-            source.buffer().use {
-                buildMap {
-                    while (true) {
-                        val line = it.readUtf8Line() ?: break
-                        if (line.isNotBlank()) {
-                            with(line.toLineParser()) {
-                                val start = readStartIdx()
-                                val length = readLength()
-                                val dependency = readName()
-                                val licenseTxt = license.substring(
-                                    beginIndex = start,
-                                    endIndex = start + length + 1
-                                ).string(Charsets.UTF_8)
-                                put(dependency, licenseTxt)
-                            }
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    companion object {
-        @SuppressLint("DiscouragedApi")
-        fun openDefaultThirdPartyLicenses(context: Context): InputStream {
-            return openRawResourcesByName(context, "third_party_licenses")
-        }
-
-        @SuppressLint("DiscouragedApi")
-        fun openDefaultThirdPartyLicensesMetadata(context: Context): InputStream {
-            return openRawResourcesByName(context, "third_party_license_metadata")
-        }
-
-        @SuppressLint("DiscouragedApi")
-        fun openRawResourcesByName(context: Context, name: String): InputStream {
-            val resourceId = context.resources.getIdentifier(name, "raw", context.packageName)
-            check(resourceId != 0) { "$name was not found in resources raw of ${context.packageName}"}
-            return context.resources.openRawResource(resourceId)
-        }
-    }
-}
-
-private class LicenseMetadataLineParser(
-    private val line: String
-) {
-
-    private var idx = 0
-
-    fun readStartIdx(): Int {
-        val end = line.indexOf(':', startIndex = idx)
-        val result = line.substring(idx, end).toInt()
-        idx = end + 1
-        return result
-    }
-
-    fun readLength(): Int {
-        val end = line.indexOf(' ', startIndex = idx)
-        val result = line.substring(idx, end).toInt()
-        idx = end + 1
-        return result
-    }
-
-    fun readName(): String {
-        val result = line.substring(idx)
-        idx = line.length + 1
-        return result
-    }
-
-}
-
-private fun String.toLineParser() = LicenseMetadataLineParser(this)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/src/main/java/com/geekorum/aboutoss/core/gms/OssLicenseParserExt.kt	Wed Mar 12 19:49:58 2025 -0400
@@ -0,0 +1,43 @@
+/*
+ * AboutOss is an utility library to retrieve and display
+ * opensource licenses in Android applications.
+ *
+ * Copyright (C) 2023 by Frederic-Charles Barthelery.
+ *
+ * This file is part of AboutOss.
+ *
+ * AboutOss is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * AboutOss is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with AboutOss.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package com.geekorum.aboutoss.core.gms
+
+import android.annotation.SuppressLint
+import android.content.Context
+import java.io.InputStream
+
+@SuppressLint("DiscouragedApi")
+fun OssLicenseParser.Companion.openDefaultThirdPartyLicenses(context: Context): InputStream {
+    return openRawResourcesByName(context, "third_party_licenses")
+}
+
+@SuppressLint("DiscouragedApi")
+fun OssLicenseParser.Companion.openDefaultThirdPartyLicensesMetadata(context: Context): InputStream {
+    return openRawResourcesByName(context, "third_party_license_metadata")
+}
+
+@SuppressLint("DiscouragedApi")
+fun OssLicenseParser.Companion.openRawResourcesByName(context: Context, name: String): InputStream {
+    val resourceId = context.resources.getIdentifier(name, "raw", context.packageName)
+    check(resourceId != 0) { "$name was not found in resources raw of ${context.packageName}"}
+    return context.resources.openRawResource(resourceId)
+}