Skip to content
 
 

Latest commit

 

History

1,592 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

LNReader

LNReader is a free and open source light novel reader for Android, inspired by Tachiyomi.

Download

GitHub release (latest by date)

Get the app from our releases page.

Android 7.0 or higher.


Key Enhancements in This Fork

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


Screenshots

📸 View screenshots


Feature Highlights

Text-to-Speech (TTS)

This fork includes extensive TTS enhancements for hands-free reading and accessibility.

Core TTS Features

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)

TTS Feature Demo

▶️ Watch the demo & feature showcase

🎵 Text-to-Speech in Action

TTS-Dragable_Bottom.Panel_Direct.Update.webm

Experience the new draggable TTS bottom panel with direct update functionality

Key TTS Features Showcase
TTS Bottom Panel Settings
Bottom Panel Settings
Customize TTS controls and behavior.
TTS Voice Model Settings
Voice Model Management
Sanitize and organize voice options with human-readable names.
Auto-scrolling During TTS
Auto-scrolling
Text follows TTS playback automatically for an immersive reading experience.
Auto Chapter Download
Auto Chapter Download
Seamless chapter fetching during reading to avoid interruptions.
TTS Settings Interface
TTS Settings Interface
Comprehensive settings panel with auto-resume, scroll sync, and more.
UI Scaling Demo
UI Scaling
UI-wide scaling demo.

Enhanced TTS Media Notification (Android)

🎛️ 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.

Media Player Compact
Compact notification layout with controls

Media Player Expanded
Expanded notification with title, chapter and paragraph progress


TTS Engine Picker

🔊 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.

TTS Engine Picker
Engine Picker showing detected TTS engines

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.


TTS Text Cleanup

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
Loading
  • 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, u2014 corruption, "(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-cleanup v1; 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

Reader Experience

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

Reading Analytics & Statistics

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

Library & Updates

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

Network & Security

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

UI & Accessibility

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

Backup & Sync

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.


Trackers

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).


What's New

📋 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.

Stability & Performance

  • MainActivity Startup Crash: Resolved critical crash on app launch (window.insetsController accessed before super.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

Platform Updates

  • 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 & System Stability

  • Database Migrations 004, 005, 006: Recreates julianday triggers (004), adds repository toggle status (005), and introduces cascading ReadingSession tracking 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

Getting Started

First-Time Setup

  1. Download and Install: Get the APK from the releases page
  2. Add Novel Sources: Browse plugins and install content sources
  3. Customize Reading: Adjust font size, theme, and reading mode in Settings
  4. Enable TTS (Optional): Navigate to Settings → Reader → Accessibility → Text to Speech

Using TTS

  1. Open a Chapter: Navigate to any novel and select a chapter
  2. Start TTS: Tap the play button or open the TTS tab from reader bottom sheet
  3. Customize Voice: Select system voice, adjust speed (0.1x-3.0x) and pitch (0.1x-2.0x)
  4. Background Playback: Enable "Background Playback" to continue listening with screen off
  5. Auto-Download: Configure auto-download threshold to fetch next chapters automatically
  6. 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.

Using TTS Text Cleanup

  1. Enable: Settings → Reader → Accessibility → TTS Text Cleanup → toggle "Clean TTS text" ON (or open Reader → TTS Tab → Text Cleanup)
  2. One-tap presets: Tap Add on a preset (e.g. "Fix u2014 text corruption") to copy curated rules into your list — deduplicated, fully editable
  3. Custom rules: Add find/replace rules (literal or regex) to strip watermarks or corrupted text
  4. Phonetic dictionary: Add name pronunciations (e.g. Xianxia → "Shee-an-shah"); enable substring mode for unspaced CJK names
  5. Unicode normalization: Optionally NFD-normalize + strip combining marks to fix lookalike characters
  6. Import / Export: From the editor, share your rule set as JSON (Export) or restore one (Import — replaces the draft, Cancel discards)
  7. Verify: Play a chapter in foreground and background — cleaned text is spoken and paragraph highlighting stays in sync

Using Continuous Scrolling

  1. Navigate to Settings → Reader
  2. Enable "Auto-mark short chapters"
  3. Set "Stitch threshold" to desired chapter length
  4. Chapters will automatically merge when scrolling

Backup & Restore

  1. Navigate to Settings → Backup
  2. Choose backup location (Local, Google Drive, or Self-Hosted)
  3. Select backup format:
    • v2 Schema: Includes all enhancements from this fork (recommended)
    • Legacy Format: Compatible with original upstream LNReader for migration
  4. Tap "Create Backup"
  5. 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.


Architecture

🏗️ Expand architecture deep-dive

Advanced TTS System

[!NOTE] See docs/TTS/TTS_DESIGN.md for full design details.

The TTS engine uses a Hybrid 3-Layer Architecture to ensure reliable playback across foreground, background, and screen-off states:

  1. React Native (Controller): Manages state machine, user settings, and coordination. Uses useRef heavily (e.g., wakeTransitionInProgressRef) to prevent race conditions during chapter transitions.
  2. WebView (Parser): Handles DOM parsing, text extraction, and real-time sentence highlighting (core.js).
  3. 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
Loading

System-Wide UI Scaling

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 AppText and Icon automatically consume scaling tokens.

Dynamic Material You Theme

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).

Parallel Library Updater

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.

Robust Backup System

The backup system (src/services/backup) prioritizes data safety and portability:

  • Versioned Schema: Uses a generic Backup interface 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
Loading

Network & Security Infrastructure

The network stack has been enhanced to address three common challenges when accessing novel sources: authentication requirements, privacy concerns, and regional blocks.

1. Cookie Management System

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/cookies for centralized cookie storage
  • fetchApi Integration: Auto-injects cookies before requests and saves Set-Cookie headers after responses
  • WebView Sync: Extracts document.cookie when 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.

2. DNS-over-HTTPS (DoH)

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
Google 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)

3. Cloudflare Bypass System

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-ray header, body signatures)
  • CloudflareBypass (src/services/network/CloudflareBypass.ts): Loads challenge page in hidden WebView, extracts cf_clearance cookie
  • 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.


Plugins

  • No affiliation with content providers: LNReader does not endorse or provide content sources.
  • Plugin requests: For the original upstream plugin repository see lnreader-plugins.

Building & Contributing

  • See CONTRIBUTING.md for setup, build, and contributor guidelines.

Quick Start

Get the app running locally (development):

pnpm install
pnpm run dev:start    # start development server
pnpm run dev:android  # run on Android emulator/device

Code Quality

Before 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 checker

Tip

For release builds run: pnpm run build:release:android.

Minimum supported Android: Android 7.0 or higher.


License

This project is available under MIT license.


Thanks

Thanks to the original LNReader authors and contributors for the project this fork builds on: LNReader upstream

Repository for this fork: bizzkoot/lnreader

About

A fork of LNReader with my own spices

Resources

Code of conduct

Contributing

Stars

1 star

Watchers

1 watching

Forks

Releases

Used by

Contributors

Languages