appearance fieldguide_images table stores multiple guide photos per entity (entity_type, entity_id, image_url, sort_order)guide_image_url column on characters/sets/props stays in sync (first guide image)/:entityType/:id/guide-images, DELETE /guide-images/:guideIdguide_images array attached to each entity via attachGuideImages() helpergetGuideImageUrls() from guide_images tablereference_image_url unless the user explicitly requests an "edit existing reference" behaviorimage_url vs image_urls, PuLID single ref, Qwen caps, etc.).fileInputRefs use a ref object keyed by ${type}_${id} for per-card file inputsreference_image_url = NULL without deleting guide images
- Endpoint pattern: DELETE /api/:entityType/:id/reference-imagegenerate-advanced endpoint builds prompt via buildCharacterPrompt/buildSetPrompt/buildPropPrompt when empty prompt sent
- IMPORTANT: disable generate while entity save is in flight (saving) so users cannot save and immediately regenerate against stale DB state⚙️ Account button above the Video Story titlefixed inset-0 z-50 flex justify-end pattern as ActivityPanel / DetailPanelGET /api/account/overviewserver/account-status.js is the source of truth for:noteGET https://api.fal.ai/v1/account/billing?expand=creditsFAL_KEY, the UI must show balance unavailable and explain that billing reads require an ADMIN keyGET https://api.replicate.com/v1/account returns account identity (e.g. username) but does not expose remaining credit balance in the currently used API flowserver/account-status.js imports dotenv/config directly so standalone scripts/tests loading it still see .env<a download> fails on iOS PWAyoloStep (camelCase), recent logs arrayrefreshKey every 5s during YOLO. ALL phase components
(Analysis, Timeline, Images, Video, Export) must accept refreshKey prop and include it in their
useEffect fetch dependency array: useEffect(() => { fetchData() }, [project.id, refreshKey])breakdownShots() LLM decides cinematography; code computes duration_ms from segment timestamps-t flag-t ${audDuration} (not -shortest)actual_video_duration_ms stored after generation for drift monitoringimage_urls (array) for reference images — including Qwen standard Editimage_url (single string) which caused 422. ALL Qwen variants need array.advanced-images.js: kontext/reve use image_url (single), everything else uses image_urls (array)generate-advanced, server auto-builds from entity fields using same functions as default generatebuildCharacterPrompt/buildSetPrompt/buildPropPromptprompt: ''server/lipsync.jskwaivgi/kling-lip-sync) at $0.014/secsync/lipsync-2) at $0.05/secffmpeg -ss {start} -t {duration} from full narration to get per-shot dialogue audiolipsync_url and lipsync_status columns on shots tableCOALESCE(lipsync_url, video_url) — prefers lip-synced version when availablesegment_type = 'dialogue' on the shot's linked script_segmentGET /api/projects/:id/lipsync-status — status + cost estimatePOST /api/projects/:id/lipsync-all — batch process (runs in background, logs progress)POST /api/shots/:id/lipsync — single shot (synchronous)video_status='generating' rows can survive with no active job. getQueueStatus(projectId) should reset those rows to pending when activeJobs===0 and queue.length===0, and /video-status should expose active/waiting/halted/maxConcurrent so the UI can explain what is actually running. See references/video-queue-refresh-and-qwen-pro-ref-cap-2026-05-18.md.reference_image_prompt values can become stale. On save, invalidate auto-generated prompts (but preserve [ADVANCED:...] and [CUSTOM_UPLOAD] prompts) so later regeneration rebuilds from current structured fields.reference_image_url, first_frame_url, last_frame_url). Do not delete guide images or prompts. Clearing is for resetting generation state, not deleting upstream inputs.POST /api/hermes/projects/create-and-runGET /api/hermes/projects/:id/statusGET /api/hermes/projects/:id/exportaspect_ratio: 16:9 unless portrait requestedreference_image_model: qwenframe_image_model: qwen
references/video-queue-refresh-and-qwen-pro-ref-cap-2026-05-18.md — session detail for stale video generating rows after PM2 restart, maxConcurrent status reporting, and the live Fal Qwen Pro Edit 3-reference cap.
COALESCE(lipsync_url, video_url) so one failed lipsync does not destroy the whole pipeline.