diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..04e0b06c1
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..8fe0d409c
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..1f43d3b13
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..e9e807cbb
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..297bf1665
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png
new file mode 100644
index 000000000..ab0a2dfc4
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt b/multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt
new file mode 100644
index 000000000..9e53761b9
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt
@@ -0,0 +1,129 @@
+package eu.kanade.tachiyomi.extension.id.komikrealm
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
+import eu.kanade.tachiyomi.multisrc.zeistmanga.Status
+import eu.kanade.tachiyomi.multisrc.zeistmanga.Type
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaDto
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaIntl
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import okhttp3.Response
+import org.jsoup.nodes.Document
+import uy.kohesive.injekt.injectLazy
+
+class KomikRealm : ZeistManga(
+    "KomikRealm",
+    "https://www.komikrealm.my.id",
+    "id",
+) {
+    private val json: Json by injectLazy()
+
+    override val hasFilters = true
+
+    override val hasLanguageFilter = false
+
+    override val chapterCategory = ""
+
+    override fun mangaDetailsParse(response: Response): SManga {
+        val document = response.asJsoup()
+        val profileManga = document.select(".bigcontent")
+        val infoManga = profileManga.select("ul.infonime li")
+
+        return SManga.create().apply {
+            thumbnail_url = profileManga.select("img").first()!!.attr("data-src")
+            description = profileManga.select(".sinoposis").text()
+            genre = profileManga.select("div.info-genre > a[rel=tag]")
+                .joinToString { it.text() }
+
+            infoManga.forEach {
+                val title = it.select("b").text()
+                val desc = it.select("span").text()
+
+                when (title) {
+                    "Status" -> status = parseStatus(desc)
+                    "Author" -> author = desc
+                    "Artist" -> artist = desc
+                }
+            }
+        }
+    }
+
+    private fun parseStatus(element: String): Int = when (element.lowercase()) {
+        "ongoing" -> SManga.ONGOING
+        "completed" -> SManga.COMPLETED
+        else -> SManga.UNKNOWN
+    }
+
+    override fun chapterListParse(response: Response): List<SChapter> {
+        val document = response.asJsoup()
+
+        val url = getChapterFeedUrl(document)
+
+        val req = GET(url, headers)
+        val res = client.newCall(req).execute()
+
+        val jsonString = res.body.string()
+        val result = json.decodeFromString<ZeistMangaDto>(jsonString)
+
+        return result.feed?.entry
+            ?.filter {
+                !it.category.orEmpty().any { category ->
+                    category.term == "Series"
+                }
+            }
+            ?.map { it.toSChapter(baseUrl) }
+            ?: throw Exception("Failed to parse from chapter API")
+    }
+
+    private val imagePageRegex = """(http|https)://[^"]+""".toRegex()
+
+    override fun pageListParse(response: Response): List<Page> {
+        val document = response.asJsoup()
+        val script = document.select(".post-body > script").html()
+        val matches = imagePageRegex.findAll(script)
+        return matches.mapIndexed { i, match ->
+            Page(i, "", match.value)
+        }.toList()
+    }
+
+    private val labelChapterRegex = """var label_chapter = "([^"]+)";""".toRegex()
+
+    override fun getChapterFeedUrl(doc: Document): String {
+        val script = doc.select(".post-body > script")
+        val feed = labelChapterRegex.find(script.html())
+            ?.groupValues?.get(1)
+            ?: throw Exception("Failed to find chapter feed")
+
+        return apiUrl(chapterCategory)
+            .addPathSegments(feed)
+            .addQueryParameter("max-results", "999999")
+            .build().toString()
+    }
+
+    private val intl by lazy { ZeistMangaIntl(lang) }
+
+    override fun getStatusList(): List<Status> = listOf(
+        Status(intl.all, ""),
+        Status(intl.statusOngoing, "Ongoing"),
+        Status(intl.statusCompleted, "Completed"),
+    )
+
+    override fun getTypeList(): List<Type> = listOf(
+        Type(intl.all, ""),
+        Type(intl.typeManga, "Manga"),
+        Type(intl.typeManhua, "Manhua"),
+        Type(intl.typeManhwa, "Manhwa"),
+    )
+
+    override fun getGenreList(): List<Genre> = listOf(
+        Genre("Drama", "Drama"),
+        Genre("Mature", "Mature"),
+        Genre("Supernatural", "Supernatural"),
+    )
+}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/zeistmanga/ZeistMangaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/zeistmanga/ZeistMangaGenerator.kt
index d3ef3b188..212e7d6c5 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/zeistmanga/ZeistMangaGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/zeistmanga/ZeistMangaGenerator.kt
@@ -21,6 +21,7 @@ class ZeistMangaGenerator : ThemeSourceGenerator {
         SingleLang("ShiyuraSub", "https://shiyurasub.blogspot.com", "id"),
         SingleLang("Tooncubus", "https://www.tooncubus.top", "id", isNsfw = true),
         SingleLang("SobatManKu", "https://www.sobatmanku19.site", "id"),
+        SingleLang("KomikRealm", "https://www.komikrealm.my.id", "id"),
     )
 
     companion object {