diff --git a/src/id/komikindo/build.gradle b/src/id/komikindo/build.gradle
new file mode 100644
index 000000000..bb5016b52
--- /dev/null
+++ b/src/id/komikindo/build.gradle
@@ -0,0 +1,10 @@
+ext {
+    extName = 'Komikindo'
+    extClass = '.Komikindo'
+    themePkg = 'mangathemesia'
+    baseUrl = 'https://komikindo.sbs'
+    overrideVersionCode = 0
+    isNsfw = true
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/id/komikindo/res/mipmap-hdpi/ic_launcher.png b/src/id/komikindo/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..4802d1b77
Binary files /dev/null and b/src/id/komikindo/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/id/komikindo/res/mipmap-mdpi/ic_launcher.png b/src/id/komikindo/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..cc7491050
Binary files /dev/null and b/src/id/komikindo/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/id/komikindo/res/mipmap-xhdpi/ic_launcher.png b/src/id/komikindo/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..ee2e51cea
Binary files /dev/null and b/src/id/komikindo/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/id/komikindo/res/mipmap-xxhdpi/ic_launcher.png b/src/id/komikindo/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..834b7317a
Binary files /dev/null and b/src/id/komikindo/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/id/komikindo/res/mipmap-xxxhdpi/ic_launcher.png b/src/id/komikindo/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..dd43a73b6
Binary files /dev/null and b/src/id/komikindo/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/Komikindo.kt b/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/Komikindo.kt
new file mode 100644
index 000000000..19b289977
--- /dev/null
+++ b/src/id/komikindo/src/eu/kanade/tachiyomi/extension/id/komikindo/Komikindo.kt
@@ -0,0 +1,43 @@
+package eu.kanade.tachiyomi.extension.id.komikindo
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import org.jsoup.nodes.Document
+
+class Komikindo : MangaThemesia(
+    "Komikindo",
+    "https://komikindo.sbs",
+    "id",
+) {
+    // Some covers fail to load with no Accept header + no resize parameter.
+    // Hence the workarounds:
+
+    private val cdnHeaders = imageRequest(Page(0, "$baseUrl/", baseUrl)).headers
+
+    override val client = super.client.newBuilder()
+        .addInterceptor { chain ->
+            val request = chain.request()
+            val url = request.url.toString()
+            if (url.contains("/wp-content/uploads/")) {
+                return@addInterceptor chain.proceed(request.newBuilder().headers(cdnHeaders).build())
+            }
+            chain.proceed(request)
+        }
+        .build()
+
+    override fun mangaDetailsParse(document: Document): SManga {
+        return super.mangaDetailsParse(document).apply {
+            thumbnail_url = thumbnail_url
+                ?.toHttpUrlOrNull()
+                ?.takeIf { it.queryParameter("resize") == null }
+                ?.newBuilder()
+                ?.setEncodedQueryParameter("resize", "165,225")
+                ?.build()
+                ?.toString()
+        }
+    }
+
+    override val hasProjectPage = true
+}