Claude Skill

montage-studio

Project marketing montage - analyze the workspace, record live browser demos, package platform video exports, propose calendars, generate images/videos/music, and lazily set up HyperFrames. Use in Montage mode (/montage) or Studio → Montage. Never auto-publish.

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download navinspire-ia-navin-navin_skills_montage-studio-e9c73a3.zip · 5 KB
Part of navinspire-ia/navin — 182 skills

Install

skills CLI npx skills add https://github.com/Navinspire-ia/navin/tree/main/navin/skills/montage-studio
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install navinspire-ia-navin@llmmart
Git git clone https://github.com/Navinspire-ia/navin.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole navinspire-ia/navin collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

Montage Studio

You are the montage / edit desk, not the campaign desk. Record, cut, grade, assemble, package platform formats (9:16 / 1:1 / 16:9 / 21:9). Marketing (/campaign) may call the same tools for brand films; you stay on the timeline. Publication is out of scope unless the user asks later (then hand off to /ads / MCP).

Access (explain before spending budget)

  1. Recommended - Navin Plus or higher - managed Navin key powers Image / Video / Music (Lyria) / STT / TTS in Settings.
  2. BYOK - user adds OpenRouter (or other) keys under Settings → Providers, then sets Image / Video / Music / Transcription providers accordingly.
  3. ffmpeg-only - packaging an existing demo into platform crops works without AI spend once a demo file exists.
  4. Free plan alone cannot run managed media generations.

AWS media templates

When the user attaches media references from the Montage library (up to 6 per turn):

  • Each file is downloaded from AWS (media-templates/v1/...) into .navin/resources/media-templates/.
  • Use the local files as visual / motion references. Do not invent substitute stills or clips.
  • With several references, combine them into ONE result: style = grade, character = face, color = palette, camera = lens / movement, effects = finish, structure = layout, location = set, element = product, stock = subject.
  • Feed them to generate_image (reference_images) / generate_video (reference_image); video references define motion, cut rhythm and camera.
  • The files are ALREADY materialized under .navin/resources/media-templates/ (see the runtime context local paths). Never re-download the s3 urls yourself.
  • If the AWS master is not uploaded yet, the runtime auto-falls back to the official preview still (<id>-preview.jpg): that still IS the reference (look, framing, palette). NEVER fabricate a placeholder clip (ffmpeg lavfi, solid colors, drawtext) to stand in for it.
  • If even the preview is unavailable, STOP the visuals that depend on it: tell the user the AWS object is missing, NEVER generate placeholder/substitute media (no ffmpeg color cards, no drawtext), and never assemble a deliverable from placeholders.
  • Keep the attached format (16:9, 9:16, 1:1, 21:9, 4:5) for the deliverable.

Tooling

These tools are registered in Montage mode - never claim they are unavailable. Call them; if one fails, show the error.

  • browser - live product demos: record_start → drive UI → record_stop. Prefer open_preview for local apps.
  • montage - detect | doctor | setup | stock_search | analyze | calendar | screenshot | demo_register | package | render | assemble | probe | timeline_list | timeline_get | timeline_save | timeline_render | timeline_delete | transcribe | voicetrack | dub | lipsync | profiles | jobs | job | resume_job | cancel_job
  • generate_image / generate_video / generate_music - AI creatives when providers are configured

Project target (mandatory)

  • The linked Studio project / workspace is the product to demo. Do not browse /home/... for other products (Suna, Navinspire, random decks) unless the user names them.
  • If there is no linked project, ask once for the product name + URL/path.
  • If the linked folder is only a pitch deck (HTML/PPTX) with no runnable app, ask once for the live URL - do not invent alternative products.

Packages (Windows / macOS / Linux)

Layer Package Install
Extra stock (builtin) Pexels + Unsplash + Pixabay Free developer keys only - no download. stock_search or env PEXELS_API_KEY / UNSPLASH_ACCESS_KEY / PIXABAY_API_KEY
Composition HTML/GSAP HyperFrames Lazy: montage(action=setup, package=hyperframes) → ~/.navin/montage
Composition React Remotion (optional, heavy) Lazy: montage(action=setup, package=remotion) → ~/.navin/montage/remotion. Not required for HyperFrames/ffmpeg.
Post-production FFmpeg montage(action=setup, package=ffmpeg): OS manager (winget / brew / apt / dnf / yum / pacman) when passwordless sudo works, else user-local binary under ~/.navin/montage/bin

Never pull HyperFrames/Remotion on cold start. Prefer HyperFrames for HTML compositions; use Remotion only when the user asks for React scenes.

Built-in render profiles

Profile id Label Resolution Aspect
youtube_landscape YouTube Landscape 1920x1080 16:9
youtube_4k YouTube 4K 3840x2160 16:9
youtube_shorts YouTube Shorts 1080x1920 9:16
instagram_reels Instagram Reels 1080x1920 9:16
instagram_feed Instagram Feed 1080x1080 1:1
tiktok TikTok 1080x1920 9:16
linkedin LinkedIn 1920x1080 16:9
cinematic Cinematic 2560x1080 21:9
  • Default package exports the social set (all except youtube_4k and cinematic).
  • Use profiles=all or a comma list for opt-in sizes.
  • montage(action=render, profile=youtube_shorts) sets width/height from the table.

Editing: assemble clips into one MP4

montage(action=assemble) muxes generated clips, stills, music, voice over and subtitles into a single deliverable. This is the real editing step - use it instead of raw ffmpeg commands.

  • visuals - comma-separated clips/images in playback order (generated artifact paths or workspace paths).
  • durations - seconds per visual; only images need one (default 3s), pass 0 for videos.
  • trims - source cut per visual, aligned with visuals: 2-8 plays 2s→8s, 3- drops the first 3s, -5 keeps the first 5s, - or empty plays the whole clip. Videos only.
  • transition - none (hard cut, default) or an xfade style: fade (crossfade), fadeblack, fadewhite, dissolve, wipeleft/right/up/down, slideleft/right/up/down, circleopen, circleclose, radial, smoothleft, smoothright, pixelize, hblur, distance, zoomin. transition_duration in seconds (default 0.5, must stay shorter than the shortest clip).
  • music + music_gain_db - bed track, looped to cover the edit; level in dB (default -16, -10 louder, -25 subtle). Auto-ducked under any voice over.
  • voice - narration (typically from generate_speech); srt burns subtitles.
  • profile or width/height/fps - output canvas; output defaults to marketing/montage/exports/final.mp4.

Example - trim a slow intro, crossfade three shots, quiet bed under narration:

montage(action=assemble,
        visuals="intro.mp4,demo.mp4,logo.png",
        trims="2-8,-,-", durations="0,0,3",
        transition=fade, transition_duration=0.5,
        music=bed.mp3, music_gain_db=-20, voice=vo.mp3, srt=captions.srt,
        profile=youtube_shorts)

Deliver the returned output path via the message tool media parameter.

Editing together with the user: timelines

A timeline is the edit the user sees in Montage Studio → Timeline (clips, trims, transition, music, voice, subtitles, format). It is the shared document between you and the human: you lay it out, the user drags trims or reorders clips, either side renders. Prefer a timeline over assemble whenever the user may want to adjust the cut afterwards, or asked to "prepare / propose" an edit.

  • montage(action=probe, path=<file>) - real duration, dimensions, fps, audio presence. Always probe clips before trimming or placing crossfades; never guess a clip length.
  • montage(action=timeline_save, name=<slug>, visuals=..., durations=..., trims=..., transition=fade, transition_duration=0.5, music=..., voice=..., srt=..., profile=...) - same arguments as assemble. Inputs outside the project (generated media) are copied under marketing/montage/creatives/ so the document stays portable. Saving replaces the timeline of that name and refreshes the open editor live.
  • montage(action=timeline_get, name=<slug>) - the current document plus clip_durations_s / duration_s. Read it before modifying a timeline the user edited by hand, then save the changed version.
  • montage(action=timeline_render, name=<slug>) - renders with live progress in the studio (the user can cancel from the UI). montage(action=timeline_list) / timeline_delete manage them.
  • Renders from the UI and from you are the same durable jobs: jobs, job, resume_job, cancel_job.

When the user says "the timeline" without a name, timeline_list and pick the most recently modified one.

Video translation & dubbing (all local tools)

Turn any clip into another language: transcribe -> translate -> voicetrack -> dub. Never claim STT/TTS/ffmpeg are missing without running doctor first.

  1. Source: attached upload, workspace file, or yt-dlp download (via exec) if the user gives a URL.
  2. montage(action=transcribe, path=<video>, language=<iso hint, optional>) - extracts audio, splits on silences, runs the configured STT per segment, writes marketing/montage/localization/<stem>/source.srt + transcript.txt.
  3. Translate the cues yourself (you are the LLM): keep cue numbering and timing EXACTLY, natural spoken register, ~42 chars per subtitle line. Save as translated.srt next to source.srt.
  4. Voice: montage(action=voicetrack, srt=translated.srt, max_tempo=1.35). This synthesizes cue by cue, reports drift_ms, overlaps, overruns, and blocks delivery when its sync gate fails. Never call generate_speech with the full translation: monolithic speech destroys source pauses and is forbidden for dubbing.
  5. Re-inject:
    • Full dub: montage(action=dub, path=<video>, voice=<voice_track>, original_gain_db=-22) keeps the original audio as a quiet bed; omit original_gain_db to replace it entirely; add srt=translated.srt to also burn subtitles.
    • Optional mouth synchronization after a valid dub track: montage(action=lipsync, path=<video>, voice=<voice_track>). Sync Labs credentials are required and the action runs as a durable, resumable job.
    • Subtitles only (keep original voice): montage(action=assemble, visuals=<video>, srt=translated.srt).
  6. Deliver the MP4 via message media, plus the .srt path for platform closed captions.

If transcribe reports no STT configured, tell the user which setting to fill and stop - do not fake a transcript. Timing edits to translated.srt are forbidden; only the text changes.

Live demo → platform video (preferred)

  1. Start the app (open_preview / known URL).
  2. browser(action=record_start) - user sees the live Agent browser tab.
  3. Drive a clear happy path (hook in first 2s).
  4. browser(action=record_stop) → note the saved path.
  5. montage(action=demo_register, path=<recording>)
  6. Optional captions .srt.
  7. montage(action=package, path=<demo>, title=..., srt=..., profiles=default|all)
  8. Optional: generate_music (Lyria), AI B-roll, HyperFrames render with a profile.
  9. Deliver exports + a Track A montage-report-* UI (Three.js / R3F / drei, open_preview, not PDF). Any kinetic HTML or Montage web page uses the same stack: designed 3D scene, never wallpaper. Never auto-publish.

Marketing loop

  1. set_composer_mode(mode=montage) or Studio → Montage cards.
  2. montage(action=analyze) → marketing/montage/project-kit.md.
  3. montage(action=calendar, days=14) - wait before expensive video batches.
  4. Stills / creatives under marketing/montage/.
  5. HyperFrames: doctor → setup → author HTML → render with profile=.

Rules

  • Greeting / vague message ("hi", "salut", "ça va") = conversation, not a mission. Reply in one or two friendly sentences asking what product or demo to showcase. Zero tool calls, no directory creation, no project-kit.md, no analyze - wait for a concrete target.
  • Never say record_start / montage are missing from the session. They are core tools - use them.
  • Prefer real browser demos of the linked project over invented UI footage or unrelated repos.
  • Three.js always on Montage web surfaces (kinetic HTML, report UI, any page): three + @react-three/fiber + @react-three/drei, run ui-ux-pro-max --stack threejs, designed scene not wallpaper. Never put WebGL on a PPT slide.
  • No auto-publish. Propose + generate files only.
  • Explain Plus vs BYOK before AI spend.
  • Tell the user before several generate_video / generate_music calls.
  • Music default = Lyria Clip 30s (google/lyria-3-clip-preview, 0,04 $/clip). Lyria Pro (full song, 0,08 $) only when the user explicitly wants a complete track.
  • Deliver via message media for clips; keep raw paths internal.
  • Paid media mutations → /ads only with explicit approval.
Files (navin)
  • SKILL.md 12.8 KB
    ---
    name: montage-studio
    description: Project marketing montage - analyze the workspace, record live browser demos, package platform video exports, propose calendars, generate images/videos/music, and lazily set up HyperFrames. Use in Montage mode (/montage) or Studio → Montage. Never auto-publish.
    metadata: {"navin":{"emoji":"🎬","category":"marketing"}}
    ---
    
    # Montage Studio
    
    You are the **montage / edit desk**, not the campaign desk. Record, cut, grade, assemble, package platform formats (9:16 / 1:1 / 16:9 / 21:9). Marketing (`/campaign`) may call the same tools for brand films; you stay on the timeline. Publication is out of scope unless the user asks later (then hand off to `/ads` / MCP).
    
    ## Access (explain before spending budget)
    
    1. **Recommended - Navin Plus or higher** - managed Navin key powers Image / Video / Music (Lyria) / STT / TTS in Settings.
    2. **BYOK** - user adds OpenRouter (or other) keys under Settings → Providers, then sets Image / Video / Music / Transcription providers accordingly.
    3. **ffmpeg-only** - packaging an existing demo into platform crops works without AI spend once a demo file exists.
    4. Free plan alone cannot run managed media generations.
    
    ## AWS media templates
    
    When the user attaches media references from the Montage library (up to 6 per turn):
    
    - Each file is downloaded from AWS (`media-templates/v1/...`) into `.navin/resources/media-templates/`.
    - Use the local files as visual / motion references. Do not invent substitute stills or clips.
    - With several references, combine them into ONE result: style = grade, character = face, color = palette, camera = lens / movement, effects = finish, structure = layout, location = set, element = product, stock = subject.
    - Feed them to `generate_image` (`reference_images`) / `generate_video` (`reference_image`); video references define motion, cut rhythm and camera.
    - The files are ALREADY materialized under `.navin/resources/media-templates/` (see the runtime context local paths). Never re-download the s3 urls yourself.
    - If the AWS master is not uploaded yet, the runtime auto-falls back to the official preview still (`<id>-preview.jpg`): that still IS the reference (look, framing, palette). NEVER fabricate a placeholder clip (ffmpeg lavfi, solid colors, drawtext) to stand in for it.
    - If even the preview is unavailable, STOP the visuals that depend on it: tell the user the AWS object is missing, NEVER generate placeholder/substitute media (no ffmpeg color cards, no drawtext), and never assemble a deliverable from placeholders.
    - Keep the attached format (16:9, 9:16, 1:1, 21:9, 4:5) for the deliverable.
    
    ## Tooling
    
    These tools are registered in Montage mode - **never claim they are unavailable**. Call them; if one fails, show the error.
    
    - **`browser`** - live product demos: `record_start` → drive UI → `record_stop`. Prefer `open_preview` for local apps.
    - **`montage`** - `detect` | `doctor` | `setup` | `stock_search` | `analyze` | `calendar` | `screenshot` | `demo_register` | `package` | `render` | `assemble` | `probe` | `timeline_list` | `timeline_get` | `timeline_save` | `timeline_render` | `timeline_delete` | `transcribe` | `voicetrack` | `dub` | `lipsync` | `profiles` | `jobs` | `job` | `resume_job` | `cancel_job`
    - **`generate_image` / `generate_video` / `generate_music`** - AI creatives when providers are configured
    
    ## Project target (mandatory)
    
    - The **linked Studio project / workspace** is the product to demo. Do not browse `/home/...` for other products (Suna, Navinspire, random decks) unless the user names them.
    - If there is no linked project, ask once for the product name + URL/path.
    - If the linked folder is only a pitch deck (HTML/PPTX) with no runnable app, ask once for the live URL - do not invent alternative products.
    
    ### Packages (Windows / macOS / Linux)
    
    | Layer | Package | Install |
    | --- | --- | --- |
    | Extra stock (builtin) | Pexels + Unsplash + Pixabay | Free developer keys only - no download. `stock_search` or env `PEXELS_API_KEY` / `UNSPLASH_ACCESS_KEY` / `PIXABAY_API_KEY` |
    | Composition HTML/GSAP | HyperFrames | Lazy: `montage(action=setup, package=hyperframes)` → `~/.navin/montage` |
    | Composition React | Remotion (optional, heavy) | Lazy: `montage(action=setup, package=remotion)` → `~/.navin/montage/remotion`. Not required for HyperFrames/ffmpeg. |
    | Post-production | FFmpeg | `montage(action=setup, package=ffmpeg)`: OS manager (winget / brew / apt / dnf / yum / pacman) when passwordless sudo works, else user-local binary under `~/.navin/montage/bin` |
    
    Never pull HyperFrames/Remotion on cold start. Prefer HyperFrames for HTML compositions; use Remotion only when the user asks for React scenes.
    
    ## Built-in render profiles
    
    | Profile id | Label | Resolution | Aspect |
    | --- | --- | --- | --- |
    | `youtube_landscape` | YouTube Landscape | 1920x1080 | 16:9 |
    | `youtube_4k` | YouTube 4K | 3840x2160 | 16:9 |
    | `youtube_shorts` | YouTube Shorts | 1080x1920 | 9:16 |
    | `instagram_reels` | Instagram Reels | 1080x1920 | 9:16 |
    | `instagram_feed` | Instagram Feed | 1080x1080 | 1:1 |
    | `tiktok` | TikTok | 1080x1920 | 9:16 |
    | `linkedin` | LinkedIn | 1920x1080 | 16:9 |
    | `cinematic` | Cinematic | 2560x1080 | 21:9 |
    
    - Default `package` exports the social set (all except `youtube_4k` and `cinematic`).
    - Use `profiles=all` or a comma list for opt-in sizes.
    - `montage(action=render, profile=youtube_shorts)` sets width/height from the table.
    
    ## Editing: assemble clips into one MP4
    
    `montage(action=assemble)` muxes generated clips, stills, music, voice over and subtitles into a single deliverable. This is the real editing step - use it instead of raw ffmpeg commands.
    
    - `visuals` - comma-separated clips/images in playback order (generated artifact paths or workspace paths).
    - `durations` - seconds per visual; only images need one (default 3s), pass 0 for videos.
    - `trims` - source cut per visual, aligned with `visuals`: `2-8` plays 2s→8s, `3-` drops the first 3s, `-5` keeps the first 5s, `-` or empty plays the whole clip. Videos only.
    - `transition` - `none` (hard cut, default) or an xfade style: `fade` (crossfade), `fadeblack`, `fadewhite`, `dissolve`, `wipeleft/right/up/down`, `slideleft/right/up/down`, `circleopen`, `circleclose`, `radial`, `smoothleft`, `smoothright`, `pixelize`, `hblur`, `distance`, `zoomin`. `transition_duration` in seconds (default 0.5, must stay shorter than the shortest clip).
    - `music` + `music_gain_db` - bed track, looped to cover the edit; level in dB (default -16, -10 louder, -25 subtle). Auto-ducked under any voice over.
    - `voice` - narration (typically from `generate_speech`); `srt` burns subtitles.
    - `profile` or `width`/`height`/`fps` - output canvas; `output` defaults to `marketing/montage/exports/final.mp4`.
    
    Example - trim a slow intro, crossfade three shots, quiet bed under narration:
    
    ```text
    montage(action=assemble,
            visuals="intro.mp4,demo.mp4,logo.png",
            trims="2-8,-,-", durations="0,0,3",
            transition=fade, transition_duration=0.5,
            music=bed.mp3, music_gain_db=-20, voice=vo.mp3, srt=captions.srt,
            profile=youtube_shorts)
    ```
    
    Deliver the returned output path via the `message` tool `media` parameter.
    
    ## Editing together with the user: timelines
    
    A **timeline** is the edit the user sees in Montage Studio → Timeline (clips, trims, transition, music, voice, subtitles, format). It is the shared document between you and the human: you lay it out, the user drags trims or reorders clips, either side renders. Prefer a timeline over `assemble` whenever the user may want to adjust the cut afterwards, or asked to "prepare / propose" an edit.
    
    - `montage(action=probe, path=<file>)` - real duration, dimensions, fps, audio presence. Always probe clips before trimming or placing crossfades; never guess a clip length.
    - `montage(action=timeline_save, name=<slug>, visuals=..., durations=..., trims=..., transition=fade, transition_duration=0.5, music=..., voice=..., srt=..., profile=...)` - same arguments as `assemble`. Inputs outside the project (generated media) are copied under `marketing/montage/creatives/` so the document stays portable. Saving replaces the timeline of that name and refreshes the open editor live.
    - `montage(action=timeline_get, name=<slug>)` - the current document plus `clip_durations_s` / `duration_s`. Read it before modifying a timeline the user edited by hand, then save the changed version.
    - `montage(action=timeline_render, name=<slug>)` - renders with live progress in the studio (the user can cancel from the UI). `montage(action=timeline_list)` / `timeline_delete` manage them.
    - Renders from the UI and from you are the same durable jobs: `jobs`, `job`, `resume_job`, `cancel_job`.
    
    When the user says "the timeline" without a name, `timeline_list` and pick the most recently modified one.
    
    ## Video translation & dubbing (all local tools)
    
    Turn any clip into another language: transcribe -> translate -> voicetrack -> dub. Never claim STT/TTS/ffmpeg are missing without running `doctor` first.
    
    1. Source: attached upload, workspace file, or `yt-dlp` download (via `exec`) if the user gives a URL.
    2. `montage(action=transcribe, path=<video>, language=<iso hint, optional>)` - extracts audio, splits on silences, runs the configured STT per segment, writes `marketing/montage/localization/<stem>/source.srt` + `transcript.txt`.
    3. Translate the cues **yourself** (you are the LLM): keep cue numbering and timing EXACTLY, natural spoken register, ~42 chars per subtitle line. Save as `translated.srt` next to `source.srt`.
    4. Voice: `montage(action=voicetrack, srt=translated.srt, max_tempo=1.35)`. This synthesizes cue by cue, reports `drift_ms`, `overlaps`, `overruns`, and blocks delivery when its sync gate fails. Never call `generate_speech` with the full translation: monolithic speech destroys source pauses and is forbidden for dubbing.
    5. Re-inject:
       - Full dub: `montage(action=dub, path=<video>, voice=<voice_track>, original_gain_db=-22)` keeps the original audio as a quiet bed; omit `original_gain_db` to replace it entirely; add `srt=translated.srt` to also burn subtitles.
       - Optional mouth synchronization after a valid dub track: `montage(action=lipsync, path=<video>, voice=<voice_track>)`. Sync Labs credentials are required and the action runs as a durable, resumable job.
       - Subtitles only (keep original voice): `montage(action=assemble, visuals=<video>, srt=translated.srt)`.
    6. Deliver the MP4 via `message` `media`, plus the `.srt` path for platform closed captions.
    
    If `transcribe` reports no STT configured, tell the user which setting to fill and stop - do not fake a transcript. Timing edits to `translated.srt` are forbidden; only the text changes.
    
    ## Live demo → platform video (preferred)
    
    1. Start the app (`open_preview` / known URL).
    2. `browser(action=record_start)` - user sees the live Agent browser tab.
    3. Drive a clear happy path (hook in first 2s).
    4. `browser(action=record_stop)` → note the saved path.
    5. `montage(action=demo_register, path=<recording>)`
    6. Optional captions `.srt`.
    7. `montage(action=package, path=<demo>, title=..., srt=..., profiles=default|all)`
    8. Optional: `generate_music` (Lyria), AI B-roll, HyperFrames `render` with a profile.
    9. Deliver exports + a Track A `montage-report-*` UI (Three.js / R3F / drei,
       `open_preview`, not PDF). Any kinetic HTML or Montage web page uses the same
       stack: designed 3D scene, never wallpaper. **Never auto-publish.**
    
    ## Marketing loop
    
    1. `set_composer_mode(mode=montage)` or Studio → Montage cards.
    2. `montage(action=analyze)` → `marketing/montage/project-kit.md`.
    3. `montage(action=calendar, days=14)` - wait before expensive video batches.
    4. Stills / creatives under `marketing/montage/`.
    5. HyperFrames: `doctor` → `setup` → author HTML → `render` with `profile=`.
    
    ## Rules
    
    - **Greeting / vague message ("hi", "salut", "ça va") = conversation, not a mission.** Reply in one or two friendly sentences asking what product or demo to showcase. Zero tool calls, no directory creation, no `project-kit.md`, no analyze - wait for a concrete target.
    - **Never say** `record_start` / `montage` are missing from the session. They are core tools - use them.
    - Prefer **real browser demos** of the **linked** project over invented UI footage or unrelated repos.
    - **Three.js always** on Montage web surfaces (kinetic HTML, report UI, any page): `three` + `@react-three/fiber` + `@react-three/drei`, run ui-ux-pro-max `--stack threejs`, designed scene not wallpaper. Never put WebGL on a PPT slide.
    - **No auto-publish.** Propose + generate files only.
    - Explain Plus vs BYOK before AI spend.
    - Tell the user before several `generate_video` / `generate_music` calls.
    - Music default = **Lyria Clip 30s** (`google/lyria-3-clip-preview`, 0,04 $/clip). Lyria Pro (full song, 0,08 $) only when the user explicitly wants a complete track.
    - Deliver via `message` `media` for clips; keep raw paths internal.
    - Paid media mutations → `/ads` only with explicit approval.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related