November 4 - December 4, 2025 (version 1.0.66)
Summary
Major release with 201 changed files covering analytics integration, account management, hotkey system overhaul, PDF export, and extensive UI/UX improvements including full phone layout support.
👤 User-Facing Changes
Account Restoration
- Soft-deleted accounts can be restored within 30 days
- Shows days remaining until permanent deletion
- Automatic redirect for soft-deleted users
⌨️ Keyboard Shortcuts
Platform-Aware Hotkeys
- Uses ⌘ (Command) on macOS, Ctrl on Windows/Linux
- Platform-specific display in hotkey hints
New Shortcuts
| Shortcut | Action |
|---|---|
⌘/Ctrl+I | Import script from file |
⌘/Ctrl+P | PDF export (Shot List, Storyboard) |
Shift+P | Populate shot list from script |
Shift+S | Toggle script panel |
1-7 | Script Editor element formatting |
⌘/Ctrl+Shift+T | Toggle color theming |
📄 Script Editor
Import Improvements
- Real-time progress indicator with step-by-step feedback
- Shows: loading, parsing, indexing, syncing, complete states
- Non-blocking import prevents UI freezing on large scripts
Responsive Layout
- Full layout (940px+): All buttons with labels
- Compact layout (780px+): Condensed button labels
- Ultra-compact (<720px): Maximum editor space
Mobile Improvements
- iOS/Android selection handles and toolbars
- Phone layout with drawer navigation
🗂️ Shot List
Phone Layout (NEW)
- Mobile-optimized expandable shot items
- Swipe actions for edit and delete
- Bottom navigation to toggle Linear/Production modes
- Day selector for production scheduling
- PreVis image carousel with upload support
Desktop Improvements
- Cmd+Scroll to adjust row height (30-200px)
- Drag column headers to reorder
- Long-press custom columns to delete
- “Sort & Fix Indexes” maintenance tool
PDF Export (NEW)
- Export shot lists to PDF with customizable options
- Select which columns to include
- Choose page format (Portrait/Landscape A4)
- Custom PreVis image dimensions
- Document header with project logo
- Unicode font support (Cyrillic and other scripts)
Edit Overlays
- Fade-out gradient at bottom of option lists
- Long-press to delete custom options
- Auto-save while typing
🎯 Storyboard
Grid View (NEW)
- Toggle between Linear and Grid layouts
- Phone: 2-column grid
- Desktop: Configurable 1-10 columns
- Cmd+Scroll to adjust column count
- Drag-and-drop reordering
Linear View Improvements
- Cmd+Scroll to adjust panel width (200-800px)
- Tappable shot type, lens, and movement fields
- Double-tap description to edit inline
- Single-tap opens expanded view
Expanded View Dialog (NEW)
- Fullscreen view for shot details and previs images
- Image carousel with tap zones (left/right to navigate)
- “Manage PreVis” button for quick access
PDF Export (NEW)
- Configure columns per page (1-5)
- Scene selection: Current, Range, or All
- Adjustable margins and panel spacing
📁 Media Explorer
Improvements
- Lazy loading with scroll-based pagination
- Drag-and-drop file reordering (order persists)
- Phone layout with drawer navigation
- Filter bar for desktop/tablet, filter sheet for mobile
Entity Media Screen
- Fullscreen modal dialog on desktop
- Drag-and-drop file reordering
📱 Phone Layout Support
Added responsive phone layouts across the app:
- Script Editor, Projects, Account, Help, Roadmap
- Call Sheets, Cast & Crew, Home, Invoices
- Media Explorer, Hotkeys Screen
Common Phone Features
- Unified PhoneAppBar with drawer navigation
- Project abbreviation in app bar navigates to projects list
- Keyboard auto-dismiss on tap
🎨 UI/UX Improvements
Navigation
- Phone layout uses drawer instead of navigation rail
- Project selector navigates directly to projects list on phone
- Help screen with links to docs, support, and legal info
Windows Support
- Window caption integration
- Drag-to-move area for window dragging
Error Handling
- User-friendly network error notifications via snackbar
🔧 Technical Changes
🌐 API & Network Layer
API Client
- Configurable endpoint prefixes with
defaultPrefixparameter - Per-endpoint prefix overrides (GraphQL uses root
/) SnackbarServiceintegration for network error notifications- New endpoints:
graphql,updateProfile,deleteAccount,restoreAccount,initiateUpload
Exception Handling
OfflineExceptionclass for expected network errors (not logged as errors)- Async network connectivity checks before reporting errors
AuthInterceptorreadsrequiresAuthfrom endpoint options
Network Connectivity Service (NEW)
NetworkConnectivityServicefor reliable connectivity detection- Uses
connectivity_plusfor platform state - Socket-based internet verification (Google DNS, Cloudflare DNS)
onConnectivityChangedstream for real-time monitoring
🔄 CineSync (Transaction Sync)
GraphQLCineSyncServerreceivesApiClientinstance (reuses interceptors)- Consolidated
graphql_server.dartintoserver_interface.dart TransactionQueuereceives server at construction (no recreation)- Dedicated
scriptImportmutation for bulk operations - Transactions marked for retry when connection restored
📊 Analytics
- Firebase Analytics integration with
AnalyticsService - Platform-aware tracking (iOS, macOS, Android, Windows, Linux, Web)
app_platformuser property for segmentation- Session tracking with duration measurement
- Authentication flow events: login started/code sent/completed/failed, logout
- Analytics user ID via backend-generated hashed
analyticsId - Upload tracking:
media_file_uploaded,media_file_upload_failed,upload_batch_completed - Project events: created, deleted, opened
🔐 Authentication
AuthUser Model
- New fields:
analyticsId,firstName,lastName,roles,deletedAt isDeletedcomputed property,daysUntilPermanentDeletiontoMap(),fromMap(),copyWith()methods
AuthService
updateProfile(),deleteAccount(),restoreAccount()methods- Clear cached project ID on logout
- Clear refresh token before new authentication
🧭 Router
- New routes:
/account-restoration,/help,/account - Firebase Analytics observer for screen tracking
- Soft-deleted account redirect logic
- Post-auth redirect to shot list if project available
EntityMediaPageRouteremoved (now modal dialog)
🎬 Models & Stores
Scene & Shot Models
SceneTimeOfDay: Fixed GraphQL string conversionShotModel: Addedstatusfield toggleShotListItemListTypeenum:linearvsproduction
ShotListItem Model
listTypefield (linearorproduction)- Linear items require
productionDay == null copyToProductionList()method
Stores
sceneModelProviderkeyed by scene ID (UUID) instead of scene number- Placeholder scene for deleted scenes
sceneNumberExists()validation
📄 Script Editor Internals
Import Transactions
ScriptImportDocumentTransaction: Atomic document delete+createScriptImportNodesTransaction: Batched node creation (200 per batch)ScriptImportTransaction: Single-transaction optimized import
FractionalIndexingIsolate (NEW)
- Background isolate for fractional indexing
- Batches of 100 nodes with microtask breaks
FountainAtomicRealtimeController
- Improved dialogue continuation for empty nodes
- Character demotion validation
- NodeRemovedEvent detection for deletions
🗂️ Shot List Internals
Transactions
- All include
listTypefield ShotListReindexTransaction(NEW): Bulk reindex for corrupted indexesLinearSceneDeletionTransaction: Deletes linear and production itemsShotListPopulationTransaction: BULK_DELETE in FK order- Deprecated
ShotSceneChangeTransaction→ useLinearShotMoveTransaction
Services
CellEditOverlayService: Tablet dialog support, scene by UUIDShotEditingService:updateStatus()methodShotListPDFExportService(NEW): PDF generation with Unicode fontsShotListService: Bootstrap splits bylistType, scene integrity validation
Utilities
- Deletion order: remove from list → invalidate provider → delete from store
ShotListExportUtils(NEW): JSON export for debugging- Linear items always have
productionDay: null
🎯 Storyboard Internals
StoryboardLayoutModeenum:linearandgrid- Removed deprecated
StoryboardDisplayState StoryboardGridDelegate: Custom grid layout withadditionalHeight- Renamed
LinearStoryboardTopMenuBar→StoryboardTopMenuBar
🔥 Firebase & Initialization
Firebase
- Platform-specific configurations via FlutterFire CLI
- Web, Android, iOS, macOS, Windows support
- Linux throws
UnsupportedError
Bootstrap
- 10-second timeout with error UI
- Auto-logout on bootstrap error
- Workspace initialization handled by AuthService
Responsive Breakpoints
- MOBILE → PHONE (0-550px)
- TABLET (551-1000px)
- DESKTOP (1001+)
🛠️ Utilities
New
Debouncer: Input stabilizationGridLayoutUtils: Responsive card sizingFilePickerDiagnostics: Platform-specific loggingFileOrderUpdateTransaction: File sort order persistenceFileSelectionMixin: Consistent selection behavior
Text Transformers
camelCaseSlughandles acronymscamelToSnakeCaseextensiontitleToCamelCaseSlugfor special characters
Display Settings
storyboardGridCrossAxisCountfor grid columnsstoryboardLinearSizedefault: 200 → 350
Other
log.error()defaultshowSnackbar: falseclearRefreshToken()for selective token clearingappBarThemewith consistent text styling