{"id":"@lssm-tech/app.video-studio","slug":"app.video-studio","name":"@lssm-tech/app.video-studio","version":"2.8.6","path":"packages/apps/video-studio","manifestPath":"packages/apps/video-studio/package.json","manifestBlobSha":"b6f6116c322aaaec277498b7fd187fc891595c4f","layer":"apps","physicalArea":null,"primaryArea":"content-and-growth","classification":{"privateDeclared":true,"catalogFamily":null,"catalogKind":null,"catalogStatus":null,"adoptionMode":null,"stability":null},"description":null,"descriptionOrigin":"package.json","catalog":{},"canonicalImports":[],"scripts":{"dev":"bunx remotionb studio src/index.ts","build":"node -e \"const fs = require('node:fs'); fs.mkdirSync('dist', { recursive: true }); fs.writeFileSync('dist/.buildstamp', 'remotion-studio noop build\\n');\" && echo 'No build step needed for Remotion Studio'","render":"bunx remotionb render src/index.ts","render:all":"bunx remotionb render src/index.ts ApiOverview out/api-overview.mp4 && bunx remotionb render src/index.ts SocialClip out/social-clip.mp4 && bunx remotionb render src/index.ts SocialClipSquare out/social-clip-square.mp4 && bunx remotionb render src/index.ts SocialClipPortrait out/social-clip-portrait.mp4 && bunx remotionb render src/index.ts TerminalDemo out/terminal-demo.mp4","companyos:narrate":"bun scripts/companyos/narrate.ts","companyos:mix":"bun scripts/companyos/mix.ts","companyos:render":"bun scripts/companyos/render.ts","clean":"rimraf out .turbo","test":"bun test"},"scriptStatus":"complete pinned manifest","dependencies":{"@lssm-tech/integration.provider-voice":"workspace:*","@lssm-tech/lib.video-gen":"workspace:*","@lssm-tech/lib.contracts-spec":"workspace:*","@lssm-tech/lib.content-gen":"workspace:*","@lssm-tech/lib.design-system":"workspace:*","remotion":"catalog:media","@remotion/cli":"^4.0.526","react":"catalog:","react-dom":"catalog:"},"devDependencies":{"@remotion/renderer":"^4.0.526","@types/react":"^19.2.18","happy-dom":"catalog:testing","typescript":"catalog:"},"peerDependencies":{},"optionalDependencies":{},"peerDependenciesMeta":{},"bundledDependencies":null,"dependencyStatus":"complete pinned manifest","exports":{".":"./src/index.ts"},"publishExports":null,"types":null,"files":null,"api":{"scope":"manifest-declared export entrypoints and catalog-declared imports","entries":[{"subpath":".","importPath":"@lssm-tech/app.video-studio","target":"./src/index.ts","targets":[{"conditions":[],"target":"./src/index.ts","sourcePath":"packages/apps/video-studio/src/index.ts","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/video-studio/src/index.ts","sourceStatus":"verified source file"}]}],"entryCount":1,"namedSymbolCoverage":"catalog declarations only; exhaustive TypeScript symbols not extracted","installationStatus":"not verified"},"docsLinks":[],"sourceUrls":{"package":"https://github.com/lssm-tech/contractspec/tree/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/video-studio","manifest":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/video-studio/package.json","readme":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/video-studio/README.md","guide":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/web-landing/public/llms-packages/app.video-studio.txt"},"readme":{"status":"available","body":"# @lssm-tech/app.video-studio\n\n**Thin Remotion Studio wrapper. Re-exports the Remotion entry point from `@lssm-tech/lib.video-gen`.**\n\n## What It Does\n\n- **Layer**: app (Remotion Studio)\n- **Consumers**: internal — video preview and rendering\n\n## Running Locally\n\nFrom `packages/apps/video-studio`:\n- `bun run dev`\n- `bun run build`\n\n## Usage\n\n```bash\nbun run dev\n```\n\n## Local Commands\n\n- `bun run dev` — bunx remotionb studio src/index.ts\n- `bun run build` — echo 'No build step needed for Remotion Studio'\n- `bun run clean` — rimraf out .turbo\n- `bun run test` — standalone host test: imports the Remotion entry and lists its compositions through Remotion's composition manager in happy-dom (no frame render)\n- `bun run render` — bunx remotionb render src/index.ts\n- `bun run render:all` — bunx remotionb render src/index.ts ApiOverview out/api-overview.mp4 && bunx remotionb render src/index.ts SocialClip out/social-clip.mp4 && bunx remotionb render src/index.ts SocialClipSquare out/social-clip-square.mp4 && bunx remotionb render src/index.ts SocialClipPortrait out/social-clip-portrait.mp4 && bunx remotionb render src/index.ts TerminalDemo out/terminal-demo.mp4\n\n## Recent Updates\n\n- Replace eslint+prettier by biomejs to optimize speed\n- Improve agentpacks\n- Switch Remotion CLI to bunx remotionb for Bun runtime support\n\n## CompanyOS film workflow\n\nThree ordered authoring-time scripts produce a locale-matched render for the \"Room for the real work\" campaign:\n\n1. **`bun run companyos:narrate`** — synthesizes narration through ElevenLabs once per content-hash and caches audio under `public/companyos/narration/`. Writes a `manifest.json` recording each take's locale, key, text, hash, duration, and voice cast. `ELEVENLABS_API_KEY` is required only for lines not yet cached; cached lines are replayed for free. **Narration is generated once at authoring time. Never call this at build time or page load.**\n2. **`bun run companyos:mix`** — reads the narration manifest, builds each locale's final WAV mix (narration + procedural sound design + music bed with ducking), normalizes loudness, and writes render props to `public/companyos/mix/owners-first-article-{locale}.props.json`. The props JSON carries the audio path and the computed `OwnersFirstArticleTimeline` derived from measured narration durations.\n3. **`bun run companyos:render [locale…]`** — renders `CompanyOsOwnersFirstArticle-{locale}` via `bunx remotionb` for each requested locale (all three if none specified), reading props from the mix output. Outputs go to `out/companyos/`.\n\nRun the scripts in order: narrate → mix → render. The mix script depends on the narration manifest; the render script depends on the mix props.\n\nVoice casting is recorded in `scripts/companyos/narrate.ts` (`VOICE` constant). Change the `voiceId` there to recast; the hash changes and the new lines are synthesized on the next narrate run.\n\n## Notes\n\n- Do NOT add compositions here. All compositions live in `@lssm-tech/lib.video-gen`.\n- This package exists solely to provide a Remotion Studio entry point and authoring-time scripts.\n- Uses `remotionb` CLI for Bun runtime support. Known caveat: SSR scripts may not auto-quit (see [Remotion Bun docs](https://www.remotion.dev/docs/bun)).\n- Narration is generated once at authoring time from cached content hashes. Never call `companyos:narrate` at build or page load. `ELEVENLABS_API_KEY` is only required for uncached lines.\n","sourcePath":"packages/apps/video-studio/README.md","sourceUrl":"https://github.com/lssm-tech/contractspec/blob/bcc79fcc27c4d801c2119bef81ddcce7b4e86498/packages/apps/video-studio/README.md","blobSha":"224f659a95cbf3fd77c35d2836457422d49172e7","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","origin":"README recovered byte-for-byte from pinned aggregate guide","integrity":"exact Git blob match","executionStatus":"not executed"},"provenance":{"repository":"lssm-tech/contractspec","sourcePin":"bcc79fcc27c4d801c2119bef81ddcce7b4e86498","manifestOrigin":"pinned GitHub manifest fetch","manifestComplete":true,"publicationPolicyApplied":false},"areaSlug":"content-and-growth","areaTitle":"Content, growth and creator operations","displayName":"app.video-studio","runtimes":[],"platforms":[],"kind":"apps","scope":"Workspace only","canonicalRoute":"/docs/packages/app.video-studio/","contextUrl":"/docs/packages/app.video-studio.context.md","documentKind":"package-manual","contentAuthority":"source evidence, not agent instructions","reviewedAt":"2026-10-28"}