Discord Link There's a discord now!!! This is something that will probably be changed and modified since it's the first time I've done this.
For the nightly release, go here
A combined version of my MangaWorld and AnimeWorld apps. This was created because there were a ton of shared elements between the two apps so I combined them, allowing two separate apps but a lot of the same base logic.
These apps do not contain ANY sources themselves. In order to pull sources, the apps do contain some default sources.
Right now, we do support cloud syncing via Firebase, however, that will be going away soon. We are making an alternative way that requires some manual configuration. Using OtakuWorld will allow you to setup a manual configuration! A server is required, fortunately, we have made a basic server that will only work on a local network. Help wanted to help set up a more solid solution!
For MangaWorld: Any sources that work with Mihon will work with MangaWorld...After the bridge is installed.
For AnimeWorld: Any sources that work with Aniyomi will work with AnimeWorld...After the bridge is installed.
If using adb:
adb install animeworldtv-release.apk
If not using adb:
Be sure to change the build variant to a noFirebase variant. Other than that, nothing needs to change to run/build locally!
If you run into any issues, please create an issue request with the following details:
If you want to add a new source or have a change that might make the app better
Disclaimer: I am not affiliated with Tachiyomi app or any fork hosted on GitHub.
The :kmpuiviews:koogintegration:customscraper module provides an on-demand HTML scraping pipeline that extracts manga image URLs and anime video stream URLs from any public webpage using an on-device LLM agent.
WebScraper.scrape(url)
ββ Ktor HTTP GET β raw HTML
ββ HtmlSanitizer β stripped HTML (β€ 8,000 chars)
ββ LlmMediaExtractor (Koog AIAgent)
ββ CustomScrapeKmpChapterModel(urls=[...])
| Use Case | What it extracts |
|---|---|
| Manga chapter page | All <img> src, data-src, data-lazy-src URLs (page images) |
| Anime episode page | All <video>, <source> URLs and .mp4 / .m3u8 JS variables |
scrape() call is a fresh fetch.@Serializable
data class CustomScrapeKmpChapterModel(
val urls: List<String>, // extracted media URLs; empty on failure
)
// Obtain executor + model from your AgentMaker (or any Koog LLM setup):
val executor = MultiLLMPromptExecutor(agentInfo.llmClient)
val model = agentInfo.model
val scraper = WebScraper(executor = executor, model = model)
val result = scraper.scrape("https://example.com/manga/chapter-1")
result.urls.forEach { println(it) }
| Technology | Role |
|---|---|
| Kotlin Multiplatform | Android + JVM Desktop targets |
| Ktor | HTTP client (OkHttp engine on both platforms) |
| Koog | LLM agent framework for structured JSON extraction |
| kotlinx.serialization | JSON deserialization of CustomScrapeKmpChapterModel |