diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml
index 11f1c4ba8..2e9f8b049 100644
--- a/.github/workflows/issue_moderator.yml
+++ b/.github/workflows/issue_moderator.yml
@@ -43,7 +43,7 @@ jobs:
},
{
"type": "both",
- "regex": ".*(hq\\s*dragon|manga\\s*host|supermangas|superhentais|union\\s*mangas|yes\\s*mangas|manhuascan|manhwahot|leitor\\.?net|manga\\s*livre|tsuki\\s*mangas|manga\\s*yabu|mangas\\.in|mangas\\.pw|hentaikai|toptoon\\+?|colamanhua|mangadig|hitomi\\.la|copymanga|neox|1manga\\.co|mangafox\\.fun|mangahere\\.onl|mangakakalot\\.fun|manganel(?!o)|mangaonline\\.fun|mangatoday|manga\\.town|onemanga\\.info|koushoku|ksk\\.moe|comikey|leercapitulo|c[uứ]u\\s*truy[eệ]n|day\\s*comics?|reaper\\s*scans|constellar\\s*scans|mode\\s*scanlator).*",
+ "regex": ".*(hq\\s*dragon|manga\\s*host|supermangas|superhentais|union\\s*mangas|yes\\s*mangas|manhuascan|manhwahot|leitor\\.?net|manga\\s*livre|tsuki\\s*mangas|manga\\s*yabu|mangas\\.in|mangas\\.pw|hentaikai|toptoon\\+?|colamanhua|mangadig|hitomi\\.la|copymanga|neox|1manga\\.co|mangafox\\.fun|mangahere\\.onl|mangakakalot\\.fun|manganel(?!o)|mangaonline\\.fun|mangatoday|manga\\.town|onemanga\\.info|koushoku|ksk\\.moe|comikey|leercapitulo|c[uứ]u\\s*truy[eệ]n|day\\s*comics?|reaper\\s*scans|constellar\\s*scans|mode\\s*scanlator|bakai).*",
"ignoreCase": true,
"labels": ["invalid"],
"message": "{match} will not be added back as it is too difficult to maintain. Read [this](https://github.com/tachiyomiorg/tachiyomi-extensions/blob/master/REMOVED_SOURCES.md) for more information."
diff --git a/REMOVED_SOURCES.md b/REMOVED_SOURCES.md
index 7a94c5937..cbd0199c9 100644
--- a/REMOVED_SOURCES.md
+++ b/REMOVED_SOURCES.md
@@ -10,6 +10,7 @@ Here is a list of known sources that were removed.
### Too difficult to maintain
+- Bakai https://github.com/tachiyomiorg/tachiyomi-extensions/pull/17890
- ColaManhua (COLA漫画) https://github.com/tachiyomiorg/tachiyomi-extensions/pull/11445
- Comikey https://github.com/tachiyomiorg/tachiyomi-extensions/pull/11971
- Constellar Scans https://github.com/tachiyomiorg/tachiyomi-extensions/pull/17277
diff --git a/src/pt/bakai/AndroidManifest.xml b/src/pt/bakai/AndroidManifest.xml
deleted file mode 100644
index 8072ee00d..000000000
--- a/src/pt/bakai/AndroidManifest.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/src/pt/bakai/build.gradle b/src/pt/bakai/build.gradle
deleted file mode 100644
index 26f9f73b2..000000000
--- a/src/pt/bakai/build.gradle
+++ /dev/null
@@ -1,12 +0,0 @@
-apply plugin: 'com.android.application'
-apply plugin: 'kotlin-android'
-
-ext {
- extName = 'Bakai'
- pkgNameSuffix = 'pt.bakai'
- extClass = '.Bakai'
- extVersionCode = 4
- isNsfw = true
-}
-
-apply from: "$rootDir/common.gradle"
diff --git a/src/pt/bakai/res/mipmap-hdpi/ic_launcher.png b/src/pt/bakai/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 4dc069e59..000000000
Binary files a/src/pt/bakai/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/bakai/res/mipmap-mdpi/ic_launcher.png b/src/pt/bakai/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index bf34eebcd..000000000
Binary files a/src/pt/bakai/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/bakai/res/mipmap-xhdpi/ic_launcher.png b/src/pt/bakai/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 3ebae1078..000000000
Binary files a/src/pt/bakai/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/bakai/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/bakai/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 22957bfab..000000000
Binary files a/src/pt/bakai/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/bakai/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/bakai/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 1d637c67e..000000000
Binary files a/src/pt/bakai/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/src/pt/bakai/res/web_hi_res_512.png b/src/pt/bakai/res/web_hi_res_512.png
deleted file mode 100644
index 53a8f8dee..000000000
Binary files a/src/pt/bakai/res/web_hi_res_512.png and /dev/null differ
diff --git a/src/pt/bakai/src/eu/kanade/tachiyomi/extension/pt/bakai/Bakai.kt b/src/pt/bakai/src/eu/kanade/tachiyomi/extension/pt/bakai/Bakai.kt
deleted file mode 100644
index 1fc5afa77..000000000
--- a/src/pt/bakai/src/eu/kanade/tachiyomi/extension/pt/bakai/Bakai.kt
+++ /dev/null
@@ -1,138 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.bakai
-
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
-import eu.kanade.tachiyomi.source.model.FilterList
-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.source.online.ParsedHttpSource
-import okhttp3.Headers
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import okhttp3.Request
-import org.jsoup.nodes.Document
-import org.jsoup.nodes.Element
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Bakai : ParsedHttpSource() {
-
- override val name = "Bakai"
-
- override val baseUrl = "https://bakai.org"
-
- override val lang = "pt-BR"
-
- override val supportsLatest = true
-
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .rateLimitHost(baseUrl.toHttpUrl(), 1, 2)
- .rateLimitHost(CDN_URL.toHttpUrl(), 1, 1)
- .build()
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Referer", "$baseUrl/")
-
- // Source doesn't have a popular list, so use latest instead.
- override fun popularMangaRequest(page: Int): Request = latestUpdatesRequest(page)
-
- override fun popularMangaSelector(): String = latestUpdatesSelector()
-
- override fun popularMangaFromElement(element: Element): SManga = latestUpdatesFromElement(element)
-
- override fun popularMangaNextPageSelector(): String = latestUpdatesNextPageSelector()
-
- override fun latestUpdatesRequest(page: Int): Request {
- val path = if (page > 1) "home2/page/$page/" else ""
- return GET("$baseUrl/$path", headers)
- }
-
- override fun latestUpdatesSelector() = "#elCmsPageWrap ul.ipsGrid article.ipsBox"
-
- override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply {
- title = element.selectFirst("h2.ipsType_pageTitle a")!!.text().trim()
- thumbnail_url = element.selectFirst("img.ipsImage[alt]")!!.attr("abs:src")
- setUrlWithoutDomain(element.selectFirst("a[title]")!!.attr("href"))
- }
-
- override fun latestUpdatesNextPageSelector() =
- "#elCmsPageWrap ul.ipsPagination li.ipsPagination_next:not(.ipsPagination_inactive)"
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val url = "$baseUrl/search2/".toHttpUrl().newBuilder()
- .addQueryParameter("q", query)
- .addQueryParameter("type", "cms_records1")
- .addQueryParameter("search_in", "titles")
- .addQueryParameter("sortby", "relevancy")
- .toString()
-
- return GET(url, headers)
- }
-
- override fun searchMangaSelector() = "#elSearch_main ol.ipsStream li.ipsStreamItem"
-
- override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
- title = element.selectFirst("h2.ipsStreamItem_title a")!!.text().trim()
- thumbnail_url = element.selectFirst("span.ipsThumb img")!!.attr("abs:src")
- setUrlWithoutDomain(element.selectFirst("h2.ipsStreamItem_title a")!!.attr("href"))
- }
-
- override fun searchMangaNextPageSelector(): String? = null
-
- override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
- val infoElement = document.selectFirst(chapterListSelector())!!
-
- author = infoElement.select("p:contains(Artista:) a")
- .joinToString { it.text().trim() }
- genre = infoElement.selectFirst("p:contains(Tags:) span.ipsBadge + span")!!.text()
- status = SManga.COMPLETED
- description = infoElement.select("section.ipsType_richText p")
- .joinToString("\n\n") { it.text().trim() }
- thumbnail_url = infoElement.selectFirst("div.cCmsRecord_image img.ipsImage")!!.attr("abs:src")
- }
-
- override fun chapterListSelector() = "#ipsLayout_contentWrapper article.ipsContained"
-
- override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
- name = element.selectFirst("p:contains(Tipo:) a")!!.text()
- scanlator = element.select("p:contains(Tradução:) a").firstOrNull()
- ?.text()?.trim()
- date_upload = element.ownerDocument()!!.select("div.ipsPageHeader__meta time").firstOrNull()
- ?.attr("datetime")?.toDate() ?: 0L
- setUrlWithoutDomain(element.ownerDocument()!!.location())
- }
-
- override fun pageListParse(document: Document): List {
- return document.select(chapterListSelector() + " div.ipsGrid img.ipsImage")
- .mapIndexed { i, element ->
- Page(i, document.location(), element.attr("abs:data-src"))
- }
- }
-
- override fun imageUrlParse(document: Document) = ""
-
- override fun imageRequest(page: Page): Request {
- val newHeaders = headersBuilder()
- .set("Accept", ACCEPT_IMAGE)
- .set("Referer", page.url)
- .build()
-
- return GET(page.imageUrl!!, newHeaders)
- }
-
- private fun String.toDate(): Long {
- return runCatching { DATE_FORMATTER.parse(trim())?.time }
- .getOrNull() ?: 0L
- }
-
- companion object {
- private const val CDN_URL = "https://img.bakai.org"
-
- private const val ACCEPT_IMAGE = "image/webp,image/apng,image/*,*/*;q=0.8"
-
- private val DATE_FORMATTER by lazy {
- SimpleDateFormat("yyyy-mm-dd'T'HH:mm:ss'Z'", Locale.ENGLISH)
- }
- }
-}