One reader, six native builds.
Nyora is designed, built and shipped by a single developer across six platforms — a Kotlin Android app, two Swift/SwiftUI Apple builds, three Compose Multiplatform desktop targets and a TypeScript web app — all sharing one account, one parser engine and one sync layer. These case studies are written for engineers: each one digs into the real architecture and the hardest problem solved on that platform, down to the specific bug, the failed naive approach, and the fix that shipped.
- Kotlin
- Swift
- SwiftUI
- TypeScript
- Compose Multiplatform
- Android
- iOS / iPadOS
- macOS
- Windows
- Linux
- Web
- On-device ML & OCR
- Real-time rendering
- Nyora Sync
- CI/CD
-
Six native builds, one developer
Android in Kotlin, iOS/iPadOS and macOS in Swift and SwiftUI, Windows and Linux on Compose Multiplatform, and a no-install web app — each one native to its platform, not a wrapper around a single codebase.
-
One shared engine, 960+ sources
All six builds run the same parser engine and the same delta-sync contract, so a chapter started on one device resumes mid-page on any other. Reusing one engine instead of six is the architectural bet the whole project rests on.
-
On-device AI translation
The headline feature reads any page of foreign-language comic art — ensemble OCR, speech-bubble reconstruction, staged machine-translation-to-LLM refinement — and re-letters the result back over the original artwork, live, on the device.
Pick a platform, read the architecture.
8 write-ups, one per build — the stack, the metrics that matter, and a deep dive into how the hard parts actually work.
- nyora-android
Nyora for Android
A solo-built Android manga reader whose headline feature reads any page of foreign-language comic art, runs it through a three-stage OCR-to-translation-to-AI pipeline, and re-letters the result onto the original artwork inside a 60fps zoomable reader — across a roughly 120,000-line Kotlin codebase.
- Kotlin
- Android (View system + Material Components / Material You)
- Jetpack Compose (incrementally adopted)
- Hilt (Dagger) DI
- Room
- +10
- nyora-ios
Nyora for iOS & iPadOS
A native SwiftUI manga reader for iPhone and iPad that runs the same 11,507-line JavaScript source-parser engine as its sibling apps inside a hidden web view, and typesets whole-page AI translation back over the original artwork entirely on-device.
- Swift 5.9
- SwiftUI (iOS/iPadOS 17+)
- WKWebView + JavaScriptCore (JS parser host)
- URLSession (async/await networking)
- Apple Vision (OCR)
- +6
- nyora-mac
Nyora for macOS
A native SwiftUI Mac reader that translates whole pages of Japanese, Chinese, and Korean comics on-device, while driving a headless Kotlin engine as a private background service over a local-only API.
- Swift 6 (strict concurrency, language mode v6)
- SwiftUI (macOS 15+ native front end)
- Swift Package Manager (executable target)
- Apple Vision (VNRecognizeTextRequest + RecognizeDocumentsRequest)
- Core Image (CIFilter preprocessing pipeline)
- +8
- nyora-windows
Nyora for Windows
A self-contained Windows manga reader, built from one Kotlin codebase, that ships as native installers for both Intel/AMD and ARM64 machines and translates Japanese pages in place using only the operating system's own text-recognition engine.
- Kotlin 2.1.21 (JVM)
- Compose Multiplatform for Desktop 1.8.2
- Skiko 0.9.4.2 (windows-x64 + windows-arm64)
- GraalVM JS / Truffle (shared engine)
- SQLDelight 2.1.0 (SQLite/JDBC)
- +5
- nyora-linux
Nyora for Linux
A native Linux desktop manga reader that runs a complete server-grade source engine — JavaScript parser sandbox, SQLite store, and image proxy — inside its own GUI process, packaged as a self-contained, runtime-bundled binary that installs on every major distribution with one command.
- Kotlin/JVM (2.1.x)
- Compose Multiplatform for Desktop 1.7.3
- Material 3 + custom design system
- GraalVM Polyglot (GraalJS) for JS source parsers
- SQLDelight (SQLite/JDBC)
- +6
- nyora-web
Nyora for the Web
A browser-native manga reader that runs a full web-scraping parser engine entirely on the user's device with no application backend, reaching arbitrary manga sites through a single 270-line edge proxy while staying in cross-device sync with five native apps.
- Vanilla JavaScript (ES modules, no framework)
- esbuild (code-split, content-hashed production bundle)
- Cloudflare Pages + Cloudflare Workers
- Service Worker / PWA (offline app shell)
- IndexedDB + localStorage
- +5
- nyora-mihon
Nyora for Mihon
A drop-in extension repository that brings Nyora's full ~900-source catalog to unmodified, stock Mihon: one Android APK bundles the entire kotatsu-parsers engine and every source and parses fully on-device, with no server, no forked app, and no code changes to Mihon itself.
- Kotlin
- Android (Mihon / Tachiyomi extension API)
- kotatsu-parsers-redo engine (bundled on-device)
- Mihon extension repo format (index.min.json + repo.json)
- Gradle (per-variant APK assembly)
- +2
- nyora-aidoku
Nyora for Aidoku
A source list of ~959 WebAssembly (.aix) extensions — one per Nyora source — that run inside completely stock Aidoku on iOS, each a small Rust/aidoku-rs proxy that calls the Nyora cloud helper's REST endpoints, installed with a single aidoku://addSourceList deep link.
- Rust (aidoku-rs)
- WebAssembly (.aix Aidoku sources)
- Aidoku iOS source-list format (index.min.json)
- Nyora cloud helper REST API (api.nyora.xyz)
- kotatsu-parsers-redo engine (server-side)
- +2