feat: reader enhancements, history, tag management, cache controls - #21
Merged
Conversation
CRITICAL: - Remove token_plain from ApiToken model (no more plaintext in DB) - Fix Dockerfile chmod 777 → 750 for /app/config - Add path traversal validation in gallery delete - Fix symlink bypass in import with os.path.realpath() - Validate PID cmdline before signaling (race condition fix) HIGH: - Reorder download enqueue: ARQ first, then DB insert (atomicity) - Wrap sync file I/O in asyncio.to_thread() in library delete - Add pre-backup + --single-transaction to restore script - Add config permission comments in docker-compose.yml - Fix login page race condition with AbortController - Deduplicate 401 redirects with isRedirecting flag - Add retry logic for reader progress save failures MEDIUM: - Add Redis rate limiting (10/min) on external download endpoint - Atomic file writes for thumbnails and gallery-dl config - BFS cycle detection for tag implications (was 1-hop only) - Fix SW caching 401 responses + add offline fallback page - Add SSR guards for localStorage in browse page - Await mutate() calls in queue page error handling - Add disable_symlinks to nginx media locations - Move nginx cache from /tmp to /var/cache/nginx Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…trols Reader: scale modes, reading direction (LTR/RTL/TTB), auto-advance timer, status bar, pinch-to-zoom, help overlay with tap zone guide. History: standalone browse history page with record/list/delete/clear API. Tags: autocomplete search, translation support, blocked/filtered tags with server-side filtering in both library and EH search results. Cache: view stats and clear Redis cache categories from settings page. Backend APIs: EH popular, toplists, comments (read-only), saved searches CRUD. Known gaps (follow-up): browse page Popular/TopLists/Language tabs, saved search UI, comments display, history recording triggers, subscriptions. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- history.py: add COUNT(*) query so frontend pagination works correctly - search.py: change response key from "items" to "searches" to match frontend type Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reader: - Fix auto-advance showing loading spinner on cached images (150ms debounce) - Fix webtoon thumbnail click not scrolling to target page - Replace TTB with vertical tap mode (top=prev, middle=menu, bottom=next) - Toolbar: split into 3 rows, add safe-area-inset-top for PWA, X close button Browse: - Persist page/tab/favcat/search in URL params for back-navigation - Save/restore scroll position via sessionStorage - Floating back button (bottom-right) for mobile ergonomics - LazyImage with IntersectionObserver for browse thumbnails Backend: - Thumb-proxy: add asyncio.Semaphore(4) to limit concurrent CDN requests - Library: fix _get_blocked_tag_strings to use injected db session - Tests: add blocked_tags table to SQLite test schema (fixes 6 failures) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…e URL - Backend: normalize declared cell heights per sprite URL (use max height) to fix cover pages (150px) vs normal pages (278px) inconsistency - Backend: add new regex for 2024+ EH preview HTML format - Backend: add hath.network CDN to allowed thumb proxy hosts - Frontend: switch from cover scaling (Math.max) to width-based scaling to eliminate black rectangles and cell bleeding artifacts - Frontend: remove loading="lazy" from thumbnails in overflow containers - Frontend: fix browse pagination feedback loop (watch urlQ only) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
/history) with full CRUD API + sidebar/mobile nav linksKnown Gaps (follow-up PR)
api.history.record()never calledapi.tsexpects{ searches: [] }but backend returns{ items: [] }for saved searchesChanged Files
db/models.py,db/init.sqleh.py,history.py,library.py,search.py,system.py,tag.pyeh_client.pyhooks.ts,index.tsx,types.tshistory/page.tsx,settings/page.tsx,browse/[gid]/[token]/page.tsxapi.ts,types.ts,i18n.tsTagAutocomplete.tsx,Sidebar.tsx,MobileNav.tsxuseGalleries.ts,useTagTranslations.tsTest Plan
/historypage shows entrydocker compose build api worker pwa && docker compose up -d🤖 Generated with Claude Code