Replaced inner Textarea component (defined inside StudioCustomizeModal)
with a plain renderTextarea() function called directly — prevents React
from unmounting/remounting the textarea on each re-render.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Consistent #0D0D0D dark theme throughout, no white sections
- Unified action buttons: dark surface with FFCB05/FF5C00 icon accents
- Studio grid: refined cards with hover lift, pencil shows on hover
- All modals/panels (share, edit, podcast, upload) match dark surface
- Processing/failed banners: dark blue/red tints with proper contrast
- Documents list, synthesis, studio viewer all dark themed
- Studio sub-views (flashcards, quiz, report, datatable) dark themed
- globals.css .dk class resets forced color override for dark sections
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Browser preview:
- White background for content slides, dark (#1A1A1A) for title slide
- Yellow (#FFCB05) top bar, title underline, slide number highlight
- Orange (#FF5C00) bullet dots
- Montserrat font via CSS, responsive clamp() sizing
PPTX download:
- Blank layout with programmatic shapes (no default theme artifacts)
- Dark title slide with yellow left bar and separator line
- White content slides with yellow top/accent bars
- Orange bullet markers, Montserrat font, proper sizing
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Studio is now a 5th button in the main action bar. Clicking it expands a second row of 7 colored buttons (Mind Map, Flashcards, Quiz, Slide Deck, Report, Infographic, Data Table) styled to match existing Chat/Share/Analysis/Podcast buttons. Removes the old card grid section.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- studio_generators.py: 7 Pydantic output models + async generators using LLM factory
- database.py: add studio_data TEXT column with safe ALTER TABLE migration
- notebooks.py: GET /studio, POST /studio/{type}, GET /studio/{slides,report}/download
- types/index.ts, api.ts: Studio type interfaces and API calls
- page.tsx: Studio grid section, modal overlay, 7 viewer sub-components (SVG mind map, 3D flashcard flip, scored quiz, slide carousel, report PDF, infographic, data table)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Replace broken useEffect-based refresh (which had race conditions) with
simpler refetchInterval approach. Now the notebook query polls every 2s
while any tasks are processing, then stops when all complete.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Added useEffect that tracks completed task count and invalidates the
notebook query when new tasks finish. This ensures documents appear
in the list immediately after processing without requiring a manual
page refresh.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Users can now preview ElevenLabs voices before selecting them for podcast
generation. Added play/stop buttons next to each voice dropdown that play
the official ElevenLabs preview audio samples.
- Added previewUrl to each voice in the voices array
- Added playPreview function with HTML5 Audio API
- Added play/stop buttons with visual feedback when playing
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Security improvements:
- Add JWT token authentication for all API endpoints
- Create jwt_auth middleware with token generation and validation
- Update auth routes to return access tokens on login/signup
- Add Authorization header interceptor in frontend API client
- Store JWT tokens in Zustand auth store
- Remove insecure user_id query parameters
Sharing enhancements:
- Add user search API endpoint (GET /api/auth/users/search)
- Implement autocomplete in share modal with debounced search
- Show email and username suggestions in dropdown
- Add keyboard navigation (arrows, Enter, Escape)
- Filter out already-shared users and current user from results
- Add email format validation on frontend and backend
Developer experience:
- Make basePath environment-specific (empty in dev, /notebookllama in prod)
- Update next.config.js to support local development without basePath
- Fix routing issues in local development (login/signup redirects)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Frontend now passes session_id in WebSocket URL
- Backend uses existing session instead of creating new one
- Messages now save to correct chat session
- Fixes messages disappearing after refresh
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- getSharedNotebooks now passes user_id
- Shared notebooks will now display correctly
- Users can see notebooks shared with them
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Alert users after document deletion
- Warn to wait 1-2 minutes before querying
- LlamaCloud index updates are async and take time
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Warn user about consequences before deleting
- Show what will be deleted (docs, chats, pipeline)
- Clear confirmation message
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Accept PDF, DOCX, DOC, PPTX, PPT, TXT, MD files
- Update UI text to show supported formats
- LlamaParse handles all these file types
- Backend validation for supported extensions
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Use refetchUsers() instead of window.location.reload()
- Admin actions now update UI without logging out
- Suspend/unsuspend works correctly
- User management stays on same page
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Add user management UI in admin panel
- Promote/demote admin functionality
- Delete user functionality (removes all data)
- Show ADMIN badge for admin users
- Hide Admin nav link from non-admin users
- Strict admin-only access control
- Fix timestamps to use local time instead of UTC
- Add bulk delete for chat sessions
- Add unshare option for shared chats
- Backend returns is_admin field for users
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
- Remove useEffect dependency (was causing issues)
- Set synthesis state directly in queryFn
- Always refetch on mount
- Added extensive console logging for debugging
Synthesis WILL persist now!
✅ Podcast Customization:
- Added 'Additional Instructions' textarea field
- Now matches Streamlit app (theme + custom prompt)
- Full customization available
✅ Synthesis Persistence:
- Invalidate React Query cache after generating
- Forces reload from database
- Synthesis persists across logout/login
These were the critical missing features!
- Removed creatingSession flag (was causing issues)
- Mutation uses disabled state properly
- Synthesis useEffect always sets when loaded (removed !synthesis check)
- Added console log for debugging
Should fix both new chat spam and synthesis not showing!