LNReader is a free and open source light novel reader for Android, inspired by Tachiyomi.
Get the app from our releases page.
Android 7.0 or higher.
This fork builds on the original LNReader with enhanced features focused on accessibility, reading experience, and productivity:
- Advanced TTS System: Bluetooth headset controls, multi-chapter background playback, smart auto-stop, queue management, live settings updates, and length-preserving text cleanup
- Continuous Reading Experience: Seamless chapter transitions with invisible stitching and auto-mark short chapters
- In-Chapter Text Search: Fast non-destructive keyword search with steppers and occurrence counters without breaking TTS
- Reading Analytics & Statistics: In-depth multi-tab analytics (Overview, Time, Plugins), SVG donut distribution charts, reading velocity, and inactivity auto-pause with TTS synergy
- Scheduled & Parallel Updates: Automatic periodic update checks (12h to weekly) and concurrent multi-source updating (up to 3 sources)
- RTL Language & Layout Support: Complete bidirectional UI and reader flow mirroring for Arabic, Hebrew, Persian, and Urdu
- Network & Security: Cookie management for authenticated sources, DNS-over-HTTPS (DoH) for privacy, and Cloudflare bypass
- System-Wide UI Scaling: Adjustable layout scaling (
uiScale) for better accessibility across all devices - Enhanced Backup System: Versioned schema with migration pipeline, multi-location support (Local, Google Drive, Self-Hosted)
- Material You & MD3 Design: Dynamic wallpaper-derived color palettes, modern MD3 sliders, top tab indicators, and standardized sheets
- Expanded Trackers: Kitsu added alongside AniList, MyAnimeList, and MangaUpdates
- Better Android Compatibility: Support for API 35+ (Android 15+); third-party Gradle/deprecation issues addressed via patches
Table of Contents
- Key Enhancements in This Fork
- Feature Highlights
- What's New
- Getting Started
- Architecture
- Plugins
- License
- Thanks
This fork includes extensive TTS enhancements for hands-free reading and accessibility.
| Feature | Description |
|---|---|
| 🔈 Background Playback | Continue listening with screen off or app in background |
| ⏩ Multi-Chapter Continuation | Seamless audio across chapter boundaries while screen is off |
| 🎧 Bluetooth & Wired Headset Controls | Full media button support for hands-free control |
| ⏱️ Auto-Stop System | Smart sleep timer with screen state detection (minutes/paragraphs/end of chapter) + Smart Rewind |
| ⚡ Live Settings Updates | Change speed, pitch, voice instantly without restarting |
| 📥 Queue Management | Proactive refill prevents audio gaps with race condition protection |
| 💾 Progress Persistence | Triple-layer save (DB + MMKV + Native) with reconciliation |
| ⏯️ Smart Resume | Auto-resume after interruptions with position sync |
| 📚 Per-Novel TTS Settings | Isolated voice/speed/pitch per novel without overwriting global defaults |
| 🔧 TTS Engine Picker | Select system or custom TTS engines with quality badges and persistent selection |
| 🏷️ Auto Chapter Title Prepend | Auto-announces chapter title via TTS when not visibly present in content |
| 🖱️ Advanced Button Gestures | Tap to toggle playback, hold 0.5s + swipe to adjust highlight offset, hold 2s + drag to move |
| 🧹 TTS Text Cleanup | Strip watermarks/corrupted text & fix pronunciations before TTS reads — declarative rules, one-tap presets, per-novel overrides, JSON import/export. Also cleans visible reader text (Applies to: TTS / Visible / Both) |
▶️ Watch the demo & feature showcase
TTS-Dragable_Bottom.Panel_Direct.Update.webm
Experience the new draggable TTS bottom panel with direct update functionality
🎛️ See the media notification
This release introduces a 5-button Android MediaStyle notification for the TTS foreground service. It provides rich metadata (novel name, chapter title, and paragraph-based progress), lock-screen visibility, and a native ⇄ React Native TTS progress sync — all while preserving visibility of the 5 action buttons.
🔊 Explore TTS engine options
Android devices can have multiple TTS engines installed. The default engine is often your manufacturer's (Google on most phones, Samsung on Galaxy devices), but you can install better ones. The Engine Picker (Settings → Reader → Accessibility → TTS Engine) lets you choose which engine powers LNReader's TTS, independently of your system default.
Why switch engines? Voice quality varies dramatically between engines. Neural/TTS voices sound significantly more natural than older synthesizers — with better intonation, pacing, and clarity for long listening sessions.
| Engine | Description | Install |
|---|---|---|
| Google Text-to-Speech | Best all-around — Neural2 voices are the most natural-sounding | Play Store |
| Microsoft Text-to-Speech | High-quality neural voices, great for English | Play Store |
| NekoSpeak | Offline AI TTS with voice cloning (Kokoro, Piper, Pocket-TTS) | GitHub |
| SherpaTTS / VoxSherpa | 100% offline on-device TTS powered by Sherpa-ONNX | GitHub |
| RHVoice | Open source, good multilingual support | Play Store |
| eSpeak | Lightweight, many languages, works on older devices | Play Store |
[!TIP] Google TTS with Neural2 voices is the current best recommendation. Install Google TTS, open your device's TTS settings (Settings → Accessibility → Text-to-Speech → Preferred Engine), select "Google Text-to-Speech", then install the Neural2 voice packs. Switch LNReader to use Google TTS and you'll get the highest quality reading experience.
Sites like Novelight inject anti-scraper watermarks (spaced letters, unicode lookalikes, u2014 corruption, "Do not rehost this novel" spam) that system TTS engines read aloud, and LN names/honorifics are commonly mispronounced. Text Cleanup fixes both with a declarative, length-preserving pipeline applied to every paragraph before it reaches the TTS engine — across all playback modes, including background playback. The same ruleset can also clean the visible reader text (Applies to: TTS audio only / Visible text only / Both), so you maintain ONE ruleset for reading and listening instead of juggling a separate Custom JS script.
🧹 View the cleanup pipeline diagram
flowchart LR
%% Styles
classDef src fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
classDef clean fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#e65100,font-weight:bold
classDef out fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20,font-weight:bold
classDef vis fill:#f3e5f5,stroke:#8e24aa,stroke-width:2px,color:#6a1b9a,font-weight:bold
%% Nodes
PARA["📄 Every Paragraph<br/>(any playback path)"]:::src
NORM["🔤 1. Unicode Normalization<br/>(optional: NFD + strip combining marks)"]:::clean
RULES["🧹 2. Find & Replace Rules<br/>(literal or regex, ordered)"]:::clean
PHON["🗣️ 3. Phonetic Dictionary<br/>(whole-word or substring)"]:::clean
TTS["🔈 Native TTS Engine"]:::out
VDOM["👁️ Visible Reader DOM<br/>(rules only — no phonetics/normalization)"]:::vis
%% Flow
PARA ==> NORM ==> RULES ==> PHON ==> TTS
PARA -. "Applies to: Both / Visible" .-> VDOM
- Access: Settings → Reader → Accessibility → TTS Text Cleanup (global), or Reader Bottom Sheet → TTS Tab → Text Cleanup (quick access, per-novel aware)
- Applies to: inside the cleanup editor, choose TTS audio only (default), Visible text only, or Both. In visible modes the find/replace rules also clean the reader DOM (once per chapter load, never removing paragraphs — emptied ones are padded invisibly to keep highlight/scroll/progress in sync). Phonetic dictionary and Unicode normalization always stay TTS-only — they are audio-oriented and would corrupt visible text
- Presets (one-tap): Curated templates — Novelight spaced watermark,
u2014corruption, "(Official version)" tags, "Do not rehost" spam, math-bold lookalikes, LN name pronunciations, and CJK substring pairs. Presets are UI data only; applying copies them into your editable rules - Import / Export: Share or restore your rule set as a versioned JSON envelope (
lnreader-tts-cleanupv1; v2 when a non-default target is set — v1 files still import as "TTS audio only") - Per-novel overrides: With per-novel TTS settings enabled, cleanup (including the target mode) can be overridden per novel
- Safety: Regex length cap + ReDoS-shape detection + invalid-regex skip; length-preserving (paragraph count never changes, so highlight/scroll stay in sync). Custom JS (
Settings → Reader → Advanced) is NOT recommended for text cleanup — it runs raw and can break paragraph indexing
Enhanced features for smoother, more immersive reading.
| Feature | Description |
|---|---|
| 🔍 In-Chapter Search | Fast keyword search with steppers, occurrence counters, and zero TTS interference |
| 🌐 RTL Language Support | Full layout and text mirroring for Arabic, Hebrew, Persian, and Urdu |
| 📜 Continuous Scrolling | Seamless chapter transitions with invisible DOM stitching |
| ✅ Auto-Mark Short Chapters | Automatically mark short chapters as read to reduce clutter |
| 🪡 Configurable Stitch Threshold | User-adjustable trigger for chapter merging |
| 🚀 Jump to First Unread | Read button & FAB navigate straight to the first unread chapter |
| 📚 EPUB Range Export | Export custom chapter ranges with chapter numbers preserved |
| 🎨 EPUB Style Preservation | <span> tags preserved for better styling |
| 🧹 EPUB Summary Improvements | Clean summaries with HTML tag/entity stripping |
Gain deep insights into your reading habits, velocities, and source distribution.
| Feature | Description |
|---|---|
| 📊 Multi-Tab Analytics | Dedicated Overview, Time, and Plugins tabs with daily averages and top novels |
| 🍩 Interactive Donut Charts | Dynamic SVG distribution charts with genre taxonomy visualization |
| ⏱️ Smart Time Tracking | Dual-mode tracking for manual reading and TTS audio with zero double-counting |
| ⏸️ Inactivity Auto-Pause | Auto-pauses reading timer on inactivity (2m/5m/10m/15m) to ensure accurate stats |
| ⚡ Reading Velocity | Live calculation of chapters per hour and minutes per chapter |
Efficient library management with parallel updates, background scheduling, and rate-limit friendly downloads.
| Feature | Description |
|---|---|
| 🕒 Scheduled Background Updates | Automatically check for new chapters at your preferred interval (12h, 24h, 48h, 72h, weekly) |
| ⚡ Parallel Library Updates | Update novels across multiple sources concurrently (up to 3 at once) |
| ⏱️ Configurable Download Cooldown | Adjustable delay between chapter downloads (Settings → General) |
| 🔔 Skip-Version Updates | Dismiss update notifications for a specific version |
Privacy-focused networking features for enhanced access and security.
| Feature | Description |
|---|---|
| 🍪 Cookie Management | Automatic cookie persistence for authentication-required sources with manual clearing |
| 🔒 DNS-over-HTTPS (DoH) | Encrypted DNS queries via Cloudflare, Google, or AdGuard for enhanced privacy |
| 🛡️ Cloudflare Bypass | Automated challenge solving for accessing Cloudflare-protected novel sources |
| 🌐 Enhanced Network Resilience | Retry logic with backoff, connection pooling, and graceful timeout handling |
System-wide improvements for better usability across devices.
| Feature | Description |
|---|---|
| 📏 UI-Wide Scaling | Single uiScale setting affects icons, paddings, and component dimensions |
| 🔠 AppText Component | Text scaling support for better accessibility |
| 🖼️ Theme Customization | Multiple theme options with consistent styling |
| 🎨 Dynamic Material You | Wallpaper-derived Material 3 color palettes (Android 12+) |
| 🎚️ MD3 Sliders & Tabs | Flicker-free native sliders, M3 top tab indicators, standardized sheets |
Robust backup system with multiple options and versioned schema.
| Feature | Description |
|---|---|
| 🔄 Versioned Schema v2 | Automatic migration from v1 backups |
| ☁️ Multi-Location Support | Local, Google Drive, and Self-Hosted repositories |
| 🔙 Legacy Format Support | Create backups compatible with original upstream LNReader |
| 📂 Folder Picker | Custom backup folder selection |
| 🧹 Smart Pruning | Automatic cleanup of old backups |
Note
Migration Friendly: You can restore backups from this fork to the original LNReader upstream build. Use the legacy format option when creating backups to ensure cross-compatibility.
Synchronize your reading progress, status, and scores with popular tracking services.
| Tracker | Supported Features |
|---|---|
| 🦊 Kitsu | Search, status, chapter progress, and score sync |
| 🌸 AniList | Search, status, chapter progress, and score sync |
| 🟦 MyAnimeList | Search, status, chapter progress, and score sync |
| 📖 MangaUpdates | Search, status, chapter progress, and score sync |
Note
Kitsu is the newest addition to the tracker lineup; all trackers share the same capabilities (search, status, chapter progress, and score).
📋 Expand the changelog
[!NOTE] Feature highlights mirror the tables above — this section lists what's new that isn't already covered there: bug fixes, platform/tooling upgrades, and database hardening. For the complete changelog, see RELEASE_NOTES.md.
- MainActivity Startup Crash: Resolved critical crash on app launch (
window.insetsControlleraccessed beforesuper.onCreate()) - Header Positioning Fix: Resolved header overlap with Android status bar icons across all Settings and More screens
- SafeAreaView Enhancement: Proper inset handling following React Native best practices
- TTS Progress Persistence: Fixed stale closure preventing reliable saves
- Media Notification Sync: Eliminated flicker and state desync during seeks
- Notification Position Restore: Fixed position restoration when returning from pause
- Auto-Stop Reliability: Resolved race conditions and state management issues
- TTS Position Restoration: Fixed position when returning to reader after notification pause
- EPUB Toggles: Toggle values (appTheme/CSS/JS/chapterNumber) now carry through export instead of reading a stale closure
- EPUB Range Export Correctness: Fixed chapter-range export fetching wrong/duplicated chapters on multi-page novels
- EPUB Improvements: Adopted upstream PRs for better EPUB rendering and summaries
- Android SDK 35+ Support: Targets API 35 with compile-time compatibility fixes; Gradle deprecation warnings resolved for third-party modules via pnpm patches — remaining in-app Kotlin deprecation warnings tracked in plan.md
- Modern Tooling: Upgraded React Native to 0.82.1, Reanimated to 4.2.0
- Build System: Gradle 9.2.0 upgrade with OkHttp 4.12.0 for DoH support
- Database Migrations 004, 005, 006: Recreates
juliandaytriggers (004), adds repository toggle status (005), and introduces cascadingReadingSessiontracking tables with compound indexing (006) - Exclusive DB Transactions: Write operations and backup restores wrapped in exclusive transactions to prevent database locks
- Security & Safety Fixes: Hardened backup archive inputs against path traversal, date-correct library updates, numeric EPUB page ordering, and safe native file operations
- Download and Install: Get the APK from the releases page
- Add Novel Sources: Browse plugins and install content sources
- Customize Reading: Adjust font size, theme, and reading mode in Settings
- Enable TTS (Optional): Navigate to Settings → Reader → Accessibility → Text to Speech
- Open a Chapter: Navigate to any novel and select a chapter
- Start TTS: Tap the play button or open the TTS tab from reader bottom sheet
- Customize Voice: Select system voice, adjust speed (0.1x-3.0x) and pitch (0.1x-2.0x)
- Background Playback: Enable "Background Playback" to continue listening with screen off
- Auto-Download: Configure auto-download threshold to fetch next chapters automatically
- Advanced Button Gestures:
- Short Tap: Play / Pause playback.
- Hold 0.5s (Amber Glow) + Swipe Up/Down: Adjust paragraph highlight offset (resets per chapter).
- Hold 2.0s (Teal Glow) + Drag: Move the TTS button anywhere on the screen.
- Enable: Settings → Reader → Accessibility → TTS Text Cleanup → toggle "Clean TTS text" ON (or open Reader → TTS Tab → Text Cleanup)
- One-tap presets: Tap Add on a preset (e.g. "Fix
u2014text corruption") to copy curated rules into your list — deduplicated, fully editable - Custom rules: Add find/replace rules (literal or regex) to strip watermarks or corrupted text
- Phonetic dictionary: Add name pronunciations (e.g.
Xianxia→ "Shee-an-shah"); enable substring mode for unspaced CJK names - Unicode normalization: Optionally NFD-normalize + strip combining marks to fix lookalike characters
- Import / Export: From the editor, share your rule set as JSON (Export) or restore one (Import — replaces the draft, Cancel discards)
- Verify: Play a chapter in foreground and background — cleaned text is spoken and paragraph highlighting stays in sync
- Navigate to Settings → Reader
- Enable "Auto-mark short chapters"
- Set "Stitch threshold" to desired chapter length
- Chapters will automatically merge when scrolling
- Navigate to Settings → Backup
- Choose backup location (Local, Google Drive, or Self-Hosted)
- Select backup format:
- v2 Schema: Includes all enhancements from this fork (recommended)
- Legacy Format: Compatible with original upstream LNReader for migration
- Tap "Create Backup"
- For restoration, select location and choose a backup file
Tip
Migrating to/from Original LNReader: Use Legacy Format when creating backups if you plan to restore them in the original LNReader upstream build. This ensures seamless data transfer between versions.
🏗️ Expand architecture deep-dive
[!NOTE] See
docs/TTS/TTS_DESIGN.mdfor full design details.
The TTS engine uses a Hybrid 3-Layer Architecture to ensure reliable playback across foreground, background, and screen-off states:
- React Native (Controller): Manages state machine, user settings, and coordination. Uses
useRefheavily (e.g.,wakeTransitionInProgressRef) to prevent race conditions during chapter transitions. - WebView (Parser): Handles DOM parsing, text extraction, and real-time sentence highlighting (
core.js). - Native Android (Audio): Runs a Foreground Service with a managed audio queue to support continuous background playback.
Key Mechanisms:
- Proactive Queue Refill: Monitors queue size and refills (batch size ~20) before depletion to prevent audio gaps.
- State Reconciliation: On load, syncs progress from three sources: Database (permanent), MMKV (fast), and Native (current utterance).
- Smart Wake-Up: Detects app foregrounding and seamlessly syncs the visual reader position with the background audio position.
- Declarative Text Cleanup: Settings-driven find/replace + phonetic rules applied length-preserving at every audio entry point (initial queue, WebView DOM refills, fallback single-speak) — no arbitrary JS, no hardcoded site regexes.
flowchart LR
%% Define styles for visual appeal
classDef rn fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,rx:10,ry:10,color:#0d47a1,font-weight:bold
classDef wv fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,rx:10,ry:10,color:#e65100,font-weight:bold
classDef nat fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,rx:10,ry:10,color:#1b5e20,font-weight:bold
%% Nodes with Icons and clearer descriptions
UI["📱 React Native<br/>(Controller & State)"]:::rn
DOM["📄 WebView<br/>(Parser & Highlights)"]:::wv
SVC["🔈 Native Service<br/>(Audio Engine)"]:::nat
%% Data Flow Connections
UI <==>|"1. Sync Text & UI"| DOM
UI ==>|"2. Batch Audio Queue"| SVC
SVC -.->|"3. Progress Events"| UI
A custom scaling engine (src/theme/scaling.ts) ensures accessibility across all device sizes:
- Centralized Logic:
scaleDimension(value, scale)applies user preferences globally. - Safety Clamps: Prevents broken layouts by clamping scale factors (0.8x - 1.3x).
- Component-Level Support: Custom components like
AppTextandIconautomatically consume scaling tokens.
Dynamic theming (src/theme/dynamic.ts) generates Material 3 palettes from the Android wallpaper via @pchmn/expo-material3-theme when the system theme is set to "Dynamic" (DYNAMIC_THEME_ID), with an automatic fallback color when dynamic theming is unsupported (pre-Android 12).
The library updater (src/services/updates) groups library novels by source and updates up to 3 sources concurrently (UPDATE_SOURCE_CONCURRENCY). Within each source, novels update sequentially with a short cooldown — so a slow or rate-limited source never bottlenecks unrelated sources.
The backup system (src/services/backup) prioritizes data safety and portability:
- Versioned Schema: Uses a generic
Backupinterface that supports version migration (v1 → v2). - Provider Abstraction: Decouples logic from storage backends (Local File vs Google Drive).
- Legacy Compatibility: Maintains a "Legacy Exporter" to ensure users can always migrate back to the upstream version.
flowchart LR
%% Styles
classDef main fill:#e3f2fd,stroke:#1565c0,stroke-width:2px,color:#0d47a1,font-weight:bold
classDef logic fill:#fff3e0,stroke:#ef6c00,stroke-width:2px,color:#e65100,font-weight:bold
classDef store fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px,color:#1b5e20,font-weight:bold
%% Nodes
Manager["🛡️ Backup Manager<br/>(Orchestrator)"]:::main
Data[("📱 App Data<br/>(DB, MMKV)")]:::main
subgraph Pipeline ["Processing Pipeline"]
direction TB
Compat["⚙️ Compatibility Layer<br/>(compatibility.ts)"]:::logic
V2Logic["✅ V2 Schema Builder<br/>(Manifest + Typed Sections)"]:::logic
LegacyLogic["⚠️ Legacy Exporter<br/>(Field Stripping)"]:::logic
end
subgraph Storage ["Storage Providers"]
direction TB
Drive["☁️ Google Drive"]:::store
Local["📂 Local File"]:::store
Self["🌐 Self-Hosted"]:::store
end
%% Flow
Data ==> Manager
Manager ==> Compat
Compat -- "Standard" --> V2Logic
Compat -- "Legacy Mode" --> LegacyLogic
V2Logic --> Storage
LegacyLogic --> Storage
The network stack has been enhanced to address three common challenges when accessing novel sources: authentication requirements, privacy concerns, and regional blocks.
Problem: Many novel sources require authentication (login) but lose session data on app restart.
Solution: Automatic cookie persistence using a three-tier approach:
- CookieManager Service (
src/services/network/CookieManager.ts): Wraps@react-native-cookies/cookiesfor centralized cookie storage - fetchApi Integration: Auto-injects cookies before requests and saves
Set-Cookieheaders after responses - WebView Sync: Extracts
document.cookiewhen WebView-based authentication is used (OAuth flows, login pages)
Use Case: Source requires login → User authenticates in WebView → Cookies automatically persist → Subsequent requests work without re-login.
Problem: ISP-level DNS queries can leak browsing data and be censored by network administrators.
Solution: Encrypted DNS resolution through trusted providers.
| Provider | Endpoint | Bootstrap IP | Privacy Policy |
|---|---|---|---|
| Cloudflare | https://cloudflare-dns.com/dns-query |
1.1.1.1 | Link |
https://dns.google/dns-query |
8.8.8.8 | Link | |
| AdGuard | https://dns-unfiltered.adguard.com/dns-query |
94.140.14.140 | Link |
Implementation:
- Native Android module (
DoHManagerModule.kt) using OkHttp 4.12.0 +okhttp-dnsoverhttps - Bootstrap IPs prevent circular DNS dependency (can't resolve DoH provider domain without DNS!)
- Dual-layer persistence (MMKV + SharedPreferences) survives app restarts
- Security Note: No certificate pinning per OWASP 2025 guidance (prevents outages when providers rotate certs)
Location: Settings → Advanced → DoH Provider (Android only)
Problem: Many novel sources use Cloudflare protection (403/503 "Checking your browser..." challenges).
Solution: Automated WebView-based challenge solver.
Architecture:
- CloudflareDetector (
src/services/network/CloudflareDetector.ts): Identifies Cloudflare challenges (status codes,cf-rayheader, body signatures) - CloudflareBypass (
src/services/network/CloudflareBypass.ts): Loads challenge page in hidden WebView, extractscf_clearancecookie - fetchApi Integration: Auto-detects challenges and attempts bypass (max 2 retries to prevent infinite loops)
Challenge Types Handled:
- ✅ JS Challenge: 5-second JavaScript execution check (fully automated)
- 🔶 Interactive Challenge: "Verify you are human" checkbox (requires user tap)
- ❌ CAPTCHA Challenge: hCaptcha/reCAPTCHA (requires manual solve)
Cookie Lifetime: cf_clearance typically valid for 15 min - 24 hours. After expiration, bypass re-triggers automatically.
- No affiliation with content providers: LNReader does not endorse or provide content sources.
- Plugin requests: For the original upstream plugin repository see lnreader-plugins.
- See
CONTRIBUTING.mdfor setup, build, and contributor guidelines.
Get the app running locally (development):
pnpm install
pnpm run dev:start # start development server
pnpm run dev:android # run on Android emulator/deviceBefore submitting a PR, please ensure your code is formatted and linted:
pnpm run format # auto-format code
pnpm run lint:fix # fix linting errors
pnpm run type-check # run type checkerTip
For release builds run: pnpm run build:release:android.
Minimum supported Android: Android 7.0 or higher.
This project is available under MIT license.
Thanks to the original LNReader authors and contributors for the project this fork builds on: LNReader upstream
Repository for this fork: bizzkoot/lnreader









