@gentbajko/slopify 2.5.0 → 3.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (542) hide show
  1. package/LICENSE +201 -21
  2. package/NOTICE +12 -0
  3. package/README.md +24 -41
  4. package/SUBTITLES.md +1 -1
  5. package/dist/adapter-registry.js +31 -0
  6. package/dist/adapters/alignment/cache.js +4 -1
  7. package/dist/adapters/alignment/ctc.js +25 -23
  8. package/dist/adapters/alignment/index.js +37 -6
  9. package/dist/adapters/alignment/multilingual.js +267 -0
  10. package/dist/adapters/alignment/protocol.js +11 -0
  11. package/dist/adapters/alignment/quality.js +4 -3
  12. package/dist/adapters/alignment/sentences.js +95 -0
  13. package/dist/adapters/alignment/spec.js +24 -0
  14. package/dist/adapters/alignment/spell.js +769 -0
  15. package/dist/adapters/alignment/text.js +56 -9
  16. package/dist/adapters/alignment/window.js +34 -30
  17. package/dist/adapters/alignment/worker.js +23 -21
  18. package/dist/adapters/explain.js +11 -11
  19. package/dist/adapters/host-cli/index.js +44 -5
  20. package/dist/adapters/host-cli/transport.js +7 -5
  21. package/dist/adapters/image/bytes.js +2 -2
  22. package/dist/adapters/image/codex-output.js +1 -1
  23. package/dist/adapters/image/codex.js +87 -22
  24. package/dist/adapters/image/fal.js +13 -5
  25. package/dist/adapters/image/google.js +11 -8
  26. package/dist/adapters/image/openai.js +14 -7
  27. package/dist/adapters/image/reference.js +34 -0
  28. package/dist/adapters/image/replicate.js +7 -2
  29. package/dist/adapters/image/video.js +2 -2
  30. package/dist/adapters/key-probes.js +85 -0
  31. package/dist/adapters/llm/claude-code.js +168 -32
  32. package/dist/adapters/llm/cli-login-error.js +1 -1
  33. package/dist/adapters/llm/codex-limits.js +157 -0
  34. package/dist/adapters/llm/codex.js +99 -12
  35. package/dist/adapters/llm/document-workspace.js +2 -2
  36. package/dist/adapters/llm/gemini-workspace.js +1 -1
  37. package/dist/adapters/llm/gemini.js +16 -3
  38. package/dist/adapters/llm/image-workspace.js +58 -0
  39. package/dist/adapters/llm/openrouter.js +11 -3
  40. package/dist/adapters/llm/run-cli.js +12 -7
  41. package/dist/adapters/tts/cartesia.js +10 -0
  42. package/dist/adapters/tts/elevenlabs.js +31 -9
  43. package/dist/adapters/tts/gemini.js +206 -0
  44. package/dist/adapters/tts/inworld-async.js +9 -5
  45. package/dist/adapters/tts/inworld.js +17 -3
  46. package/dist/adapters/tts/openai.js +3 -0
  47. package/dist/adapters/tts/pcm-mp3.js +62 -0
  48. package/dist/adapters/tts/system.js +147 -0
  49. package/dist/adapters/tts/voice-languages.js +80 -0
  50. package/dist/assets/fonts/noto/NotoSans-Regular.ttf +0 -0
  51. package/dist/assets/fonts/noto/NotoSansArabic-Regular.ttf +0 -0
  52. package/dist/assets/fonts/noto/NotoSansDevanagari-Regular.ttf +0 -0
  53. package/dist/assets/fonts/noto/NotoSansHebrew-Regular.ttf +0 -0
  54. package/dist/assets/fonts/noto/NotoSansThai-Regular.ttf +0 -0
  55. package/dist/assets/fonts/noto/OFL.txt +93 -0
  56. package/dist/assets/fonts/noto/SOURCE.txt +18 -0
  57. package/dist/assets/models.yaml +38 -0
  58. package/dist/assets/sample/sample-audiobook.tar +0 -0
  59. package/dist/assets/sample/sample-podcast.tar +0 -0
  60. package/dist/assets/sample/sample-project.tar +0 -0
  61. package/dist/assets/style-preview/narration.mp3 +0 -0
  62. package/dist/assets/style-preview/tall-1.jpg +0 -0
  63. package/dist/assets/style-preview/tall-2.jpg +0 -0
  64. package/dist/assets/style-preview/tall-3.jpg +0 -0
  65. package/dist/assets/style-preview/wide-1.jpg +0 -0
  66. package/dist/assets/style-preview/wide-2.jpg +0 -0
  67. package/dist/assets/style-preview/wide-3.jpg +0 -0
  68. package/dist/catalog/merge.js +132 -0
  69. package/dist/catalog/registry.js +17 -14
  70. package/dist/catalog/schema.js +2 -0
  71. package/dist/catalog/store.js +147 -8
  72. package/dist/catalog/validate.js +2 -2
  73. package/dist/compose.yaml +71 -0
  74. package/dist/edge/autostart/docker-record.js +32 -0
  75. package/dist/edge/autostart/docker.js +118 -0
  76. package/dist/edge/autostart/index.js +78 -0
  77. package/dist/edge/autostart/launcher.js +176 -0
  78. package/dist/edge/autostart/model.js +3 -0
  79. package/dist/edge/autostart/native.js +210 -0
  80. package/dist/edge/autostart/prompt.js +72 -0
  81. package/dist/edge/autostart/service.js +90 -0
  82. package/dist/edge/cli-args.js +71 -0
  83. package/dist/edge/cli.js +64 -63
  84. package/dist/edge/docker-install/activation.js +56 -0
  85. package/dist/edge/docker-install/apply.js +458 -0
  86. package/dist/edge/docker-install/engine.js +362 -0
  87. package/dist/edge/docker-install/run.js +160 -0
  88. package/dist/edge/docker-install/state.js +146 -0
  89. package/dist/edge/{docker-projects → docker-install}/volume.js +1 -5
  90. package/dist/edge/docker.js +14 -22
  91. package/dist/edge/events/hub.js +3 -1
  92. package/dist/edge/host-cli.js +1 -1
  93. package/dist/edge/http/actions.js +38 -11
  94. package/dist/edge/http/app.js +60 -2
  95. package/dist/edge/http/auditions.js +70 -0
  96. package/dist/edge/http/autostart.js +37 -0
  97. package/dist/edge/http/byte-range.js +42 -0
  98. package/dist/edge/http/channel-memory.js +92 -0
  99. package/dist/edge/http/channels.js +128 -0
  100. package/dist/edge/http/diagnostics.js +1 -0
  101. package/dist/edge/http/draft-files.js +2 -4
  102. package/dist/edge/http/entries.js +22 -3
  103. package/dist/edge/http/files.js +11 -7
  104. package/dist/edge/http/folder-location.js +1 -1
  105. package/dist/edge/http/home.js +39 -0
  106. package/dist/edge/http/host-cli.js +29 -5
  107. package/dist/edge/http/narration-peaks.js +76 -0
  108. package/dist/edge/http/onboarding.js +212 -0
  109. package/dist/edge/http/open-folder.js +1 -1
  110. package/dist/edge/http/patch-notes.js +45 -0
  111. package/dist/edge/http/planning.js +4 -2
  112. package/dist/edge/http/project-create.js +87 -0
  113. package/dist/edge/http/project-templates.js +19 -2
  114. package/dist/edge/http/projects.js +37 -100
  115. package/dist/edge/http/prompts.js +40 -3
  116. package/dist/edge/http/pronunciations.js +23 -4
  117. package/dist/edge/http/providers.js +119 -3
  118. package/dist/edge/http/reviews.js +131 -0
  119. package/dist/edge/http/revision-files.js +3 -5
  120. package/dist/edge/http/revisions.js +1 -1
  121. package/dist/edge/http/run-cost.js +25 -0
  122. package/dist/edge/http/schedules.js +115 -6
  123. package/dist/edge/http/settings.js +84 -6
  124. package/dist/edge/http/storage-files.js +50 -0
  125. package/dist/edge/http/storage.js +43 -2
  126. package/dist/edge/http/studio.js +287 -0
  127. package/dist/edge/http/style-preview.js +61 -0
  128. package/dist/edge/http/subtitles.js +1 -1
  129. package/dist/edge/http/trash.js +69 -0
  130. package/dist/edge/http/tutorials.js +59 -0
  131. package/dist/edge/http/update.js +24 -3
  132. package/dist/edge/http/whats-new.js +15 -0
  133. package/dist/edge/http/youtube-edits.js +92 -0
  134. package/dist/edge/native-update.js +62 -0
  135. package/dist/extension/slopify-studio-chrome.zip +0 -0
  136. package/dist/extension/slopify-studio-firefox.zip +0 -0
  137. package/dist/host-cli/gemini-login.js +83 -0
  138. package/dist/host-cli/open-folder.js +10 -10
  139. package/dist/host-cli/runtime.js +9 -1
  140. package/dist/host-cli/status.js +4 -2
  141. package/dist/kernel/db/migrations/0025-automatic-reviews.sql +40 -0
  142. package/dist/kernel/db/migrations/0026-schedule-topic-generation.sql +23 -0
  143. package/dist/kernel/db/migrations/0027-run-cost.sql +58 -0
  144. package/dist/kernel/db/migrations/0030-automatic-retries.sql +18 -0
  145. package/dist/kernel/db/migrations/0031-prompt-history-and-description-edits.sql +33 -0
  146. package/dist/kernel/db/migrations/0032-channels.sql +65 -0
  147. package/dist/kernel/db/migrations/0034-script-prompts.sql +23 -0
  148. package/dist/kernel/db/migrations/0035-narration-aliases.sql +13 -0
  149. package/dist/kernel/db/migrations/0037-project-uploads.sql +8 -0
  150. package/dist/kernel/db/migrations/0038-voice-languages.sql +7 -0
  151. package/dist/kernel/db/migrations/0039-channel-essentials.sql +64 -0
  152. package/dist/kernel/db/migrations/0040-standalone-usage.sql +35 -0
  153. package/dist/kernel/db/migrations/0041-cast-hosts.sql +3 -0
  154. package/dist/kernel/paths.js +27 -6
  155. package/dist/kernel/pipeline.js +4 -1
  156. package/dist/kernel/ports/host-cli.js +122 -14
  157. package/dist/kernel/ports/key-probe.js +1 -0
  158. package/dist/kernel/ports/languages.js +157 -0
  159. package/dist/kernel/ports/model.js +10 -5
  160. package/dist/kernel/ports/narration-aliases.js +60 -0
  161. package/dist/kernel/ports/plan-limits.js +36 -0
  162. package/dist/kernel/ports/system-speech.js +203 -0
  163. package/dist/kernel/runner/attempt.js +17 -8
  164. package/dist/kernel/runner/audition.js +36 -0
  165. package/dist/kernel/runner/graph.js +40 -5
  166. package/dist/kernel/runner/index.js +39 -9
  167. package/dist/kernel/runner/meter.js +1 -0
  168. package/dist/kernel/runner/providers.js +142 -7
  169. package/dist/kernel/runner/retry-policy.js +43 -0
  170. package/dist/kernel/runner/standalone.js +134 -0
  171. package/dist/kernel/runner/work-authority.js +28 -2
  172. package/dist/main.js +277 -16
  173. package/dist/model-catalog.js +2 -0
  174. package/dist/patch-notes/0.4.2-to-1.0.md +93 -0
  175. package/dist/patch-notes/1.0-to-2.0.md +74 -0
  176. package/dist/patch-notes/2.0-to-3.0.md +257 -0
  177. package/dist/patch-notes/3.0.0.md +70 -0
  178. package/dist/patch-notes/3.0.1.md +105 -0
  179. package/dist/patch-notes/index.json +32 -0
  180. package/dist/slices/admission/model.js +27 -0
  181. package/dist/slices/admission/repo.js +24 -4
  182. package/dist/slices/admission/rules.js +80 -2
  183. package/dist/slices/admission/schema.js +58 -1
  184. package/dist/slices/admission/short-mode.js +47 -0
  185. package/dist/slices/admission/start.js +42 -6
  186. package/dist/slices/article/continuation.js +2 -2
  187. package/dist/slices/article/provided-entries.js +2 -2
  188. package/dist/slices/article/run.js +6 -2
  189. package/dist/slices/article/segments.js +3 -3
  190. package/dist/slices/backups/folder.js +14 -6
  191. package/dist/slices/batch/index.js +7 -2
  192. package/dist/slices/cancel/index.js +1 -1
  193. package/dist/slices/channels/cast-images.js +110 -0
  194. package/dist/slices/channels/cast-match.js +32 -0
  195. package/dist/slices/channels/images.js +19 -0
  196. package/dist/slices/channels/model.js +5 -0
  197. package/dist/slices/channels/rebrand.js +100 -0
  198. package/dist/slices/channels/repo.js +221 -0
  199. package/dist/slices/channels/runs.js +129 -0
  200. package/dist/slices/channels/schema.js +152 -0
  201. package/dist/slices/channels/service.js +180 -0
  202. package/dist/slices/channels/studio-csv.js +110 -0
  203. package/dist/slices/channels/videos.js +120 -0
  204. package/dist/slices/checkpoints/recovery.js +10 -0
  205. package/dist/slices/control/index.js +5 -2
  206. package/dist/slices/control/providers.js +4 -1
  207. package/dist/slices/document/fonts.js +1 -1
  208. package/dist/slices/document/render.js +1 -1
  209. package/dist/slices/episodes/related.js +90 -0
  210. package/dist/slices/episodes/repo.js +60 -0
  211. package/dist/slices/episodes/service.js +58 -0
  212. package/dist/slices/episodes/summarize.js +170 -0
  213. package/dist/slices/estimate/index.js +109 -28
  214. package/dist/slices/estimate/requests.js +68 -2
  215. package/dist/slices/eta/history.js +56 -0
  216. package/dist/slices/eta/model.js +63 -0
  217. package/dist/slices/eta/view.js +25 -0
  218. package/dist/slices/fixes/rules.js +73 -0
  219. package/dist/slices/fonts/coverage.js +82 -0
  220. package/dist/slices/fonts/sfnt.js +74 -0
  221. package/dist/slices/images/run.js +8 -5
  222. package/dist/slices/images/scale.js +84 -0
  223. package/dist/slices/library/diff.js +122 -0
  224. package/dist/slices/library/history.js +100 -0
  225. package/dist/slices/library/model.js +3 -0
  226. package/dist/slices/library/photorealistic.js +49 -0
  227. package/dist/slices/library/repo.js +19 -14
  228. package/dist/slices/library/save.js +62 -12
  229. package/dist/slices/library/slots.js +7 -1
  230. package/dist/slices/library/used-by.js +153 -0
  231. package/dist/slices/loudness/level-pieces.js +41 -0
  232. package/dist/slices/loudness/loudnorm.js +164 -0
  233. package/dist/slices/loudness/model.js +153 -0
  234. package/dist/slices/model-upkeep/model.js +10 -0
  235. package/dist/slices/model-upkeep/switch.js +217 -0
  236. package/dist/slices/model-upkeep/usage.js +185 -0
  237. package/dist/slices/narration/aliases-library.js +31 -0
  238. package/dist/slices/narration/aliases-schema.js +53 -0
  239. package/dist/slices/narration/aliases.js +49 -0
  240. package/dist/slices/narration/blocks.js +352 -0
  241. package/dist/slices/narration/chunk.js +19 -7
  242. package/dist/slices/narration/concat.js +2 -2
  243. package/dist/slices/narration/describe.js +45 -0
  244. package/dist/slices/narration/pauses-model.js +63 -0
  245. package/dist/slices/narration/pauses.js +269 -0
  246. package/dist/slices/narration/peaks-model.js +1 -0
  247. package/dist/slices/narration/peaks.js +94 -0
  248. package/dist/slices/narration/preparation.js +21 -3
  249. package/dist/slices/narration/pronunciation-chunks.js +3 -3
  250. package/dist/slices/narration/pronunciation.js +72 -25
  251. package/dist/slices/narration/run.js +6 -6
  252. package/dist/slices/narration/shared-glossary.js +1 -1
  253. package/dist/slices/narration/steering.js +15 -4
  254. package/dist/slices/notifications/notifier.js +47 -3
  255. package/dist/slices/notifications/rules.js +48 -3
  256. package/dist/slices/onboarding/copy.js +143 -0
  257. package/dist/slices/onboarding/first-run.js +72 -0
  258. package/dist/slices/onboarding/full-video.js +81 -0
  259. package/dist/slices/onboarding/install.js +119 -0
  260. package/dist/slices/onboarding/model.js +85 -0
  261. package/dist/slices/onboarding/packs.js +491 -0
  262. package/dist/slices/onboarding/quick-short.js +144 -0
  263. package/dist/slices/onboarding/sample.js +132 -0
  264. package/dist/slices/onboarding/state.js +68 -0
  265. package/dist/slices/onboarding/template.js +73 -0
  266. package/dist/slices/patch-notes/library.js +73 -0
  267. package/dist/slices/patch-notes/seen.js +77 -0
  268. package/dist/slices/play-drafts/convert.js +127 -8
  269. package/dist/slices/play-drafts/readiness.js +4 -1
  270. package/dist/slices/play-drafts/repo.js +2 -0
  271. package/dist/slices/play-drafts/review-inputs.js +20 -3
  272. package/dist/slices/play-drafts/schema.js +89 -0
  273. package/dist/slices/play-drafts/service.js +4 -1
  274. package/dist/slices/play-drafts/start.js +43 -18
  275. package/dist/slices/project-templates/from-project.js +59 -6
  276. package/dist/slices/project-templates/next-chapter.js +94 -0
  277. package/dist/slices/project-templates/one-off.js +26 -0
  278. package/dist/slices/project-templates/repo.js +2 -1
  279. package/dist/slices/project-templates/schema.js +7 -1
  280. package/dist/slices/project-templates/service.js +15 -4
  281. package/dist/slices/project-templates/setup.js +18 -2
  282. package/dist/slices/rebuild/admission-repo.js +1 -1
  283. package/dist/slices/rebuild/model.js +6 -0
  284. package/dist/slices/rebuild/preview-details.js +46 -3
  285. package/dist/slices/rebuild/preview-plan.js +13 -6
  286. package/dist/slices/rebuild/recipe-audio-parts.js +40 -7
  287. package/dist/slices/rebuild/recipe-audio.js +66 -12
  288. package/dist/slices/rebuild/recipe-build.js +8 -4
  289. package/dist/slices/rebuild/recipe-cast.js +18 -0
  290. package/dist/slices/rebuild/recipe-checkpoints.js +11 -9
  291. package/dist/slices/rebuild/recipe-describe.js +93 -0
  292. package/dist/slices/rebuild/recipe-edit.js +13 -1
  293. package/dist/slices/rebuild/recipe-exports.js +67 -8
  294. package/dist/slices/rebuild/recipe-input-schema.js +35 -0
  295. package/dist/slices/rebuild/recipe-legacy.js +9 -0
  296. package/dist/slices/rebuild/recipe-loudness.js +45 -0
  297. package/dist/slices/rebuild/recipe-model.js +25 -6
  298. package/dist/slices/rebuild/recipe-pauses.js +7 -0
  299. package/dist/slices/rebuild/recipe-preparation.js +3 -3
  300. package/dist/slices/rebuild/recipe-provider-choice.js +11 -1
  301. package/dist/slices/rebuild/recipe-reference.js +15 -1
  302. package/dist/slices/rebuild/recipe-reviews.js +117 -0
  303. package/dist/slices/rebuild/recipe-save.js +4 -1
  304. package/dist/slices/rebuild/recipe-shorts.js +23 -3
  305. package/dist/slices/rebuild/recipe-text.js +114 -19
  306. package/dist/slices/rebuild/recipe-validation.js +14 -2
  307. package/dist/slices/rebuild/recipe-visual.js +96 -33
  308. package/dist/slices/rebuild/recipe-voices.js +286 -0
  309. package/dist/slices/rebuild/recipe-work.js +77 -6
  310. package/dist/slices/rebuild/recipe-youtube.js +2 -0
  311. package/dist/slices/rebuild/recovery-conflict.js +7 -3
  312. package/dist/slices/rebuild/recovery-model.js +3 -0
  313. package/dist/slices/rebuild/recovery-selection.js +28 -2
  314. package/dist/slices/rebuild/recovery.js +35 -17
  315. package/dist/slices/rebuild/repo.js +3 -3
  316. package/dist/slices/rebuild/retry.js +18 -0
  317. package/dist/slices/rebuild/review-redo.js +125 -0
  318. package/dist/slices/rebuild/runtime-actions.js +5 -0
  319. package/dist/slices/rebuild/runtime-admission.js +4 -1
  320. package/dist/slices/rebuild/runtime-animate.js +4 -4
  321. package/dist/slices/rebuild/runtime-article.js +5 -5
  322. package/dist/slices/rebuild/runtime-document.js +4 -4
  323. package/dist/slices/rebuild/runtime-export-bed.js +43 -0
  324. package/dist/slices/rebuild/runtime-export-edit.js +70 -11
  325. package/dist/slices/rebuild/runtime-export-inputs.js +52 -10
  326. package/dist/slices/rebuild/runtime-export-short.js +85 -0
  327. package/dist/slices/rebuild/runtime-export.js +84 -19
  328. package/dist/slices/rebuild/runtime-figure-card.js +87 -0
  329. package/dist/slices/rebuild/runtime-image.js +21 -2
  330. package/dist/slices/rebuild/runtime-local.js +148 -24
  331. package/dist/slices/rebuild/runtime-materialize.js +8 -0
  332. package/dist/slices/rebuild/runtime-narration-reuse.js +2 -1
  333. package/dist/slices/rebuild/runtime-narration-text.js +7 -7
  334. package/dist/slices/rebuild/runtime-pictures.js +28 -0
  335. package/dist/slices/rebuild/runtime-piece-label.js +27 -0
  336. package/dist/slices/rebuild/runtime-provider.js +126 -18
  337. package/dist/slices/rebuild/runtime-publication.js +21 -5
  338. package/dist/slices/rebuild/runtime-review.js +267 -0
  339. package/dist/slices/rebuild/runtime-run.js +17 -11
  340. package/dist/slices/rebuild/runtime-shorts.js +44 -17
  341. package/dist/slices/rebuild/runtime-store.js +62 -11
  342. package/dist/slices/rebuild/runtime-subtitles.js +72 -19
  343. package/dist/slices/rebuild/runtime-voices.js +103 -0
  344. package/dist/slices/rebuild/runtime-youtube.js +7 -6
  345. package/dist/slices/rebuild/service-readiness.js +3 -3
  346. package/dist/slices/rebuild/soften.js +49 -0
  347. package/dist/slices/rebuild/transition-repo.js +9 -2
  348. package/dist/slices/research/run.js +4 -4
  349. package/dist/slices/research/synthesis.js +2 -2
  350. package/dist/slices/reviews/model.js +105 -0
  351. package/dist/slices/reviews/outcome.js +22 -0
  352. package/dist/slices/reviews/repo.js +118 -0
  353. package/dist/slices/reviews/rules.js +63 -0
  354. package/dist/slices/reviews/verdict.js +71 -0
  355. package/dist/slices/reviews/view.js +30 -0
  356. package/dist/slices/revisions/adopt-content.js +5 -2
  357. package/dist/slices/revisions/adopt.js +3 -1
  358. package/dist/slices/revisions/downloads.js +7 -1
  359. package/dist/slices/revisions/image-plan.js +183 -0
  360. package/dist/slices/revisions/mutation-assets.js +10 -0
  361. package/dist/slices/revisions/mutation-cues.js +71 -0
  362. package/dist/slices/revisions/mutation-request.js +2 -1
  363. package/dist/slices/revisions/mutations.js +97 -3
  364. package/dist/slices/revisions/schema.js +11 -1
  365. package/dist/slices/run-cost/limits.js +128 -0
  366. package/dist/slices/run-cost/meter.js +47 -0
  367. package/dist/slices/run-cost/panel.js +256 -0
  368. package/dist/slices/run-cost/pricing.js +95 -0
  369. package/dist/slices/run-cost/week.js +108 -0
  370. package/dist/slices/schedules/agenda.js +222 -0
  371. package/dist/slices/schedules/repo.js +58 -18
  372. package/dist/slices/schedules/scheduler.js +68 -17
  373. package/dist/slices/schedules/schema.js +179 -1
  374. package/dist/slices/schedules/service.js +43 -4
  375. package/dist/slices/schedules/similar.js +128 -0
  376. package/dist/slices/schedules/topic-list.js +163 -0
  377. package/dist/slices/schedules/topics.js +523 -0
  378. package/dist/slices/settings/first-run.js +106 -0
  379. package/dist/slices/settings/health.js +247 -0
  380. package/dist/slices/settings/key-guides.js +138 -0
  381. package/dist/slices/settings/key-test.js +93 -0
  382. package/dist/slices/settings/keys.js +10 -5
  383. package/dist/slices/settings/model-reach.js +52 -0
  384. package/dist/slices/settings/model.js +55 -1
  385. package/dist/slices/settings/models.js +5 -1
  386. package/dist/slices/settings/playback.js +15 -0
  387. package/dist/slices/settings/readiness.js +14 -2
  388. package/dist/slices/settings/repo.js +17 -3
  389. package/dist/slices/settings/tutorial-schema.js +5 -0
  390. package/dist/slices/settings/voices.js +64 -4
  391. package/dist/slices/settings/whats-new.js +64 -0
  392. package/dist/slices/shorts/captions.js +9 -0
  393. package/dist/slices/shorts/pick.js +3 -3
  394. package/dist/slices/shorts/prompts.js +1 -1
  395. package/dist/slices/shorts/render.js +63 -13
  396. package/dist/slices/storage/asset-name.js +3 -0
  397. package/dist/slices/storage/backup-export.js +48 -9
  398. package/dist/slices/storage/backup-format.js +38 -1
  399. package/dist/slices/storage/backup-import.js +191 -19
  400. package/dist/slices/storage/delete-project.js +7 -4
  401. package/dist/slices/storage/documents.js +87 -0
  402. package/dist/slices/storage/downloads.js +33 -1
  403. package/dist/slices/storage/files-location.js +531 -0
  404. package/dist/slices/storage/layout.js +14 -4
  405. package/dist/slices/storage/model.js +11 -0
  406. package/dist/slices/storage/portable.js +94 -12
  407. package/dist/slices/storage/reconcile.js +14 -1
  408. package/dist/slices/storage/repo.js +4 -1
  409. package/dist/slices/storage/schema.js +11 -0
  410. package/dist/slices/storage/trim.js +146 -0
  411. package/dist/slices/studio/disclosure.js +74 -0
  412. package/dist/slices/studio/model.js +30 -0
  413. package/dist/slices/studio/pack.js +211 -0
  414. package/dist/slices/studio/queue.js +69 -0
  415. package/dist/slices/studio/settings.js +170 -0
  416. package/dist/slices/style-preview/images.js +61 -0
  417. package/dist/slices/style-preview/narration.js +33 -0
  418. package/dist/slices/style-preview/render.js +148 -0
  419. package/dist/slices/style-preview/schema.js +59 -0
  420. package/dist/slices/style-preview/service.js +92 -0
  421. package/dist/slices/style-preview/settings.js +139 -0
  422. package/dist/slices/subtitles/captions.js +42 -9
  423. package/dist/slices/subtitles/model.js +22 -0
  424. package/dist/slices/subtitles/prepare.js +27 -16
  425. package/dist/slices/subtitles/transcript.js +1 -1
  426. package/dist/slices/thumbnail/run.js +7 -7
  427. package/dist/slices/trash/model.js +25 -0
  428. package/dist/slices/trash/service.js +273 -0
  429. package/dist/slices/tutorials/anchors.js +57 -0
  430. package/dist/slices/tutorials/library.js +185 -0
  431. package/dist/slices/uploads/repo.js +20 -0
  432. package/dist/slices/video/ambient-bed-schema.js +15 -0
  433. package/dist/slices/video/ambient-bed.js +95 -0
  434. package/dist/slices/video/ambient-mix.js +72 -0
  435. package/dist/slices/video/audio-inputs.js +2 -2
  436. package/dist/slices/video/cards.js +5 -2
  437. package/dist/slices/video/edit-list.js +23 -2
  438. package/dist/slices/video/edit-settings.js +13 -3
  439. package/dist/slices/video/ffmpeg.js +63 -9
  440. package/dist/slices/video/figure-card.js +492 -0
  441. package/dist/slices/video/figure-spans.js +51 -0
  442. package/dist/slices/video/plan.js +125 -13
  443. package/dist/slices/video/run.js +14 -12
  444. package/dist/slices/video/slideshow.js +39 -4
  445. package/dist/slices/voices/attribution.js +69 -0
  446. package/dist/slices/voices/audio-files.js +87 -0
  447. package/dist/slices/voices/audition.js +25 -0
  448. package/dist/slices/voices/cast.js +74 -0
  449. package/dist/slices/voices/grouping.js +59 -0
  450. package/dist/slices/voices/join.js +35 -0
  451. package/dist/slices/voices/languages.js +25 -0
  452. package/dist/slices/voices/model.js +218 -0
  453. package/dist/slices/voices/palette.js +26 -0
  454. package/dist/slices/voices/panel.js +91 -0
  455. package/dist/slices/voices/portraits.js +55 -0
  456. package/dist/slices/voices/script.js +136 -0
  457. package/dist/slices/voices/timing.js +58 -0
  458. package/dist/slices/youtube/answer.js +1 -1
  459. package/dist/slices/youtube/chapters.js +126 -0
  460. package/dist/slices/youtube/edits-repo.js +84 -0
  461. package/dist/slices/youtube/edits.js +89 -0
  462. package/dist/slices/youtube/placeholders.js +98 -0
  463. package/dist/slices/youtube/transcript.js +11 -4
  464. package/dist/tutorials/AI-CLIs.md +146 -0
  465. package/dist/tutorials/Backups.md +121 -0
  466. package/dist/tutorials/Calendar.md +103 -0
  467. package/dist/tutorials/Cast-Library.md +112 -0
  468. package/dist/tutorials/Channels.md +148 -0
  469. package/dist/tutorials/Costs-and-Run-Cost.md +136 -0
  470. package/dist/tutorials/Docker.md +171 -0
  471. package/dist/tutorials/Document-Themes.md +207 -0
  472. package/dist/tutorials/Editing-a-Project.md +204 -0
  473. package/dist/tutorials/FAQ.md +134 -0
  474. package/dist/tutorials/First-Launch-and-Welcome.md +153 -0
  475. package/dist/tutorials/Home-and-Projects.md +174 -0
  476. package/dist/tutorials/Home.md +119 -0
  477. package/dist/tutorials/Install.md +154 -0
  478. package/dist/tutorials/Intros-and-Outros.md +86 -0
  479. package/dist/tutorials/Keyboard-Shortcuts-and-Command-Palette.md +215 -0
  480. package/dist/tutorials/Library-Overview.md +75 -0
  481. package/dist/tutorials/Models.md +133 -0
  482. package/dist/tutorials/Multiple-Voices.md +161 -0
  483. package/dist/tutorials/Narration-Aliases-and-Glossary.md +129 -0
  484. package/dist/tutorials/Notifications.md +86 -0
  485. package/dist/tutorials/Other-Languages.md +110 -0
  486. package/dist/tutorials/PDF-Documents.md +100 -0
  487. package/dist/tutorials/Play-Images.md +135 -0
  488. package/dist/tutorials/Play-Narration.md +167 -0
  489. package/dist/tutorials/Play-Outputs.md +109 -0
  490. package/dist/tutorials/Play-Overview.md +216 -0
  491. package/dist/tutorials/Play-Title-and-Article.md +135 -0
  492. package/dist/tutorials/Play-Video-and-Style.md +143 -0
  493. package/dist/tutorials/Project-Page.md +228 -0
  494. package/dist/tutorials/Prompts.md +136 -0
  495. package/dist/tutorials/Providers-and-Keys.md +290 -0
  496. package/dist/tutorials/Publishing-to-YouTube.md +135 -0
  497. package/dist/tutorials/Recovery-and-Retries.md +141 -0
  498. package/dist/tutorials/Reviews-and-Checkpoints.md +143 -0
  499. package/dist/tutorials/Schedules.md +154 -0
  500. package/dist/tutorials/Settings-Reference.md +258 -0
  501. package/dist/tutorials/Shorts.md +116 -0
  502. package/dist/tutorials/Start-at-Login.md +126 -0
  503. package/dist/tutorials/Studio-Extension.md +146 -0
  504. package/dist/tutorials/Templates.md +146 -0
  505. package/dist/tutorials/Trash.md +87 -0
  506. package/dist/tutorials/Troubleshooting.md +149 -0
  507. package/dist/tutorials/Uninstalling-and-Moving.md +113 -0
  508. package/dist/tutorials/Updating-and-Patch-Notes.md +120 -0
  509. package/dist/tutorials/Video-Editing.md +135 -0
  510. package/dist/tutorials/Where-Your-Files-Live.md +149 -0
  511. package/dist/tutorials/YouTube-Description.md +132 -0
  512. package/dist/tutorials/Your-First-Short.md +125 -0
  513. package/dist/tutorials/_Footer.md +1 -0
  514. package/dist/tutorials/_Sidebar.md +69 -0
  515. package/dist/updater/service.js +66 -21
  516. package/dist/web/assets/index-DBLSfqA-.css +1 -0
  517. package/dist/web/assets/index-DFdIhmm0.js +307 -0
  518. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
  519. package/dist/web/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
  520. package/dist/web/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
  521. package/dist/web/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
  522. package/dist/web/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
  523. package/dist/web/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
  524. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
  525. package/dist/web/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
  526. package/dist/web/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
  527. package/dist/web/assets/{pdf-BLF2i8c2.js → pdf-B9OY1ioX.js} +1 -1
  528. package/dist/web/index.html +2 -2
  529. package/package.json +5 -5
  530. package/dist/edge/docker-launch.js +0 -81
  531. package/dist/edge/docker-projects/activation.js +0 -35
  532. package/dist/edge/docker-projects/claims.js +0 -85
  533. package/dist/edge/docker-projects/committed.js +0 -40
  534. package/dist/edge/docker-projects/engine.js +0 -461
  535. package/dist/edge/docker-projects/install.js +0 -254
  536. package/dist/edge/docker-projects/prune.js +0 -66
  537. package/dist/edge/docker-projects/recover.js +0 -100
  538. package/dist/edge/docker-projects/state.js +0 -225
  539. package/dist/web/assets/index-CktpxlJd.js +0 -171
  540. package/dist/web/assets/index-DB-vOnGU.css +0 -1
  541. package/scripts/docker-run.sh +0 -3
  542. /package/dist/edge/{docker-projects → docker-install}/tree.js +0 -0
@@ -0,0 +1,100 @@
1
+ # PDF Documents
2
+
3
+ Slopify can lay out your article as a styled PDF: a title page with the thumbnail as its cover, a table of contents, the article with drop caps, a sources page and an optional closing page. It is drawn on your computer in the theme you pick, needs no provider and costs nothing.
4
+
5
+ **Where to find it:** Play → **Outputs** row → **Document**. On a finished project: the **Document** section of the project page, and Edit project → **Inputs** → **Stages** → **Document theme**.
6
+
7
+ ## Make a PDF
8
+
9
+ 1. On Play, open the **Outputs** row.
10
+ 2. In the **Document** rail, switch the source from **Off** to **Generate**.
11
+ 3. Pick a **Theme**: the built-in **Plain**, or one of your own themes from Library → Documents.
12
+ 4. Start the run.
13
+
14
+ The Document stage runs after the article (and the thumbnail, if there is one) is ready. A thumbnail that failed or was cancelled doesn't hold it back: the PDF is then laid out without a cover. It needs an article with some text; an empty article stops the stage with a message pointing you to Edit project → Article.
15
+
16
+ ## Options
17
+
18
+ | Option | What it does | Default |
19
+ |---|---|---|
20
+ | **Document** source | **Generate** lays out a PDF of the article and title on this computer, in the theme you pick. It needs no provider and costs nothing. | Off |
21
+ | **Theme** | How the PDF looks: the built-in **Plain** theme, or one of yours from **Library → Documents**. **Edit themes** opens the list. | Plain, or the channel's document theme |
22
+
23
+ A theme of yours is copied into the project when you pick it. Editing the theme later leaves this project alone until you pick it again, so a PDF already made or queued never changes by surprise. A channel's brand kit can set a **Document theme** for its videos whose template picks none; see [Channels](Channels).
24
+
25
+ ## What's in the PDF
26
+
27
+ In order:
28
+
29
+ | Part | What it holds |
30
+ |---|---|
31
+ | **Title page** | The theme's brand name and tagline (if the theme sets them), the video's title, the project's thumbnail as a cover, then the date and word count. |
32
+ | **Table of Contents** | Headings from the article, down to the level the theme sets (two levels in Plain), with page numbers. |
33
+ | **Body** | The article: headings, paragraphs with a drop cap after headings, bold and italic, links, lists, quotes and rules. |
34
+ | **Sources Consulted** | The article's "Sources Consulted" section, then any other web link cited in the research notes. Links stay clickable. |
35
+ | **Closing page** | Optional: the theme's own lines, the document's details (written on, total words, total pages), a link and a closing line. Off in Plain. |
36
+
37
+ Every page after the title page has a running header ("Brand | Title", or the title alone) and a page number in the footer.
38
+
39
+ ### What is left out
40
+
41
+ - The article's **Pronunciation Glossary** is for the narrator and is never printed.
42
+ - The "Sources Consulted" section becomes the Sources page instead of body text.
43
+ - A heading at the top that repeats the title is not printed twice.
44
+ - Images, raw HTML and footnotes in the article's markdown have no printed form. Tables are printed as rows of cells separated by `|`, and code blocks as plain paragraphs.
45
+
46
+ ### Cover
47
+
48
+ The title page uses the project's thumbnail as its cover when:
49
+
50
+ - the project makes or uploads a thumbnail (its Thumbnail source is not Off),
51
+ - the thumbnail is a PNG, JPEG or WebP image, and
52
+ - the theme's cover setting is on (it is in Plain).
53
+
54
+ Otherwise the title page has no cover and the details sit in the theme's usual place. That includes a thumbnail step that failed or was cancelled: the PDF is made anyway, without a cover. If you make the thumbnail later, the PDF is marked outdated, so you can remake it with the cover. If the thumbnail file can't be read, the Document stage stops and asks you to regenerate or upload the thumbnail again, then use **Try again** on Document.
55
+
56
+ ### Sources
57
+
58
+ Sources come from two places:
59
+
60
+ 1. The article's own section headed **Sources Consulted** (any heading level, or a bold line). Ask for it in your Article prompt with exactly that heading.
61
+ 2. Links in the research notes, when research is on, that the article's list doesn't already have.
62
+
63
+ When there are no sources, the Sources page is left out.
64
+
65
+ ## The Plain theme
66
+
67
+ Plain is the one built-in theme: an unbranded A4 page on a warm off-white background, headings in dark blue, the Cinzel typeface for body and headings, a three-line drop cap after headings, a table of contents and a sources page, no closing page.
68
+
69
+ To change fonts, colours, paper size (A4 or Letter), page parts and the closing page, make your own theme. See [Document-Themes](Document-Themes).
70
+
71
+ ## Open and download the PDF
72
+
73
+ On the project page, the **Document** section shows the theme's name (for example **Plain theme**) and, once the PDF is made:
74
+
75
+ - **Open PDF** opens it in a new browser tab.
76
+ - **Download PDF** saves the file to your computer.
77
+
78
+ While the stage runs it says "The PDF will be saved when rendering finishes." The file lives in the project's folder; see [Where-Your-Files-Live](Where-Your-Files-Live).
79
+
80
+ ## Change the theme of a finished project
81
+
82
+ 1. Open the project and press **Edit project**.
83
+ 2. Open **Inputs**. Under **Stages**, set the Document source to Generate if it was Off.
84
+ 3. Pick a **Document theme**.
85
+ 4. Save. The rebuild review lists the PDF to be made again; it costs nothing.
86
+
87
+ ## Tips
88
+
89
+ - Use Library → Documents' live preview to try a theme on a sample article before you pick it for a project.
90
+ - If a PDF has no cover, check that the project has a thumbnail and that it is a PNG, JPEG or WebP image.
91
+ - Want the sources page filled? Make sure your Article prompt asks for a "Sources Consulted" section, and consider turning on research.
92
+
93
+ ## Related pages
94
+
95
+ - [Document-Themes](Document-Themes)
96
+ - [Play-Outputs](Play-Outputs)
97
+ - [Channels](Channels)
98
+ - [Project-Page](Project-Page)
99
+ - [Editing-a-Project](Editing-a-Project)
100
+ - [Play-Title-and-Article](Play-Title-and-Article)
@@ -0,0 +1,135 @@
1
+ # Play Images
2
+
3
+ The images are the pictures your video shows while the narration plays. On Play you pick who draws them, which Library image prompts they come from and how many each makes, and optionally an establishing image that keeps characters and style consistent. You get a set of images, drawn in the video's frame shape, played in order.
4
+
5
+ **Where to find it:** Play → **Images** row → **Change**.
6
+
7
+ ## Choose where the images come from
8
+
9
+ The Images row starts with a **Source** switch:
10
+
11
+ | Source | What happens | Cost |
12
+ | --- | --- | --- |
13
+ | **Generate** (default) | Draws images from the ticked image prompts, one image-model call each. | Per image, by the provider |
14
+ | **Provide** | Uses your own PNG, JPEG or WebP files (**Slideshow images**) in the order you pick them. | None |
15
+ | **Off** | No images. This turns the video off too: the **Video and style** row says "Video is Off because Images is Off." | None |
16
+
17
+ ### Use your own images
18
+
19
+ 1. Set **Source** to **Provide**.
20
+ 2. Pick the files under **Slideshow images**. Each is numbered in the order it plays.
21
+ 3. Remove a file with its remove button, or reattach one whose upload was lost.
22
+
23
+ A video can have at most 60 of your images, and the same file cannot be picked twice. Wait for every upload to finish before pressing Start.
24
+
25
+ ## Pick the image provider and model
26
+
27
+ | Option | What it does | Default |
28
+ | --- | --- | --- |
29
+ | **Provider** | Who draws the images, the thumbnail and the shorts' pictures: a keyed service billed per image (fal.ai, Replicate, OpenAI, Google), or a command-line tool you are signed in to (Codex CLI). A greyed provider says why it cannot be used; fix it under Settings. | Your Settings default |
30
+ | **Model** | The provider's image model. Models differ in quality, speed and price per image; the estimate in the right rail shows what this run costs. The refresh button asks for the current list; **Custom ID** lets you type one. | Your Settings default |
31
+ | **Effort** | How long an image agent, such as the Codex CLI, reasons before it draws. Higher effort can follow the prompt more closely but takes longer and uses more tokens. Shown only for models that offer levels. | **Model default** |
32
+
33
+ Changing the provider clears the model.
34
+
35
+ ### Drawing with the Codex CLI
36
+
37
+ With **Codex CLI** as the image provider, the **Model** list holds **Codex default** and the Codex CLI's own models. **Codex default** leaves the model and effort to the CLI's own defaults. Any other model runs with the **Effort** you pick. An image agent that reviews and redraws its picture can work for several minutes at a high effort. Images drawn this way cost nothing extra on your plan; the estimate shows the approximate API price beside **$0 on your plan**. See [AI CLIs](AI-CLIs).
38
+
39
+ ## Pick the image prompts
40
+
41
+ 1. Under **Image prompts**, tick the Library prompts that should draw the video's images.
42
+ 2. Give each ticked prompt a **Number**: how many images it makes, 1 to 20.
43
+ 3. Check the total under the list, for example **8 of 60 images**.
44
+
45
+ | Rule | Value |
46
+ | --- | --- |
47
+ | Images per prompt | 1 to 20 |
48
+ | Images per run, hand-set | at most 60 |
49
+ | Images per run, with **More images for long videos** | at most 240 |
50
+ | Order | The images play in the order you ticked the prompts |
51
+
52
+ Each image is one image-model call. A prompt that has been deleted since this draft picked it shows **Missing template · untick to remove**. With no image prompts at all, the row says "No image prompts saved. Write one on Prompts." See [Prompts](Prompts).
53
+
54
+ ### Photorealistic prompts
55
+
56
+ An image prompt in the Library has a **Draws photorealistic pictures** tick. Turn it on when the prompt's style looks like real photos or film. Prepare upload then answers Yes to YouTube's AI use question for videos and shorts drawn with it. Leave it off for painterly or illustrated styles. It is set on the prompt, not on Play: open Library → Prompts → the prompt. See [Prompts](Prompts) and [Publishing to YouTube](Publishing-to-YouTube).
57
+
58
+ ## Establishing image
59
+
60
+ The establishing image is made first and never shown in the video. Every other image, the shorts' images and (if ticked) the thumbnail are drawn with it as a reference, so characters, style and palette stay the same across the video.
61
+
62
+ | Option | What it does | Default |
63
+ | --- | --- | --- |
64
+ | **Establishing image** | **Off**, **From a prompt** (costs one more image) or **Upload** (your own PNG or JPEG, **Establishing image file**). | Off |
65
+ | **Establishing prompt** | The Library image prompt that draws it, keywords filled like the others. Describe the characters, setting and style every other image should share. | None |
66
+ | **Draw the thumbnail from it too** | Draws the thumbnail with the establishing image as a reference too, so it matches the video. Untick it for a thumbnail drawn on its own. | On |
67
+
68
+ Changing the establishing image later marks the images drawn from it as outdated. When you upload the establishing image, the style preview in the right rail is drawn on it, so you judge the Look and captions on your own picture.
69
+
70
+ ### Set up an establishing image
71
+
72
+ 1. Under **Establishing image**, pick **From a prompt** or **Upload**.
73
+ 2. For **From a prompt**, pick the **Establishing prompt**. For **Upload**, pick the file.
74
+ 3. Leave **Draw the thumbnail from it too** ticked if the thumbnail should match.
75
+
76
+ ## The channel's cast
77
+
78
+ The channel you pick in the **Channel** row brings its cast: characters, creatures, places and objects, each with reference pictures. When an image's brief mentions a cast member by name or alias (as a whole word, ignoring case), that image is drawn with the member's pictures as references, after the establishing image when it is on. The establishing image and the thumbnail also take the members the title mentions. At most four members go with one image.
79
+
80
+ Models that take several input pictures (Codex, OpenAI, Google, and fal.ai's FLUX.2 and Nano Banana 2 edit models) use the pictures directly. A model that takes none gets the members described in words instead. The cast is used even when **Use the channel's brand kit** is off. See [Cast Library](Cast-Library) and [Channels](Channels).
81
+
82
+ ## More images for long videos
83
+
84
+ A long video with a fixed handful of images repeats them for an hour. **More images for long videos** adds images as the narration gets longer.
85
+
86
+ | Option | What it does | Default / range |
87
+ | --- | --- | --- |
88
+ | **More images for long videos** | Adds images, planned from the expected length when the run starts. The extra images are shared among the ticked prompts in order, up to 240 in all. Each is one more image call. | Off |
89
+ | **How the rate is given** | **Every N minutes**: one image every N minutes of narration (0.25 to 60). **N per hour**: N images per hour (1 to 240). Switching keeps the same rate. | One image every 2 minutes |
90
+
91
+ ### Turn it on
92
+
93
+ 1. Tick at least one image prompt.
94
+ 2. Switch on **More images for long videos**.
95
+ 3. Pick **Every N minutes** or **N per hour** and type the rate.
96
+ 4. Read the line under it, for example: "For about 60 minutes (9,000 words expected, set on Review): 30 images, 26 more than the prompts' 4."
97
+
98
+ How the count is worked out:
99
+
100
+ - The length is the pasted article's own word count, or else **Expected article words per video** in the right rail, at 150 spoken words a minute.
101
+ - Each ticked prompt keeps its own **Number** as a minimum. The extra images are handed to the ticked prompts one at a time, in the order they were ticked.
102
+ - When the prompts' own Numbers already cover the length, nothing is added.
103
+ - The count stops at 240. After that the slideshow repeats its images, as it does whenever the narration outlasts them.
104
+ - The count is planned once, when the run starts. A narration that turns out longer is still covered by the slideshow cycling its images.
105
+
106
+ Turning it on also switches **Motion** (in the **Video and style** row) from **Zoom in and out** to **Mix of both**, so a long video pans and zooms by turns. A **Pan across** or **Still** you picked stays, and you can pick Zoom again.
107
+
108
+ ## How long each image stays on screen
109
+
110
+ **Seconds per image** (1 to 600, default 15) is in the **Video and style** row, beside **Cuts**, **Zoom** and **Motion**. When cuts follow the narration, it is the target length and a cut waits for a sentence end. When images run out, they start again. See [Play Video and Style](Play-Video-and-Style).
111
+
112
+ ## The thumbnail and the shorts
113
+
114
+ The thumbnail and the shorts' images use the same image provider and model. If the video's images are not generated but the thumbnail is, the thumbnail gets its own **Provider**, **Model** and **Effort** pickers in the **Outputs** row. See [Play Outputs](Play-Outputs) and [Shorts](Shorts).
115
+
116
+ ## What the row summary says
117
+
118
+ Folded, the Images row lists each ticked prompt with its Number, the provider and model, and "establishing image" when one is on, for example `Scene × 6, Portrait × 2 · fal.ai · flux-pro · establishing image`. With Provide it says how many of your images there are.
119
+
120
+ ## Tips
121
+
122
+ - Keep one style across the video with an establishing image, instead of repeating the style in every image prompt.
123
+ - Picture reviews can check each image for malformed hands, stray text and a match with its brief. They need Claude Code or Codex as the reviewer. See [Reviews and Checkpoints](Reviews-and-Checkpoints).
124
+ - After the run, you can add, remove or regenerate single images on the project page. See [Editing a Project](Editing-a-Project).
125
+
126
+ ## Related pages
127
+
128
+ - [Play Overview](Play-Overview)
129
+ - [Prompts](Prompts)
130
+ - [Cast Library](Cast-Library)
131
+ - [Channels](Channels)
132
+ - [Models](Models)
133
+ - [Costs and Run Cost](Costs-and-Run-Cost)
134
+ - [Play Video and Style](Play-Video-and-Style)
135
+ - [Play Outputs](Play-Outputs)
@@ -0,0 +1,167 @@
1
+ # Play Narration
2
+
3
+ The narration is the article read aloud by a text-to-speech (TTS) voice. On Play you pick the service, model and voice, and fine-tune how the text is prepared, split, paced and levelled. You get a narration track that the captions, cuts, chapters and shorts are all timed from.
4
+
5
+ **Where to find it:** Play → **Narration** row → **Change**. The pauses, the volume levelling and the silences sit in Play → **Video and style**, and **Show tables and figures on screen** sits in Play → **Outputs**; they are described here because they shape the narration.
6
+
7
+ ## Choose where the narration comes from
8
+
9
+ The Narration row starts with a **Source** switch:
10
+
11
+ | Source | What happens | Cost |
12
+ | --- | --- | --- |
13
+ | **Generate** (default) | A TTS voice reads the article aloud. | Charged by the provider per character |
14
+ | **Provide** | Uses an audio file you upload (**Narration file**), as it is. | None |
15
+ | **Off** | Makes a silent video with no captions, YouTube description or shorts. The row reads "Off, a silent video". | None |
16
+
17
+ With **Provide**, the file is used as is: "Uploaded narration is used as-is; include any intro and outro in that file." It is never levelled piece by piece; only the final master reaches it when **Level the volume** is on.
18
+
19
+ ## Pick a voice
20
+
21
+ 1. Open the **Narration** row and leave **Source** on **Generate**.
22
+ 2. Pick the **TTS** provider. A greyed provider says why it cannot be used; add its key under Settings.
23
+ 3. Pick the **TTS model**.
24
+ 4. Pick a **Voice**. If the list says "No voices. Add one in Settings.", add a voice first (see [Add a voice](#add-a-voice-under-settings--voices)).
25
+
26
+ | Option | What it does | Default |
27
+ | --- | --- | --- |
28
+ | **TTS** | The text-to-speech service, charged per character of text: ElevenLabs, OpenAI, Cartesia, Inworld, Google Gemini, or **System voice**, your computer's own speech, which is free (greyed as **Speech Program Missing** when none is found; see [the system voice](Providers-and-Keys#the-system-voice)). Changing it clears the model and voice. | Your Settings default |
29
+ | **TTS model** | The provider's speech model. Models differ in quality, languages, speed and price per character. Narration Preparation needs Inworld TTS-2. The refresh button asks the provider for its current list; **Custom ID** lets you type one. | Your Settings default |
30
+ | **Voice** | Who reads the narration: the voices you added under Settings → Voices for this provider, filtered to the project's language. With several speakers, this voice reads the intro and outro. | None |
31
+ | **Show all voices** | The voice list hides voices listed for other languages than the project's. Tick this to pick one anyway, for example a multilingual voice whose languages are listed wrong. The label says how many are hidden. A voice with unknown languages is always shown. | Off |
32
+
33
+ ### Several speakers
34
+
35
+ Under the voice is a **Speakers** disclosure. It reads "Narration, one voice" by default. Open it to pick an audiobook, podcast, radio drama or interview format with several speakers, each with their own voice. See [Multiple Voices](Multiple-Voices) for every speaker setting, and [Other Languages](Other-Languages) for narrating in another language.
36
+
37
+ ## Audio Advanced
38
+
39
+ **Audio Advanced** is a disclosure under the voice. Its line says what is not at the default, for example `words · intro Welcome · glossary on`.
40
+
41
+ ### Chunking
42
+
43
+ How the narration is split into TTS requests. Split it when a provider refuses long text. It changes the number of requests, not the characters charged.
44
+
45
+ | Option | What it does | Default |
46
+ | --- | --- | --- |
47
+ | **Chunking** | **Whole** sends the narration in one request. **Paragraph** sends one per paragraph. **Every N words** or **Every N characters** ends each request at a sentence end. | **Whole** |
48
+ | **Words** / **Characters** (chunk size) | How long each request may be. Each request ends at the last whole sentence that fits, so a single longer sentence stays whole. Characters count spaces. | 500 words, or 3000 characters |
49
+
50
+ Up to 10,000 words or 1,000,000 characters per chunk.
51
+
52
+ ### Intro and outro
53
+
54
+ **Intro** and **Outro** pick Library entries read before and after the article. See [Play Title and Article](Play-Title-and-Article#intro-and-outro) and [Intros and Outros](Intros-and-Outros).
55
+
56
+ ### Narration Preparation
57
+
58
+ Has the text model add delivery directions and sounds, such as a sigh or a laugh, following the Library narration prompt you pick. The article and captions stay unchanged.
59
+
60
+ | Option | What it does | Default |
61
+ | --- | --- | --- |
62
+ | **Narration Preparation** | Pick a narration prompt from the Library, or **Off**. One text-model call per narration chunk and per intro or outro entry. | Off |
63
+
64
+ It needs the Inworld TTS-2 model. With another model, the field says "Choose Inworld TTS-2 or turn preparation Off." With several speakers it works per speaker: each turn of a speaker on Inworld TTS-2 is prepared on its own, with the speaker's name and role, so every voice gets its own cues. At least one speaker must use TTS-2; turns of speakers on other voices are spoken as written. See [Multiple Voices](Multiple-Voices). When preparation is on, the row offers **Choose text generation under Article** to jump to the text model.
65
+
66
+ ### Pronunciation Glossary
67
+
68
+ | Option | What it does | Default |
69
+ | --- | --- | --- |
70
+ | **Use Pronunciation Glossary** | Reads names with the IPA in the article's Pronunciation Glossary, such as `Arda: /ˈɑɹdə/`, with no extra text-model call. Works with Inworld TTS-2 and TTS-2 Flash. The written text stays unchanged. | On |
71
+ | **Also use pronunciations from my other projects** | Adds every term from your other projects' glossaries, copied when this project starts. This project's own glossary wins where they differ. Turn it off to use only this article's glossary. | On |
72
+
73
+ With another provider or model the switch is greyed and says "Unavailable for this provider or model. Your saved preference is retained."
74
+
75
+ To get a glossary, ask for one in your article prompt: a section in slash-delimited standard-English IPA, one `Term: /IPA/` per line, with an English approximation for foreign names. A line with sounds English lacks is read as plain text. The glossary is never narrated itself. See [Narration Aliases and Glossary](Narration-Aliases-and-Glossary).
76
+
77
+ ### Narration aliases
78
+
79
+ | Option | What it does | Default |
80
+ | --- | --- | --- |
81
+ | **Use narration aliases** | Says the words listed in Library → Aliases the way they are written there, such as `Dr.` as `Doctor`, with any generated voice. They are copied when the project starts. The article and captions keep the written words. | On |
82
+
83
+ Manage the list in [Narration Aliases and Glossary](Narration-Aliases-and-Glossary).
84
+
85
+ ### Tables, figures and code
86
+
87
+ An article written to be read can contain tables, pictures, equations and code. Read aloud cell by cell or symbol by symbol, they are noise.
88
+
89
+ | Option | What it does | Default |
90
+ | --- | --- | --- |
91
+ | **Describe tables and figures in the narration** | The text model writes a short spoken passage for each table, picture, equation and code block (a table's pattern, what a figure or equation means, what code does), and the narration says it in its place. One extra text-model call per block, in the estimate and kept for reuse. The article and PDF keep the real table; captions show what is said. Needs a text model. | On |
92
+ | **Leave code out** | Shown under the switch above. Drops code blocks from the narration instead of summarising each in a sentence or two. Tables, figures and equations are still described. | Off |
93
+ | **Show tables and figures on screen** (in the **Outputs** row) | Each block the narration describes is also shown in the video while it is described: the article's own picture for a figure, a card drawn in your brand kit's title font and colour for the rest. The images take turns around them, and Shorts that include one show it upright. Drawn on this computer at no cost. Offered while the narration describes tables and figures. | On |
94
+
95
+ Even with the switch off, some things are handled for you: links are read without their address, and footnote markers, the Sources Consulted section and the Pronunciation Glossary are never narrated.
96
+
97
+ ## Pauses between sentences and paragraphs
98
+
99
+ Some voices run one sentence into the next with barely a breath. These settings add quiet where the voice's own pause is shorter. They never shorten a pause or cut a word, and the captions follow. They are in the **Video and style** row, beside **Level the volume**, and only show while the narration is generated.
100
+
101
+ | Option | What it does | Default / range |
102
+ | --- | --- | --- |
103
+ | **Pause between sentences (seconds)** | The least quiet after each sentence. About 0.25 s is brisk, 0.35 to 0.45 natural or documentary, 0.5 to 0.8 an audiobook's relaxed pace, 0.8 and up sleep content. 0 keeps the voice's own. | 0.4; 0 to 2 in steps of 0.05 |
104
+ | **Pause between paragraphs (seconds)** | The least quiet at the end of a paragraph, when you want more than between sentences. Try 0.8 to 1.2 for a slower read. 0 gives paragraphs the sentence pause. | 0; 0 to 2 in steps of 0.05 |
105
+
106
+ The pauses are added on this computer before the word timing, so the captions, cuts, shorts and YouTube chapters stay in step. With several speakers, the gap between turns is **Gap between turns** under Speakers instead.
107
+
108
+ ## Level the volume
109
+
110
+ TTS comes back at a different loudness for every voice and even every request, so a joined narration can jump between quiet and loud. **Level the volume** brings every narration piece (each chunk, each intro and outro, each speaker's turn) to one loudness before they are joined, then sets the finished video, shorts and audio files to a target loudness. It runs on this computer with no API calls. It is in the **Video and style** row and shows whenever there is narration.
111
+
112
+ | Option | What it does | Default / range |
113
+ | --- | --- | --- |
114
+ | **Level the volume** | Turns levelling on or off for this run. A draft that never changed it follows Settings → General. | On |
115
+ | **Video volume** | How loud the finished video and shorts are. 0 dB is −14 LUFS, what YouTube and Spotify play everything at. Peaks always stay under −1.5 dBTP. | 0 dB; −10 to +4 dB in steps of 0.5 |
116
+ | **Audio files volume** | How loud the audio-only WAV and an audiobook's MP3 and M4B are. 0 dB is −18 LUFS, the level audiobook shops ask for. Peaks always stay under −3 dBTP. | 0 dB; −10 to +4 dB in steps of 0.5 |
117
+
118
+ Type each volume in **dB** or as a **%** of the recommended level; the other box follows. −6 dB is about 50% and +4 dB about 158%. The help line under each field says the LUFS it stands for. LUFS is how loud a file sounds on average, measured the way ears hear it.
119
+
120
+ ## Silence at the edges and between segments
121
+
122
+ Both are in the **Video and style** row and only show while there is narration.
123
+
124
+ | Option | What it does | Default / range |
125
+ | --- | --- | --- |
126
+ | **Silence at start and end (seconds)** | Quiet time before the narration starts and after it ends. | 2; 0 to 30 |
127
+ | **Silence between segments (seconds)** | Quiet between the intro and the narration, and between the narration and the outro. Only matters when an intro or outro is set. Leave it empty to use the gap set in Settings. | Settings value (3 unless changed); 0 to 30 |
128
+
129
+ ## Add a voice under Settings → Voices
130
+
131
+ The **Voice** list on Play only offers voices you have added.
132
+
133
+ 1. Open Settings → **Voices**.
134
+ 2. Fill in **Voice name**, **Provider**, **Voice ID** and, optionally, **Languages**.
135
+ 3. Press **Add voice**. The voice joins the table above the form.
136
+ 4. Optional: tick **Real person** on the voice's row in the table if it imitates a real person.
137
+
138
+ | Field | What it does |
139
+ | --- | --- |
140
+ | **Voice name** | The name you pick this voice by on Play and in Edit project. Only you see it. |
141
+ | **Provider** | The TTS service the voice ID belongs to. Only providers set up under Settings are listed. |
142
+ | **Voice ID** | The provider's own id for the voice, copied from its voice library. It is not checked now; a wrong id fails when a run's narration uses it. |
143
+ | **Languages** | The languages the voice speaks, as codes such as `es`, `de`. Play lists the voice only for projects in these languages. Blank asks the provider when it can say; a voice with unknown languages is offered for every language. |
144
+ | **Real person** | Turn on for a voice cloned from, or made to sound like, a real person. Prepare upload then answers Yes to YouTube's AI use question for videos it narrates. An AI voice that imitates no one stays off. |
145
+
146
+ See [Settings Reference](Settings-Reference) and [Publishing to YouTube](Publishing-to-YouTube).
147
+
148
+ ## What the row summary says
149
+
150
+ Folded, the Narration row shows the provider and voice (or the speakers format and count), and any preparation prompt, intro and outro, for example `Inworld · Ada · intro Welcome`. With Provide it shows your file's name.
151
+
152
+ ## Tips
153
+
154
+ - If a provider refuses long requests, switch **Chunking** to **Paragraph** or **Every 500 words**. The characters charged stay the same.
155
+ - Listen to the narration on the project page before publishing, in Slopify's own player (see [Project Page](Project-Page#the-players)). Fix a single chunk there instead of re-running everything. See [Editing a Project](Editing-a-Project).
156
+ - An automatic review can check the narration for missing or garbled passages. See [Reviews and Checkpoints](Reviews-and-Checkpoints).
157
+
158
+ ## Related pages
159
+
160
+ - [Play Overview](Play-Overview)
161
+ - [Multiple Voices](Multiple-Voices)
162
+ - [Other Languages](Other-Languages)
163
+ - [Narration Aliases and Glossary](Narration-Aliases-and-Glossary)
164
+ - [Intros and Outros](Intros-and-Outros)
165
+ - [Prompts](Prompts)
166
+ - [Providers and Keys](Providers-and-Keys)
167
+ - [Play Video and Style](Play-Video-and-Style)
@@ -0,0 +1,109 @@
1
+ # Play Outputs
2
+
3
+ Besides the long video, a run can make a thumbnail (or three), a YouTube description with chapters, a set of vertical shorts and a PDF of the article. Audio-only runs give you a WAV, and multi-voice runs can add an MP3 and an M4B audiobook. This page lists every output, what it costs and where to set it. The formats with more to them have their own pages.
4
+
5
+ **Where to find it:** Play → **Outputs** row → **Change**. The row's summary lists what the run will make, for example `1 thumbnail · 3 shorts · YouTube description · PDF (Plain)`, or **Only the video**.
6
+
7
+ ## Every output at a glance
8
+
9
+ | Output | Where to set it | Default | Cost |
10
+ | --- | --- | --- | --- |
11
+ | Long video (MP4) | **Video and style** → Source **Generate** | On | None, rendered on this computer |
12
+ | Thumbnail | **Outputs** → Thumbnail | Off | One image call per thumbnail (plus one text call with **Prompt by LLM**) |
13
+ | YouTube description | **Outputs** → **YouTube description** | Off | One text-model call |
14
+ | Shorts | **Outputs** → **Shorts** | Off | One text call to pick them, plus new images for each |
15
+ | Tables and figures on screen | **Outputs** → **Show tables and figures on screen** | On (when described) | None |
16
+ | PDF document | **Outputs** → Document | Off | None, laid out on this computer |
17
+ | Subtitle files (.srt, .vtt) | **Video and style** → **Subtitles** | Off | None |
18
+ | Narration WAV | **Video and style** → Source **Off**, with narration on | | None |
19
+ | MP3 and M4B audiobook | **Narration** → **Speakers** | Off | None |
20
+
21
+ ## Thumbnail
22
+
23
+ The Thumbnail part has its own **Source** switch:
24
+
25
+ | Source | What happens | Cost |
26
+ | --- | --- | --- |
27
+ | **Off** (default) | No thumbnail. | None |
28
+ | **From prompt** | Draws the thumbnail straight from the thumbnail prompt. | One image call |
29
+ | **Prompt by LLM** | The text model first writes the image prompt from yours, the title and the article, then the image model draws it. | One text call, then one image call |
30
+ | **Provide** | Uses your own PNG, JPEG or WebP (**Thumbnail image**). | None |
31
+
32
+ | Option | What it does | Default |
33
+ | --- | --- | --- |
34
+ | **Thumbnail prompt** | The Library thumbnail prompt, keywords filled in. **From prompt** sends it to the image model as it is; **Prompt by LLM** gives it to the text model with the title and article to write the image prompt. | None |
35
+ | **Thumbnails** (**1** or **3**) | **3** makes two more thumbnails from the same prompt with different compositions, for YouTube's Test & compare. Each costs one more image, so 3 thumbnails are 3 image calls. | 1 |
36
+
37
+ ### Make three thumbnails for Test & compare
38
+
39
+ 1. Set the Thumbnail **Source** to **From prompt** or **Prompt by LLM**.
40
+ 2. Pick a **Thumbnail prompt**. Write one in [Prompts](Prompts) if you have none.
41
+ 3. Set **Thumbnails** to **3**.
42
+
43
+ You can remake each thumbnail on its own on the project page. The thumbnail uses the Images row's provider and model; if the video's images are not generated, the Thumbnail part shows its own **Provider**, **Model** and **Effort**. With an establishing image and **Draw the thumbnail from it too** ticked, the thumbnail is drawn with it as a reference, and it also takes cast members the title mentions. See [Play Images](Play-Images#establishing-image).
44
+
45
+ ## YouTube description
46
+
47
+ After subtitle timing, the text model writes a description with chapters at the narration's real times, hashtags at the end, and a separate list of tags, ready to copy. It runs beside the render. It needs narration; without it the switch is disabled and says "Needs narration."
48
+
49
+ | Option | What it does | Default |
50
+ | --- | --- | --- |
51
+ | **YouTube description** | Turns the step on. One text-model call. | Off |
52
+ | **Description prompt** | The Library prompt the description is written from. **Built-in** asks for a short summary, 5 to 12 chapters, 3 to 5 hashtags and 15 to 25 tags. Write your own description prompt on Prompts to change the tone or add links. | Built-in |
53
+
54
+ See [YouTube Description](YouTube-Description) for the result and the copy buttons.
55
+
56
+ ## Shorts
57
+
58
+ After subtitle timing, the text model picks the best self-contained moments of the narration. Each becomes a vertical 1080×1920 clip with new images, big word-by-word captions and its own title, description and hashtags. It runs beside the render, and its images are charged like any other. It needs narration.
59
+
60
+ | Option | What it does | Default / range |
61
+ | --- | --- | --- |
62
+ | **Shorts** | Turns shorts on. | Off |
63
+ | **How many** | How many shorts to cut from this video. Each needs its own new images. | 3; 1 to 10 |
64
+ | **Length** | The shortest and longest a short may run, in seconds. | 60 to 120; 15 to 180 |
65
+ | **Shorts prompt** | The Library prompt the text model follows to pick the moments and write each short's title, description and hashtags. | Built-in |
66
+ | **Image style** | The Library image prompt the shorts' new vertical images are drawn from. | Built-in |
67
+ | **Title on screen** (under **More shorts options**) | Keeps the short's title at the top for the whole clip, large and bold in the caption font. | On |
68
+ | **Speed** | Plays each short faster than the narration, with the pitch kept. | 1.00×; 1.00× to 1.25× in steps of 0.05 |
69
+ | **Music volume** | How loud the background music plays under every short; it dips while the narrator speaks. Only used with a music file. | 15; 0 to 100% |
70
+ | **Full video link** | Each short's description ends with a line pointing to the full video. Without a link, the line says `[PASTE THE FULL VIDEO LINK HERE]`. | Empty |
71
+ | **Background music (optional)** | An audio file, looped if shorter than a short. | None |
72
+
73
+ See [Shorts](Shorts) for how moments are picked and how to remake a short.
74
+
75
+ ## Show tables and figures on screen
76
+
77
+ Shown while the narration describes tables and figures. Each described table, figure, equation and code block is also shown in the video while it is described. On by default. See [Play Narration](Play-Narration#tables-figures-and-code).
78
+
79
+ ## PDF document
80
+
81
+ The Document part lays out a PDF of the article and title on this computer, in the theme you pick. It needs no provider and costs nothing.
82
+
83
+ | Option | What it does | Default |
84
+ | --- | --- | --- |
85
+ | Document **Source** | **Off** or **Generate**. | Off |
86
+ | **Theme** | How the PDF looks: the built-in **Plain** theme, or one of yours from Library → Documents. A theme of yours is copied into the project, so editing it later leaves this project alone until you pick it again. **Edit themes** opens the list. | Plain, or the channel's brand kit theme |
87
+
88
+ See [PDF Documents](PDF-Documents) and [Document Themes](Document-Themes).
89
+
90
+ ## Audio files
91
+
92
+ - **Narration WAV.** Set the video **Source** to **Off** in **Video and style** while narration is on. The line beside the switch reads "Combined WAV export with narration and segment gaps". The WAV is mastered to the **Audio files volume** when **Level the volume** is on.
93
+ - **MP3 and M4B.** With several speakers, tick **Also make MP3 and M4B files with chapter markers** under **Narration** → **Speakers**. The M4B is an audiobook file with a chapter marker at each chapter. Both are made on this computer at no provider cost. See [Multiple Voices](Multiple-Voices).
94
+
95
+ ## Tips
96
+
97
+ - The YouTube description and shorts need subtitle timing but not burned-in captions; you can leave **Subtitles** Off.
98
+ - Automatic reviews can check the thumbnail at phone size and each short's images. See [Reviews and Checkpoints](Reviews-and-Checkpoints).
99
+ - A PDF is free, so switch it on whenever the article is worth reading on its own.
100
+
101
+ ## Related pages
102
+
103
+ - [Play Overview](Play-Overview)
104
+ - [Shorts](Shorts)
105
+ - [YouTube Description](YouTube-Description)
106
+ - [PDF Documents](PDF-Documents)
107
+ - [Document Themes](Document-Themes)
108
+ - [Multiple Voices](Multiple-Voices)
109
+ - [Publishing to YouTube](Publishing-to-YouTube)