System Dashboard
Auto-refreshes every 10s
{{ dashActiveJobs }}
Active Jobs
{{ dashScripts }}
Scripts
{{ dashOutputs }}
Videos
{{ dashQueue }}
Queued
{{ dashVideoQueue }} pack · {{ dashRenderQueue }} render · {{ dashTtsQueue }} TTS
TTS Queue
{{ tts.status || 'pending' }} {{ tts.input?.substring(0, 40) || tts.character || '...' }}{{ (tts.input?.length || 0) > 40 ? '...' : '' }} {{ tts.character || '' }}
Active Jobs
No active jobs
{{ job.type }} {{ job.statusLabel }}
{{ job.target }}
{{ job.phase }}
{{ job.id.slice(0,16) }}…
{{ line.slice(0,100) }}
Recent Scripts
No scripts
NameLinesStatus
{{ s.name }} {{ s.line_count }} {{ s.status }}
Recent Outputs
No outputs
NameSizeYT
{{ o.name }} {{ fmtSize(o.size) }}
Channels
No channels
ChannelStatus
{{ ch.name }} ready auth missing
Queue Items
IDTypeStatusMessage
{{ q.id.slice(0,8) }}… {{ q.type }} {{ q.status }} {{ q.message }}
Scripts
No scripts.
{{ s.name }}
{{ s.line_count }} lines · {{ fmtDate(s.mtime) }}
Select or create a script.
{{ editorError }}
saving… ✓ saved save failed
Script Pipeline
Track scripts from generation to video output
Generated {{ pipelineGenerated.length }}
No scripts generated
{{ s.name }}
{{ s.segments }} lines ♪ {{ s.tts_cached }}/{{ s.segments }} TTS
{{ s.topic }}
Rendering {{ pipelineRendering.length }}
Nothing rendering
{{ s.name }}
{{ s.phase }}
{{ s.last_log.slice(0,80) }}
job {{ s.job_id.slice(0,8) }}…
Completed {{ pipelineCompleted.length }}
No completed videos
{{ s.name }}
{{ fmtSize(s.video_size || 0) }}
YouTube ✓
Needs Work {{ pipelineNeedsWork.length }}
All good!
{{ s.name }}
{{ s.issue }}
Generate Script with AI
{{ genDone ? 'Generation log (done)' : 'Live output…' }}
{{ line }}
Generation failed (exit {{ genExitCode }})
Result — {{ genSegments.length }} segments (edit, then save)
{{ genSavedMsg }}
Generate Video
Live output
{{ line }}
✓ Rendered successfully
✗ Render failed (exit {{ vidExitCode }})
Outputs
No outputs yet.
{{ o.name }}
{{ fmtDur(o.manifest.total_duration) }} no manifest · {{ fmtSize(o.size) }}
YT ✓ not uploaded
Select a video.
Manifest ({{ currentOutput.manifest.lines?.length }} lines, {{ fmtDur(currentOutput.manifest.total_duration) }})
#CharacterTextStartDur
{{ line.index+1 }} {{ line.character }} {{ line.text }} {{ line.start?.toFixed(1) }}s {{ line.duration?.toFixed(1) }}s
YouTube
{{ currentOutput.manifest.youtube.title }}
{{ currentOutput.manifest.youtube.channel_name }} · {{ currentOutput.manifest.youtube.privacy }}
{{ currentOutput.manifest.youtube.url }} ↗
{{ currentOutput.manifest.youtube.analytics.views }}
views
{{ currentOutput.manifest.youtube.analytics.average_view_percentage?.toFixed(1) }}%
avg view %
{{ currentOutput.manifest.youtube.analytics.likes }}
likes
{{ currentOutput.manifest.youtube.analytics.comments }}
comments
YouTube Channels
No channels configured.
ChannelNichePrivacyAuth
Upload to YouTube
{{ line }}
✓ Upload complete
✗ Upload failed
Analytics
Single Video
Fleet
{{ line }}
{{ anData.views }}
views
{{ anData.average_view_percentage?.toFixed(1) }}%
avg view %
{{ anData.likes }}
likes
{{ fmtDur(anData.average_view_duration_seconds) }}
avg watch time
Retention by line
#CharacterTextStartWatch%Drop
{{ line.index+1 }} {{ line.character }} {{ line.text }} {{ line.start?.toFixed(1) }}s {{ line.watch_ratio != null ? (line.watch_ratio*100).toFixed(0)+'%' : '—' }} {{ line.drop != null ? (line.drop*100).toFixed(1)+'%' : '—' }}
{{ fleetText }}
{{ fleetError }}