Hands-Free Reading#
- TTS auto-advance — when narration finishes a chapter, the reader automatically slides into the next chapter and keeps reading without you touching anything. Binge a whole novel hands-free
- The player stays alive across the chapter swap (a manual navigation still closes it, as before) and resumes from the top of the new chapter
- Gapless audio — the next audio chunk is now pre-decoded into its own element, so there's no more audible hiccup between paragraph groups. The gap was worst at high playback speed (shorter chunks = more switches); that's gone
- New Auto-advance toggle in Display Settings (on by default). Replaces the old TTS pause delay and sleep timer settings, which have been removed — auto-advance covers the real use case more simply
Pull-to-Next-Chapter#
- Pull past the bottom of a chapter to go to the next one — a soft progress indicator fills as you keep scrolling/dragging at the end, and releasing past the threshold navigates
- Momentum-immune: the gesture only counts if it starts while you're already pinned at the bottom. The long scroll that carried you to the end (and all its inertia) is ignored, so chapters don't skip on a fast flick
- Works with both mouse-wheel and touch drag. Top/previous overscroll is intentionally left alone so it doesn't fight the browser's pull-to-refresh / back gesture
Reader Reliability#
- Navigation cancels in-flight fetches — rapid Next/Prev clicks no longer flash stale content or land you on the wrong chapter. Each chapter fetch and prefetch poll is abortable and gets cancelled the moment you move on
- An aborted fetch from fast navigation is now treated as expected, not surfaced as an error
- Background prefetch is strictly a speedup now — if it's slow, manual navigation aborts it and fetches directly instead of blocking on it
- Every new chapter reliably starts scrolled to the top
Translation Model Transparency#
- Per-step model display — chapters now show which model did what: e.g. Translation: Gemini 3.1 / Glossary: DeepSeek, instead of one ambiguous label. Surfaced cleanly on the chapter view (and condensed on mobile so it never bloats the UI)
- Under the hood the per-chapter model record moved to a structured
{translation, glossary}shape; legacy single-label rows were back-filled so history stays accurate
Smarter Translation Routing#
- Right model for the job — brand-new translations run on Gemini 3.1 (Vertex). Chapters whose existing translation came from the older
gemini-2.5-flash-liteengine refresh through DeepSeek for both translation and glossary, which is materially cheaper for bulk back-catalog refresh without quality regression - New translation router with separate DeepSeek-first and Gemini-first paths so the routing decision is explicit per chapter, not global
- Prefetch buffer tuned for the new routing so the next chapters are ready when you reach them
Entity & Glossary Quality#
- Entity length caps — very long phrases can no longer be registered as entities (capped at 12 CJK chars / 8 words / 60 chars). Kept deliberately generous so real multi-word names still pass while sentence fragments get rejected
- Tighter entity prompt — explicitly rejects generic genre jargon (cultivation/system/magic terms, bare titles, numbered concept lists) with a "means the same in any other novel of this genre → not an entity" test. Kept general across all genres and intentionally compact to keep costs down
- Junk cleanup — ~23K low-value AI-detected entities with no chapter references purged, along with orphaned chapter-entity links. User-added entities were left untouched
- Natural-English tuning on the translation prompt (semantic over pinyin for common-noun names)
Free & Anonymous Readers#
- No more prefetch dead-end — free and signed-out readers landing on a chapter flagged for retranslation now reliably get the existing translation to read, instead of being bounced into a prefetch loop with nothing on screen
Comments & Replies#
- Smart reply targeting — hitting Reply on a nested reply now pre-fills an
@mentionto that specific reply's author (it used to always ping the top comment's author). The reply still threads under the parent — it's purely about who gets notified - Cleaner now that pings flow exclusively through the mention system
Notifications#
- Timezone fix — "5 hours ago" bug squashed. Backend notification timestamps now serialize with an explicit UTC offset, and the frontend parses server dates timezone-safely, so fresh notifications read correctly for users outside UTC (e.g. IST)
- Emoji stripped from stored notification text for a cleaner, consistent look
Scraping#
- quanben.io added — full scraper with chapter-URL synthesis from the preview list
- ixdzs.tw mirror support, and trxs.cc now synthesizes chapter URLs from navigation when the site hides the chapter list
- wodeshucheng5.com mirror support added alongside the existing domain
Performance#
- Metadata task skip-guard — the periodic novel-metadata pass now probes the latest chapter touch and skips the heavy chapter-stats aggregate entirely when nothing changed (~91% fewer expensive aggregate calls)
- Database tuning — per-table autovacuum tuned on the hot
chapters/chapter_entitiestables, a partial covering index added for the missing-translation scan, and aVACUUM ANALYZEcleared a stale visibility map that was forcing tens of thousands of heap fetches per query. Slow-route count dropped from 68 to 24 over 24h - Router-level optimization on hot API paths; missing-task scan moved to keyset pagination
- Fandom wiki generation service refactored for a cleaner pipeline