# I Built a Manga Reader That Works on Every Platform --Here's How

> Source: <https://dev.to/hasan72341/i-built-a-manga-reader-that-works-on-every-platform-heres-how-aa1>
> Published: 2026-07-24 06:21:44+00:00

**Nyora** is a free, open-source manga/manhwa/manhua reader for Android, iOS, macOS, Windows, Linux, Web, and even Docker — with AI-powered on-device translation and cross-platform sync.

Every manga reader makes you choose:

I wanted one library — same titles, same progress, same bookmarks — on my phone, laptop, and browser. No ads. No account required. So I built it.

| Platform | Distribution |
|---|---|
| Android | APK (sideload) |
| iOS/iPadOS | IPA via AltStore/SideStore |
| macOS |
`.dmg` or `brew install --cask nyora`
|
| Windows |
`.exe` (x64 + ARM64) |
| Linux |
`.deb` , `.rpm` , or curl installer |
| Web |
|

**No account needed to read.** Cloud sync is opt-in.

This is the flagship feature. Instead of dumping translated text over the artwork:

Each platform uses the best local engine:

There's also an **Ensemble AI Narrative Engine** that tracks character names and speaking styles across chapters so translations stay consistent.

The Android app pulls from 1,100+ manga sources via 35 generic engine templates (Madara, FoolSlide, MMRCMS, etc.). Web has ~390 live, health-checked sources. Desktop ports are growing toward parity.

Sync library, categories, reading history, bookmarks, and exact page progress across all six platforms. Two sign-in methods:

Self-hostable — the backend is just Supabase/PostgreSQL with row-level security. The server stores only reading state, never page images.

| Component | Stack |
|---|---|
| Android | Kotlin 2.2, Jetpack Compose, Hilt, Room, Coil 3, ML Kit |
| iOS | Swift, SwiftUI (fork of Aidoku) |
| macOS | SwiftUI + Compose Multiplatform |
| Windows/Linux | Compose Multiplatform (Kotlin) |
| Web | TypeScript SPA (100% client-side, no framework) |
| Python SDK |
`pip install nyora` — bundled engine + TUI |
| JS SDK |
`npm install nyora-sdk` — cloud-powered |
| Sync backend | PostgreSQL, RLS, last-write-wins |
| Marketing site | Astro |

Nyora began as a fork of [Kotatsu](https://github.com/KotatsuApp/Kotatsu) on Android. I loved the data-driven source engine approach but wanted it on every platform. I forked [Aidoku](https://github.com/Aidoku/Aidoku) for iOS and started porting the source engine to Swift. Desktop came next via Compose Multiplatform. Web was a clean-room TypeScript rebuild.

The hardest part: **cross-platform manga ID hashing**. Every platform needed to resolve the same manga to the same UUID for sync to work. I built a stable `nyoraId`

hash that works identically across Kotlin, Swift, TypeScript, and Python.

**Web** (no install): [web.nyora.xyz](https://web.nyora.xyz)

**Native apps**: [GitHub Releases](https://github.com/Nyora-Manga)

**Self-hosted**: `docker run -d -p 8080:8080 -v nyora-data:/data hasan72341/nyora`

**Python**: `pip install nyora`

**Discord**: [Join the community](https://discord.gg/7aZcgbgbqU)

Nyora is GPLv3 (mobile apps) and Apache-2.0 (everything else). The source engine templates are beginner-friendly and highly parallelizable. If you've ever wanted to contribute to open source, porting a parser is a great first PR.

Check the [GitHub](https://github.com/Nyora-Manga) and [Discord](https://discord.gg/7aZcgbgbqU) to get started.

*Built with Kotlin, Swift, TypeScript, and the stubborn belief that manga readers shouldn't require compromises.*
