- PDF pages rendered by PDF.js directly from File object (no conversion shown)
- Each page gets a transparent overlay canvas for drawing highlights
- Word positions extracted from PDF.js getTextContent() in PDF coordinate space
- convertToViewportPoint() maps PDF space → canvas pixels correctly (handles y-flip)
- On each sentence: purple highlight rectangles drawn over matching words on the PDF
- Sentence→word mapping via character-position search through word stream
- PDF rendering and text extraction run in parallel (pages appear as they render)
- Nextcloud PDFs use pdf_b64 → PDF.js rendering path
- Removed iframe approach entirely
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PDF renders immediately on file select via blob URL (no server round-trip)
- Text extraction happens in background (only needed for TTS audio)
- Default view is now PDF (shows the real document, not extracted text)
- User can switch to Text view to see extracted sentences with highlighting
- Nextcloud PDFs also default to PDF view when opened
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Browser renders PDF exactly as-is using its built-in viewer (Chrome/Edge/Firefox)
- No external dependencies - just a blob URL in an <iframe>
- Page navigation via #page=N fragment syncs PDF view with playback position
- Fixed flex layout so iframe fills remaining height correctly
- Removed PDF.js script tag
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- PDF pages rendered via PDF.js (see actual document, not just extracted text)
- Text/PDF view toggle appears for PDF documents (top-right of header)
- PDF view scrolls to current page as sentences are read
- Column-aware extraction: detects two-column layouts, reads left column
top-to-bottom then right column (fixes academic papers, double-page PDFs)
- De-hyphenation: removes mid-word line breaks from extracted text
- Both PDF upload and Nextcloud download now return pdf_b64 + page_texts
- sentence→page mapping so PDF view auto-scrolls during playback
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Email verification: send link on register via SMTP2GO (noreply@pedshub.com), verify endpoint, beautiful HTML email
- Unverified users see yellow banner in app with resend button; also shown on settings page
- User settings page (/settings): personal Nextcloud credentials (override admin-wide config)
- Admin and per-user Nextcloud config merged (user settings take priority)
- Groq PlayAI TTS: 20 English voices + 2 Arabic voices via groq-playai-tts / groq-playai-tts-arabic
- Added groq-playai-tts and groq-playai-tts-arabic to litellm config
- Favicon SVG (purple play button) across all pages
- Settings link in user dropdown menu
- verify-ok.html and verify-fail.html result pages
- DB migration: added email_verified column, verification_tokens and user_settings tables
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>