@muskanmeet/invoicing-design-system 0.1.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 (695) hide show
  1. package/.cache/replit/env/latest +78 -0
  2. package/.cache/replit/env/latest.json +1 -0
  3. package/.cache/replit/modules/nodejs-20.res +1 -0
  4. package/.cache/replit/modules/python-3.11.res +1 -0
  5. package/.cache/replit/modules/replit-rtld-loader.res +1 -0
  6. package/.cache/replit/modules/replit.res +1 -0
  7. package/.cache/replit/modules.stamp +0 -0
  8. package/.cache/replit/nix/dotreplitenv.json +1 -0
  9. package/.cache/replit/toolchain.json +1 -0
  10. package/.cache/typescript/5.9/package-lock.json +50 -0
  11. package/.cache/typescript/5.9/package.json +1 -0
  12. package/.config/nextjs-nodejs/config.json +7 -0
  13. package/.eslintrc.json +3 -0
  14. package/.local/.commit_message +31 -0
  15. package/.local/secondary_skills/LICENSE.txt +21 -0
  16. package/.local/secondary_skills/ad-creative/.fingerprint +1 -0
  17. package/.local/secondary_skills/ad-creative/SKILL.md +872 -0
  18. package/.local/secondary_skills/ai-recruiter/.fingerprint +1 -0
  19. package/.local/secondary_skills/ai-recruiter/SKILL.md +1087 -0
  20. package/.local/secondary_skills/ai-sdr/.fingerprint +1 -0
  21. package/.local/secondary_skills/ai-sdr/SKILL.md +204 -0
  22. package/.local/secondary_skills/ai-secretary/.fingerprint +1 -0
  23. package/.local/secondary_skills/ai-secretary/SKILL.md +1132 -0
  24. package/.local/secondary_skills/branding-generator/.fingerprint +1 -0
  25. package/.local/secondary_skills/branding-generator/SKILL.md +286 -0
  26. package/.local/secondary_skills/competitive-analysis/.fingerprint +1 -0
  27. package/.local/secondary_skills/competitive-analysis/SKILL.md +429 -0
  28. package/.local/secondary_skills/content-machine/.fingerprint +1 -0
  29. package/.local/secondary_skills/content-machine/SKILL.md +321 -0
  30. package/.local/secondary_skills/deep-research/.fingerprint +1 -0
  31. package/.local/secondary_skills/deep-research/SKILL.md +517 -0
  32. package/.local/secondary_skills/design-thinker/.fingerprint +1 -0
  33. package/.local/secondary_skills/design-thinker/SKILL.md +327 -0
  34. package/.local/secondary_skills/excel-generator/.fingerprint +1 -0
  35. package/.local/secondary_skills/excel-generator/SKILL.md +954 -0
  36. package/.local/secondary_skills/excel-generator/financial-models.md +289 -0
  37. package/.local/secondary_skills/file-converter/.fingerprint +1 -0
  38. package/.local/secondary_skills/file-converter/SKILL.md +823 -0
  39. package/.local/secondary_skills/flashcard-generator/.fingerprint +1 -0
  40. package/.local/secondary_skills/flashcard-generator/SKILL.md +233 -0
  41. package/.local/secondary_skills/geo/.fingerprint +1 -0
  42. package/.local/secondary_skills/geo/SKILL.md +378 -0
  43. package/.local/secondary_skills/geo/references/content-patterns.md +158 -0
  44. package/.local/secondary_skills/geo/references/platform-notes.md +128 -0
  45. package/.local/secondary_skills/geo/references/scorecard.md +113 -0
  46. package/.local/secondary_skills/geo/references/technical-checklist.md +257 -0
  47. package/.local/secondary_skills/github-solution-finder/.fingerprint +1 -0
  48. package/.local/secondary_skills/github-solution-finder/SKILL.md +174 -0
  49. package/.local/secondary_skills/infographic-builder/.fingerprint +1 -0
  50. package/.local/secondary_skills/infographic-builder/SKILL.md +317 -0
  51. package/.local/secondary_skills/infographic-builder/antv-syntax.md +470 -0
  52. package/.local/secondary_skills/infographic-builder/react-fallback.md +210 -0
  53. package/.local/secondary_skills/insurance-optimizer/.fingerprint +1 -0
  54. package/.local/secondary_skills/insurance-optimizer/SKILL.md +209 -0
  55. package/.local/secondary_skills/interview-prep/.fingerprint +1 -0
  56. package/.local/secondary_skills/interview-prep/SKILL.md +349 -0
  57. package/.local/secondary_skills/invoice-generator/.fingerprint +1 -0
  58. package/.local/secondary_skills/invoice-generator/SKILL.md +527 -0
  59. package/.local/secondary_skills/legal-contract/.fingerprint +1 -0
  60. package/.local/secondary_skills/legal-contract/SKILL.md +977 -0
  61. package/.local/secondary_skills/meal-planner/.fingerprint +1 -0
  62. package/.local/secondary_skills/meal-planner/SKILL.md +517 -0
  63. package/.local/secondary_skills/personal-shopper/.fingerprint +1 -0
  64. package/.local/secondary_skills/personal-shopper/SKILL.md +361 -0
  65. package/.local/secondary_skills/photo-editor/.fingerprint +1 -0
  66. package/.local/secondary_skills/photo-editor/SKILL.md +605 -0
  67. package/.local/secondary_skills/podcast-generator/.fingerprint +1 -0
  68. package/.local/secondary_skills/podcast-generator/SKILL.md +560 -0
  69. package/.local/secondary_skills/podcast-marketing/.fingerprint +1 -0
  70. package/.local/secondary_skills/podcast-marketing/SKILL.md +550 -0
  71. package/.local/secondary_skills/podcast-marketing/audio-processing.md +530 -0
  72. package/.local/secondary_skills/podcast-marketing/content-atoms.md +253 -0
  73. package/.local/secondary_skills/podcast-marketing/content-calendar.md +318 -0
  74. package/.local/secondary_skills/podcast-marketing/content-templates.md +325 -0
  75. package/.local/secondary_skills/podcast-marketing/quote-cards.md +238 -0
  76. package/.local/secondary_skills/podcast-marketing/rss-and-batch.md +359 -0
  77. package/.local/secondary_skills/podcast-marketing/video-clips.md +660 -0
  78. package/.local/secondary_skills/podcast-marketing/youtube-processing.md +328 -0
  79. package/.local/secondary_skills/product-manager/.fingerprint +1 -0
  80. package/.local/secondary_skills/product-manager/SKILL.md +272 -0
  81. package/.local/secondary_skills/programmatic-seo/.fingerprint +1 -0
  82. package/.local/secondary_skills/programmatic-seo/SKILL.md +1207 -0
  83. package/.local/secondary_skills/real-estate-analyzer/.fingerprint +1 -0
  84. package/.local/secondary_skills/real-estate-analyzer/SKILL.md +786 -0
  85. package/.local/secondary_skills/recipe-creator/.fingerprint +1 -0
  86. package/.local/secondary_skills/recipe-creator/SKILL.md +259 -0
  87. package/.local/secondary_skills/recreate-screenshot/.fingerprint +1 -0
  88. package/.local/secondary_skills/recreate-screenshot/SKILL.md +215 -0
  89. package/.local/secondary_skills/replit-migration-guardrails/.fingerprint +1 -0
  90. package/.local/secondary_skills/replit-migration-guardrails/SKILL.md +55 -0
  91. package/.local/secondary_skills/replit-migration-guardrails/references/base44.md +47 -0
  92. package/.local/secondary_skills/replit-migration-guardrails/references/vercel.md +78 -0
  93. package/.local/secondary_skills/resume-maker/.fingerprint +1 -0
  94. package/.local/secondary_skills/resume-maker/SKILL.md +790 -0
  95. package/.local/secondary_skills/seo-auditor/.fingerprint +1 -0
  96. package/.local/secondary_skills/seo-auditor/SKILL.md +448 -0
  97. package/.local/secondary_skills/skill-creator/.fingerprint +1 -0
  98. package/.local/secondary_skills/skill-creator/SKILL.md +214 -0
  99. package/.local/secondary_skills/skill-finder/.fingerprint +1 -0
  100. package/.local/secondary_skills/skill-finder/SKILL.md +299 -0
  101. package/.local/secondary_skills/stock-analyzer/.fingerprint +1 -0
  102. package/.local/secondary_skills/stock-analyzer/SKILL.md +798 -0
  103. package/.local/secondary_skills/storyboard/.fingerprint +1 -0
  104. package/.local/secondary_skills/storyboard/SKILL.md +558 -0
  105. package/.local/secondary_skills/supplier-research/.fingerprint +1 -0
  106. package/.local/secondary_skills/supplier-research/SKILL.md +213 -0
  107. package/.local/secondary_skills/tax-reviewer/.fingerprint +1 -0
  108. package/.local/secondary_skills/tax-reviewer/SKILL.md +131 -0
  109. package/.local/secondary_skills/travel-assistant/.fingerprint +1 -0
  110. package/.local/secondary_skills/travel-assistant/SKILL.md +667 -0
  111. package/.local/secondary_skills/video-editing/.fingerprint +1 -0
  112. package/.local/secondary_skills/video-editing/SKILL.md +705 -0
  113. package/.local/secondary_skills/video-editing/dead-space-and-chunking.md +1081 -0
  114. package/.local/secondary_skills/video-editing/operations.md +1719 -0
  115. package/.local/secondary_skills/video-editing/virality-scoring.md +1212 -0
  116. package/.local/secondary_skills/video-editing/voiceover.md +788 -0
  117. package/.local/secondary_skills/website-cloning/.fingerprint +1 -0
  118. package/.local/secondary_skills/website-cloning/SKILL.md +544 -0
  119. package/.local/secondary_skills/website-cloning/extraction.md +1207 -0
  120. package/.local/secondary_skills/website-cloning/pitfalls.md +297 -0
  121. package/.local/skills/LICENSE.txt +21 -0
  122. package/.local/skills/agent-inbox/.fingerprint +1 -0
  123. package/.local/skills/agent-inbox/SKILL.md +128 -0
  124. package/.local/skills/artifacts/.fingerprint +1 -0
  125. package/.local/skills/artifacts/SKILL.md +21 -0
  126. package/.local/skills/artifacts/artifacts/automation/artifact.yaml +40 -0
  127. package/.local/skills/artifacts/artifacts/automation/files/package.json.template +47 -0
  128. package/.local/skills/artifacts/artifacts/automation/files/scripts/build.sh +6 -0
  129. package/.local/skills/artifacts/artifacts/automation/files/scripts/inngest.sh +18 -0
  130. package/.local/skills/artifacts/artifacts/automation/files/src/global.d.ts +1 -0
  131. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/agents/agent.ts +89 -0
  132. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/index.ts +212 -0
  133. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/client.ts +17 -0
  134. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/inngest/index.ts +214 -0
  135. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/storage/index.ts +8 -0
  136. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/tools/exampleTool.ts +71 -0
  137. package/.local/skills/artifacts/artifacts/automation/files/src/mastra/workflows/workflow.ts +203 -0
  138. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/cronTriggers.ts +61 -0
  139. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/exampleConnectorTrigger.ts +153 -0
  140. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/slackTriggers.ts +638 -0
  141. package/.local/skills/artifacts/artifacts/automation/files/src/triggers/telegramTriggers.ts +94 -0
  142. package/.local/skills/artifacts/artifacts/automation/files/tests/testCronAutomation.ts +86 -0
  143. package/.local/skills/artifacts/artifacts/automation/files/tests/testWebhookAutomation.ts +118 -0
  144. package/.local/skills/artifacts/artifacts/automation/files/tsconfig.json +26 -0
  145. package/.local/skills/artifacts/artifacts/data-visualization/artifact.yaml +48 -0
  146. package/.local/skills/artifacts/artifacts/expo/OWNERS +2 -0
  147. package/.local/skills/artifacts/artifacts/expo/artifact.yaml +47 -0
  148. package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/_layout.tsx +86 -0
  149. package/.local/skills/artifacts/artifacts/expo/files/app/(tabs)/index.tsx +28 -0
  150. package/.local/skills/artifacts/artifacts/expo/files/app/+not-found.tsx +45 -0
  151. package/.local/skills/artifacts/artifacts/expo/files/app/_layout.tsx +60 -0
  152. package/.local/skills/artifacts/artifacts/expo/files/app.json.template +38 -0
  153. package/.local/skills/artifacts/artifacts/expo/files/assets/images/icon.png +0 -0
  154. package/.local/skills/artifacts/artifacts/expo/files/babel.config.js +6 -0
  155. package/.local/skills/artifacts/artifacts/expo/files/components/ErrorBoundary.tsx +54 -0
  156. package/.local/skills/artifacts/artifacts/expo/files/components/ErrorFallback.tsx +278 -0
  157. package/.local/skills/artifacts/artifacts/expo/files/components/KeyboardAwareScrollViewCompat.tsx +29 -0
  158. package/.local/skills/artifacts/artifacts/expo/files/constants/colors.ts +59 -0
  159. package/.local/skills/artifacts/artifacts/expo/files/hooks/useColors.ts +24 -0
  160. package/.local/skills/artifacts/artifacts/expo/files/metro.config.js +3 -0
  161. package/.local/skills/artifacts/artifacts/expo/files/package.json.template +58 -0
  162. package/.local/skills/artifacts/artifacts/expo/files/scripts/build.js +573 -0
  163. package/.local/skills/artifacts/artifacts/expo/files/server/serve.js +135 -0
  164. package/.local/skills/artifacts/artifacts/expo/files/server/templates/landing-page.html +460 -0
  165. package/.local/skills/artifacts/artifacts/expo/files/tsconfig.json +23 -0
  166. package/.local/skills/artifacts/artifacts/mockup-sandbox/artifact.yaml +15 -0
  167. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/components.json +21 -0
  168. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/index.html +31 -0
  169. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/mockupPreviewPlugin.ts +199 -0
  170. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/package.json.template +75 -0
  171. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/public/favicon.svg +3 -0
  172. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/.generated/mockup-components.ts +3 -0
  173. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/App.tsx +146 -0
  174. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/accordion.tsx +55 -0
  175. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert-dialog.tsx +139 -0
  176. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/alert.tsx +59 -0
  177. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/aspect-ratio.tsx +5 -0
  178. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/avatar.tsx +50 -0
  179. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/badge.tsx +43 -0
  180. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/breadcrumb.tsx +115 -0
  181. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button-group.tsx +83 -0
  182. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/button.tsx +65 -0
  183. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/calendar.tsx +213 -0
  184. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/card.tsx +76 -0
  185. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/carousel.tsx +260 -0
  186. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/chart.tsx +367 -0
  187. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/checkbox.tsx +28 -0
  188. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/collapsible.tsx +11 -0
  189. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/command.tsx +153 -0
  190. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/context-menu.tsx +198 -0
  191. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dialog.tsx +120 -0
  192. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/drawer.tsx +116 -0
  193. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/dropdown-menu.tsx +201 -0
  194. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/empty.tsx +104 -0
  195. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/field.tsx +244 -0
  196. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/form.tsx +176 -0
  197. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/hover-card.tsx +27 -0
  198. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-group.tsx +168 -0
  199. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input-otp.tsx +69 -0
  200. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/input.tsx +22 -0
  201. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/item.tsx +193 -0
  202. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/kbd.tsx +28 -0
  203. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/label.tsx +26 -0
  204. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/menubar.tsx +254 -0
  205. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/navigation-menu.tsx +128 -0
  206. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/pagination.tsx +117 -0
  207. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/popover.tsx +31 -0
  208. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/progress.tsx +28 -0
  209. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/radio-group.tsx +42 -0
  210. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/resizable.tsx +45 -0
  211. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/scroll-area.tsx +46 -0
  212. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/select.tsx +159 -0
  213. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/separator.tsx +29 -0
  214. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sheet.tsx +140 -0
  215. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sidebar.tsx +727 -0
  216. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/skeleton.tsx +15 -0
  217. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/slider.tsx +26 -0
  218. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/sonner.tsx +31 -0
  219. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/spinner.tsx +16 -0
  220. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/switch.tsx +27 -0
  221. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/table.tsx +120 -0
  222. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tabs.tsx +53 -0
  223. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/textarea.tsx +22 -0
  224. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toast.tsx +127 -0
  225. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toaster.tsx +33 -0
  226. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle-group.tsx +61 -0
  227. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/toggle.tsx +43 -0
  228. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/components/ui/tooltip.tsx +32 -0
  229. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-mobile.tsx +19 -0
  230. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/hooks/use-toast.ts +189 -0
  231. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/index.css +158 -0
  232. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/lib/utils.ts +6 -0
  233. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/src/main.tsx +5 -0
  234. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/tsconfig.json +20 -0
  235. package/.local/skills/artifacts/artifacts/mockup-sandbox/files/vite.config.ts +72 -0
  236. package/.local/skills/artifacts/artifacts/react-vite/artifact.yaml +41 -0
  237. package/.local/skills/artifacts/artifacts/react-vite/files/components.json +20 -0
  238. package/.local/skills/artifacts/artifacts/react-vite/files/index.html.template +24 -0
  239. package/.local/skills/artifacts/artifacts/react-vite/files/package.json.template +77 -0
  240. package/.local/skills/artifacts/artifacts/react-vite/files/public/favicon.svg +3 -0
  241. package/.local/skills/artifacts/artifacts/react-vite/files/public/robots.txt +2 -0
  242. package/.local/skills/artifacts/artifacts/react-vite/files/src/App.tsx +42 -0
  243. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/accordion.tsx +55 -0
  244. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert-dialog.tsx +139 -0
  245. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/alert.tsx +59 -0
  246. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/aspect-ratio.tsx +5 -0
  247. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/avatar.tsx +50 -0
  248. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/badge.tsx +43 -0
  249. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/breadcrumb.tsx +115 -0
  250. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button-group.tsx +83 -0
  251. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/button.tsx +65 -0
  252. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/calendar.tsx +213 -0
  253. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/card.tsx +76 -0
  254. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/carousel.tsx +260 -0
  255. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/chart.tsx +367 -0
  256. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/checkbox.tsx +28 -0
  257. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/collapsible.tsx +11 -0
  258. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/command.tsx +153 -0
  259. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/context-menu.tsx +198 -0
  260. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dialog.tsx +120 -0
  261. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/drawer.tsx +116 -0
  262. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/dropdown-menu.tsx +201 -0
  263. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/empty.tsx +104 -0
  264. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/field.tsx +244 -0
  265. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/form.tsx +176 -0
  266. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/hover-card.tsx +27 -0
  267. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-group.tsx +168 -0
  268. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input-otp.tsx +69 -0
  269. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/input.tsx +22 -0
  270. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/item.tsx +193 -0
  271. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/kbd.tsx +28 -0
  272. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/label.tsx +26 -0
  273. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/menubar.tsx +254 -0
  274. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/navigation-menu.tsx +128 -0
  275. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/pagination.tsx +117 -0
  276. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/popover.tsx +31 -0
  277. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/progress.tsx +28 -0
  278. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/radio-group.tsx +42 -0
  279. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/resizable.tsx +45 -0
  280. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/scroll-area.tsx +46 -0
  281. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/select.tsx +159 -0
  282. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/separator.tsx +29 -0
  283. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sheet.tsx +140 -0
  284. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sidebar.tsx +727 -0
  285. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/skeleton.tsx +15 -0
  286. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/slider.tsx +26 -0
  287. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/sonner.tsx +31 -0
  288. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/spinner.tsx +16 -0
  289. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/switch.tsx +27 -0
  290. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/table.tsx +120 -0
  291. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tabs.tsx +53 -0
  292. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/textarea.tsx +22 -0
  293. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toast.tsx +127 -0
  294. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toaster.tsx +33 -0
  295. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle-group.tsx +61 -0
  296. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/toggle.tsx +43 -0
  297. package/.local/skills/artifacts/artifacts/react-vite/files/src/components/ui/tooltip.tsx +32 -0
  298. package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-mobile.tsx +19 -0
  299. package/.local/skills/artifacts/artifacts/react-vite/files/src/hooks/use-toast.ts +191 -0
  300. package/.local/skills/artifacts/artifacts/react-vite/files/src/index.css +393 -0
  301. package/.local/skills/artifacts/artifacts/react-vite/files/src/lib/utils.ts +6 -0
  302. package/.local/skills/artifacts/artifacts/react-vite/files/src/main.tsx +5 -0
  303. package/.local/skills/artifacts/artifacts/react-vite/files/src/pages/not-found.tsx +21 -0
  304. package/.local/skills/artifacts/artifacts/react-vite/files/tsconfig.json +22 -0
  305. package/.local/skills/artifacts/artifacts/react-vite/files/vite.config.ts +75 -0
  306. package/.local/skills/artifacts/artifacts/slides/artifact.yaml +33 -0
  307. package/.local/skills/artifacts/artifacts/slides/files/index.html.template +46 -0
  308. package/.local/skills/artifacts/artifacts/slides/files/package.json.template +30 -0
  309. package/.local/skills/artifacts/artifacts/slides/files/public/favicon.svg +3 -0
  310. package/.local/skills/artifacts/artifacts/slides/files/scripts/validate-slides.ts +193 -0
  311. package/.local/skills/artifacts/artifacts/slides/files/src/App.tsx +251 -0
  312. package/.local/skills/artifacts/artifacts/slides/files/src/data/slides-manifest.json +1 -0
  313. package/.local/skills/artifacts/artifacts/slides/files/src/data/slidesManifestSchema.ts +33 -0
  314. package/.local/skills/artifacts/artifacts/slides/files/src/index.css +48 -0
  315. package/.local/skills/artifacts/artifacts/slides/files/src/main.tsx +14 -0
  316. package/.local/skills/artifacts/artifacts/slides/files/src/slideLoader.ts +51 -0
  317. package/.local/skills/artifacts/artifacts/slides/files/tsconfig.json +17 -0
  318. package/.local/skills/artifacts/artifacts/slides/files/vite.config.ts +74 -0
  319. package/.local/skills/artifacts/artifacts/video-js/artifact.yaml +38 -0
  320. package/.local/skills/artifacts/artifacts/video-js/files/index.html.template +27 -0
  321. package/.local/skills/artifacts/artifacts/video-js/files/package.json.template +36 -0
  322. package/.local/skills/artifacts/artifacts/video-js/files/public/favicon.svg +3 -0
  323. package/.local/skills/artifacts/artifacts/video-js/files/scripts/validate-recording.sh +38 -0
  324. package/.local/skills/artifacts/artifacts/video-js/files/src/App.tsx +5 -0
  325. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/ReplitLoadingScene.tsx +105 -0
  326. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/VideoTemplate.tsx +30 -0
  327. package/.local/skills/artifacts/artifacts/video-js/files/src/components/video/index.ts +1 -0
  328. package/.local/skills/artifacts/artifacts/video-js/files/src/hooks/use-mobile.tsx +19 -0
  329. package/.local/skills/artifacts/artifacts/video-js/files/src/index.css +50 -0
  330. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/utils.ts +6 -0
  331. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/animations.ts +239 -0
  332. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/hooks.ts +104 -0
  333. package/.local/skills/artifacts/artifacts/video-js/files/src/lib/video/index.ts +19 -0
  334. package/.local/skills/artifacts/artifacts/video-js/files/src/main.tsx +5 -0
  335. package/.local/skills/artifacts/artifacts/video-js/files/tsconfig.json +16 -0
  336. package/.local/skills/artifacts/artifacts/video-js/files/vite.config.ts +79 -0
  337. package/.local/skills/artifacts/bootstrap-legacy.js +115 -0
  338. package/.local/skills/artifacts/bootstrap.js +118 -0
  339. package/.local/skills/artifacts/references/multi-artifact-creation.md +94 -0
  340. package/.local/skills/canvas/.fingerprint +1 -0
  341. package/.local/skills/canvas/SKILL.md +534 -0
  342. package/.local/skills/canvas/__init__.py +1 -0
  343. package/.local/skills/code_review/.fingerprint +1 -0
  344. package/.local/skills/code_review/SKILL.md +82 -0
  345. package/.local/skills/database/.fingerprint +1 -0
  346. package/.local/skills/database/SKILL.md +351 -0
  347. package/.local/skills/database/references/database-migrations-on-publish.md +57 -0
  348. package/.local/skills/delegation/.fingerprint +1 -0
  349. package/.local/skills/delegation/SKILL.md +200 -0
  350. package/.local/skills/deployment/.fingerprint +1 -0
  351. package/.local/skills/deployment/SKILL.md +261 -0
  352. package/.local/skills/deployment/references/deployment-failure-debugging.md +243 -0
  353. package/.local/skills/deployment/references/deployment-logs.md +147 -0
  354. package/.local/skills/design/.fingerprint +1 -0
  355. package/.local/skills/design/SKILL.md +235 -0
  356. package/.local/skills/design-exploration/.fingerprint +1 -0
  357. package/.local/skills/design-exploration/SKILL.md +95 -0
  358. package/.local/skills/diagnostics/.fingerprint +1 -0
  359. package/.local/skills/diagnostics/SKILL.md +122 -0
  360. package/.local/skills/environment-secrets/.fingerprint +1 -0
  361. package/.local/skills/environment-secrets/SKILL.md +201 -0
  362. package/.local/skills/expo/.fingerprint +1 -0
  363. package/.local/skills/expo/OWNERS +2 -0
  364. package/.local/skills/expo/SKILL.md +298 -0
  365. package/.local/skills/expo/references/design_and_aesthetics.md +141 -0
  366. package/.local/skills/expo/references/device_features_and_permissions.md +48 -0
  367. package/.local/skills/expo/references/first_build.md +114 -0
  368. package/.local/skills/expo/references/react_context.md +54 -0
  369. package/.local/skills/external_apis/.fingerprint +1 -0
  370. package/.local/skills/external_apis/SKILL.md +25 -0
  371. package/.local/skills/external_apis/references/brave.md +116 -0
  372. package/.local/skills/external_apis/references/elevenlabs.md +44 -0
  373. package/.local/skills/external_apis/references/exa.md +34 -0
  374. package/.local/skills/external_apis/references/firecrawl.md +37 -0
  375. package/.local/skills/external_apis/references/nano_banana.md +33 -0
  376. package/.local/skills/follow-up-tasks/.fingerprint +1 -0
  377. package/.local/skills/follow-up-tasks/SKILL.md +80 -0
  378. package/.local/skills/image-search/.fingerprint +1 -0
  379. package/.local/skills/image-search/SKILL.md +150 -0
  380. package/.local/skills/integrations/.fingerprint +1 -0
  381. package/.local/skills/integrations/SKILL.md +205 -0
  382. package/.local/skills/media-generation/.fingerprint +1 -0
  383. package/.local/skills/media-generation/SKILL.md +170 -0
  384. package/.local/skills/media-generation/audio_generation.md +138 -0
  385. package/.local/skills/media-generation/video_generation.md +82 -0
  386. package/.local/skills/mockup-extract/.fingerprint +1 -0
  387. package/.local/skills/mockup-extract/SKILL.md +123 -0
  388. package/.local/skills/mockup-graduate/.fingerprint +1 -0
  389. package/.local/skills/mockup-graduate/SKILL.md +97 -0
  390. package/.local/skills/mockup-sandbox/.fingerprint +1 -0
  391. package/.local/skills/mockup-sandbox/SKILL.md +750 -0
  392. package/.local/skills/package-management/.fingerprint +1 -0
  393. package/.local/skills/package-management/SKILL.md +264 -0
  394. package/.local/skills/post_merge_setup/.fingerprint +1 -0
  395. package/.local/skills/post_merge_setup/SKILL.md +102 -0
  396. package/.local/skills/project_tasks/.fingerprint +1 -0
  397. package/.local/skills/project_tasks/SKILL.md +361 -0
  398. package/.local/skills/query-integration-data/.fingerprint +1 -0
  399. package/.local/skills/query-integration-data/SKILL.md +385 -0
  400. package/.local/skills/react-vite/.fingerprint +1 -0
  401. package/.local/skills/react-vite/SKILL.md +110 -0
  402. package/.local/skills/react-vite/references/frontend_general_rules.md +66 -0
  403. package/.local/skills/react-vite/references/seo.md +158 -0
  404. package/.local/skills/remove-image-background/.fingerprint +1 -0
  405. package/.local/skills/remove-image-background/SKILL.md +55 -0
  406. package/.local/skills/repl_setup/.fingerprint +1 -0
  407. package/.local/skills/repl_setup/SKILL.md +90 -0
  408. package/.local/skills/repl_setup/references/angular.md +103 -0
  409. package/.local/skills/repl_setup/references/react_vite.md +121 -0
  410. package/.local/skills/repl_setup/references/vue.md +102 -0
  411. package/.local/skills/replit-docs/.fingerprint +1 -0
  412. package/.local/skills/replit-docs/SKILL.md +81 -0
  413. package/.local/skills/revenuecat/.fingerprint +1 -0
  414. package/.local/skills/revenuecat/SKILL.md +133 -0
  415. package/.local/skills/revenuecat/references/initial-setup.md +566 -0
  416. package/.local/skills/revenuecat/references/replit-revenuecat-sdk-docs.md +279 -0
  417. package/.local/skills/revenuecat/references/subsequent-management.md +63 -0
  418. package/.local/skills/security_scan/.fingerprint +1 -0
  419. package/.local/skills/security_scan/SKILL.md +51 -0
  420. package/.local/skills/skill-authoring/.fingerprint +1 -0
  421. package/.local/skills/skill-authoring/SKILL.md +99 -0
  422. package/.local/skills/slides/.fingerprint +1 -0
  423. package/.local/skills/slides/SKILL.md +523 -0
  424. package/.local/skills/slides/references/brand_research.md +86 -0
  425. package/.local/skills/slides/references/export_failures.md +36 -0
  426. package/.local/skills/slides/references/exporting.md +49 -0
  427. package/.local/skills/slides/references/importing.md +40 -0
  428. package/.local/skills/slides/references/visual_qa.md +121 -0
  429. package/.local/skills/slides/templates/90s-board-deck.md +285 -0
  430. package/.local/skills/slides/templates/academic-lecture.md +437 -0
  431. package/.local/skills/slides/templates/adventure-outdoor.md +845 -0
  432. package/.local/skills/slides/templates/analytics-dashboard.md +407 -0
  433. package/.local/skills/slides/templates/annual-report-cover.md +592 -0
  434. package/.local/skills/slides/templates/apple-minimal.md +570 -0
  435. package/.local/skills/slides/templates/architecture-studio.md +339 -0
  436. package/.local/skills/slides/templates/arctic-expedition.md +582 -0
  437. package/.local/skills/slides/templates/arctic-minimal.md +364 -0
  438. package/.local/skills/slides/templates/art-deco.md +308 -0
  439. package/.local/skills/slides/templates/artisan-ceramics.md +659 -0
  440. package/.local/skills/slides/templates/artisan-food.md +709 -0
  441. package/.local/skills/slides/templates/artisanal-chalkboard.md +623 -0
  442. package/.local/skills/slides/templates/astronomy-log.md +562 -0
  443. package/.local/skills/slides/templates/aurora-expedition.md +754 -0
  444. package/.local/skills/slides/templates/automotive-electric.md +339 -0
  445. package/.local/skills/slides/templates/bauhaus-avant-garde.md +443 -0
  446. package/.local/skills/slides/templates/bioluminescent-sea.md +814 -0
  447. package/.local/skills/slides/templates/biophilic-urban.md +565 -0
  448. package/.local/skills/slides/templates/blackboard-chalk.md +517 -0
  449. package/.local/skills/slides/templates/blueprint.md +478 -0
  450. package/.local/skills/slides/templates/botanical-index.md +822 -0
  451. package/.local/skills/slides/templates/botanical-wellness.md +611 -0
  452. package/.local/skills/slides/templates/brand-book-page.md +466 -0
  453. package/.local/skills/slides/templates/brutalist-concrete.md +362 -0
  454. package/.local/skills/slides/templates/brutalist-studio.md +325 -0
  455. package/.local/skills/slides/templates/brutalist-web-punk.md +591 -0
  456. package/.local/skills/slides/templates/celestial-observatory.md +453 -0
  457. package/.local/skills/slides/templates/ceramics-artisan.md +740 -0
  458. package/.local/skills/slides/templates/cinema-verite.md +415 -0
  459. package/.local/skills/slides/templates/claymorphism.md +737 -0
  460. package/.local/skills/slides/templates/collage-zine.md +357 -0
  461. package/.local/skills/slides/templates/copper-sage.md +325 -0
  462. package/.local/skills/slides/templates/coral-reef.md +508 -0
  463. package/.local/skills/slides/templates/corporate-grid.md +331 -0
  464. package/.local/skills/slides/templates/corporate-memphis-flat.md +938 -0
  465. package/.local/skills/slides/templates/cosmos-explorer.md +998 -0
  466. package/.local/skills/slides/templates/cpg-coffee.md +850 -0
  467. package/.local/skills/slides/templates/craft-coffee-roast.md +693 -0
  468. package/.local/skills/slides/templates/creative-agency.md +244 -0
  469. package/.local/skills/slides/templates/creative-director.md +875 -0
  470. package/.local/skills/slides/templates/culinary-brand.md +698 -0
  471. package/.local/skills/slides/templates/de-stijl-construct.md +320 -0
  472. package/.local/skills/slides/templates/desert-dunes-photo.md +483 -0
  473. package/.local/skills/slides/templates/desert-mirror.md +577 -0
  474. package/.local/skills/slides/templates/desert-modernism.md +439 -0
  475. package/.local/skills/slides/templates/developer-api-docs.md +654 -0
  476. package/.local/skills/slides/templates/editorial-magazine.md +694 -0
  477. package/.local/skills/slides/templates/engineering-blueprint.md +730 -0
  478. package/.local/skills/slides/templates/executive-mono.md +363 -0
  479. package/.local/skills/slides/templates/expedition-peak.md +298 -0
  480. package/.local/skills/slides/templates/fashion-campaign.md +681 -0
  481. package/.local/skills/slides/templates/fashion-editorial.md +497 -0
  482. package/.local/skills/slides/templates/figma-geometric.md +420 -0
  483. package/.local/skills/slides/templates/film-noir.md +857 -0
  484. package/.local/skills/slides/templates/fitness-athletics.md +663 -0
  485. package/.local/skills/slides/templates/flat-vector.md +912 -0
  486. package/.local/skills/slides/templates/fluid-luxe.md +665 -0
  487. package/.local/skills/slides/templates/furniture-brand.md +505 -0
  488. package/.local/skills/slides/templates/gallery-modern.md +436 -0
  489. package/.local/skills/slides/templates/gaming-esports.md +410 -0
  490. package/.local/skills/slides/templates/geodesic-future.md +368 -0
  491. package/.local/skills/slides/templates/glass-artisan.md +666 -0
  492. package/.local/skills/slides/templates/glassmorphism.md +320 -0
  493. package/.local/skills/slides/templates/greenhouse-botanical.md +662 -0
  494. package/.local/skills/slides/templates/healthcare-clarity.md +468 -0
  495. package/.local/skills/slides/templates/holographic-drop.md +663 -0
  496. package/.local/skills/slides/templates/hospitality-resort.md +608 -0
  497. package/.local/skills/slides/templates/hypercar-launch.md +557 -0
  498. package/.local/skills/slides/templates/infographic-title.md +306 -0
  499. package/.local/skills/slides/templates/ink-wash.md +244 -0
  500. package/.local/skills/slides/templates/investor-memo.md +509 -0
  501. package/.local/skills/slides/templates/isometric-data.md +703 -0
  502. package/.local/skills/slides/templates/ivory-boardroom.md +439 -0
  503. package/.local/skills/slides/templates/japanese-minimal.md +308 -0
  504. package/.local/skills/slides/templates/jazz-blue-note.md +478 -0
  505. package/.local/skills/slides/templates/kinetic-type.md +206 -0
  506. package/.local/skills/slides/templates/lagoon-luxury.md +320 -0
  507. package/.local/skills/slides/templates/lavender-pastoral.md +577 -0
  508. package/.local/skills/slides/templates/linear-precise.md +460 -0
  509. package/.local/skills/slides/templates/lineart-sketch.md +930 -0
  510. package/.local/skills/slides/templates/lost-temple.md +689 -0
  511. package/.local/skills/slides/templates/luxury-fashion.md +269 -0
  512. package/.local/skills/slides/templates/luxury-watch.md +678 -0
  513. package/.local/skills/slides/templates/marble-elegance.md +673 -0
  514. package/.local/skills/slides/templates/mediterranean-travel.md +811 -0
  515. package/.local/skills/slides/templates/memphis-design.md +426 -0
  516. package/.local/skills/slides/templates/midnight-jazz.md +260 -0
  517. package/.local/skills/slides/templates/minimalist-poster.md +538 -0
  518. package/.local/skills/slides/templates/molten-craft.md +743 -0
  519. package/.local/skills/slides/templates/moroccan-tile.md +738 -0
  520. package/.local/skills/slides/templates/motorsport.md +782 -0
  521. package/.local/skills/slides/templates/mountain-drift.md +311 -0
  522. package/.local/skills/slides/templates/music-label.md +641 -0
  523. package/.local/skills/slides/templates/neo-tokyo.md +637 -0
  524. package/.local/skills/slides/templates/neobrutalism.md +334 -0
  525. package/.local/skills/slides/templates/newspaper-broadsheet.md +687 -0
  526. package/.local/skills/slides/templates/noir-fragrance.md +672 -0
  527. package/.local/skills/slides/templates/non-profit-impact.md +320 -0
  528. package/.local/skills/slides/templates/ocean-breeze.md +398 -0
  529. package/.local/skills/slides/templates/origami-couture.md +636 -0
  530. package/.local/skills/slides/templates/origami-paper.md +308 -0
  531. package/.local/skills/slides/templates/pastel-playground.md +1114 -0
  532. package/.local/skills/slides/templates/perfume-noir.md +646 -0
  533. package/.local/skills/slides/templates/prairie-storm.md +625 -0
  534. package/.local/skills/slides/templates/private-equity-dark.md +506 -0
  535. package/.local/skills/slides/templates/renaissance-florals.md +225 -0
  536. package/.local/skills/slides/templates/retro-print.md +880 -0
  537. package/.local/skills/slides/templates/retro-vinyl-sleeve.md +229 -0
  538. package/.local/skills/slides/templates/riso-zine.md +1094 -0
  539. package/.local/skills/slides/templates/risograph.md +1151 -0
  540. package/.local/skills/slides/templates/saas-product-launch.md +972 -0
  541. package/.local/skills/slides/templates/scandinavian.md +372 -0
  542. package/.local/skills/slides/templates/skater-culture.md +583 -0
  543. package/.local/skills/slides/templates/slate-modern.md +469 -0
  544. package/.local/skills/slides/templates/sneaker-drop.md +1006 -0
  545. package/.local/skills/slides/templates/social-campaign.md +321 -0
  546. package/.local/skills/slides/templates/stained-glass.md +574 -0
  547. package/.local/skills/slides/templates/strategy-one-pager.md +508 -0
  548. package/.local/skills/slides/templates/street-drop.md +677 -0
  549. package/.local/skills/slides/templates/street-mural.md +588 -0
  550. package/.local/skills/slides/templates/studio-noir.md +466 -0
  551. package/.local/skills/slides/templates/sustainability-esg.md +686 -0
  552. package/.local/skills/slides/templates/swiss-archive.md +648 -0
  553. package/.local/skills/slides/templates/swiss-typographic.md +364 -0
  554. package/.local/skills/slides/templates/tea-ceremony.md +456 -0
  555. package/.local/skills/slides/templates/tech-earbuds.md +870 -0
  556. package/.local/skills/slides/templates/terracotta-studio.md +235 -0
  557. package/.local/skills/slides/templates/thesis-defense.md +390 -0
  558. package/.local/skills/slides/templates/travel-aerial.md +648 -0
  559. package/.local/skills/slides/templates/treasury-policy.md +475 -0
  560. package/.local/skills/slides/templates/tropical-lush.md +332 -0
  561. package/.local/skills/slides/templates/underwater-dream.md +627 -0
  562. package/.local/skills/slides/templates/urban-golden.md +342 -0
  563. package/.local/skills/slides/templates/vintage-apothecary.md +552 -0
  564. package/.local/skills/slides/templates/vintage-ticket-stub.md +637 -0
  565. package/.local/skills/slides/templates/vinyl-crate.md +550 -0
  566. package/.local/skills/slides/templates/vision-editorial.md +612 -0
  567. package/.local/skills/slides/templates/volcanic-edge.md +347 -0
  568. package/.local/skills/slides/templates/watercolor-city.md +827 -0
  569. package/.local/skills/slides/templates/wine-spirits.md +203 -0
  570. package/.local/skills/slides/templates/wireframe-prototype.md +718 -0
  571. package/.local/skills/slides/templates/workspace-design.md +782 -0
  572. package/.local/skills/slides/templates/workspace-modern.md +406 -0
  573. package/.local/skills/slides/templates/zen-meditation.md +284 -0
  574. package/.local/skills/slides/templates/zen-void.md +244 -0
  575. package/.local/skills/stripe/.fingerprint +1 -0
  576. package/.local/skills/stripe/SKILL.md +455 -0
  577. package/.local/skills/stripe/references/code-templates.md +588 -0
  578. package/.local/skills/threat_modeling/.fingerprint +1 -0
  579. package/.local/skills/threat_modeling/SKILL.md +240 -0
  580. package/.local/skills/validation/.fingerprint +1 -0
  581. package/.local/skills/validation/SKILL.md +237 -0
  582. package/.local/skills/video-js/.fingerprint +1 -0
  583. package/.local/skills/video-js/SKILL.md +793 -0
  584. package/.local/skills/video-js/references/audio.md +237 -0
  585. package/.local/skills/video-js/references/finalize_playback.md +16 -0
  586. package/.local/skills/video-js/references/first_build.md +87 -0
  587. package/.local/skills/video-js/references/scene_selectors.md +428 -0
  588. package/.local/skills/web-search/.fingerprint +1 -0
  589. package/.local/skills/web-search/SKILL.md +110 -0
  590. package/.local/skills/whop/.fingerprint +1 -0
  591. package/.local/skills/whop/SKILL.md +104 -0
  592. package/.local/skills/whop/references/code-templates.md +66 -0
  593. package/.local/skills/whop/references/whop-api.mjs +22 -0
  594. package/.local/skills/whop/references/whop-mcp.mjs +40 -0
  595. package/.local/skills/whop/references/whopClient.ts +54 -0
  596. package/.local/skills/workflows/.fingerprint +1 -0
  597. package/.local/skills/workflows/SKILL.md +245 -0
  598. package/.local/state/replit/agent/.agent_state_037313043e76b5c652f276153ea014a68570e145.bin +0 -0
  599. package/.local/state/replit/agent/.agent_state_0f5361c2a53ab324b2a941a797f6494891be084c.bin +0 -0
  600. package/.local/state/replit/agent/.agent_state_4272443827dc90eac8c5b1963a34ee86da70bb99.bin +0 -0
  601. package/.local/state/replit/agent/.agent_state_4f14655950cbd611b228b4f0e1f664b66a56af24.bin +0 -0
  602. package/.local/state/replit/agent/.agent_state_ce28955a30856aa3d095b3568c322c8ec098993f.bin +0 -0
  603. package/.local/state/replit/agent/.agent_state_ec5347d04ebfbf6cf850fe04e15590d423e96d1d.bin +0 -0
  604. package/.local/state/replit/agent/.agent_state_f68f8c104d815ccc387290f0fba2c87c818d29f1.bin +0 -0
  605. package/.local/state/replit/agent/.agent_state_f87c1803a179510408c57c7a380c26f5c2197a30.bin +0 -0
  606. package/.local/state/replit/agent/.agent_state_main.bin +0 -0
  607. package/.local/state/replit/agent/.latest.json +1 -0
  608. package/.local/state/replit/agent/repl_state.bin +0 -0
  609. package/.local/state/scribe/scribe.db +0 -0
  610. package/.local/state/scribe/scribe.db-shm +0 -0
  611. package/.local/state/scribe/scribe.db-wal +0 -0
  612. package/.local/state/workflow-logs/2tfQP52ibxJTy4lpZ7_JX/start_application.shell.exec.0 +27 -0
  613. package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.external.managed.0 +31 -0
  614. package/.local/state/workflow-logs/6QjtmQThaHrR_QHf4v8HA/validation.json +1 -0
  615. package/.local/state/workflow-logs/85n-z_SHy4JSGaUeJIcxy/start_application.shell.exec.0 +18 -0
  616. package/.local/state/workflow-logs/GIL2Ql5124lrEqGrfRO4k/start_application.shell.exec.0 +222 -0
  617. package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.external.managed.0 +45 -0
  618. package/.local/state/workflow-logs/LiH2MjG_9FwFummNHhDtO/validation.json +1 -0
  619. package/.local/state/workflow-logs/OKp1t-fEO5U_zQi1SKOQ-/start_application.shell.exec.0 +10 -0
  620. package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.external.managed.0 +43 -0
  621. package/.local/state/workflow-logs/Tpp7d6Hu6CO1NKGo_eAi7/validation.json +1 -0
  622. package/.local/state/workflow-logs/UDYycRqPV-N4B7whZP-yX/start_application.shell.exec.0 +252 -0
  623. package/.local/state/workflow-logs/V8Anmvz-HuvAztflZ8yCo/start_application.shell.exec.0 +87 -0
  624. package/.local/state/workflow-logs/a5fMnjr9tCwoaFY93pYuN/start_application.shell.exec.0 +2519 -0
  625. package/.local/state/workflow-logs/ggFzYcdHfIlW0owP2pb0U/start_application.shell.exec.0 +28 -0
  626. package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.external.managed.0 +41 -0
  627. package/.local/state/workflow-logs/hIHNKfUtPX3jZs8qXw_Vt/validation.json +1 -0
  628. package/.local/state/workflow-logs/nbLvtuGJXB0wPmnruB3BE/start_application.shell.exec.0 +199 -0
  629. package/.local/state/workflow-logs/uDhN6S0ypUEh0MphXaFGY/start_application.shell.exec.0 +73 -0
  630. package/.local/state/workflow-logs/xZqU5CdTivcY6KEDEcVmD/start_application.shell.exec.0 +17 -0
  631. package/.local/tasks/breadcrumb-component.md +89 -0
  632. package/.local/tasks/calendar-component.md +93 -0
  633. package/.local/tasks/invoicing-design-system-app.md +39 -0
  634. package/.local/tasks/task-1.md +42 -0
  635. package/.local/tasks/task-7.md +92 -0
  636. package/.local/tasks/task-8.md +96 -0
  637. package/.replit +34 -0
  638. package/.upm/store.json +1 -0
  639. package/README.md +121 -0
  640. package/app/dashboard/page.tsx +10 -0
  641. package/app/design-system/page.tsx +802 -0
  642. package/app/invoices/page.tsx +10 -0
  643. package/app/layout.tsx +28 -0
  644. package/app/login/page.tsx +5 -0
  645. package/app/page.tsx +93 -0
  646. package/app/signup/page.tsx +5 -0
  647. package/attached_assets/Colors_1779781016394.png +0 -0
  648. package/attached_assets/Navy_1779781016404.png +0 -0
  649. package/attached_assets/Orange_1779781016405.png +0 -0
  650. package/attached_assets/Screenshot_2026-05-26_at_1.14.29_PM_1779781472515.png +0 -0
  651. package/attached_assets/Screenshot_2026-05-26_at_11.28.20_AM_1779775171071.png +0 -0
  652. package/attached_assets/Screenshot_2026-05-26_at_2.04.42_PM_1779784485318.png +0 -0
  653. package/attached_assets/Typography_1779781016406.png +0 -0
  654. package/design-system/components/avatar.tsx +46 -0
  655. package/design-system/components/badge.tsx +34 -0
  656. package/design-system/components/breadcrumb.tsx +149 -0
  657. package/design-system/components/button.tsx +57 -0
  658. package/design-system/components/calendar.tsx +77 -0
  659. package/design-system/components/card.tsx +62 -0
  660. package/design-system/components/checkbox.tsx +27 -0
  661. package/design-system/components/date-picker.tsx +153 -0
  662. package/design-system/components/dialog.tsx +106 -0
  663. package/design-system/components/dropdown-menu.tsx +88 -0
  664. package/design-system/components/form-field.tsx +78 -0
  665. package/design-system/components/input.tsx +25 -0
  666. package/design-system/components/label.tsx +25 -0
  667. package/design-system/components/popover.tsx +30 -0
  668. package/design-system/components/radio-group.tsx +35 -0
  669. package/design-system/components/select.tsx +84 -0
  670. package/design-system/components/separator.tsx +24 -0
  671. package/design-system/components/switch.tsx +28 -0
  672. package/design-system/components/table.tsx +80 -0
  673. package/design-system/components/tabs.tsx +54 -0
  674. package/design-system/components/textarea.tsx +25 -0
  675. package/design-system/components/toast.tsx +118 -0
  676. package/design-system/components/toaster.tsx +38 -0
  677. package/design-system/components/tooltip.tsx +27 -0
  678. package/design-system/hooks/index.ts +2 -0
  679. package/design-system/hooks/use-media-query.ts +27 -0
  680. package/design-system/hooks/use-toast.ts +91 -0
  681. package/design-system/index.ts +36 -0
  682. package/design-system/lib/cn.ts +6 -0
  683. package/design-system/styles.css +142 -0
  684. package/design-system/tokens/tokens.css +149 -0
  685. package/design-system/tokens/tokens.ts +190 -0
  686. package/next.config.mjs +6 -0
  687. package/package.json +46 -0
  688. package/postcss.config.mjs +6 -0
  689. package/screens/_shared/app-shell.tsx +145 -0
  690. package/screens/auth/auth-screen.tsx +156 -0
  691. package/screens/dashboard/dashboard-screen.tsx +207 -0
  692. package/screens/index.ts +17 -0
  693. package/screens/invoices/invoices-screen.tsx +317 -0
  694. package/tailwind.config.ts +110 -0
  695. package/tsconfig.json +26 -0
@@ -0,0 +1,1719 @@
1
+ # FFmpeg Operations Reference
2
+
3
+ Complete command reference for video editing operations in Replit. All examples use Node.js with `child_process.execFile`or`fluent-ffmpeg`.
4
+
5
+ ## Table of Contents
6
+
7
+ 1. [Trimming and Cutting](#trimming-and-cutting)
8
+ 2. [Concatenation](#concatenation)
9
+
10
+ 3. [Transitions](#transitions)
11
+ 4. [Text Overlays](#text-overlays)
12
+
13
+ 5. [Subtitles](#subtitles)
14
+ 6. [Audio](#audio)
15
+
16
+ 7. [Effects](#effects)
17
+ 8. [Format Conversion](#format-conversion)
18
+
19
+ 9. [Image Extraction](#image-extraction)
20
+ 10. [GIF Creation](#gif-creation)
21
+
22
+ 11. [Resizing and Cropping](#resizing-and-cropping)
23
+ 12. [Watermarks and Overlays](#watermarks-and-overlays)
24
+
25
+ 13. [Compression](#compression)
26
+ 14. [Stabilization](#stabilization)
27
+
28
+ 15. [Looping](#looping)
29
+ 16. [Rotation and Flipping](#rotation-and-flipping)
30
+
31
+ 17. [Split Screen](#split-screen)
32
+ 18. [Muting and Audio Removal](#muting-and-audio-removal)
33
+
34
+ 19. [Thumbnail Generation](#thumbnail-generation)
35
+ 20. [Watermark Removal (Crop)](#watermark-removal-crop)
36
+
37
+ 21. [Logo Overlay (Branding)](#logo-overlay-branding)
38
+ 22. [Social Media Reframing](#social-media-reframing)
39
+
40
+ ---
41
+
42
+ ## Trimming and Cutting
43
+
44
+ ### Trim without re-encoding (fast, frame-accurate at keyframes)
45
+
46
+ ```bash
47
+
48
+ ffmpeg -i input.mp4 -ss 00:00:30 -to 00:01:15 -c copy output.mp4
49
+
50
+ ```
51
+
52
+ Place `-ss`before`-i`for faster seeking (input seeking), or after`-i`for frame-accurate seeking (output seeking). Using`-c copy` avoids re-encoding but may have imprecise start points at non-keyframe positions.
53
+
54
+ ### Trim with re-encoding (slower, frame-accurate)
55
+
56
+ ```bash
57
+
58
+ ffmpeg -i input.mp4 -ss 00:00:30 -to 00:01:15 -c:v libx264 -c:a aac output.mp4
59
+
60
+ ```
61
+
62
+ ### Remove a section (keep before and after)
63
+
64
+ Split into two parts and concatenate:
65
+
66
+ ```bash
67
+
68
+ ffmpeg -i input.mp4 -t 00:00:30 -c copy part1.mp4
69
+
70
+ ffmpeg -i input.mp4 -ss 00:01:00 -c copy part2.mp4
71
+
72
+ ```
73
+
74
+ Then concatenate (see Concatenation section).
75
+
76
+ ---
77
+
78
+ ## Concatenation
79
+
80
+ ### Concat demuxer (same codec, resolution, frame rate)
81
+
82
+ Create a text file `concat_list.txt`:
83
+
84
+ ```text
85
+
86
+ file 'clip1.mp4'
87
+
88
+ file 'clip2.mp4'
89
+
90
+ file 'clip3.mp4'
91
+
92
+ ```
93
+
94
+ ```bash
95
+
96
+ ffmpeg -f concat -safe 0 -i concat_list.txt -c copy output.mp4
97
+
98
+ ```
99
+
100
+ This is the fastest method because it avoids re-encoding, but all clips must share the same codec, resolution, and frame rate.
101
+
102
+ ### Concat filter (different codecs/resolutions)
103
+
104
+ ```bash
105
+
106
+ ffmpeg -i clip1.mp4 -i clip2.mp4 \\
107
+
108
+ -filter_complex "[0:v][0:a][1:v][1:a]concat=n=2:v=1:a=1[outv][outa]" \\
109
+
110
+ -map "[outv]" -map "[outa]" output.mp4
111
+
112
+ ```
113
+
114
+ This re-encodes everything but handles mismatched inputs. Scale inputs to a common resolution first if they differ.
115
+
116
+ ---
117
+
118
+ ## Transitions
119
+
120
+ ### Crossfade between two clips
121
+
122
+ ```bash
123
+
124
+ ffmpeg -i clip1.mp4 -i clip2.mp4 \\
125
+
126
+ -filter_complex "\\
127
+
128
+ [0:v]trim=duration=5,setpts=PTS-STARTPTS[v0]; \\
129
+
130
+ [1:v]trim=duration=5,setpts=PTS-STARTPTS[v1]; \\
131
+
132
+ [v0][v1]xfade=transition=fade:duration=1:offset=4[outv]; \\
133
+
134
+ [0:a]atrim=duration=5,asetpts=PTS-STARTPTS[a0]; \\
135
+
136
+ [1:a]atrim=duration=5,asetpts=PTS-STARTPTS[a1]; \\
137
+
138
+ [a0][a1]acrossfade=d=1[outa]" \\
139
+
140
+ -map "[outv]" -map "[outa]" output.mp4
141
+
142
+ ```
143
+
144
+ ### Available xfade transitions
145
+
146
+ `fade`, `wipeleft`, `wiperight`, `wipeup`, `wipedown`, `slideleft`, `slideright`, `slideup`, `slidedown`, `circlecrop`, `rectcrop`, `distance`, `fadeblack`, `fadewhite`, `radial`, `smoothleft`, `smoothright`, `smoothup`, `smoothdown`, `circleopen`, `circleclose`, `vertopen`, `vertclose`, `horzopen`, `horzclose`, `dissolve`, `pixelize`, `diagtl`, `diagtr`, `diagbl`, `diagbr`, `hlslice`, `hrslice`, `vuslice`, `vdslice`, `hblur`, `fadegrays`, `squeezev`, `squeezeh`, `zoomin`, `hlwind`, `hrwind`, `vuwind`, `vdwind`, `coverleft`, `coverright`, `coverup`, `coverdown`, `revealleft`, `revealright`, `revealup`, `revealdown`
147
+
148
+ ### Fade in/out
149
+
150
+ ```bash
151
+
152
+ # Fade in first 2 seconds
153
+
154
+ ffmpeg -i input.mp4 -vf "fade=t=in:st=0:d=2" -c:a copy output.mp4
155
+
156
+ # Fade out last 2 seconds (requires knowing duration)
157
+
158
+ ffmpeg -i input.mp4 -vf "fade=t=out:st=8:d=2" -c:a copy output.mp4
159
+
160
+ # Audio fade in/out
161
+
162
+ ffmpeg -i input.mp4 -af "afade=t=in:st=0:d=2,afade=t=out:st=8:d=2" output.mp4
163
+
164
+ ```
165
+
166
+ ---
167
+
168
+ ## Text Overlays
169
+
170
+ ### Static text overlay
171
+
172
+ ```bash
173
+
174
+ ffmpeg -i input.mp4 \\
175
+
176
+ -vf "drawtext=text='Hello World':fontsize=48:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSans-Bold.ttf" \\
177
+
178
+ output.mp4
179
+
180
+ ```
181
+
182
+ ### Text with background box
183
+
184
+ ```bash
185
+
186
+ ffmpeg -i input.mp4 \\
187
+
188
+ -vf "drawtext=text='Title':fontsize=64:fontcolor=white:box=1:boxcolor=black@0.6:boxborderw=10:x=(w-text_w)/2:y=50" \\
189
+
190
+ output.mp4
191
+
192
+ ```
193
+
194
+ ### Timed text (appears and disappears)
195
+
196
+ ```bash
197
+
198
+ ffmpeg -i input.mp4 \\
199
+
200
+ -vf "drawtext=text='Scene 1':fontsize=48:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:enable='between(t,2,5)'" \\
201
+
202
+ output.mp4
203
+
204
+ ```
205
+
206
+ ### Font discovery
207
+
208
+ List available fonts in the Replit environment:
209
+
210
+ ```bash
211
+
212
+ fc-list : family style | sort
213
+
214
+ ```
215
+
216
+ Or use a custom font file by downloading it to the project and referencing it with `fontfile=`.
217
+
218
+ ---
219
+
220
+ ## Subtitles
221
+
222
+ ### Burn subtitles from SRT file
223
+
224
+ ```bash
225
+
226
+ ffmpeg -i input.mp4 -vf "subtitles=subs.srt" output.mp4
227
+
228
+ ```
229
+
230
+ ### Burn subtitles with styling
231
+
232
+ ```bash
233
+
234
+ ffmpeg -i input.mp4 \\
235
+
236
+ -vf "subtitles=subs.srt:force_style='FontSize=24,FontName=Arial,PrimaryColour=&Hffffff&,OutlineColour=&H000000&,Outline=2'" \\
237
+
238
+ output.mp4
239
+
240
+ ```
241
+
242
+ ### Burn ASS/SSA subtitles (preserves advanced styling)
243
+
244
+ ```bash
245
+
246
+ ffmpeg -i input.mp4 -vf "ass=subs.ass" output.mp4
247
+
248
+ ```
249
+
250
+ ### Embed subtitles as a stream (soft subs, MKV only)
251
+
252
+ ```bash
253
+
254
+ ffmpeg -i input.mp4 -i subs.srt -c copy -c:s srt output.mkv
255
+
256
+ ```
257
+
258
+ ---
259
+
260
+ ## Audio
261
+
262
+ ### Add background music
263
+
264
+ ```bash
265
+
266
+ ffmpeg -i video.mp4 -i music.mp3 \\
267
+
268
+ -filter_complex "[1:a]volume=0.3[music];[0:a][music]amix=inputs=2:duration=first[outa]" \\
269
+
270
+ -map 0:v -map "[outa]" -c:v copy output.mp4
271
+
272
+ ```
273
+
274
+ ### Replace audio entirely
275
+
276
+ ```bash
277
+
278
+ ffmpeg -i video.mp4 -i new_audio.mp3 \\
279
+
280
+ -map 0:v -map 1:a -c:v copy -shortest output.mp4
281
+
282
+ ```
283
+
284
+ ### Extract audio
285
+
286
+ ```bash
287
+
288
+ ffmpeg -i video.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
289
+
290
+ ffmpeg -i video.mp4 -vn -c:a copy output.aac
291
+
292
+ ```
293
+
294
+ ### Remove audio
295
+
296
+ ```bash
297
+
298
+ ffmpeg -i input.mp4 -an -c:v copy output.mp4
299
+
300
+ ```
301
+
302
+ ### Adjust volume
303
+
304
+ ```bash
305
+
306
+ # Set to 50% volume
307
+
308
+ ffmpeg -i input.mp4 -af "volume=0.5" -c:v copy output.mp4
309
+
310
+ # Increase by 10dB
311
+
312
+ ffmpeg -i input.mp4 -af "volume=10dB" -c:v copy output.mp4
313
+
314
+ # Normalize audio
315
+
316
+ ffmpeg -i input.mp4 -af "loudnorm" -c:v copy output.mp4
317
+
318
+ ```
319
+
320
+ ### Audio delay/offset
321
+
322
+ ```bash
323
+
324
+ # Delay audio by 1 second
325
+
326
+ ffmpeg -i input.mp4 -itsoffset 1 -i input.mp4 \\
327
+
328
+ -map 0:v -map 1:a -c copy output.mp4
329
+
330
+ ```
331
+
332
+ ---
333
+
334
+ ## Effects
335
+
336
+ ### Speed change
337
+
338
+ ```bash
339
+
340
+ # 2x speed
341
+
342
+ ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=0.5*PTS[v];[0:a]atempo=2.0[a]" \\
343
+
344
+ -map "[v]" -map "[a]" output.mp4
345
+
346
+ # 0.5x speed (slow motion)
347
+
348
+ ffmpeg -i input.mp4 -filter_complex "[0:v]setpts=2.0*PTS[v];[0:a]atempo=0.5[a]" \\
349
+
350
+ -map "[v]" -map "[a]" output.mp4
351
+
352
+ ```
353
+
354
+ Note: `atempo`only accepts values between 0.5 and 100.0. For extreme slow-motion, chain multiple atempo filters:`atempo=0.5,atempo=0.5` for 0.25x.
355
+
356
+ ### Reverse
357
+
358
+ ```bash
359
+
360
+ ffmpeg -i input.mp4 -vf reverse -af areverse output.mp4
361
+
362
+ ```
363
+
364
+ Warning: `reverse` loads the entire video into memory. Only use on short clips.
365
+
366
+ ### Rotate
367
+
368
+ ```bash
369
+
370
+ # 90 degrees clockwise
371
+
372
+ ffmpeg -i input.mp4 -vf "transpose=1" output.mp4
373
+
374
+ # 90 degrees counter-clockwise
375
+
376
+ ffmpeg -i input.mp4 -vf "transpose=2" output.mp4
377
+
378
+ # 180 degrees
379
+
380
+ ffmpeg -i input.mp4 -vf "transpose=1,transpose=1" output.mp4
381
+
382
+ # Arbitrary angle (in radians)
383
+
384
+ ffmpeg -i input.mp4 -vf "rotate=PI/6" output.mp4
385
+
386
+ ```
387
+
388
+ ### Color adjustments
389
+
390
+ ```bash
391
+
392
+ # Brightness, contrast, saturation
393
+
394
+ ffmpeg -i input.mp4 -vf "eq=brightness=0.1:contrast=1.2:saturation=1.3" output.mp4
395
+
396
+ # Convert to grayscale
397
+
398
+ ffmpeg -i input.mp4 -vf "hue=s=0" output.mp4
399
+
400
+ # Color curves (cinematic look)
401
+
402
+ ffmpeg -i input.mp4 -vf "curves=preset=cross_process" output.mp4
403
+
404
+ ```
405
+
406
+ Available curve presets: `none`, `color_negative`, `cross_process`, `darker`, `increase_contrast`, `lighter`, `linear_contrast`, `medium_contrast`, `negative`, `strong_contrast`, `vintage`
407
+
408
+ ### Blur
409
+
410
+ ```bash
411
+
412
+ # Box blur
413
+
414
+ ffmpeg -i input.mp4 -vf "boxblur=5:1" output.mp4
415
+
416
+ # Gaussian blur
417
+
418
+ ffmpeg -i input.mp4 -vf "gblur=sigma=10" output.mp4
419
+
420
+ ```
421
+
422
+ ### Picture-in-picture
423
+
424
+ ```bash
425
+
426
+ ffmpeg -i main.mp4 -i overlay.mp4 \\
427
+
428
+ -filter_complex "[1:v]scale=320:240[pip];[0:v][pip]overlay=W-w-10:H-h-10" \\
429
+
430
+ output.mp4
431
+
432
+ ```
433
+
434
+ ### Stabilize shaky video
435
+
436
+ ```bash
437
+
438
+ # Step 1: Analyze
439
+
440
+ ffmpeg -i input.mp4 -vf "vidstabdetect=shakiness=5:accuracy=15" -f null -
441
+
442
+ # Step 2: Apply stabilization
443
+
444
+ ffmpeg -i input.mp4 -vf "vidstabtransform=smoothing=10:input=transforms.trf" output.mp4
445
+
446
+ ```
447
+
448
+ ---
449
+
450
+ ## Format Conversion
451
+
452
+ ### MP4 (H.264 + AAC — most compatible)
453
+
454
+ ```bash
455
+
456
+ ffmpeg -i input.webm -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k output.mp4
457
+
458
+ ```
459
+
460
+ CRF values: 18 (high quality, large file) to 28 (lower quality, small file). 23 is a good default.
461
+
462
+ ### WebM (VP9 + Opus — web-optimized)
463
+
464
+ ```bash
465
+
466
+ ffmpeg -i input.mp4 -c:v libvpx-vp9 -crf 30 -b:v 0 -c:a libopus output.webm
467
+
468
+ ```
469
+
470
+ ### MOV (ProRes — editing friendly)
471
+
472
+ ```bash
473
+
474
+ ffmpeg -i input.mp4 -c:v prores_ks -profile:v 3 -c:a pcm_s16le output.mov
475
+
476
+ ```
477
+
478
+ ### Audio only
479
+
480
+ ```bash
481
+
482
+ ffmpeg -i input.mp4 -vn -c:a libmp3lame -q:a 2 output.mp3
483
+
484
+ ffmpeg -i input.mp4 -vn -c:a libopus -b:a 128k output.opus
485
+
486
+ ffmpeg -i input.mp4 -vn -c:a flac output.flac
487
+
488
+ ```
489
+
490
+ ---
491
+
492
+ ## Image Extraction
493
+
494
+ ### Extract a single frame
495
+
496
+ ```bash
497
+
498
+ ffmpeg -i input.mp4 -ss 00:00:05 -frames:v 1 frame.png
499
+
500
+ ```
501
+
502
+ ### Extract frames at interval
503
+
504
+ ```bash
505
+
506
+ # One frame per second
507
+
508
+ ffmpeg -i input.mp4 -vf "fps=1" frames/frame_%04d.png
509
+
510
+ # One frame every 10 seconds
511
+
512
+ ffmpeg -i input.mp4 -vf "fps=1/10" frames/frame_%04d.png
513
+
514
+ ```
515
+
516
+ ### Create a thumbnail sheet (contact sheet)
517
+
518
+ ```bash
519
+
520
+ ffmpeg -i input.mp4 -frames:v 1 -vf "select=not(mod(n\\100)),scale=160:90,tile=5x4" thumbnail.png
521
+
522
+ ```
523
+
524
+ ---
525
+
526
+ ## GIF Creation
527
+
528
+ ### Basic GIF
529
+
530
+ ```bash
531
+
532
+ ffmpeg -i input.mp4 -ss 00:00:02 -t 5 -vf "fps=15,scale=480:-1" output.gif
533
+
534
+ ```
535
+
536
+ ### High-quality GIF with palette
537
+
538
+ ```bash
539
+
540
+ # Step 1: Generate palette
541
+
542
+ ffmpeg -i input.mp4 -ss 2 -t 5 -vf "fps=15,scale=480:-1:flags=lanczos,palettegen" palette.png
543
+
544
+ # Step 2: Use palette for GIF
545
+
546
+ ffmpeg -i input.mp4 -i palette.png -ss 2 -t 5 \\
547
+
548
+ -filter_complex "[0:v]fps=15,scale=480:-1:flags=lanczos[v];[v][1:v]paletteuse" output.gif
549
+
550
+ ```
551
+
552
+ The two-pass palette method produces significantly better GIFs with less banding.
553
+
554
+ ---
555
+
556
+ ## Resizing and Cropping
557
+
558
+ ### Scale to specific dimensions
559
+
560
+ ```bash
561
+
562
+ # Exact size
563
+
564
+ ffmpeg -i input.mp4 -vf "scale=1280:720" -c:a copy output.mp4
565
+
566
+ # Scale width, auto height (maintain aspect ratio)
567
+
568
+ ffmpeg -i input.mp4 -vf "scale=1280:-2" -c:a copy output.mp4
569
+
570
+ # Scale to fit within bounds (maintain aspect ratio)
571
+
572
+ ffmpeg -i input.mp4 -vf "scale='min(1280,iw)':'min(720,ih)':force_original_aspect_ratio=decrease" output.mp4
573
+
574
+ ```
575
+
576
+ ### Crop
577
+
578
+ ```bash
579
+
580
+ # Crop to 1280x720 from center
581
+
582
+ ffmpeg -i input.mp4 -vf "crop=1280:720" -c:a copy output.mp4
583
+
584
+ # Crop with offset (x=100, y=50)
585
+
586
+ ffmpeg -i input.mp4 -vf "crop=1280:720:100:50" -c:a copy output.mp4
587
+
588
+ # Crop to 16:9 from center
589
+
590
+ ffmpeg -i input.mp4 -vf "crop=ih*16/9:ih" -c:a copy output.mp4
591
+
592
+ ```
593
+
594
+ ### Add padding/letterbox
595
+
596
+ ```bash
597
+
598
+ # Add black bars to make 16:9
599
+
600
+ ffmpeg -i input.mp4 -vf "pad=ih*16/9:ih:(ow-iw)/2:(oh-ih)/2:black" output.mp4
601
+
602
+ ```
603
+
604
+ ---
605
+
606
+ ## Watermarks and Overlays
607
+
608
+ ### Image watermark
609
+
610
+ ```bash
611
+
612
+ # Bottom-right corner with padding
613
+
614
+ ffmpeg -i video.mp4 -i watermark.png \\
615
+
616
+ -filter_complex "overlay=W-w-10:H-h-10" output.mp4
617
+
618
+ # With opacity
619
+
620
+ ffmpeg -i video.mp4 -i watermark.png \\
621
+
622
+ -filter_complex "[1:v]format=rgba,colorchannelmixer=aa=0.5[wm];[0:v][wm]overlay=W-w-10:H-h-10" output.mp4
623
+
624
+ ```
625
+
626
+ ### Timed overlay (appears at specific time)
627
+
628
+ ```bash
629
+
630
+ ffmpeg -i video.mp4 -i overlay.png \\
631
+
632
+ -filter_complex "overlay=10:10:enable='between(t,3,8)'" output.mp4
633
+
634
+ ```
635
+
636
+ ---
637
+
638
+ ## Compression
639
+
640
+ Reduce file size while maintaining acceptable quality.
641
+
642
+ ### Quick compress (reduce bitrate)
643
+
644
+ ```bash
645
+
646
+ # Moderate compression — good balance of size vs quality
647
+
648
+ ffmpeg -y -i input.mp4 \\
649
+
650
+ -c:v libx264 -crf 28 -preset medium \\
651
+
652
+ -c:a aac -b:a 96k \\
653
+
654
+ output_compressed.mp4
655
+
656
+ # Aggressive compression — much smaller file, noticeable quality loss
657
+
658
+ ffmpeg -y -i input.mp4 \\
659
+
660
+ -c:v libx264 -crf 32 -preset slow \\
661
+
662
+ -c:a aac -b:a 64k \\
663
+
664
+ output_small.mp4
665
+
666
+ # Target a specific file size (e.g., 25MB for Discord/email)
667
+
668
+ # Calculate bitrate: bitrate = (target_size_MB * 8192) / duration_seconds
669
+
670
+ # For a 60s video targeting 25MB: bitrate = (25 * 8192) / 60 ≈ 3413 kbps
671
+
672
+ ffmpeg -y -i input.mp4 \\
673
+
674
+ -c:v libx264 -b:v 3000k -maxrate 3400k -bufsize 6800k -preset medium \\
675
+
676
+ -c:a aac -b:a 128k \\
677
+
678
+ output_25mb.mp4
679
+
680
+ ```
681
+
682
+ ### Two-pass encoding (best quality at target size)
683
+
684
+ ```bash
685
+
686
+ ffmpeg -y -i input.mp4 \\
687
+
688
+ -c:v libx264 -b:v 2000k -preset medium -pass 1 \\
689
+
690
+ -an -f null /dev/null
691
+
692
+ ffmpeg -y -i input.mp4 \\
693
+
694
+ -c:v libx264 -b:v 2000k -preset medium -pass 2 \\
695
+
696
+ -c:a aac -b:a 128k \\
697
+
698
+ output_2pass.mp4
699
+
700
+ ```
701
+
702
+ ### Reduce resolution for smaller file
703
+
704
+ ```bash
705
+
706
+ # Downscale to 720p (keeps aspect ratio)
707
+
708
+ ffmpeg -y -i input.mp4 \\
709
+
710
+ -vf "scale=-2:720" \\
711
+
712
+ -c:v libx264 -crf 23 -preset medium \\
713
+
714
+ -c:a aac -b:a 128k \\
715
+
716
+ output_720p.mp4
717
+
718
+ # Downscale to 480p
719
+
720
+ ffmpeg -y -i input.mp4 \\
721
+
722
+ -vf "scale=-2:480" \\
723
+
724
+ -c:v libx264 -crf 23 -preset medium \\
725
+
726
+ -c:a aac -b:a 96k \\
727
+
728
+ output_480p.mp4
729
+
730
+ ```
731
+
732
+ **CRF guide:** 18 = visually lossless, 23 = default (good quality), 28 = moderate compression, 32 = heavy compression, 40+ = very low quality. Each +6 roughly halves the file size.
733
+
734
+ ---
735
+
736
+ ## Stabilization
737
+
738
+ Stabilize shaky footage using FFmpeg's vidstab filter (two-pass process).
739
+
740
+ ### Basic stabilization
741
+
742
+ ```bash
743
+
744
+ # Pass 1: Analyze motion (creates transforms.trf)
745
+
746
+ ffmpeg -y -i shaky.mp4 \\
747
+
748
+ -vf vidstabdetect=shakiness=5:accuracy=15:result=transforms.trf \\
749
+
750
+ -f null -
751
+
752
+ # Pass 2: Apply stabilization
753
+
754
+ ffmpeg -y -i shaky.mp4 \\
755
+
756
+ -vf vidstabtransform=input=transforms.trf:smoothing=10:crop=black:zoom=1 \\
757
+
758
+ -c:v libx264 -crf 23 -preset medium \\
759
+
760
+ -c:a copy \\
761
+
762
+ stabilized.mp4
763
+
764
+ ```
765
+
766
+ ### Node.js wrapper
767
+
768
+ ```typescript
769
+
770
+ async function stabilizeVideo(inputPath: string, outputPath: string, smoothing = 10) {
771
+
772
+ const transformsFile = inputPath + '.transforms.trf';
773
+
774
+ // Pass 1: detect motion
775
+
776
+ await execFileAsync('ffmpeg', [
777
+
778
+ '-y', '-i', inputPath,
779
+
780
+ '-vf', `vidstabdetect=shakiness=5:accuracy=15:result=${transformsFile}`,
781
+
782
+ '-f', 'null', '-'
783
+
784
+ ]);
785
+
786
+ // Pass 2: apply stabilization
787
+
788
+ await execFileAsync('ffmpeg', [
789
+
790
+ '-y', '-i', inputPath,
791
+
792
+ '-vf', `vidstabtransform=input=${transformsFile}:smoothing=${smoothing}:crop=black:zoom=1`,
793
+
794
+ '-c:v', 'libx264', '-crf', '23', '-preset', 'medium',
795
+
796
+ '-c:a', 'copy',
797
+
798
+ outputPath
799
+
800
+ ]);
801
+
802
+ await fs.promises.unlink(transformsFile).catch(() => {});
803
+
804
+ }
805
+
806
+ ```
807
+
808
+ ### Parameters
809
+
810
+ - `shakiness`(1-10): How shaky the video is. Default 5, use 8-10 for very shaky footage.
811
+ -`smoothing`(0-30): How much to smooth the camera path. Higher = smoother but may crop more. Default 10.
812
+
813
+ -`zoom` (0-10): Extra zoom to hide black borders from stabilization. 1 = slight zoom, 0 = no zoom (may show borders).
814
+
815
+ ---
816
+
817
+ ## Looping
818
+
819
+ Repeat a clip multiple times.
820
+
821
+ ```bash
822
+
823
+ # Loop a clip 3 times using stream_loop
824
+
825
+ ffmpeg -y -stream_loop 2 -i input.mp4 \\
826
+
827
+ -c copy \\
828
+
829
+ output_looped.mp4
830
+
831
+ # Loop with re-encoding (more reliable for some formats)
832
+
833
+ ffmpeg -y -stream_loop 2 -i input.mp4 \\
834
+
835
+ -c:v libx264 -crf 23 -preset medium \\
836
+
837
+ -c:a aac -b:a 128k \\
838
+
839
+ output_looped.mp4
840
+
841
+ ```
842
+
843
+ **Note:** `-stream_loop 2`means play the input 3 times total (original + 2 loops). Use`-stream_loop 4` for 5 times, etc.
844
+
845
+ ### Create a boomerang effect (forward + reverse)
846
+
847
+ ```bash
848
+
849
+ # Forward then reverse
850
+
851
+ ffmpeg -y -i input.mp4 \\
852
+
853
+ -filter_complex "[0:v]reverse[rv];[0:v][rv]concat=n=2:v=1:a=0[outv]" \\
854
+
855
+ -map "[outv]" \\
856
+
857
+ -c:v libx264 -crf 23 -preset medium \\
858
+
859
+ boomerang.mp4
860
+
861
+ ```
862
+
863
+ ---
864
+
865
+ ## Rotation and Flipping
866
+
867
+ ### Rotate (2)
868
+
869
+ ```bash
870
+
871
+ # Rotate 90 degrees clockwise
872
+
873
+ ffmpeg -y -i input.mp4 \\
874
+
875
+ -vf "transpose=1" \\
876
+
877
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
878
+
879
+ rotated_90.mp4
880
+
881
+ # Rotate 90 degrees counter-clockwise
882
+
883
+ ffmpeg -y -i input.mp4 \\
884
+
885
+ -vf "transpose=2" \\
886
+
887
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
888
+
889
+ rotated_270.mp4
890
+
891
+ # Rotate 180 degrees
892
+
893
+ ffmpeg -y -i input.mp4 \\
894
+
895
+ -vf "transpose=1,transpose=1" \\
896
+
897
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
898
+
899
+ rotated_180.mp4
900
+
901
+ # Rotate by arbitrary angle (e.g., 15 degrees) — adds black borders
902
+
903
+ ffmpeg -y -i input.mp4 \\
904
+
905
+ -vf "rotate=15*PI/180:c=black:ow=rotw(15*PI/180):oh=roth(15*PI/180)" \\
906
+
907
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
908
+
909
+ rotated_15deg.mp4
910
+
911
+ ```
912
+
913
+ ### Flip
914
+
915
+ ```bash
916
+
917
+ # Flip horizontally (mirror)
918
+
919
+ ffmpeg -y -i input.mp4 \\
920
+
921
+ -vf "hflip" \\
922
+
923
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
924
+
925
+ flipped_horizontal.mp4
926
+
927
+ # Flip vertically
928
+
929
+ ffmpeg -y -i input.mp4 \\
930
+
931
+ -vf "vflip" \\
932
+
933
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
934
+
935
+ flipped_vertical.mp4
936
+
937
+ ```
938
+
939
+ **`transpose` values:** 0 = 90° counter-clockwise + vertical flip, 1 = 90° clockwise, 2 = 90° counter-clockwise, 3 = 90° clockwise + vertical flip.
940
+
941
+ ---
942
+
943
+ ## Split Screen
944
+
945
+ Put two or more videos side by side or in a grid.
946
+
947
+ ### Two videos side by side (horizontal)
948
+
949
+ ```bash
950
+
951
+ ffmpeg -y -i left.mp4 -i right.mp4 \\
952
+
953
+ -filter_complex "\\
954
+
955
+ [0:v]scale=640:360[left];\\
956
+
957
+ [1:v]scale=640:360[right];\\
958
+
959
+ [left][right]hstack=inputs=2[outv]" \\
960
+
961
+ -map "[outv]" -map 0:a? \\
962
+
963
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
964
+
965
+ split_screen.mp4
966
+
967
+ ```
968
+
969
+ ### Two videos stacked (vertical)
970
+
971
+ ```bash
972
+
973
+ ffmpeg -y -i top.mp4 -i bottom.mp4 \\
974
+
975
+ -filter_complex "\\
976
+
977
+ [0:v]scale=1080:540[top];\\
978
+
979
+ [1:v]scale=1080:540[bottom];\\
980
+
981
+ [top][bottom]vstack=inputs=2[outv]" \\
982
+
983
+ -map "[outv]" -map 0:a? \\
984
+
985
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
986
+
987
+ stacked.mp4
988
+
989
+ ```
990
+
991
+ ### 2x2 grid (four videos)
992
+
993
+ ```bash
994
+
995
+ ffmpeg -y -i v1.mp4 -i v2.mp4 -i v3.mp4 -i v4.mp4 \\
996
+
997
+ -filter_complex "\\
998
+
999
+ [0:v]scale=540:360[a];[1:v]scale=540:360[b];\\
1000
+
1001
+ [2:v]scale=540:360[c];[3:v]scale=540:360[d];\\
1002
+
1003
+ [a][b]hstack=inputs=2[top];\\
1004
+
1005
+ [c][d]hstack=inputs=2[bottom];\\
1006
+
1007
+ [top][bottom]vstack=inputs=2[outv]" \\
1008
+
1009
+ -map "[outv]" -map 0:a? \\
1010
+
1011
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1012
+
1013
+ grid_2x2.mp4
1014
+
1015
+ ```
1016
+
1017
+ ### Picture-in-picture (2)
1018
+
1019
+ ```bash
1020
+
1021
+ # Small video in bottom-right corner (25% size)
1022
+
1023
+ ffmpeg -y -i main.mp4 -i pip.mp4 \\
1024
+
1025
+ -filter_complex "\\
1026
+
1027
+ [1:v]scale=iw/4:ih/4[pip];\\
1028
+
1029
+ [0:v][pip]overlay=W-w-20:H-h-20[outv]" \\
1030
+
1031
+ -map "[outv]" -map 0:a \\
1032
+
1033
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1034
+
1035
+ pip_output.mp4
1036
+
1037
+ # PiP with rounded corners (border radius)
1038
+
1039
+ ffmpeg -y -i main.mp4 -i pip.mp4 \\
1040
+
1041
+ -filter_complex "\\
1042
+
1043
+ [1:v]scale=320:180,format=yuva420p,\\
1044
+
1045
+ geq='lum=lum(X,Y):a=if(gt(abs(X-W/2),W/2-10)*gt(abs(Y-H/2),H/2-10),0,255)'[pip];\\
1046
+
1047
+ [0:v][pip]overlay=W-w-20:H-h-20[outv]" \\
1048
+
1049
+ -map "[outv]" -map 0:a \\
1050
+
1051
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1052
+
1053
+ pip_rounded.mp4
1054
+
1055
+ ```
1056
+
1057
+ ---
1058
+
1059
+ ## Muting and Audio Removal
1060
+
1061
+ ```bash
1062
+
1063
+ # Remove audio track entirely
1064
+
1065
+ ffmpeg -y -i input.mp4 -an \\
1066
+
1067
+ -c:v copy \\
1068
+
1069
+ output_muted.mp4
1070
+
1071
+ # Replace audio with silence (keeps audio stream but silent)
1072
+
1073
+ ffmpeg -y -i input.mp4 \\
1074
+
1075
+ -f lavfi -i anullsrc=channel_layout=stereo:sample_rate=44100 \\
1076
+
1077
+ -c:v copy -c:a aac -shortest \\
1078
+
1079
+ output_silent.mp4
1080
+
1081
+ # Keep only audio (extract as MP3)
1082
+
1083
+ ffmpeg -y -i input.mp4 \\
1084
+
1085
+ -vn -c:a libmp3lame -q:a 2 \\
1086
+
1087
+ audio_only.mp3
1088
+
1089
+ # Keep only audio (extract as AAC/M4A)
1090
+
1091
+ ffmpeg -y -i input.mp4 \\
1092
+
1093
+ -vn -c:a copy \\
1094
+
1095
+ audio_only.m4a
1096
+
1097
+ ```
1098
+
1099
+ ---
1100
+
1101
+ ## Thumbnail Generation
1102
+
1103
+ Extract a single frame as an image file.
1104
+
1105
+ ```bash
1106
+
1107
+ # Frame at a specific timestamp
1108
+
1109
+ ffmpeg -y -ss 00:00:05 -i input.mp4 \\
1110
+
1111
+ -frames:v 1 -q:v 2 \\
1112
+
1113
+ thumbnail.jpg
1114
+
1115
+ # Frame at 25% through the video
1116
+
1117
+ # (calculate timestamp from duration first with ffprobe)
1118
+
1119
+ ffmpeg -y -ss 30 -i input.mp4 \\
1120
+
1121
+ -frames:v 1 -q:v 2 \\
1122
+
1123
+ thumbnail_mid.jpg
1124
+
1125
+ # Multiple thumbnails at regular intervals (e.g., every 10 seconds)
1126
+
1127
+ ffmpeg -y -i input.mp4 \\
1128
+
1129
+ -vf "fps=1/10" -q:v 2 \\
1130
+
1131
+ thumbnails_%03d.jpg
1132
+
1133
+ # Best quality PNG thumbnail
1134
+
1135
+ ffmpeg -y -ss 00:00:05 -i input.mp4 \\
1136
+
1137
+ -frames:v 1 \\
1138
+
1139
+ thumbnail.png
1140
+
1141
+ ```
1142
+
1143
+ ### Node.js: Smart thumbnail (pick the most interesting frame)
1144
+
1145
+ ```typescript
1146
+
1147
+ async function generateThumbnail(
1148
+
1149
+ videoPath: string,
1150
+
1151
+ outputPath: string,
1152
+
1153
+ timestamp?: number
1154
+
1155
+ ): Promise<string> {
1156
+
1157
+ if (timestamp === undefined) {
1158
+
1159
+ // Default to 25% through the video — usually more interesting than the first frame
1160
+
1161
+ const { stdout } = await execFileAsync('ffprobe', [
1162
+
1163
+ '-v', 'quiet', '-print_format', 'json', '-show_format', videoPath
1164
+
1165
+ ]);
1166
+
1167
+ const duration = parseFloat(JSON.parse(stdout).format.duration);
1168
+
1169
+ timestamp = duration * 0.25;
1170
+
1171
+ }
1172
+
1173
+ await execFileAsync('ffmpeg', [
1174
+
1175
+ '-y', '-ss', timestamp.toFixed(3), '-i', videoPath,
1176
+
1177
+ '-frames:v', '1', '-q:v', '2',
1178
+
1179
+ outputPath
1180
+
1181
+ ]);
1182
+
1183
+ return outputPath;
1184
+
1185
+ }
1186
+
1187
+ ```
1188
+
1189
+ ---
1190
+
1191
+ ## Watermark Removal (Crop)
1192
+
1193
+ Remove a watermark by cropping it out. This is the only reliable FFmpeg approach — there is no "inpainting" filter.
1194
+
1195
+ ```bash
1196
+
1197
+ # Crop out a watermark in the bottom-right corner
1198
+
1199
+ # Removes 60px from the bottom and 120px from the right
1200
+
1201
+ ffmpeg -y -i input.mp4 \\
1202
+
1203
+ -vf "crop=iw-120:ih-60:0:0" \\
1204
+
1205
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1206
+
1207
+ output_no_watermark.mp4
1208
+
1209
+ # Crop out a watermark at the top-left
1210
+
1211
+ # Removes 80px from the top and 200px from the left
1212
+
1213
+ ffmpeg -y -i input.mp4 \\
1214
+
1215
+ -vf "crop=iw-200:ih-80:200:80" \\
1216
+
1217
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1218
+
1219
+ output_no_watermark.mp4
1220
+
1221
+ # Crop + scale back to original resolution (fills the gap)
1222
+
1223
+ ffmpeg -y -i input.mp4 \\
1224
+
1225
+ -vf "crop=iw-120:ih-60:0:0,scale=1920:1080" \\
1226
+
1227
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1228
+
1229
+ output_cleaned.mp4
1230
+
1231
+ ```
1232
+
1233
+ **Crop filter syntax:** `crop=out_w:out_h:x:y` — output width, output height, x offset from left, y offset from top.
1234
+
1235
+ **Note:** Cropping changes the aspect ratio/resolution. If the user needs the original dimensions, scale back up after cropping, though this may introduce slight softness.
1236
+
1237
+ ---
1238
+
1239
+ ## Logo Overlay (Branding)
1240
+
1241
+ Add a persistent logo/brand image to a video.
1242
+
1243
+ ```bash
1244
+
1245
+ # Logo in the top-left corner with padding
1246
+
1247
+ ffmpeg -y -i video.mp4 -i logo.png \\
1248
+
1249
+ -filter_complex "overlay=20:20" \\
1250
+
1251
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1252
+
1253
+ branded.mp4
1254
+
1255
+ # Logo in the bottom-right corner
1256
+
1257
+ ffmpeg -y -i video.mp4 -i logo.png \\
1258
+
1259
+ -filter_complex "overlay=W-w-20:H-h-20" \\
1260
+
1261
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1262
+
1263
+ branded.mp4
1264
+
1265
+ # Logo with transparency (50% opacity)
1266
+
1267
+ ffmpeg -y -i video.mp4 -i logo.png \\
1268
+
1269
+ -filter_complex "[1:v]format=rgba,colorchannelmixer=aa=0.5[logo];[0:v][logo]overlay=W-w-20:20" \\
1270
+
1271
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1272
+
1273
+ branded_subtle.mp4
1274
+
1275
+ # Logo scaled to a specific size (e.g., 100px wide, keep aspect ratio)
1276
+
1277
+ ffmpeg -y -i video.mp4 -i logo.png \\
1278
+
1279
+ -filter_complex "[1:v]scale=100:-1[logo];[0:v][logo]overlay=W-w-20:20" \\
1280
+
1281
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1282
+
1283
+ branded_small.mp4
1284
+
1285
+ # Logo that appears only during the first 5 seconds
1286
+
1287
+ ffmpeg -y -i video.mp4 -i logo.png \\
1288
+
1289
+ -filter_complex "[1:v]scale=100:-1[logo];[0:v][logo]overlay=20:20:enable='between(t,0,5)'" \\
1290
+
1291
+ -c:v libx264 -crf 23 -preset medium -c:a copy \\
1292
+
1293
+ branded_intro.mp4
1294
+
1295
+ ```
1296
+
1297
+ ### Overlay position shortcuts
1298
+
1299
+ - Top-left: `overlay=20:20`
1300
+ - Top-right: `overlay=W-w-20:20`
1301
+
1302
+ - Bottom-left: `overlay=20:H-h-20`
1303
+ - Bottom-right: `overlay=W-w-20:H-h-20`
1304
+
1305
+ - Center: `overlay=(W-w)/2:(H-h)/2`
1306
+
1307
+ ---
1308
+
1309
+ ## Social Media Reframing
1310
+
1311
+ Reframe videos for different platforms with the correct aspect ratio and resolution.
1312
+
1313
+ ### Platform Reference
1314
+
1315
+ | Platform | Aspect Ratio | Resolution | Duration | Codec |
1316
+
1317
+ |----------|-------------|------------|----------|-------|
1318
+
1319
+ | TikTok | 9:16 | 1080×1920 | 10–45s | H.264 |
1320
+
1321
+ | Instagram Reels | 9:16 | 1080×1920 | 10–30s | H.264 |
1322
+
1323
+ | Instagram Stories | 9:16 | 1080×1920 | 1–60s | H.264 |
1324
+
1325
+ | Instagram Feed | 1:1 or 4:5 | 1080×1080 or 1080×1350 | 3–60s | H.264 |
1326
+
1327
+ | YouTube Shorts | 9:16 | 1080×1920 | 15–60s | H.264 |
1328
+
1329
+ | YouTube (standard) | 16:9 | 1920×1080 | any | H.264 |
1330
+
1331
+ | X / Twitter | 16:9 | 1280×720 | 10–45s | H.264 |
1332
+
1333
+ | X / Twitter (square) | 1:1 | 720×720 | 10–45s | H.264 |
1334
+
1335
+ | Facebook Reels | 9:16 | 1080×1920 | 10–30s | H.264 |
1336
+
1337
+ | Facebook Feed | 16:9 or 1:1 | 1920×1080 or 1080×1080 | any | H.264 |
1338
+
1339
+ | LinkedIn | 16:9 or 1:1 | 1920×1080 or 1080×1080 | 10–60s | H.264 |
1340
+
1341
+ | Pinterest | 9:16 or 2:3 | 1080×1920 or 1000×1500 | 6–60s | H.264 |
1342
+
1343
+ | Snapchat Spotlight | 9:16 | 1080×1920 | 5–60s | H.264 |
1344
+
1345
+ ### Strategy selection by conversion type
1346
+
1347
+ - **Landscape → Vertical (9:16):** Use blurred fill (Strategy 3) — looks polished on TikTok/Reels/Shorts
1348
+ - **Landscape → Square (1:1):** Use blurred fill or center crop depending on framing
1349
+
1350
+ - **Vertical → Landscape (16:9):** Use blurred fill to avoid large black bars
1351
+ - **Same orientation:** Use center crop or scale directly
1352
+
1353
+ - **4:5 portrait (Instagram Feed):** Use letterbox or blurred fill from 16:9
1354
+
1355
+ ### Strategy 1: Center Crop
1356
+
1357
+ Crops from the center to fill the target ratio. Best when the subject is center-framed.
1358
+
1359
+ ```bash
1360
+
1361
+ # 16:9 landscape → 9:16 vertical (TikTok/Reels) — center crop
1362
+
1363
+ ffmpeg -y -i input.mp4 \\
1364
+
1365
+ -vf "crop=ih*9/16:ih,scale=1080:1920" \\
1366
+
1367
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1368
+
1369
+ output_tiktok.mp4
1370
+
1371
+ # 16:9 landscape → 1:1 square (Instagram) — center crop
1372
+
1373
+ ffmpeg -y -i input.mp4 \\
1374
+
1375
+ -vf "crop=ih:ih,scale=1080:1080" \\
1376
+
1377
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1378
+
1379
+ output_instagram.mp4
1380
+
1381
+ # 9:16 vertical → 16:9 landscape — center crop
1382
+
1383
+ ffmpeg -y -i input.mp4 \\
1384
+
1385
+ -vf "crop=iw:iw*9/16,scale=1920:1080" \\
1386
+
1387
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1388
+
1389
+ output_youtube.mp4
1390
+
1391
+ # 9:16 vertical → 1:1 square — center crop
1392
+
1393
+ ffmpeg -y -i input.mp4 \\
1394
+
1395
+ -vf "crop=iw:iw,scale=1080:1080" \\
1396
+
1397
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1398
+
1399
+ output_square.mp4
1400
+
1401
+ ```
1402
+
1403
+ ### Strategy 2: Letterbox / Pillarbox (black bars)
1404
+
1405
+ Fits the entire video inside the target frame with black bars filling the gaps. No content is lost.
1406
+
1407
+ ```bash
1408
+
1409
+ # 16:9 → 9:16 with black bars (pillarbox)
1410
+
1411
+ ffmpeg -y -i input.mp4 \\
1412
+
1413
+ -vf "scale=1080:-2,pad=1080:1920:(ow-iw)/2:(oh-ih)/2:black" \\
1414
+
1415
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1416
+
1417
+ output_tiktok_letterbox.mp4
1418
+
1419
+ # 16:9 → 1:1 with black bars
1420
+
1421
+ ffmpeg -y -i input.mp4 \\
1422
+
1423
+ -vf "scale=1080:-2,pad=1080:1080:(ow-iw)/2:(oh-ih)/2:black" \\
1424
+
1425
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1426
+
1427
+ output_square_letterbox.mp4
1428
+
1429
+ # 9:16 → 16:9 with black bars (pillarbox)
1430
+
1431
+ ffmpeg -y -i input.mp4 \\
1432
+
1433
+ -vf "scale=-2:1080,pad=1920:1080:(ow-iw)/2:(oh-ih)/2:black" \\
1434
+
1435
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1436
+
1437
+ output_youtube_letterbox.mp4
1438
+
1439
+ ```
1440
+
1441
+ ### Strategy 3: Blurred Fill (recommended for landscape → portrait)
1442
+
1443
+ Uses a blurred, scaled-up version of the video as background behind the original. Looks much more polished than black bars, especially for landscape-to-portrait conversion.
1444
+
1445
+ ```bash
1446
+
1447
+ # 16:9 → 9:16 with blurred background fill (best for TikTok/Reels)
1448
+
1449
+ ffmpeg -y -i input.mp4 \\
1450
+
1451
+ -filter_complex "\\
1452
+
1453
+ [0:v]scale=1080:1920:force_original_aspect_ratio=increase,crop=1080:1920,gblur=sigma=50[bg];\\
1454
+
1455
+ [0:v]scale=1080:1920:force_original_aspect_ratio=decrease[fg];\\
1456
+
1457
+ [bg][fg]overlay=(W-w)/2:(H-h)/2[outv]" \\
1458
+
1459
+ -map "[outv]" -map 0:a? \\
1460
+
1461
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1462
+
1463
+ output_tiktok_blur.mp4
1464
+
1465
+ # 16:9 → 1:1 with blurred background fill
1466
+
1467
+ ffmpeg -y -i input.mp4 \\
1468
+
1469
+ -filter_complex "\\
1470
+
1471
+ [0:v]scale=1080:1080:force_original_aspect_ratio=increase,crop=1080:1080,gblur=sigma=50[bg];\\
1472
+
1473
+ [0:v]scale=1080:1080:force_original_aspect_ratio=decrease[fg];\\
1474
+
1475
+ [bg][fg]overlay=(W-w)/2:(H-h)/2[outv]" \\
1476
+
1477
+ -map "[outv]" -map 0:a? \\
1478
+
1479
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1480
+
1481
+ output_square_blur.mp4
1482
+
1483
+ # 9:16 → 16:9 with blurred background fill
1484
+
1485
+ ffmpeg -y -i input.mp4 \\
1486
+
1487
+ -filter_complex "\\
1488
+
1489
+ [0:v]scale=1920:1080:force_original_aspect_ratio=increase,crop=1920:1080,gblur=sigma=50[bg];\\
1490
+
1491
+ [0:v]scale=1920:1080:force_original_aspect_ratio=decrease[fg];\\
1492
+
1493
+ [bg][fg]overlay=(W-w)/2:(H-h)/2[outv]" \\
1494
+
1495
+ -map "[outv]" -map 0:a? \\
1496
+
1497
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1498
+
1499
+ output_youtube_blur.mp4
1500
+
1501
+ # 16:9 → 4:5 portrait with blurred fill (Instagram Feed — preferred over 1:1)
1502
+
1503
+ ffmpeg -y -i input.mp4 \\
1504
+
1505
+ -filter_complex "\\
1506
+
1507
+ [0:v]scale=1080:1350:force_original_aspect_ratio=increase,crop=1080:1350,gblur=sigma=50[bg];\\
1508
+
1509
+ [0:v]scale=1080:1350:force_original_aspect_ratio=decrease[fg];\\
1510
+
1511
+ [bg][fg]overlay=(W-w)/2:(H-h)/2[outv]" \\
1512
+
1513
+ -map "[outv]" -map 0:a? \\
1514
+
1515
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1516
+
1517
+ output_instagram_feed_4x5.mp4
1518
+
1519
+ # 16:9 → 2:3 portrait with blurred fill (Pinterest)
1520
+
1521
+ ffmpeg -y -i input.mp4 \\
1522
+
1523
+ -filter_complex "\\
1524
+
1525
+ [0:v]scale=1000:1500:force_original_aspect_ratio=increase,crop=1000:1500,gblur=sigma=50[bg];\\
1526
+
1527
+ [0:v]scale=1000:1500:force_original_aspect_ratio=decrease[fg];\\
1528
+
1529
+ [bg][fg]overlay=(W-w)/2:(H-h)/2[outv]" \\
1530
+
1531
+ -map "[outv]" -map 0:a? \\
1532
+
1533
+ -c:v libx264 -crf 23 -preset medium -c:a aac -b:a 128k \\
1534
+
1535
+ output_pinterest_blur.mp4
1536
+
1537
+ ```
1538
+
1539
+ ### Multi-platform Export (Node.js)
1540
+
1541
+ Export to all platforms in one go:
1542
+
1543
+ ```typescript
1544
+
1545
+ import { execFile } from 'child_process';
1546
+
1547
+ import { promisify } from 'util';
1548
+
1549
+ import * as path from 'path';
1550
+
1551
+ const execFileAsync = promisify(execFile);
1552
+
1553
+ interface PlatformSpec {
1554
+
1555
+ name: string;
1556
+
1557
+ width: number;
1558
+
1559
+ height: number;
1560
+
1561
+ suffix: string;
1562
+
1563
+ }
1564
+
1565
+ const PLATFORMS: Record<string, PlatformSpec> = {
1566
+
1567
+ tiktok: { name: 'TikTok', width: 1080, height: 1920, suffix: 'tiktok' },
1568
+
1569
+ instagram_reels: { name: 'Instagram Reels', width: 1080, height: 1920, suffix: 'ig_reels' },
1570
+
1571
+ reels: { name: 'Instagram Reels', width: 1080, height: 1920, suffix: 'ig_reels' },
1572
+
1573
+ instagram_stories: { name: 'Instagram Stories', width: 1080, height: 1920, suffix: 'ig_stories' },
1574
+
1575
+ instagram_feed: { name: 'Instagram Feed', width: 1080, height: 1080, suffix: 'ig_feed' },
1576
+
1577
+ instagram_feed_45: { name: 'Instagram Feed 4:5', width: 1080, height: 1350, suffix: 'ig_feed_4x5' },
1578
+
1579
+ youtube_shorts: { name: 'YouTube Shorts', width: 1080, height: 1920, suffix: 'yt_shorts' },
1580
+
1581
+ shorts: { name: 'YouTube Shorts', width: 1080, height: 1920, suffix: 'yt_shorts' },
1582
+
1583
+ youtube: { name: 'YouTube', width: 1920, height: 1080, suffix: 'youtube' },
1584
+
1585
+ twitter: { name: 'X / Twitter', width: 1280, height: 720, suffix: 'twitter' },
1586
+
1587
+ x: { name: 'X / Twitter', width: 1280, height: 720, suffix: 'twitter' },
1588
+
1589
+ twitter_sq: { name: 'X / Twitter Square', width: 720, height: 720, suffix: 'twitter_sq' },
1590
+
1591
+ facebook_reels: { name: 'Facebook Reels', width: 1080, height: 1920, suffix: 'fb_reels' },
1592
+
1593
+ facebook_feed: { name: 'Facebook Feed', width: 1920, height: 1080, suffix: 'fb_feed' },
1594
+
1595
+ linkedin: { name: 'LinkedIn', width: 1920, height: 1080, suffix: 'linkedin' },
1596
+
1597
+ pinterest: { name: 'Pinterest', width: 1080, height: 1920, suffix: 'pinterest' },
1598
+
1599
+ pinterest_2x3: { name: 'Pinterest 2:3', width: 1000, height: 1500, suffix: 'pinterest_2x3' },
1600
+
1601
+ snapchat: { name: 'Snapchat Spotlight', width: 1080, height: 1920, suffix: 'snapchat' },
1602
+
1603
+ };
1604
+
1605
+ async function reframeForPlatform(
1606
+
1607
+ inputPath: string,
1608
+
1609
+ platform: PlatformSpec,
1610
+
1611
+ outputDir: string,
1612
+
1613
+ strategy: 'crop' | 'letterbox' | 'blur' = 'blur'
1614
+
1615
+ ): Promise<string> {
1616
+
1617
+ const ext = path.extname(inputPath);
1618
+
1619
+ const base = path.basename(inputPath, ext);
1620
+
1621
+ const outputPath = path.join(outputDir, `${base}_${platform.suffix}${ext}`);
1622
+
1623
+ const { width, height } = platform;
1624
+
1625
+ let filterComplex: string;
1626
+
1627
+ switch (strategy) {
1628
+
1629
+ case 'crop':
1630
+
1631
+ filterComplex = `scale=${width}:${height}:force_original_aspect_ratio=increase,crop=${width}:${height}`;
1632
+
1633
+ break;
1634
+
1635
+ case 'letterbox':
1636
+
1637
+ filterComplex = `scale=${width}:${height}:force_original_aspect_ratio=decrease,pad=${width}:${height}:(ow-iw)/2:(oh-ih)/2:black`;
1638
+
1639
+ break;
1640
+
1641
+ case 'blur':
1642
+
1643
+ filterComplex = [
1644
+
1645
+ `[0:v]scale=${width}:${height}:force_original_aspect_ratio=increase,crop=${width}:${height},gblur=sigma=50[bg]`,
1646
+
1647
+ `[0:v]scale=${width}:${height}:force_original_aspect_ratio=decrease[fg]`,
1648
+
1649
+ `[bg][fg]overlay=(W-w)/2:(H-h)/2[outv]`
1650
+
1651
+ ].join(';');
1652
+
1653
+ break;
1654
+
1655
+ }
1656
+
1657
+ const args = ['-y', '-i', inputPath];
1658
+
1659
+ if (strategy === 'blur') {
1660
+
1661
+ args.push('-filter_complex', filterComplex, '-map', '[outv]', '-map', '0:a?');
1662
+
1663
+ } else {
1664
+
1665
+ args.push('-vf', filterComplex);
1666
+
1667
+ }
1668
+
1669
+ args.push(
1670
+
1671
+ '-c:v', 'libx264', '-crf', '23', '-preset', 'medium',
1672
+
1673
+ '-c:a', 'aac', '-b:a', '128k',
1674
+
1675
+ outputPath
1676
+
1677
+ );
1678
+
1679
+ await execFileAsync('ffmpeg', args);
1680
+
1681
+ return outputPath;
1682
+
1683
+ }
1684
+
1685
+ async function exportAllPlatforms(
1686
+
1687
+ inputPath: string,
1688
+
1689
+ outputDir: string,
1690
+
1691
+ platforms: string[] = ['youtube', 'tiktok', 'instagram', 'twitter'],
1692
+
1693
+ strategy: 'crop' | 'letterbox' | 'blur' = 'blur'
1694
+
1695
+ ) {
1696
+
1697
+ const results: Array<{ platform: string; path: string }> = [];
1698
+
1699
+ for (const key of platforms) {
1700
+
1701
+ const spec = PLATFORMS[key];
1702
+
1703
+ if (!spec) continue;
1704
+
1705
+ console.log(`Reframing for ${spec.name} (${spec.width}x${spec.height})...`);
1706
+
1707
+ const outPath = await reframeForPlatform(inputPath, spec, outputDir, strategy);
1708
+
1709
+ results.push({ platform: spec.name, path: outPath });
1710
+
1711
+ console.log(` → ${outPath}`);
1712
+
1713
+ }
1714
+
1715
+ return results;
1716
+
1717
+ }
1718
+
1719
+ ```