Every release of Novel DR, from the latest to the beginning.
v4.1.20 (rev495)
July 28, 2026
🛡️ “Stability & Recovery Patch”
[ Compatibility ]
- Verified compatibility with Android 8–14 for the updated crash-reporting stack.
[ Warning ]
- A small number of Android 13 devices may experience a one‑time delay on first launch while crash‑reporting hooks reinitialize. This resolves after the first successful app open.
[ New Features ]
- Auto-Backup: optional toggle in Backup & Restore; silently creates backup on close/background. Auto-backups (tagged "auto", latest 3 kept) reuse the manual export pipeline and auto-clean older ones.
- Per-novel write lock: prevents concurrent saves (e.g. progress autosave during app resume) from colliding on the same file.
- Automatic cleanup of orphaned `.tmp` files from interrupted atomic writes.
- Low-storage warning before novel download: warns if <200 MB free, shows exact free space, allows cancel or continue.
- Update-available badge: a dot on the Settings tab icon when a newer version is available.
- Backup size estimate: the "Label this backup" step now shows estimated size (before compression).
- Automatic chapter download retry: failed chapters retry up to 3 times, then skip; all skipped chapters retried again (3 attempts each) at the end before finalizing.
- "Recently Added" tag on library cards: unread novels added in the last 24 hours show "Recently Added" instead of "Unread", reverting automatically after 24h.
- "Last Read: Xd" tag: novels with reading progress not opened in 2+ days show the days since last read, replacing the normal status badge.
[ Fixes ]
- Fixed a race condition where overlapping saves sharing the same temp filename caused a
moveAsync rejection.
- Fixed orphaned `.tmp` files left by failed atomic writes, which previously wasted storage over time.
- Fixed the library card "Continue" button: it now jumps directly to the reader at the last-read chapter. Novels without progress still show "Read" and open the detail page.
- Fixed the reader's close button returning to the library instead of the novel detail page when opened via "Continue". It now always returns to the detail screen.
- Fixed auto-scroll speed changes requiring pause/resume to apply. Adjusting speed while auto-scroll is running now takes effect immediately.
[ Changes ]
- Changed default library tab on app open from "All" to "Reading".
- The filter tab bar now auto-scrolls to keep the active tab centered, whether selected by tap or swipe.
[ Improvements ]
- Atomic file writes now serialized per destination path, queuing overlapping writes to avoid races.
- Failed library writes now clean up partial state automatically.
- Improved the chapter list empty state on the novel detail screen with an icon, clearer text, and a "Go to Updates" button.
- Minor internal cleanup across reader, settings, and library context files to reduce
any usage and tighten type coverage.
v3.7.55 (rev411)
July 16, 2026
📖 "Sentry Overhaul"
✨ [ NEW ]
- ZIP‑only backups — New backups are now always created as a single
.zip file, built via a streaming, memory‑safe export (chapters written in bounded NDJSON parts, covers compressed and copied directly) rather than one giant in‑memory JSON blob.
- Dual‑format restore — The restore flow supports both ZIP (v5+) and legacy JSON (v4 and earlier), from the on‑device backup list or the file picker.
- Share button restored — The backup completion alert now includes a “Share Backup” button to instantly share the generated
.zip file.
- Native crash reporting (Sentry) — Native crash capture wired in at app launch, plus Session Replay (10% of normal sessions, 100% of sessions that hit an error).
- Novel Cover compression — Covers are resized/compressed via
expo-image-manipulator before being packed into the backup, instead of embedded as raw base64.
- Check for Updates — Added the button
Check for Updates in the Settings to manually check if there's a new version or the update was skipped.
- Notif Bell Update — Added a Notif bell icon just on top of the Reload button; it will only appear once there's a new update or has been manually triggered by the
Check for Updates in the Settings tab.
- Chapter Deletion — Added a chapter deletion system that deletes chapters properly and have the same flow as deleting a novel in the Library tab.
-
Self Updater Implementation
- Implemented
downloadApk using expo-file-system's createDownloadResumable.
- Added an update modal UI component, it looks like a notification bell, to notify users when a new version is available, showing version info, changelog, and a download/install action.
- Implemented
downloadApk using expo-file-system's createDownloadResumable, with progress tracking for the modal's download state.
- Implemented
installApk using FileSystem.getContentUriAsync + expo-intent-launcher to trigger the Android package installer directly from the app, and for Android 7+ compatibility.
- Added the
REQUEST_INSTALL_PACKAGES permission to app.config.js, since Android blocks "install from unknown sources" for sideloaded apps without it.
- Connected
downloadApk / installApk into useUpdateChecker.ts so the update flow triggers automatically on version check.
-
Chapter Limiter
- Added a shared
useChapterLimiter hook and ChapterLimitModal component.
- Thresholds: caution at 200 chapters, danger at 250+, hard cap at 300.
- Wired into both
add.tsx and updates.tsx.
⚡ [ IMPROVEMENTS ]
- Consolidated code — Removed
collectAppData() and exportBackupJSON(), replaced with a single exportBackup() function for the streaming ZIP export.
- File picker extended — Now accepts both
application/json and application/zip MIME types, making it easier to import any backup.
- Silent skip guard — Update's chapter-skip logging (
SKIPPED: already fetched this run / SKIPPED: already in library) no longer prints per‑chapter — the skip guard now runs silently in the background.
- Faster stuck-loop detection — Added a consecutive-skip counter (
MAX_CONSECUTIVE_SKIPS = 5) that breaks the update loop immediately once 5 chapters in a row are skipped without a real download, instead of waiting on the much higher ITERATION_CEILING (maxCh × 5 + 50).
- Clear stop message — When the guard trips, the log now shows a single clean line: “STOPPED: Update has stopped without downloading anything new. The source's "next chapter" link likely nonexistent.”
- Progress-aware reset — The skip counter resets to 0 the moment a real chapter (new or gap-fill) actually downloads, so long legitimate resume runs over already‑downloaded chapters aren't falsely flagged as stuck.
-
Battery drain fix
- Traced excessive battery usage to
splitSentencesWithLineBreaks and TTS highlight matching running on every single render frame.
- Fixed
useMemo and a ttsToRenderKeyMap for O(1) lookups, for TTS render optimization.
-
Update checker fix
- Fixed a bug where the app could never actually tell what version was currently installed, so it kept thinking every release — even older ones — was a new update.
- The update check now correctly recognizes the version you already have, so you won't get repeat "update available" prompts or be offered a downgrade disguised as an update.
🗑️ [ REMOVED / REPLACED ]
- Removed JSON backup path — The old
exportBackupJSON() and its supporting code are no longer used.
- Old single‑blob JSON export path removed — the original
collectAppData() (full library + chapters + base64 covers built in memory, then double‑copied via JSON.stringify) is gone; this was the likely source of the OOM crashes on large libraries.