Banana Slides v0.4.0 brings internationalization, dark mode, a redesigned editor experience, and dozens of quality-of-life improvements.
Highlights
✏️ New Editor Experience
- MarkdownTextarea — A brand-new rich editing component with inline chips, formatting toolbar, image preview, and markdown-to-chips conversion on paste. Now user can paste images whereever in homepage, outline editor or description cards and they will be processed instantly.
- OutlineEditor Redesign — Split-view layout: left panel for editing raw outline/description text, right collapsible drawer for structured outline cards.
- Glassmorphism UI — Modal and MaterialGeneratorModal redesigned with a modern glassmorphism aesthetic.
🧮 LaTeX & Image Paste
- Inline (
$...$) and block ($$...$$) LaTeX formula rendering via KaTeX in all Markdown views. - Paste images directly from clipboard in description editors — they are auto-uploaded as materials and inserted as markdown image links.
- Uploaded images now get AI-generated captions (Gemini / OpenAI) used as alt text.
🖼️ Material Center
A dedicated Material Center modal for browsing, filtering by project, batch selecting, bulk downloading (as zip), uploading, deleting, and previewing materials.
⚡ Performance
Frontend image loading optimized with compressed JPG thumbnails (cached_image_path). Originals are preserved for export quality.
🌍 Internationalization & Dark Mode
Full Chinese/English bilingual support powered by i18next, with light / dark / system theme switching. Every component has been adapted for dark mode.
Features
- i18n + Dark Mode (#196)
- MarkdownTextarea, OutlineEditor redesign, glassmorphism UI (#206)
- LaTeX rendering, image paste, and AI captions (#203)
- Material Center and Help Modal — Paginated onboarding guide, auto-shown on first visit (#53)
- Image cache optimization — Thumbnail generation for faster frontend loading (#151)
- Export quality assurance — "Allow partial export" toggle (default off), fail-fast with detailed error messages and help text (#190)
- Settings service testing — One-click connectivity tests for Baidu OCR, text model, caption model, image generation, and MinerU PDF parsing; supports testing unsaved settings before saving
- Editable outline & description in SlidePreview — Edit title, points, and description directly in the preview modal
- Export outline & description to Markdown
- Manual chapter (part) editing in outline (#194)
- AI reasoning mode — Independent enable_reasoning toggles for text and image generation; Vertex
thinking_budgetsupport (#160) - Resolution mismatch detection — Warning dialog when image generation resolution doesn't match settings; OpenAI
extra_bodyparams for resolution control - Docker multi-arch — amd64 + arm64 builds
- Pre-built Docker image deployment option
- PPTX metadata — Author and date metadata in exported files
Bug Fixes
- Export directory not created — Relative path caused PDF/PPTX export to fail with 500 (#201)
- Reference files not available during generation — Files were associated after AI generation completed; now associated before (#201)
- Image generation page data mismatch — Filtered page_ids caused outline data to be zipped with wrong pages (#201)
- Stale closure in task polling — Switching projects caused polls to query the wrong project (#201)
- Infinite polling on description generation failure — Added retry limit (#201)
- Path traversal vulnerability — Export filenames and
/files/paths sanitized withsecure_filename/os.path.abspath(#201, #206) - Export path double-join —
get_absolute_path()wrapped an already-absolute path, causing 500 - Memory leak — Object URLs not revoked in image previews (#201)
- Description generation race condition — Now uses API response data directly instead of reading from store
- Database session staleness — Expire session before export to prevent stale reads (#183)
- Baidu OCR config — Read API key from Flask config (database settings) instead of only environment variables (#190)
- Silent error swallowing — MinerU / Baidu OCR extraction failures now propagate to frontend (#190)
- Image path sync — Added retry mechanism in
pollImageTask - Batch delete — Use
Promise.allSettledto handle partial failures (#201)
Improvements
- Hover tooltip with format examples for outline/description creation tabs (#202)
- HTTP error codes (503, 500, 429, etc.) show user-friendly localized messages (#202)
- Modal: always show close button + Escape key support (#202)
- Toast: new warning type, improved stacking, no header overlap (#202)
- Stale project IDs silently cleaned from localStorage (#202)
- Removed intrusive "service test tip" toast on first project creation (#202)
PORTrenamed toBACKEND_PORTfor consistency- Default text model updated to
gemini-3-flash-preview
Infrastructure
- GitHub Actions workflow for automatic README Chinese → English translation
- E2E tests adapted for i18n (
locale=zh-CN) - Test fixtures updated for open-source codebase (#204)
- Docker:
IN_DOCKER=1set in backend Dockerfile
New Contributors
- @VVIP1024 made their first contribution in #160
- @uthanw made their first contribution in #151
- @Rock-ql made their first contribution in #53
Full Changelog: v0.3.0...v0.4.0