@kolbo/kolbo-code-linux-arm64-musl 1.1.73 → 2.0.0

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 (239) hide show
  1. package/bin/kolbo +0 -0
  2. package/package.json +1 -1
  3. package/skills/brainstorming/SKILL.md +164 -0
  4. package/skills/brainstorming/scripts/frame-template.html +214 -0
  5. package/skills/brainstorming/scripts/helper.js +88 -0
  6. package/skills/brainstorming/scripts/server.cjs +354 -0
  7. package/skills/brainstorming/scripts/start-server.sh +148 -0
  8. package/skills/brainstorming/scripts/stop-server.sh +56 -0
  9. package/skills/brainstorming/spec-document-reviewer-prompt.md +49 -0
  10. package/skills/brainstorming/visual-companion.md +287 -0
  11. package/skills/dispatching-parallel-agents/SKILL.md +182 -0
  12. package/skills/docx/.skillfish.json +10 -0
  13. package/skills/docx/SKILL.md +196 -0
  14. package/skills/docx/docx-js.md +350 -0
  15. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  16. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  17. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  18. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  19. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  20. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  21. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  22. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  23. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  24. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  25. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  26. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  27. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  28. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  29. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  30. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  31. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  32. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  33. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  34. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  35. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  36. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  37. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  38. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  39. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  40. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  41. package/skills/docx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  42. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  43. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  44. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  45. package/skills/docx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  46. package/skills/docx/ooxml/schemas/mce/mc.xsd +75 -0
  47. package/skills/docx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  48. package/skills/docx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  49. package/skills/docx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  50. package/skills/docx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  51. package/skills/docx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  52. package/skills/docx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  53. package/skills/docx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  54. package/skills/docx/ooxml/scripts/pack.py +159 -0
  55. package/skills/docx/ooxml/scripts/unpack.py +29 -0
  56. package/skills/docx/ooxml/scripts/validate.py +69 -0
  57. package/skills/docx/ooxml/scripts/validation/__init__.py +15 -0
  58. package/skills/docx/ooxml/scripts/validation/base.py +951 -0
  59. package/skills/docx/ooxml/scripts/validation/docx.py +274 -0
  60. package/skills/docx/ooxml/scripts/validation/pptx.py +315 -0
  61. package/skills/docx/ooxml/scripts/validation/redlining.py +279 -0
  62. package/skills/docx/ooxml.md +599 -0
  63. package/skills/docx/scripts/__init__.py +1 -0
  64. package/skills/docx/scripts/document.py +1272 -0
  65. package/skills/docx/scripts/templates/comments.xml +3 -0
  66. package/skills/docx/scripts/templates/commentsExtended.xml +3 -0
  67. package/skills/docx/scripts/templates/commentsExtensible.xml +3 -0
  68. package/skills/docx/scripts/templates/commentsIds.xml +3 -0
  69. package/skills/docx/scripts/templates/people.xml +3 -0
  70. package/skills/docx/scripts/utilities.py +374 -0
  71. package/skills/executing-plans/SKILL.md +70 -0
  72. package/skills/finishing-a-development-branch/SKILL.md +200 -0
  73. package/skills/fullstack-app/SKILL.md +621 -0
  74. package/skills/kolbo/SKILL.md +19 -263
  75. package/skills/ollama-vision/SKILL.md +105 -0
  76. package/skills/pdf/.skillfish.json +10 -0
  77. package/skills/pdf/FORMS.md +205 -0
  78. package/skills/pdf/REFERENCE.md +612 -0
  79. package/skills/pdf/SKILL.md +293 -0
  80. package/skills/pdf/scripts/check_bounding_boxes.py +70 -0
  81. package/skills/pdf/scripts/check_bounding_boxes_test.py +226 -0
  82. package/skills/pdf/scripts/check_fillable_fields.py +12 -0
  83. package/skills/pdf/scripts/convert_pdf_to_images.py +35 -0
  84. package/skills/pdf/scripts/create_validation_image.py +41 -0
  85. package/skills/pdf/scripts/extract_form_field_info.py +152 -0
  86. package/skills/pdf/scripts/fill_fillable_fields.py +114 -0
  87. package/skills/pdf/scripts/fill_pdf_form_with_annotations.py +108 -0
  88. package/skills/photo-studio/SKILL.md +122 -0
  89. package/skills/pptx/.skillfish.json +10 -0
  90. package/skills/pptx/SKILL.md +483 -0
  91. package/skills/pptx/html2pptx.md +626 -0
  92. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd +1499 -0
  93. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd +146 -0
  94. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd +1085 -0
  95. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd +11 -0
  96. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd +3081 -0
  97. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd +23 -0
  98. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd +185 -0
  99. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd +287 -0
  100. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd +1676 -0
  101. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd +28 -0
  102. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd +144 -0
  103. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd +174 -0
  104. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd +25 -0
  105. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd +18 -0
  106. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd +59 -0
  107. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd +56 -0
  108. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd +195 -0
  109. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd +582 -0
  110. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd +25 -0
  111. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd +4439 -0
  112. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd +570 -0
  113. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd +509 -0
  114. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd +12 -0
  115. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd +108 -0
  116. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd +96 -0
  117. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd +3646 -0
  118. package/skills/pptx/ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd +116 -0
  119. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd +42 -0
  120. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd +50 -0
  121. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd +49 -0
  122. package/skills/pptx/ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd +33 -0
  123. package/skills/pptx/ooxml/schemas/mce/mc.xsd +75 -0
  124. package/skills/pptx/ooxml/schemas/microsoft/wml-2010.xsd +560 -0
  125. package/skills/pptx/ooxml/schemas/microsoft/wml-2012.xsd +67 -0
  126. package/skills/pptx/ooxml/schemas/microsoft/wml-2018.xsd +14 -0
  127. package/skills/pptx/ooxml/schemas/microsoft/wml-cex-2018.xsd +20 -0
  128. package/skills/pptx/ooxml/schemas/microsoft/wml-cid-2016.xsd +13 -0
  129. package/skills/pptx/ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd +4 -0
  130. package/skills/pptx/ooxml/schemas/microsoft/wml-symex-2015.xsd +8 -0
  131. package/skills/pptx/ooxml/scripts/pack.py +159 -0
  132. package/skills/pptx/ooxml/scripts/unpack.py +29 -0
  133. package/skills/pptx/ooxml/scripts/validate.py +69 -0
  134. package/skills/pptx/ooxml/scripts/validation/__init__.py +15 -0
  135. package/skills/pptx/ooxml/scripts/validation/base.py +951 -0
  136. package/skills/pptx/ooxml/scripts/validation/docx.py +274 -0
  137. package/skills/pptx/ooxml/scripts/validation/pptx.py +315 -0
  138. package/skills/pptx/ooxml/scripts/validation/redlining.py +279 -0
  139. package/skills/pptx/ooxml.md +427 -0
  140. package/skills/pptx/scripts/html2pptx.js +995 -0
  141. package/skills/pptx/scripts/inventory.py +1020 -0
  142. package/skills/pptx/scripts/rearrange.py +231 -0
  143. package/skills/pptx/scripts/replace.py +385 -0
  144. package/skills/pptx/scripts/thumbnail.py +450 -0
  145. package/skills/receiving-code-review/SKILL.md +213 -0
  146. package/skills/requesting-code-review/SKILL.md +105 -0
  147. package/skills/requesting-code-review/code-reviewer.md +146 -0
  148. package/skills/subagent-driven-development/SKILL.md +277 -0
  149. package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
  150. package/skills/subagent-driven-development/implementer-prompt.md +113 -0
  151. package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
  152. package/skills/supabase/.skillfish.json +10 -0
  153. package/skills/supabase/SKILL.md +106 -0
  154. package/skills/supabase/assets/feedback-issue-template.md +17 -0
  155. package/skills/supabase/references/skill-feedback.md +17 -0
  156. package/skills/supabase-postgres-best-practices/.skillfish.json +10 -0
  157. package/skills/supabase-postgres-best-practices/SKILL.md +64 -0
  158. package/skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
  159. package/skills/supabase-postgres-best-practices/references/_sections.md +39 -0
  160. package/skills/supabase-postgres-best-practices/references/_template.md +34 -0
  161. package/skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  162. package/skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  163. package/skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  164. package/skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  165. package/skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  166. package/skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  167. package/skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  168. package/skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  169. package/skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  170. package/skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  171. package/skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  172. package/skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  173. package/skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  174. package/skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  175. package/skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  176. package/skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  177. package/skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  178. package/skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  179. package/skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  180. package/skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  181. package/skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  182. package/skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  183. package/skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  184. package/skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  185. package/skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  186. package/skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  187. package/skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  188. package/skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  189. package/skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  190. package/skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  191. package/skills/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  192. package/skills/supabase-quickstart/SKILL.md +400 -0
  193. package/skills/systematic-debugging/CREATION-LOG.md +119 -0
  194. package/skills/systematic-debugging/SKILL.md +296 -0
  195. package/skills/systematic-debugging/condition-based-waiting-example.ts +158 -0
  196. package/skills/systematic-debugging/condition-based-waiting.md +115 -0
  197. package/skills/systematic-debugging/defense-in-depth.md +122 -0
  198. package/skills/systematic-debugging/find-polluter.sh +63 -0
  199. package/skills/systematic-debugging/root-cause-tracing.md +169 -0
  200. package/skills/systematic-debugging/test-academic.md +14 -0
  201. package/skills/systematic-debugging/test-pressure-1.md +58 -0
  202. package/skills/systematic-debugging/test-pressure-2.md +68 -0
  203. package/skills/systematic-debugging/test-pressure-3.md +69 -0
  204. package/skills/test-driven-development/SKILL.md +371 -0
  205. package/skills/test-driven-development/testing-anti-patterns.md +299 -0
  206. package/skills/using-git-worktrees/SKILL.md +218 -0
  207. package/skills/using-superpowers/SKILL.md +115 -0
  208. package/skills/using-superpowers/references/codex-tools.md +100 -0
  209. package/skills/using-superpowers/references/gemini-tools.md +33 -0
  210. package/skills/verification-before-completion/SKILL.md +139 -0
  211. package/skills/video-production/SKILL.md +8 -7
  212. package/skills/writing-plans/SKILL.md +152 -0
  213. package/skills/writing-plans/plan-document-reviewer-prompt.md +49 -0
  214. package/skills/writing-skills/SKILL.md +655 -0
  215. package/skills/writing-skills/anthropic-best-practices.md +1150 -0
  216. package/skills/writing-skills/examples/CLAUDE_MD_TESTING.md +189 -0
  217. package/skills/writing-skills/graphviz-conventions.dot +172 -0
  218. package/skills/writing-skills/persuasion-principles.md +187 -0
  219. package/skills/writing-skills/render-graphs.js +168 -0
  220. package/skills/writing-skills/testing-skills-with-subagents.md +384 -0
  221. package/skills/xlsx/.skillfish.json +10 -0
  222. package/skills/xlsx/SKILL.md +288 -0
  223. package/skills/xlsx/recalc.py +178 -0
  224. package/skills/color-grading/SKILL.md +0 -152
  225. package/skills/ffmpeg-patterns/SKILL.md +0 -240
  226. package/skills/image-prompting-guide/SKILL.md +0 -143
  227. package/skills/music-prompting/SKILL.md +0 -146
  228. package/skills/production-review/SKILL.md +0 -152
  229. package/skills/short-form-video/SKILL.md +0 -168
  230. package/skills/sound-design/SKILL.md +0 -154
  231. package/skills/storytelling/SKILL.md +0 -139
  232. package/skills/subtitle-production/SKILL.md +0 -244
  233. package/skills/subtitle-production/reference/burn_to_video.py +0 -222
  234. package/skills/subtitle-production/reference/export_srts.py +0 -127
  235. package/skills/subtitle-production/reference/gen_srt.py +0 -42
  236. package/skills/typography-video/SKILL.md +0 -182
  237. package/skills/typography-video/reference/KineticTitleScene.tsx +0 -345
  238. package/skills/video-editing/SKILL.md +0 -128
  239. package/skills/video-prompting-guide/SKILL.md +0 -268
@@ -1,182 +0,0 @@
1
- ---
2
- name: typography-video
3
- description: >
4
- Typography rules for video production: font selection and pairing, minimum readable sizes,
5
- safe zones per platform, text animation timing, contrast requirements, subtitle styling.
6
- Use when adding text overlays, titles, lower thirds, or captions to video.
7
- Keywords: typography, font, text, title, lower third, caption, subtitle, safe zone, text size,
8
- font pairing, readable, overlay, motion graphics
9
- ---
10
-
11
- # Typography for Video Production
12
-
13
- ## Quick Reference
14
-
15
- ```
16
- TITLE SIZE: 60-90px at 1080p | 120-180px at 4K
17
- BODY SIZE: 40-60px at 1080p | 80-120px at 4K
18
- SUBTITLE SIZE: 42px+ at 1080p | 3-5% of video height
19
- MAX CHARS/LINE: 32-42 (subtitles) | 30 (overlays)
20
- MAX LINES: 2 (subtitles) | 3 (overlays)
21
- READING SPEED: 21 chars/sec | 160-200 WPM
22
- TITLE SAFE: 80% of frame (192px margin at 1080p)
23
- FONT FAMILIES: 1-2 per video maximum
24
- CONTRAST: 4.5:1 minimum, 7:1 optimal
25
- FADE DURATION: 0.3s opacity | 0.5-1.0s slide/scale
26
- ```
27
-
28
- ## Font Selection
29
-
30
- ### Recommended Video Fonts
31
-
32
- | Category | Fonts | Use For |
33
- |----------|-------|---------|
34
- | **Body / Captions** | Inter, Open Sans, Roboto, Source Sans Pro, Lato, DM Sans | All body text, subtitles |
35
- | **Headlines** | Montserrat Bold, Bebas Neue, Oswald Bold, Poppins Bold | Titles, section headers, key stats |
36
- | **Editorial** | Playfair Display, Roboto Slab | Luxury, cinematic, documentary |
37
- | **System Safe** | Helvetica Neue, Arial, Avenir Next | When custom fonts unavailable |
38
-
39
- ### Font Pairing Rules
40
-
41
- - Limit to **1-2 font families** per video
42
- - Pair a **display/bold heading** font with a **neutral body** font
43
- - Size difference between title and body: at least **50% larger**
44
- - **Sans-serif** for motion graphics and captions (holds up in motion)
45
- - **Serif** only for cinematic title cards and editorial content
46
- - **Script/decorative** fonts: hero titles only, never body, never in motion
47
-
48
- ### Proven Pairings
49
-
50
- | Heading | Body | Style |
51
- |---------|------|-------|
52
- | Bebas Neue | Open Sans | High-impact, social ads |
53
- | Montserrat Bold | Lato | Clean modern |
54
- | Oswald Bold | Raleway | Strong contrast |
55
- | Playfair Display | Inter | Editorial |
56
- | Poppins Bold | Poppins Light | Single-family hierarchy |
57
-
58
- ## Text Sizing
59
-
60
- | Element | 1080p (px) | 4K (px) |
61
- |---------|-----------|---------|
62
- | Title / Hero text | 60-90 | 120-180 |
63
- | Body text | 40-60 | 80-120 |
64
- | Subtitles | 42+ | 84+ |
65
- | Lower third name | 48-60 | 96-120 |
66
- | Lower third role | 36-44 | 72-88 |
67
-
68
- ## Safe Zones
69
-
70
- ### Broadcast Standard (1920x1080)
71
-
72
- | Zone | Coverage | Margin |
73
- |------|----------|--------|
74
- | **Title Safe** | 80% of frame | 192px H, 108px V |
75
- | **Action Safe** | 90% of frame | 96px H, 54px V |
76
-
77
- At 1920x1080: Title Safe = inner 1536x864px
78
-
79
- ### Vertical (1080x1920) Platform-Specific
80
-
81
- See the `short-form-video` skill for per-platform safe zones. Universal safe: 900x1400px centered.
82
-
83
- ## Reading Speed
84
-
85
- - Average viewer reads **21 characters per second** / **160-200 WPM**
86
- - Minimum display time: **0.5 seconds per text element**
87
- - Maximum display time: **5 seconds** before it feels stale
88
- - Formula: `display_seconds = character_count / 21 + 0.5`
89
-
90
- ## Contrast Requirements (WCAG)
91
-
92
- | Element | Minimum Ratio |
93
- |---------|--------------|
94
- | Body text on background | 4.5:1 (AA) |
95
- | Large text (>18pt) | 3:1 (AA) |
96
- | Enhanced readability | 7:1 (AAA) |
97
-
98
- **Practical rule:** After color grading, any text overlays must still meet 4.5:1 contrast against the graded background.
99
-
100
- ## Text Animation Timing
101
-
102
- | Animation | Duration | Easing |
103
- |-----------|----------|--------|
104
- | Fade in/out | 0.3s | ease-in-out |
105
- | Slide in | 0.5-0.8s | ease-out (cubic) |
106
- | Scale up | 0.4-0.6s | ease-out with slight overshoot |
107
- | Typewriter | 30-50ms per character | linear |
108
- | Word-by-word | 80-120ms per word | step or ease |
109
-
110
- ### Animation Rules
111
- - Text should be **fully readable for at least 1.5 seconds** after animation completes
112
- - Entry animation + readable duration + exit animation = total display time
113
- - **Never animate body text character-by-character** — only titles and keywords
114
- - **Ease out, not ease in** — text should arrive quickly and settle, not start slow
115
-
116
- ## RTL (Hebrew/Arabic) Text — Proven Patterns
117
-
118
- These patterns are battle-tested in Kolbo's video production pipeline.
119
-
120
- **Reference implementation:** `./reference/KineticTitleScene.tsx` (346 lines, full RTL) — read this for a complete working example of every RTL flip listed below.
121
-
122
- ### Font Selection
123
- - **Hebrew**: Heebo (Google Fonts, free) — use Bold weight for captions
124
- - **Arabic**: Cairo (Google Fonts, free) — use Bold weight for captions
125
- - **Never** use Poppins or English-first fonts for Hebrew/Arabic body text
126
-
127
- ### Remotion RTL Rules (proven)
128
-
129
- Every component receiving text must handle RTL:
130
-
131
- ```tsx
132
- const isHebrew = language === "he" || language === "iw";
133
-
134
- <div style={{
135
- direction: isHebrew ? "rtl" : "ltr",
136
- fontFamily: isHebrew ? "'Heebo', sans-serif" : "'Poppins', sans-serif",
137
- textTransform: isHebrew ? "none" : "uppercase", // No uppercase in Hebrew
138
- letterSpacing: isHebrew ? 0 : -2, // No negative kerning for Hebrew
139
- }}>
140
- ```
141
-
142
- **What you must flip for RTL:**
143
- | Property | LTR (English) | RTL (Hebrew) |
144
- |----------|--------------|--------------|
145
- | `direction` | `ltr` | `rtl` |
146
- | `paddingLeft` / `paddingRight` | normal | swapped |
147
- | `transformOrigin` | `"top left"` | `"top right"` |
148
- | Gradient direction | `90deg` | `270deg` |
149
- | Position "left" | left side | **right side** (flip the logic) |
150
- | `textTransform` | `uppercase` | `none` |
151
- | `letterSpacing` | `-2` or custom | `0` (always) |
152
- | Slide-in direction | from left | from right |
153
-
154
- ### FFmpeg RTL Burn-in
155
-
156
- ```bash
157
- # Hebrew subtitles with Heebo font
158
- ffmpeg -i input.mp4 -vf "subtitles=subs.srt:force_style='FontName=Heebo,FontSize=22,Bold=1,Encoding=177,PrimaryColour=&H00FFFFFF,OutlineColour=&H00000000,Outline=2'" output.mp4
159
- ```
160
-
161
- See `subtitle-production` skill for full RTL karaoke and per-word positioning patterns.
162
-
163
- ---
164
-
165
- ## Kolbo MCP Integration
166
-
167
- Typography rules apply to all Kolbo visual generation:
168
-
169
- | Task | Kolbo MCP Tool | Typography Rule |
170
- |------|---------------|----------------|
171
- | Title cards | `generate_image` | Add text as Remotion overlay, NOT in AI image prompt |
172
- | Caption generation | `transcribe_audio` | Word-level SRT → burn-in with FFmpeg |
173
- | Lower thirds | Remotion component | Use proven font pairings above |
174
- | Video with text overlay | `generate_video` + FFmpeg post | Render video first, add text in post |
175
-
176
- **Key rule:** Never ask image/video generation models to render text — they can't do it reliably. Always add text as overlays in post-production (Remotion, FFmpeg, or video editor).
177
-
178
- **Free fonts for video (Google Fonts, all free):**
179
- - Body: Inter, Open Sans, Roboto, Lato, DM Sans
180
- - Headlines: Montserrat, Bebas Neue, Oswald, Poppins
181
- - Hebrew: Heebo, Assistant, Rubik
182
- - Arabic: Cairo, Noto Sans Arabic
@@ -1,345 +0,0 @@
1
- /**
2
- * KineticTitleScene — Full-screen kinetic text card
3
- *
4
- * bgStyle="solid" — always-on dark background (default)
5
- * bgStyle="dynamic_panel" — bg wipes in before text, wipes out after text gone
6
- * bgStyle="transparent" — no background (composite over footage, render with alpha codec)
7
- *
8
- * ALL words land simultaneously (staggered by 4 frames each).
9
- * Alternating solid / outline / accent treatment.
10
- * Based on Higgsfield / SOUL 2.0 reference style.
11
- */
12
- import React from "react";
13
- import { useCurrentFrame, useVideoConfig, spring, interpolate, Easing } from "remotion";
14
- import { loadFont as loadPoppins } from "@remotion/google-fonts/Poppins";
15
- import { loadFont as loadHeebo } from "@remotion/google-fonts/Heebo";
16
-
17
- const { fontFamily: poppins } = loadPoppins();
18
- const { fontFamily: heebo } = loadHeebo();
19
-
20
- export interface KineticTitleProps {
21
- words: string[]; // 2–4 words, each on its own line
22
- subtext?: string; // optional small line below
23
- accentColor?: string; // default brand blue
24
- language?: string; // "en" | "he"
25
- bgStyle?: "solid" | "dynamic_panel" | "transparent";
26
- durationInFrames: number;
27
- fps: number;
28
- }
29
-
30
- const BRAND_BLUE = "#60a5fa";
31
- const STAGGER = 4; // frames between each word entrance
32
-
33
- // How many frames the bg leads the text on entry, and trails it on exit
34
- const BG_LEAD = 10; // bg starts wiping in 10 frames before text
35
- const BG_TRAIL = 12; // bg stays for 12 frames after text is gone
36
-
37
- export const KineticTitleScene: React.FC<KineticTitleProps> = ({
38
- words = ["WENT", "VIRAL"],
39
- subtext,
40
- accentColor = BRAND_BLUE,
41
- language = "en",
42
- bgStyle = "solid",
43
- durationInFrames = 150,
44
- fps = 30,
45
- }) => {
46
- const frame = useCurrentFrame();
47
- const { width, height } = useVideoConfig();
48
-
49
- const isHebrew = language === "he" || language === "iw";
50
- const fontFamily = isHebrew ? heebo : poppins;
51
- const isVertical = height > width;
52
- const accent = accentColor;
53
- const isDynamic = bgStyle === "dynamic_panel";
54
- const isTransparent = bgStyle === "transparent";
55
-
56
- // ── Text timing ──────────────────────────────────────────────────────────
57
- // Dynamic: text starts after bg has partially appeared
58
- const textOffset = isDynamic ? BG_LEAD : 0;
59
- const textExitStart = durationInFrames - (isDynamic ? BG_TRAIL + 12 : 12);
60
-
61
- const exitOpacity = interpolate(
62
- frame,
63
- [textExitStart, textExitStart + 12],
64
- [1, 0],
65
- { extrapolateRight: "clamp" }
66
- );
67
-
68
- // Global entrance scale
69
- const globalScale = interpolate(frame - textOffset, [0, 20], [1.04, 1.0], {
70
- extrapolateLeft: "clamp",
71
- extrapolateRight: "clamp",
72
- easing: Easing.out(Easing.cubic),
73
- });
74
-
75
- // ── Background panel timing ───────────────────────────────────────────────
76
- // BG enters: wipes left→right starting at frame 0
77
- const bgEnterDuration = 18;
78
- const bgEnterProgress = interpolate(frame, [0, bgEnterDuration], [0, 1], {
79
- extrapolateLeft: "clamp",
80
- extrapolateRight: "clamp",
81
- easing: Easing.out(Easing.cubic),
82
- });
83
-
84
- // BG exits: wipes left→right starting after text is fully gone
85
- const bgExitStart = textExitStart + 12;
86
- const bgExitProgress = interpolate(
87
- frame,
88
- [bgExitStart, bgExitStart + 14],
89
- [0, 1],
90
- {
91
- extrapolateLeft: "clamp",
92
- extrapolateRight: "clamp",
93
- easing: Easing.in(Easing.cubic),
94
- }
95
- );
96
-
97
- // scaleX wipe — most reliable in Remotion headless Chrome
98
- // Enter: scaleX grows 0→1 from LEFT origin (reveals left to right)
99
- // Exit: scaleX shrinks 1→0 from RIGHT origin (removes left to right)
100
- const bgScaleX = isDynamic
101
- ? (frame < bgExitStart
102
- ? interpolate(bgEnterProgress, [0, 1], [0, 1])
103
- : interpolate(bgExitProgress, [0, 1], [1, 0]))
104
- : 1;
105
- const bgTransformOrigin = isDynamic && frame >= bgExitStart ? "right center" : "left center";
106
-
107
- const showBg = !isTransparent;
108
-
109
- // ── Accent scan line across bg (cinematic HUD feel) ──────────────────────
110
- const scanY = interpolate(frame, [0, durationInFrames], [0, height], {
111
- extrapolateRight: "clamp",
112
- });
113
- const scanOpacity = isDynamic
114
- ? bgEnterProgress * (1 - bgExitProgress) * 0.12
115
- : 0.06;
116
-
117
- // ── Font size ─────────────────────────────────────────────────────────────
118
- const baseFontSize = isVertical
119
- ? Math.round(width * 0.22)
120
- : Math.round(height * 0.26);
121
-
122
- // ── Word styles: solid → outline → accent ────────────────────────────────
123
- const wordStyles = (i: number) => {
124
- const mod = i % 3;
125
- if (mod === 0) return { color: "#ffffff", stroke: "none", shadow: `0 0 40px ${accent}44` };
126
- if (mod === 1) return { color: "transparent", stroke: accent, shadow: `0 0 30px ${accent}44` };
127
- return { color: accent, stroke: "none", shadow: `0 0 50px ${accent}88` };
128
- };
129
-
130
- // ── Separator line ────────────────────────────────────────────────────────
131
- const SepLine = ({ delay }: { delay: number }) => {
132
- const lineW = interpolate(frame - delay, [0, 16], [0, 1], {
133
- extrapolateRight: "clamp",
134
- easing: Easing.out(Easing.cubic),
135
- });
136
- return (
137
- <div style={{
138
- width: `${lineW * 100}%`,
139
- height: 1,
140
- background: `linear-gradient(${isHebrew ? "270deg" : "90deg"}, transparent, ${accent}88, transparent)`,
141
- marginBottom: 2,
142
- marginTop: 2,
143
- }} />
144
- );
145
- };
146
-
147
- return (
148
- <div style={{
149
- width, height,
150
- // dynamic_panel: outer is transparent — the animated inner panel owns the background
151
- background: (isTransparent || isDynamic) ? "transparent" : "#07070f",
152
- overflow: "hidden",
153
- position: "relative",
154
- fontFamily,
155
- direction: isHebrew ? "rtl" : "ltr",
156
- }}>
157
-
158
- {/* ── Background panel (with clip-path wipe) ── */}
159
- {showBg && (
160
- <div style={{
161
- position: "absolute", inset: 0,
162
- transform: isDynamic ? `scaleX(${bgScaleX})` : undefined,
163
- transformOrigin: isDynamic ? bgTransformOrigin : undefined,
164
- }}>
165
- {/* Dark fill */}
166
- <div style={{ position: "absolute", inset: 0, background: "#07070f" }} />
167
-
168
- {/* Grid lines */}
169
- <div style={{
170
- position: "absolute", inset: 0,
171
- backgroundImage: [
172
- `linear-gradient(rgba(255,255,255,0.03) 1px, transparent 1px)`,
173
- `linear-gradient(90deg, rgba(255,255,255,0.03) 1px, transparent 1px)`,
174
- ].join(", "),
175
- backgroundSize: "60px 60px",
176
- pointerEvents: "none",
177
- }} />
178
-
179
- {/* Diagonal corner accent */}
180
- <div style={{
181
- position: "absolute",
182
- top: -60,
183
- left: isHebrew ? undefined : -60,
184
- right: isHebrew ? -60 : undefined,
185
- width: 300, height: 300,
186
- background: `linear-gradient(${isHebrew ? "225deg" : "135deg"}, ${accent}18 0%, transparent 60%)`,
187
- pointerEvents: "none",
188
- }} />
189
-
190
- {/* Vignette */}
191
- <div style={{
192
- position: "absolute", inset: 0,
193
- background: "radial-gradient(ellipse at center, transparent 30%, rgba(0,0,0,0.65) 100%)",
194
- pointerEvents: "none",
195
- }} />
196
-
197
- {/* Horizontal scan line (slow drift) */}
198
- <div style={{
199
- position: "absolute",
200
- left: 0, right: 0,
201
- top: scanY,
202
- height: 1,
203
- background: `linear-gradient(90deg, transparent, ${accent}, transparent)`,
204
- opacity: scanOpacity,
205
- pointerEvents: "none",
206
- }} />
207
-
208
- {/* Bright edge line at wipe front — sits at the right edge of the scaled panel */}
209
- {isDynamic && bgScaleX > 0 && bgScaleX < 1 && (
210
- <div style={{
211
- position: "absolute",
212
- top: 0, bottom: 0,
213
- right: 0,
214
- width: Math.round(2 / Math.max(bgScaleX, 0.05)), // compensate for scaleX compression
215
- background: `linear-gradient(180deg, transparent, ${accent}, ${accent}, transparent)`,
216
- opacity: 0.9,
217
- boxShadow: `0 0 16px ${accent}, 0 0 32px ${accent}88`,
218
- }} />
219
- )}
220
- </div>
221
- )}
222
-
223
- {/* ── Word stack ── */}
224
- <div style={{
225
- position: "absolute",
226
- inset: 0,
227
- display: "flex",
228
- flexDirection: "column",
229
- justifyContent: "center",
230
- paddingLeft: isHebrew ? 0 : isVertical ? 32 : 64,
231
- paddingRight: isHebrew ? (isVertical ? 32 : 64) : 0,
232
- paddingTop: isVertical ? 40 : 30,
233
- transform: `scale(${globalScale})`,
234
- opacity: exitOpacity,
235
- }}>
236
- {words.map((word, i) => {
237
- const delay = textOffset + i * STAGGER;
238
- const wordScale = spring({
239
- frame: Math.max(0, frame - delay),
240
- fps,
241
- from: 0,
242
- to: 1,
243
- config: { damping: 9, stiffness: 350 },
244
- });
245
- const wordY = interpolate(
246
- frame - delay, [0, 14], [40, 0],
247
- { extrapolateLeft: "clamp", extrapolateRight: "clamp", easing: Easing.out(Easing.cubic) }
248
- );
249
- const ws = wordStyles(i);
250
-
251
- const glitchAmt = i === 0
252
- ? interpolate(frame - textOffset, [0, 1, 3], [12, 4, 0], { extrapolateRight: "clamp" })
253
- : 0;
254
-
255
- return (
256
- <React.Fragment key={i}>
257
- {i > 0 && <SepLine delay={textOffset + (i - 1) * STAGGER + 6} />}
258
- <div style={{
259
- position: "relative",
260
- transform: `translateY(${wordY}px) scaleY(${wordScale})`,
261
- transformOrigin: isHebrew ? "top right" : "top left",
262
- lineHeight: 0.85,
263
- overflow: "visible",
264
- }}>
265
- {glitchAmt > 0 && (
266
- <div style={{
267
- position: "absolute",
268
- fontSize: baseFontSize,
269
- fontWeight: 900,
270
- color: accent,
271
- textTransform: isHebrew ? "none" : "uppercase",
272
- letterSpacing: isHebrew ? 0 : -2,
273
- transform: `translateX(${glitchAmt}px)`,
274
- opacity: 0.45,
275
- mixBlendMode: "screen",
276
- userSelect: "none",
277
- }}>{word}</div>
278
- )}
279
- <div style={{
280
- fontSize: baseFontSize,
281
- fontWeight: 900,
282
- color: ws.color,
283
- textTransform: isHebrew ? "none" : "uppercase",
284
- letterSpacing: isHebrew ? 0 : -2,
285
- WebkitTextStroke: ws.stroke !== "none" ? `4px ${ws.stroke}` : undefined,
286
- textShadow: ws.shadow !== "none" ? ws.shadow : undefined,
287
- whiteSpace: "nowrap",
288
- userSelect: "none",
289
- }}>{word}</div>
290
- </div>
291
- </React.Fragment>
292
- );
293
- })}
294
-
295
- {subtext && (() => {
296
- const stDelay = textOffset + words.length * STAGGER + 10;
297
- const stOpacity = interpolate(frame - stDelay, [0, 14], [0, 1], {
298
- extrapolateLeft: "clamp", extrapolateRight: "clamp",
299
- });
300
- return (
301
- <div style={{
302
- fontSize: Math.round(baseFontSize * 0.17),
303
- fontWeight: 600,
304
- color: "rgba(255,255,255,0.45)",
305
- textTransform: isHebrew ? "none" : "uppercase",
306
- letterSpacing: isHebrew ? 0 : 5,
307
- marginTop: 20,
308
- opacity: stOpacity * exitOpacity,
309
- }}>{subtext}</div>
310
- );
311
- })()}
312
- </div>
313
-
314
- {/* ── Viewfinder corners ── */}
315
- {Math.floor(frame / 10) % 2 === 0 && [
316
- { top: 24, left: 24, borderTopWidth: 2, borderLeftWidth: 2 },
317
- { top: 24, right: 24, borderTopWidth: 2, borderRightWidth: 2 },
318
- { bottom: 24, left: 24, borderBottomWidth: 2, borderLeftWidth: 2 },
319
- { bottom: 24, right: 24, borderBottomWidth: 2, borderRightWidth: 2 },
320
- ].map((pos, i) => (
321
- <div key={i} style={{
322
- position: "absolute", width: 20, height: 20,
323
- borderColor: accent, borderStyle: "solid", borderWidth: 0,
324
- opacity: isTransparent ? exitOpacity * 0.5 : 0.5,
325
- ...pos,
326
- }} />
327
- ))}
328
-
329
- {/* ── Frame counter ── */}
330
- <div style={{
331
- position: "absolute",
332
- bottom: isVertical ? 32 : 24,
333
- right: isHebrew ? undefined : 36,
334
- left: isHebrew ? 36 : undefined,
335
- fontSize: 11,
336
- fontFamily: "monospace",
337
- color: `${accent}66`,
338
- letterSpacing: 3,
339
- opacity: exitOpacity,
340
- }}>
341
- {String(frame).padStart(4, "0")}
342
- </div>
343
- </div>
344
- );
345
- };
@@ -1,128 +0,0 @@
1
- ---
2
- name: video-editing
3
- description: >
4
- Video editing decisions: what to cut vs keep, cut techniques (J-cut, L-cut, hard cut),
5
- pacing by format, edit decision structure, silence/filler removal, talking head editing.
6
- Use when making editorial decisions about video content.
7
- Keywords: video editing, cut, trim, j-cut, l-cut, pacing, filler words, silence, talking head,
8
- edit decision, transition, dead air, false start
9
- ---
10
-
11
- # Video Editing — Editorial Decisions
12
-
13
- ## What to Cut
14
-
15
- 1. **Filler words:** "um", "uh", "like", "you know" — cut at word boundaries using word timestamps
16
- 2. **False starts:** When the speaker restarts a sentence, keep only the final take
17
- 3. **Dead air:** Silence longer than 1.5 seconds should be trimmed to ~0.5 seconds
18
- 4. **Off-topic tangents:** If the speaker wanders, cut to the next relevant segment
19
- 5. **Repeated points:** Keep the best delivery, remove redundant takes
20
-
21
- ## What NOT to Cut
22
-
23
- - **Breath pauses:** Natural 0.3-0.8 second pauses between sentences. These sound natural.
24
- - **Emphasis pauses:** Intentional pauses for dramatic effect
25
- - **Reactions and transitions:** Verbal bridges like "So..." or "Now..." that provide flow
26
-
27
- ## Cut Techniques
28
-
29
- | Technique | Description | When to Use |
30
- |-----------|-------------|-------------|
31
- | **J-cut** | Audio from next segment starts ~0.5s before visual cut | Smooth transitions |
32
- | **L-cut** | Audio from current segment continues ~0.5s after visual cut | Maintaining continuity |
33
- | **Hard cut** | Instant transition | Major topic changes |
34
- | **Jump cut** | Cut within same shot (visible jump) | YouTube/social energy, pacing |
35
- | **Match cut** | Visual similarity bridges two different shots | Creative storytelling |
36
-
37
- ## Pacing by Format
38
-
39
- | Format | Approach |
40
- |--------|----------|
41
- | **Short-form (< 60s)** | Aggressive cuts. Minimal dead air. High energy. Visual change every 1-3s |
42
- | **Medium-form (1-10 min)** | Balanced. Keep natural pauses for breathing room. Change every 3-5s |
43
- | **Long-form (> 10 min)** | Let scenes breathe. Only cut obvious problems. Change every 5-10s |
44
-
45
- ## Edit Decision Structure
46
-
47
- When planning an edit, define:
48
-
49
- - **Cuts:** Ordered list of segments to keep (source, in/out points, speed)
50
- - **Overlays:** Timed overlay placements (images, diagrams, lower thirds)
51
- - **Subtitles:** Subtitle configuration (enabled, style, source file)
52
- - **Music:** Background music settings (asset, volume, ducking, fades)
53
- - **Transitions:** Transition type and timing between cuts
54
-
55
- ## Silence Removal Workflow
56
-
57
- 1. **Detect silence** with FFmpeg: `silencedetect=noise=-35dB:d=0.4`
58
- 2. **Parse** silence_start/silence_end timestamps from stderr
59
- 3. **Generate segments** of non-silent audio
60
- 4. **Concatenate** segments with the concat demuxer
61
- 5. Optional: apply `atempo=1.14` for subtle speedup that feels natural
62
-
63
- ## Talking Head Editing Checklist
64
-
65
- - [ ] No visible jump cuts without intentional style choice
66
- - [ ] Audio doesn't pop or click at cut points
67
- - [ ] Pacing matches content energy and target platform
68
- - [ ] Speaker's face is never covered by overlays
69
- - [ ] All cuts are at word boundaries (not mid-word)
70
- - [ ] Filler words removed unless they serve the personality
71
- - [ ] B-roll covers any remaining jump cuts
72
-
73
- ## Lip Sync (Dubbing / Localization)
74
-
75
- When replacing audio and matching lips:
76
-
77
- | Input | Tool | Output |
78
- |-------|------|--------|
79
- | Existing VIDEO + new audio | Lip sync | Video with synced lips |
80
- | Still PHOTO + audio | Talking head generator | New video from photo |
81
-
82
- **Decision rule:** If you have video footage of the person, use lip sync. If you only have a photo, use talking head generation.
83
-
84
- **Workflow for localization:**
85
- ```
86
- transcribe(video) → translate → TTS(translated text) → lip_sync(original_video, new_audio)
87
- ```
88
-
89
- Keep original video as source for each language — never chain lip sync outputs.
90
-
91
- **Face padding** for lip sync: `[0, 10, 0, 0]` (top, bottom, left, right) works for 90% of footage. Increase bottom if chin gets cropped.
92
-
93
- ---
94
-
95
- ## Kolbo MCP Integration
96
-
97
- | Task | Kolbo MCP Tool | Notes |
98
- |------|---------------|-------|
99
- | Transcribe for edit points | `transcribe_audio` | Word-level timestamps for precise cuts |
100
- | Lip sync dubbing | `generate_lipsync` | Source video + new audio |
101
- | Generate B-roll | `generate_video` or `generate_image` | Cover jump cuts |
102
- | Generate narration | `generate_speech` | Re-record with AI voice |
103
- | Visual analysis | `chat_send_message` + Gemini | "Analyze this video for edit points" |
104
-
105
- **Editing workflow with Kolbo:**
106
- 1. `transcribe_audio` → get full transcript with word timestamps
107
- 2. Identify filler words, dead air, false starts from transcript
108
- 3. Generate FFmpeg trim commands for non-silent/non-filler segments
109
- 4. `generate_image` or `generate_video` → B-roll for covering jump cuts
110
- 5. Concatenate clips + burn-in subtitles + mix audio
111
- 6. Review with `production-review` skill
112
-
113
- **Localization workflow:**
114
- 1. `transcribe_audio` → source language transcript
115
- 2. Translate the transcript (use `chat_send_message` for translation)
116
- 3. `generate_speech` → TTS in target language
117
- 4. `generate_lipsync` → sync new audio to original face
118
- 5. Repeat for each language (always from original, never chain)
119
-
120
- ---
121
-
122
- ## Local / Free Options
123
-
124
- > **IMPORTANT:** Always use Kolbo MCP tools by default (`transcribe_audio`, `generate_lipsync`). FFmpeg silence removal is safe to use directly. For anything else, confirm with the user first.
125
-
126
- **FFmpeg (safe, standard):** Silence detection/removal, trimming, concatenation — all built-in.
127
-
128
- **Transcription:** If the user wants offline, `faster-whisper` runs on CPU (`pip install faster-whisper`). Confirm before installing.