diff --git a/src/es/catharsisfantasy/build.gradle b/src/es/catharsisfantasy/build.gradle
new file mode 100644
index 000000000..80a04ec81
--- /dev/null
+++ b/src/es/catharsisfantasy/build.gradle
@@ -0,0 +1,10 @@
+ext {
+    extName = 'Catharsis Fantasy'
+    extClass = '.CatharsisFantasy'
+    themePkg = 'mangathemesia'
+    baseUrl = 'https://catharsisfantasy.com'
+    overrideVersionCode = 0
+    isNsfw = true
+}
+
+apply from: "$rootDir/common.gradle"
diff --git a/src/es/catharsisfantasy/res/mipmap-hdpi/ic_launcher.png b/src/es/catharsisfantasy/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 000000000..63f51d92d
Binary files /dev/null and b/src/es/catharsisfantasy/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/src/es/catharsisfantasy/res/mipmap-mdpi/ic_launcher.png b/src/es/catharsisfantasy/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 000000000..8a9c27963
Binary files /dev/null and b/src/es/catharsisfantasy/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/src/es/catharsisfantasy/res/mipmap-xhdpi/ic_launcher.png b/src/es/catharsisfantasy/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 000000000..7c61a0dc2
Binary files /dev/null and b/src/es/catharsisfantasy/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/src/es/catharsisfantasy/res/mipmap-xxhdpi/ic_launcher.png b/src/es/catharsisfantasy/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 000000000..42c7ea894
Binary files /dev/null and b/src/es/catharsisfantasy/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/src/es/catharsisfantasy/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/catharsisfantasy/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 000000000..7c1aff296
Binary files /dev/null and b/src/es/catharsisfantasy/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/src/es/catharsisfantasy/src/eu/kanade/tachiyomi/extension/es/catharsisfantasy/CatharsisFantasy.kt b/src/es/catharsisfantasy/src/eu/kanade/tachiyomi/extension/es/catharsisfantasy/CatharsisFantasy.kt
new file mode 100644
index 000000000..6dea63295
--- /dev/null
+++ b/src/es/catharsisfantasy/src/eu/kanade/tachiyomi/extension/es/catharsisfantasy/CatharsisFantasy.kt
@@ -0,0 +1,61 @@
+package eu.kanade.tachiyomi.extension.es.catharsisfantasy
+
+import android.annotation.SuppressLint
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.OkHttpClient
+import org.jsoup.nodes.Document
+import java.security.SecureRandom
+import java.security.cert.X509Certificate
+import javax.net.ssl.SSLContext
+import javax.net.ssl.TrustManager
+import javax.net.ssl.X509TrustManager
+
+class CatharsisFantasy : MangaThemesia(
+    "Catharsis Fantasy",
+    "https://catharsisfantasy.com",
+    "es",
+) {
+    override val client = super.client.newBuilder()
+        .rateLimit(3)
+        .ignoreAllSSLErrors()
+        .build()
+
+    private val iframeSelector: String = "#mangaIframe"
+
+    override fun pageListParse(document: Document): List<Page> {
+        return super.pageListParse(
+            document.takeIf { it.select(iframeSelector).isEmpty() }
+                ?: fetchIframeDocumentPageList(document),
+        )
+    }
+
+    private fun fetchIframeDocumentPageList(document: Document): Document {
+        val pagesUrl = document.selectFirst(iframeSelector)!!
+            .absUrl("src")
+
+        return client.newCall(GET(pagesUrl, headers))
+            .execute().asJsoup()
+    }
+
+    private fun OkHttpClient.Builder.ignoreAllSSLErrors(): OkHttpClient.Builder {
+        val naiveTrustManager = @SuppressLint("CustomX509TrustManager")
+        object : X509TrustManager {
+            override fun getAcceptedIssuers(): Array<X509Certificate> = emptyArray()
+            override fun checkClientTrusted(certs: Array<X509Certificate>, authType: String) = Unit
+            override fun checkServerTrusted(certs: Array<X509Certificate>, authType: String) = Unit
+        }
+
+        val insecureSocketFactory = SSLContext.getInstance("TLSv1.2").apply {
+            val trustAllCerts = arrayOf<TrustManager>(naiveTrustManager)
+            init(null, trustAllCerts, SecureRandom())
+        }.socketFactory
+
+        sslSocketFactory(insecureSocketFactory, naiveTrustManager)
+        hostnameVerifier { _, _ -> true }
+        return this
+    }
+}