Skip to content

GianoReader Release v0.9.0

Latest

Choose a tag to compare

@DrLoki DrLoki released this 09 Aug 21:00
· 2 commits to main since this release

πŸš€ GianoReader Release v0.9.0

This release introduces Web Server Mode β€” an embedded HTTP server that exposes the EPUB library to any device on the local network via a mobile-first PWA web client. Also includes a responsive dual-panel reading layout, lazy translation with sentinel-based loading, and full REST API for books, chapters, bookmarks, and preferences.


⚠️ Post-Install Migration Required

The app identifier has changed from com.bolzonella.giano-reader to giano-reader. After installing v0.9.0, run the migration script once to preserve your existing data (library, bookmarks, reading state):

powershell -ExecutionPolicy Bypass -File scripts/migrate-appdata.ps1

This moves your data from %LOCALAPPDATA%\com.bolzonella.giano-reader\ to %LOCALAPPDATA%\giano-reader\ and removes the old directory. If you skip this step, the app will start fresh with an empty library.


πŸ“ Changelog (v0.8.3 β†’ v0.9.0)

🌐 Web Server Mode

  • Embedded HTTP Server (axum): Toggle a local web server directly from the desktop app's Settings panel. Serves the EPUB library on a configurable port (default 8888) to any device on the LAN.
  • QR Code for Quick Access: Displays a QR code in Settings with the LAN URL for instant mobile connection.
  • REST API: Full JSON API for books, chapters, covers, TOC, reading state, bookmarks, preferences, and translation.
  • Persistence (sled): Server-side key-value store for reading state, bookmarks, and user preferences β€” shared across all connected devices.

πŸ“± Mobile-First PWA Web Client

  • Responsive Dual-Panel Layout: Side-by-side Original + Translated panels on tablets/wide screens (β‰₯768px); single-panel slide view on mobile portrait with swipe and tab switching.
  • Lazy Translation (Sentinel Pattern): Translates paragraphs in chunks of 12 as the user scrolls through the translated panel β€” same proven approach as the desktop app. IntersectionObserver with root: translatedSlot.
  • IndexedDB Translation Cache: Translated paragraphs are cached locally per (bookId, chapter, paragraphId, targetLang) to avoid repeated API calls.
  • Synchronized Scroll (Wide Mode): Bidirectional proportional scroll sync between Original and Translated panels on wide screens.
  • Chapter Navigation: Bottom bar with Previous/Next chapter buttons and settings gear.
  • Settings Bottom Sheet: Slide-up sheet for theme (light/dark/sepia), translation language, font size, UI language. Changes persist immediately via the API.
  • Library Screen: Book grid with covers, progress indicators, and a Bookmarks tab showing all bookmarks across all books.
  • Bookmarks: Create bookmarks at current reading position; tap to navigate directly to the bookmarked chapter and paragraph.
  • Auto-Skip Empty Chapters: If a chapter has no paragraphs (cover/title pages), automatically advances to the first chapter with content.
  • Disconnected Overlay: Full-screen overlay with reconnect button when the server becomes unreachable.
  • Installable PWA: Web manifest with standalone display mode for home-screen installation.

πŸ—οΈ Architecture

  • Rust Backend: Minimal surface β€” axum server, sled persistence, EPUB parser (spine navigation, paragraph extraction, cover serving), Google Translate bridge (chunked batching).
  • TypeScript Web Client: Strict TypeScript, Web Components (no Shadow DOM), CSS custom properties for theming. Vite build targeting es2021/chrome105/safari13.
  • rust-embed: Web client dist/ is embedded into the Tauri binary at compile time β€” no external files needed.
  • CORS: All origins allowed for LAN device access.

πŸ“Š Real Progress Bar (Desktop & Mobile)

  • Proportional Chapter Ticks (Desktop): Progress bar tick marks are now positioned proportionally to the actual text length of each chapter β€” short chapters get less space, long chapters more. Chapter lengths are computed in background after book load.
  • Intra-Chapter Scroll Tracking (Desktop): The progress thumb moves smoothly as you scroll within a chapter, not just when you switch chapters. The indicator now shows a percentage (e.g. "42%") instead of "Ch. X / Y".
  • Click-to-Navigate Respects Proportions (Desktop): Clicking the progress bar now navigates to the correct chapter based on its proportional position.
  • Mobile Progress Bar (Web Client): New 3px accent-colored progress bar between the reading content and the bottom navigation. Shows real-time scroll percentage with a small label on the right.

πŸ› οΈ Developer Mode

  • --dev Launch Flag: Launch the installed app with "Giano Reader.exe" --dev to open WebView2 DevTools (F12) in production builds. Useful for diagnosing translation errors, TTS issues, or network problems without rebuilding.

πŸ”§ Bug Fixes & Improvements

  • JSON Serialization: Added #[serde(rename_all = "camelCase")] to all REST response models (BookSummary, ChapterResponse, TocEntry, Paragraph) β€” fixes field name mismatches between Rust backend and TypeScript client.
  • Touch Scroll Fix: Added touch-action: pan-y and passive pointer listeners to the card UI for reliable mobile scrolling.
  • API State Validation: getReadingState now checks response.ok before parsing, preventing malformed state from breaking navigation.
  • UI Language Live Update: Changing the interface language in Settings now re-renders the current view immediately without requiring a page refresh.
  • TTS Error Diagnostics: Enhanced OpenRouter TTS error logging with full response body, headers, and request details for easier debugging.
  • App Identifier Changed: From com.bolzonella.giano-reader to giano-reader (see migration warning above).
  • Release Profile: Removed panic = "abort" for better error handling in production.