@Mentions Across The Site#

  • Type @username anywhere you can write a review, review reply, chapter comment, or nested reply — autocomplete pops up while you type
  • Mentioned users get a rich notification with the novel/chapter context and a quoted excerpt of what was said
  • Mentions are ID-anchored — once you mention someone, the link survives even if they change their public username later
  • Replaces the old "reply to OP" auto-notifications with a more flexible mention-based system (you can now pull a third person into a thread, not just notify the original author)
  • Up to 5 mentions per write to keep things sane; daily comment/review caps still apply
  • New /users/search autocomplete endpoint backs the mention picker (auth-required so anonymous bots can't enumerate the user table)

Mid-Story Entity Overrides#

  • Gender mid-story changes — for gender-bender novels (or any character revealed to be a different gender later), set "feminine from chapter 50 onwards" without breaking the chapters before that
  • Active/Inactive mid-story changes — for entities like a defeated monster named "Silence" or "Extinction": active early, deactivated later so the LLM stops translating "everyone fell silent" as "everyone fell Silence". Multiple flips per timeline supported
  • Both flow through the existing entity edit dialog. Auto-apply for mods, Discord-reviewed for everyone else
  • Only chapters whose effective state actually flips get flagged for retranslation — no over-flagging
  • New dedicated Chapter Overrides Dialog in the frontend with a richer editor for both segment types

Translation Quality#

  • Smarter entity translation prompt — natural English over pinyin. Personal names still transliterate (萧炎 → Xiao Yan), but common-noun-as-name now goes semantic only (妖怪 → Monster, 钢骨 → Steel Bone — never Yaoguai/Gangu). Place names with meaning translate semantically (天荒大陆 → Wild Continent, not Tian Huang). Pinyin is the last resort
  • Rule 3 added: never extend a name past its actual characters. If 黎 is a surname, the LLM won't return 黎敏锐 (敏锐 = adjective "keen")
  • Wiki quality restored — the April model swap regressed wiki generation from ~25K-char detailed pages down to ~7K-char stubs. Reverted the section model back to Gemini 2.5 Flash with explicit length guidance — wikis are detailed again
  • 483 short or truncated wikis auto-regenerating in the background — affected entities will refresh over the next few hours

Mod & Editor Tools#

  • Editing general entities — mods can directly edit a general entity's translation, gender, etc. (used to be only "exclude from this novel")
  • Bulk rename — find-and-replace by root word across an entire novel's entities. Each renamed entity still gets its own audit row, so the change history looks identical to N single edits. Auto-applies for mods; Discord-reviewed for everyone else
  • "Old model only" retranslate flag — when triggering a novel-wide retranslate, mods can now check "only chapters whose existing translation came from the previous-generation model". Lets you refresh stale translations without redoing chapters that already use the latest engine
  • Cover change via novel report — users can submit a "wrong cover" report with a URL; mods can one-click apply the new cover from Discord. Mods can also change covers directly via the moderator actions panel. New cover URL is cache-busted so users see the change immediately
  • Mod log embeds now show a generic "Changes" field for any mod action, not just the ones with hardcoded fields

User Uploads Page#

  • New /me/uploads page showing every novel you've contributed, with formatted stats (word count, views, bookmarks, readers as 12.3K / 1.2M shorthand) and last chapter timestamp
  • Distinguishes Preview vs Full uploads with a clear flag

Notification Format#

  • Reply notifications got prettier — replies on your reviews and chapter comments now show the original text and the reply each in their own markdown blockquote, with novel and chapter context inline. Same shape as the new mention notifications, so all conversation notifications look consistent
  • Vote notifications got prettier — same blockquote treatment when someone likes/downvotes your review or comment
  • Shared format_blockquote helper lives in common/utils/notification_format.py so all notification creation sites stay in lockstep

Scraping#

  • xsw.tw rebuild — the site's ascending and descending paginators had drifted out of sync, causing chapters to silently disappear from one direction or the other. Now we fetch both and union by chapter ID. Plus a new step that scrapes the "Latest Chapter Preview" section on the main novel page — those chapters publish there before hitting the paginated index, so the refresh task no longer lags behind the source. Net effect: ~140 previously-unreachable chapters across already-scraped xsw novels are now back
  • shiguangshuwu fix — re-enabled after the rebuild fixed an extraction regression (~227 lines of scraper changes)
  • biquge.tw chapter duplication fixed — the scraper was unconditionally fetching _2.html for every chapter on the assumption that biquge always splits chapters into 2 pages. For single-page chapters the source returns page 1 again, so the content silently appended to itself ("chapter restarts halfway through"). Now reads the (N / M) page marker first and only fetches pages 2..M when the chapter is actually multi-page
  • kks101.com added — that's 39 supported sites total
  • Cloudflare CN-language detection — the scraper was missing Chinese-language Cloudflare interstitials (正在验证浏览器, 正在进行安全验证, etc.), making some CN sites silently fail at the JS challenge step. Now correctly detects them and routes through the bypass

Reliability#

  • 🚨 Cloudflare Tunnel rate-limit bug fixed — after switching to Cloudflare Tunnel + Traefik, X-Forwarded-For was returning the cloudflared container's internal IP, so every user in the world was sharing the same rate-limit bucket and getting instant-429'd. Switched to CF-Connecting-IP header. If you've been seeing random rate-limit errors, this was why
  • Infinite retranslation loop fixed — entity detection during translation was over-eagerly flagging neighbor chapters when the LLM "rediscovered" existing entities. Combined with prefetch, this caused chapters to retranslate on every reload. Cross-chapter flagging now only fires from explicit user-driven entity creation, not from translation runs
  • Retranslate / rescrape now available to Reader tier — previously locked to higher patron tiers, now opened up to Reader ($4.99) and above. Daily quota scales with tier so higher tiers still get more headroom
  • Patreon proxy manager — Patreon API calls now route through a dedicated proxy pool, fixing intermittent 403s on the verification flow
  • Annual tier auth fix — annual subscribers were occasionally being treated as expired; the verification flow now correctly recognizes annual billing
  • Redis cold-start tolerance — fastapi no longer dies on boot if Redis (over Tailscale) takes >5s to first respond; bumped connect timeout to 15s and added a lazy-reconnect cooldown so a one-off blip doesn't cascade into 14 separate reconnect attempts
  • Container ulimits raised — fastapi was hitting the default nofile=1024 under load; bumped to 65536 in compose
  • Chapter-scan index — partial covering index for the periodic "find missing embeddings" task (51 MB, planner now uses Index Only Scan). Trims periodic-scan time significantly
  • Missing-embedding task switched from OFFSET paging to keyset pagination on chapters.id — eliminates O(N) cost on deep pages
  • Queue-info polling cache bumped from 8s to 30s (~2/3 of polls now hit the cache); inspector broadcast timeout cut from 5s to 1s
  • Embedding batch size bumped for faster bulk processing
  • Periodic missing-image task added — finds entities that should have AI character images but don't, schedules generation
  • Discord mod log image rendering fix
  • Alembic baseline reset — squashed 73 individual migration files into one baseline_initial.py. Pure ops cleanup, zero schema impact

Performance#

  • Entity search rewrite — /novels/{id}/entities/search was doing a SQLAlchemy multi-join + chapter aggregation across every match before pagination. Switched to the same CTE-based pattern the unfiltered list endpoint uses, which scales much better on novels with thousands of entity matches
  • only_user_translated filter added/fixed on the entity search endpoint — show only entities you've personally translated within a novel

Glossary Cleanup#

  • Fandom dedup — merged redundant fandom variants into rollups: all major-league sports → "Sports", Godzilla franchise variants → "Godzilla", DC sub-fandoms → "DC". Down from 138 → 125 fandoms
  • Tag dedup pass with the same approach
  • Better fandom and tag changes propagate to the mobile UI
  • Entity image generation rewritten for cleaner pipeline

Frontend#

  • Sidebar navigation refresh — chat history surfaced in the sidebar, faster nav between recent chats and novels
  • New ChapterOverridesDialog — dedicated 685-line component for editing chapter-bounded gender + active/inactive overrides
  • Inactive override editor in the entity dialog (matches the gender override editor)
  • Mid-story gender override editor added to the entity dialog
  • Bulk entity update / rename UI in NovelEntitiesView (mods only) — find-and-replace flow with preview + apply
  • Mention system UI — RichTextarea (515-line component) with @ autocomplete dropdown showing public_username + avatar; MentionContent.vue renders @username substrings as clickable links inside reviews/comments
  • New UserUploadsView for the /me/uploads page (439 lines)
  • General Entities view got an editing mode for mods (was view-only)
  • Cover change UI in mod novel-report flow + moderator actions panel
  • "Old model only" toggle in the mod retranslate dialog
  • New site tips popup with 24 tips for first-time visitors and an uploads-view tip
  • Mod badge component for showing moderator status next to usernames
  • Better responsive dialog primitive — replaces a bunch of ad-hoc modal handling across reviews / comments / feedback summary
  • Chapter view + chapter content improvements (live editing, layout polish)
  • TTS overlay updates — default voice fix, layout cleanups
  • Rating reminder buttons more responsive, dismissable toast, "don't show again" option
  • Cloudflare-friendly auth flow fix — apiClient + auth.ts cleanup; cookie handling now works correctly under CF Tunnel
  • API base URL migration — App.vue now handles the API endpoint migration cleanly
  • Theme handling + entity highlighting fixes
  • Migration mode flag turned off (we're past the embeddings migration)
  • FandomCombobox simplified + better mobile experience
  • Username suggestion gap fix during signup
  • Edge-case fixes in entity dialog interactions, focus handling, dropdown closures
  • App-level toast improvements + warning suppression cleanup